11// Copyright 2025 The Gitea Authors. All rights reserved.
22// SPDX-License-Identifier: MIT
33
4- package ssh_test
4+ package ssh
55
66import (
77 "crypto/ecdsa"
@@ -12,35 +12,33 @@ import (
1212 "path/filepath"
1313 "testing"
1414
15- "code.gitea.io/gitea/modules/ssh"
16-
1715 "github.com/stretchr/testify/assert"
1816 "github.com/stretchr/testify/require"
1917 gossh "golang.org/x/crypto/ssh"
2018)
2119
2220func TestGenKeyPair (t * testing.T ) {
2321 testCases := []struct {
24- keyPath string
22+ keyType string
2523 expectedType any
2624 }{
2725 {
28- keyPath : "/gitea. rsa" ,
26+ keyType : "rsa" ,
2927 expectedType : & rsa.PrivateKey {},
3028 },
3129 {
32- keyPath : "/gitea. ed25519" ,
30+ keyType : "ed25519" ,
3331 expectedType : & ed25519.PrivateKey {},
3432 },
3533 {
36- keyPath : "/gitea. ecdsa" ,
34+ keyType : "ecdsa" ,
3735 expectedType : & ecdsa.PrivateKey {},
3836 },
3937 }
4038 for _ , tC := range testCases {
41- t .Run ("Generate " + filepath .Ext (tC .keyPath ), func (t * testing.T ) {
42- path := t .TempDir () + tC .keyPath
43- require .NoError (t , ssh . GenKeyPair (path ))
39+ t .Run ("Generate " + filepath .Ext (tC .keyType ), func (t * testing.T ) {
40+ path := t .TempDir () + "gitea." + tC .keyType
41+ require .NoError (t , GenKeyPair (path , tC . keyType ))
4442
4543 file , err := os .Open (path )
4644 require .NoError (t , err )
@@ -53,4 +51,68 @@ func TestGenKeyPair(t *testing.T) {
5351 assert .IsType (t , tC .expectedType , privateKey )
5452 })
5553 }
54+ t .Run ("Generate unknown keytype" , func (t * testing.T ) {
55+ path := t .TempDir () + "gitea.badkey"
56+
57+ err := GenKeyPair (path , "badkey" )
58+ require .Error (t , err )
59+ })
60+ }
61+
62+ func TestInitKeys (t * testing.T ) {
63+ tempDir := t .TempDir ()
64+
65+ keytypes := []string {"rsa" , "ecdsa" , "ed25519" }
66+ for _ , keytype := range keytypes {
67+ privKeyPath := filepath .Join (tempDir , "gitea." + keytype )
68+ pubKeyPath := filepath .Join (tempDir , "gitea." + keytype + ".pub" )
69+ assert .NoFileExists (t , privKeyPath )
70+ assert .NoFileExists (t , pubKeyPath )
71+ }
72+
73+ // Test basic creation
74+ err := initDefaultKeys (tempDir )
75+ require .NoError (t , err )
76+
77+ metadata := map [string ]os.FileInfo {}
78+ for _ , keytype := range keytypes {
79+ privKeyPath := filepath .Join (tempDir , "gitea." + keytype )
80+ pubKeyPath := filepath .Join (tempDir , "gitea." + keytype + ".pub" )
81+ assert .FileExists (t , privKeyPath )
82+ assert .FileExists (t , pubKeyPath )
83+
84+ info , err := os .Stat (privKeyPath )
85+ require .NoError (t , err )
86+ metadata [privKeyPath ] = info
87+
88+ info , err = os .Stat (pubKeyPath )
89+ require .NoError (t , err )
90+ metadata [pubKeyPath ] = info
91+ }
92+
93+ // Test recreation on missing public or private key
94+ require .NoError (t , os .Remove (filepath .Join (tempDir , "gitea.ecdsa.pub" )))
95+ require .NoError (t , os .Remove (filepath .Join (tempDir , "gitea.ed25519" )))
96+
97+ err = initDefaultKeys (tempDir )
98+ require .NoError (t , err )
99+
100+ for _ , keytype := range keytypes {
101+ privKeyPath := filepath .Join (tempDir , "gitea." + keytype )
102+ pubKeyPath := filepath .Join (tempDir , "gitea." + keytype + ".pub" )
103+ assert .FileExists (t , privKeyPath )
104+ assert .FileExists (t , pubKeyPath )
105+
106+ infoPriv , err := os .Stat (privKeyPath )
107+ require .NoError (t , err )
108+ infoPub , err := os .Stat (pubKeyPath )
109+ require .NoError (t , err )
110+ if keytype == "rsa" {
111+ assert .Equal (t , metadata [privKeyPath ], infoPriv )
112+ assert .Equal (t , metadata [pubKeyPath ], infoPub )
113+ } else {
114+ assert .NotEqual (t , metadata [privKeyPath ], infoPriv )
115+ assert .NotEqual (t , metadata [pubKeyPath ], infoPub )
116+ }
117+ }
56118}
0 commit comments