Skip to content

Commit 9025ea7

Browse files
committed
optimize db query by "db.Exist"
1 parent 4cb3c88 commit 9025ea7

File tree

2 files changed

+38
-43
lines changed

2 files changed

+38
-43
lines changed

services/asymkey/sign.go

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -69,30 +69,27 @@ func signingModeFromStrings(modeStrings []string) []signingMode {
6969
return returnable
7070
}
7171

72-
func userHasPubkeys(ctx context.Context, u *user_model.User) (bool, error) {
73-
gpgKeys, err := db.Find[asymkey_model.GPGKey](ctx, asymkey_model.FindGPGKeyOptions{
74-
OwnerID: u.ID,
72+
func userHasPubkeysGPG(ctx context.Context, userID int64) (bool, error) {
73+
return db.Exist[asymkey_model.GPGKey](ctx, asymkey_model.FindGPGKeyOptions{
74+
OwnerID: userID,
7575
IncludeSubKeys: true,
76-
})
77-
if err != nil {
78-
return false, err
79-
}
80-
if len(gpgKeys) > 0 {
81-
return true, nil
82-
}
76+
}.ToConds())
77+
}
8378

84-
sshKeys, err := db.Find[asymkey_model.PublicKey](ctx, asymkey_model.FindPublicKeyOptions{
85-
OwnerID: u.ID,
79+
func userHasPubkeysSSH(ctx context.Context, userID int64) (bool, error) {
80+
return db.Exist[asymkey_model.PublicKey](ctx, asymkey_model.FindPublicKeyOptions{
81+
OwnerID: userID,
8682
NotKeytype: asymkey_model.KeyTypePrincipal,
87-
})
88-
if err != nil {
89-
return false, err
90-
}
91-
if len(sshKeys) > 0 {
92-
return true, nil
93-
}
83+
}.ToConds())
84+
}
9485

95-
return false, nil
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)
9693
}
9794

9895
// ErrWontSign explains the first reason why a commit would not be signed
@@ -196,7 +193,7 @@ Loop:
196193
case always:
197194
break Loop
198195
case pubkey:
199-
hasKeys, err := userHasPubkeys(ctx, u)
196+
hasKeys, err := userHasPubkeys(ctx, u.ID)
200197
if err != nil {
201198
return false, nil, nil, err
202199
}
@@ -233,7 +230,7 @@ Loop:
233230
case always:
234231
break Loop
235232
case pubkey:
236-
hasKeys, err := userHasPubkeys(ctx, u)
233+
hasKeys, err := userHasPubkeys(ctx, u.ID)
237234
if err != nil {
238235
return false, nil, nil, err
239236
}
@@ -286,7 +283,7 @@ Loop:
286283
case always:
287284
break Loop
288285
case pubkey:
289-
hasKeys, err := userHasPubkeys(ctx, u)
286+
hasKeys, err := userHasPubkeys(ctx, u.ID)
290287
if err != nil {
291288
return false, nil, nil, err
292289
}
@@ -354,7 +351,7 @@ Loop:
354351
case always:
355352
break Loop
356353
case pubkey:
357-
hasKeys, err := userHasPubkeys(ctx, u)
354+
hasKeys, err := userHasPubkeys(ctx, u.ID)
358355
if err != nil {
359356
return false, nil, nil, err
360357
}

services/asymkey/sign_test.go

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,36 @@
1-
// Copyright 2019 The Gitea Authors. All rights reserved.
1+
// Copyright 2025 The Gitea Authors. All rights reserved.
22
// SPDX-License-Identifier: MIT
33

44
package asymkey
55

66
import (
77
"testing"
88

9-
"code.gitea.io/gitea/models/unittest"
10-
user_model "code.gitea.io/gitea/models/user"
11-
129
"github.com/stretchr/testify/assert"
10+
"github.com/stretchr/testify/require"
1311
)
1412

1513
func TestUserHasPubkeys(t *testing.T) {
16-
ctx := t.Context()
14+
test := func(t *testing.T, userID int64, expectedHasGPG, expectedHasSSH bool) {
15+
ctx := t.Context()
16+
hasGPG, err := userHasPubkeysGPG(ctx, userID)
17+
require.NoError(t, err)
18+
hasSSH, err := userHasPubkeysGPG(ctx, userID)
19+
require.NoError(t, err)
20+
hasPubkeys, err := userHasPubkeys(ctx, userID)
21+
require.NoError(t, err)
22+
assert.Equal(t, expectedHasGPG, hasGPG)
23+
assert.Equal(t, expectedHasSSH, hasSSH)
24+
assert.Equal(t, expectedHasGPG || expectedHasSSH, hasPubkeys)
25+
}
1726

1827
t.Run("AllowUserWithGPGKey", func(t *testing.T) {
19-
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 36}) // user has GPG key
20-
hasKeys, err := userHasPubkeys(ctx, user)
21-
assert.NoError(t, err)
22-
assert.True(t, hasKeys)
28+
test(t, 36, true, false) // has gpg
2329
})
24-
2530
t.Run("AllowUserWithSSHKey", func(t *testing.T) {
26-
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // user has SSH key
27-
hasKeys, err := userHasPubkeys(ctx, user)
28-
assert.NoError(t, err)
29-
assert.True(t, hasKeys)
31+
test(t, 2, false, true) // has ssh
3032
})
31-
3233
t.Run("DenyUserWithNoKeys", func(t *testing.T) {
33-
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
34-
hasKeys, err := userHasPubkeys(ctx, user)
35-
assert.NoError(t, err)
36-
assert.False(t, hasKeys)
34+
test(t, 1, false, false) // no pubkey
3735
})
3836
}

0 commit comments

Comments
 (0)