5
5
"fmt"
6
6
"os"
7
7
"runtime"
8
+ "slices"
8
9
"strings"
9
10
10
11
"github.com/go-git/go-billy/v5/osfs"
@@ -18,7 +19,8 @@ import (
18
19
type (
19
20
SuiteCommon struct {}
20
21
21
- mockKnownHosts struct {}
22
+ mockKnownHosts struct {}
23
+ mockKnownHostsWithCert struct {}
22
24
)
23
25
24
26
func (mockKnownHosts ) host () string { return "github.com" }
@@ -27,6 +29,19 @@ func (mockKnownHosts) knownHosts() []byte {
27
29
}
28
30
func (mockKnownHosts ) Network () string { return "tcp" }
29
31
func (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
+ }
30
45
31
46
var _ = Suite (& SuiteCommon {})
32
47
@@ -230,3 +245,75 @@ func (*SuiteCommon) TestNewKnownHostsCallback(c *C) {
230
245
err = clb (mock .String (), mock , hostKey )
231
246
c .Assert (err , IsNil )
232
247
}
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