@@ -3,8 +3,10 @@ package envbuilder_test
33import (
44 "context"
55 "crypto/ed25519"
6+ "encoding/json"
67 "fmt"
78 "io"
9+ "net/http"
810 "net/http/httptest"
911 "net/url"
1012 "os"
@@ -13,13 +15,16 @@ import (
1315 "testing"
1416
1517 "github.com/coder/coder/v2/codersdk"
18+ "github.com/coder/coder/v2/codersdk/agentsdk"
1619 "github.com/coder/envbuilder"
1720 "github.com/coder/envbuilder/testutil/gittest"
1821 "github.com/go-git/go-billy/v5"
1922 "github.com/go-git/go-billy/v5/memfs"
2023 "github.com/go-git/go-billy/v5/osfs"
2124 githttp "github.com/go-git/go-git/v5/plumbing/transport/http"
2225 gitssh "github.com/go-git/go-git/v5/plumbing/transport/ssh"
26+ "github.com/google/uuid"
27+ "github.com/stretchr/testify/assert"
2328 "github.com/stretchr/testify/require"
2429 gossh "golang.org/x/crypto/ssh"
2530)
@@ -382,6 +387,60 @@ func TestSetupRepoAuth(t *testing.T) {
382387 auth := envbuilder .SetupRepoAuth (opts )
383388 require .Nil (t , auth ) // TODO: actually test SSH_AUTH_SOCK
384389 })
390+
391+ t .Run ("SSH/Coder" , func (t * testing.T ) {
392+ token := uuid .NewString ()
393+ actualSigner , err := gossh .ParsePrivateKey ([]byte (testKey ))
394+ require .NoError (t , err )
395+ handler := func (w http.ResponseWriter , r * http.Request ) {
396+ hdr := r .Header .Get ("Coder-Session-Token" )
397+ if ! assert .Equal (t , hdr , token ) {
398+ w .WriteHeader (http .StatusForbidden )
399+ return
400+ }
401+ switch r .URL .Path {
402+ case "/api/v2/workspaceagents/me/gitsshkey" :
403+ _ = json .NewEncoder (w ).Encode (& agentsdk.GitSSHKey {
404+ PublicKey : string (actualSigner .PublicKey ().Marshal ()),
405+ PrivateKey : string (testKey ),
406+ })
407+ default :
408+ assert .Fail (t , "unknown path: %q" , r .URL .Path )
409+ }
410+ }
411+ srv := httptest .NewServer (http .HandlerFunc (handler ))
412+ u , err := url .Parse (srv .URL )
413+ require .NoError (t , err )
414+ opts := & envbuilder.Options {
415+ CoderAgentURL : u ,
416+ CoderAgentToken : token ,
417+ GitURL :
"ssh://[email protected] :repo/path" ,
418+ Logger : testLog (t ),
419+ }
420+ auth := envbuilder .SetupRepoAuth (opts )
421+ pk , ok := auth .(* gitssh.PublicKeys )
422+ require .True (t , ok )
423+ require .NotNil (t , pk .Signer )
424+ require .Equal (t , actualSigner , pk .Signer )
425+ })
426+
427+ t .Run ("SSH/CoderForbidden" , func (t * testing.T ) {
428+ token := uuid .NewString ()
429+ handler := func (w http.ResponseWriter , r * http.Request ) {
430+ w .WriteHeader (http .StatusForbidden )
431+ }
432+ srv := httptest .NewServer (http .HandlerFunc (handler ))
433+ u , err := url .Parse (srv .URL )
434+ require .NoError (t , err )
435+ opts := & envbuilder.Options {
436+ CoderAgentURL : u ,
437+ CoderAgentToken : token ,
438+ GitURL :
"ssh://[email protected] :repo/path" ,
439+ Logger : testLog (t ),
440+ }
441+ auth := envbuilder .SetupRepoAuth (opts )
442+ require .Nil (t , auth )
443+ })
385444}
386445
387446func mustRead (t * testing.T , fs billy.Filesystem , path string ) string {
@@ -405,6 +464,7 @@ func randKeygen(t *testing.T) gossh.Signer {
405464
406465func testLog (t * testing.T ) envbuilder.LoggerFunc {
407466 return func (_ codersdk.LogLevel , format string , args ... interface {}) {
467+ t .Helper ()
408468 t .Logf (format , args ... )
409469 }
410470}
0 commit comments