55 "fmt"
66 "os"
77 "runtime"
8+ "slices"
89 "strings"
910
1011 "github.com/go-git/go-billy/v5/osfs"
@@ -18,7 +19,8 @@ import (
1819type (
1920 SuiteCommon struct {}
2021
21- mockKnownHosts struct {}
22+ mockKnownHosts struct {}
23+ mockKnownHostsWithCert struct {}
2224)
2325
2426func (mockKnownHosts ) host () string { return "github.com" }
@@ -27,6 +29,19 @@ func (mockKnownHosts) knownHosts() []byte {
2729}
2830func (mockKnownHosts ) Network () string { return "tcp" }
2931func (mockKnownHosts ) String () string { return "github.com:22" }
32+ func (mockKnownHosts ) Algorithms () []string {
33+ return []string {ssh .KeyAlgoRSA , ssh .KeyAlgoRSASHA256 , ssh .KeyAlgoRSASHA512 }
34+ }
35+
36+ func (mockKnownHostsWithCert ) host () string { return "github.com" }
37+ func (mockKnownHostsWithCert ) knownHosts () []byte {
38+ return []byte (`@cert-authority github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==` )
39+ }
40+ func (mockKnownHostsWithCert ) Network () string { return "tcp" }
41+ func (mockKnownHostsWithCert ) String () string { return "github.com:22" }
42+ func (mockKnownHostsWithCert ) Algorithms () []string {
43+ return []string {ssh .CertAlgoRSASHA512v01 , ssh .CertAlgoRSASHA256v01 , ssh .CertAlgoRSAv01 }
44+ }
3045
3146var _ = Suite (& SuiteCommon {})
3247
@@ -230,3 +245,75 @@ func (*SuiteCommon) TestNewKnownHostsCallback(c *C) {
230245 err = clb (mock .String (), mock , hostKey )
231246 c .Assert (err , IsNil )
232247}
248+
249+ func (* SuiteCommon ) TestNewKnownHostsDbWithoutCert (c * C ) {
250+ if runtime .GOOS == "js" {
251+ c .Skip ("not available in wasm" )
252+ }
253+
254+ var mock = mockKnownHosts {}
255+
256+ f , err := util .TempFile (osfs .Default , "" , "known-hosts" )
257+ c .Assert (err , IsNil )
258+
259+ _ , err = f .Write (mock .knownHosts ())
260+ c .Assert (err , IsNil )
261+
262+ err = f .Close ()
263+ c .Assert (err , IsNil )
264+
265+ defer util .RemoveAll (osfs .Default , f .Name ())
266+
267+ f , err = osfs .Default .Open (f .Name ())
268+ c .Assert (err , IsNil )
269+
270+ defer f .Close ()
271+
272+ db , err := NewKnownHostsDb (f .Name ())
273+ c .Assert (err , IsNil )
274+
275+ algos := db .HostKeyAlgorithms (mock .String ())
276+ c .Assert (algos , HasLen , len (mock .Algorithms ()))
277+
278+ for _ , algorithm := range mock .Algorithms () {
279+ if ! slices .Contains (algos , algorithm ) {
280+ c .Error ("algos does not contain " , algorithm )
281+ }
282+ }
283+ }
284+
285+ func (* SuiteCommon ) TestNewKnownHostsDbWithCert (c * C ) {
286+ if runtime .GOOS == "js" {
287+ c .Skip ("not available in wasm" )
288+ }
289+
290+ var mock = mockKnownHostsWithCert {}
291+
292+ f , err := util .TempFile (osfs .Default , "" , "known-hosts" )
293+ c .Assert (err , IsNil )
294+
295+ _ , err = f .Write (mock .knownHosts ())
296+ c .Assert (err , IsNil )
297+
298+ err = f .Close ()
299+ c .Assert (err , IsNil )
300+
301+ defer util .RemoveAll (osfs .Default , f .Name ())
302+
303+ f , err = osfs .Default .Open (f .Name ())
304+ c .Assert (err , IsNil )
305+
306+ defer f .Close ()
307+
308+ db , err := NewKnownHostsDb (f .Name ())
309+ c .Assert (err , IsNil )
310+
311+ algos := db .HostKeyAlgorithms (mock .String ())
312+ c .Assert (algos , HasLen , len (mock .Algorithms ()))
313+
314+ for _ , algorithm := range mock .Algorithms () {
315+ if ! slices .Contains (algos , algorithm ) {
316+ c .Error ("algos does not contain " , algorithm )
317+ }
318+ }
319+ }
0 commit comments