@@ -69,6 +69,29 @@ func signingModeFromStrings(modeStrings []string) []signingMode {
6969 return returnable
7070}
7171
72+ func userHasPubkeysGPG(ctx context.Context, userID int64) (bool, error) {
73+ return db.Exist[asymkey_model.GPGKey](ctx, asymkey_model.FindGPGKeyOptions{
74+ OwnerID: userID,
75+ IncludeSubKeys: true,
76+ }.ToConds())
77+ }
78+
79+ func userHasPubkeysSSH(ctx context.Context, userID int64) (bool, error) {
80+ return db.Exist[asymkey_model.PublicKey](ctx, asymkey_model.FindPublicKeyOptions{
81+ OwnerID: userID,
82+ NotKeytype: asymkey_model.KeyTypePrincipal,
83+ }.ToConds())
84+ }
85+
86+ // userHasPubkeys checks if a user has any public keys (GPG or SSH)
87+ func userHasPubkeys(ctx context.Context, userID int64) (bool, error) {
88+ has, err := userHasPubkeysGPG(ctx, userID)
89+ if has || err != nil {
90+ return has, err
91+ }
92+ return userHasPubkeysSSH(ctx, userID)
93+ }
94+
7295// ErrWontSign explains the first reason why a commit would not be signed
7396// There may be other reasons - this is just the first reason found
7497type ErrWontSign struct {
@@ -170,14 +193,11 @@ Loop:
170193 case always:
171194 break Loop
172195 case pubkey:
173- keys, err := db.Find[asymkey_model.GPGKey](ctx, asymkey_model.FindGPGKeyOptions{
174- OwnerID: u.ID,
175- IncludeSubKeys: true,
176- })
196+ hasKeys, err := userHasPubkeys(ctx, u.ID)
177197 if err != nil {
178198 return false, nil, nil, err
179199 }
180- if len(keys) == 0 {
200+ if !hasKeys {
181201 return false, nil, nil, &ErrWontSign{pubkey}
182202 }
183203 case twofa:
@@ -210,14 +230,11 @@ Loop:
210230 case always:
211231 break Loop
212232 case pubkey:
213- keys, err := db.Find[asymkey_model.GPGKey](ctx, asymkey_model.FindGPGKeyOptions{
214- OwnerID: u.ID,
215- IncludeSubKeys: true,
216- })
233+ hasKeys, err := userHasPubkeys(ctx, u.ID)
217234 if err != nil {
218235 return false, nil, nil, err
219236 }
220- if len(keys) == 0 {
237+ if !hasKeys {
221238 return false, nil, nil, &ErrWontSign{pubkey}
222239 }
223240 case twofa:
@@ -266,14 +283,11 @@ Loop:
266283 case always:
267284 break Loop
268285 case pubkey:
269- keys, err := db.Find[asymkey_model.GPGKey](ctx, asymkey_model.FindGPGKeyOptions{
270- OwnerID: u.ID,
271- IncludeSubKeys: true,
272- })
286+ hasKeys, err := userHasPubkeys(ctx, u.ID)
273287 if err != nil {
274288 return false, nil, nil, err
275289 }
276- if len(keys) == 0 {
290+ if !hasKeys {
277291 return false, nil, nil, &ErrWontSign{pubkey}
278292 }
279293 case twofa:
@@ -337,14 +351,11 @@ Loop:
337351 case always:
338352 break Loop
339353 case pubkey:
340- keys, err := db.Find[asymkey_model.GPGKey](ctx, asymkey_model.FindGPGKeyOptions{
341- OwnerID: u.ID,
342- IncludeSubKeys: true,
343- })
354+ hasKeys, err := userHasPubkeys(ctx, u.ID)
344355 if err != nil {
345356 return false, nil, nil, err
346357 }
347- if len(keys) == 0 {
358+ if !hasKeys {
348359 return false, nil, nil, &ErrWontSign{pubkey}
349360 }
350361 case twofa:
0 commit comments