Skip to content

Commit f9682bf

Browse files
committed
Move delete deploy keys into service layer
1 parent 6a4eb12 commit f9682bf

File tree

4 files changed

+83
-62
lines changed

4 files changed

+83
-62
lines changed

models/asymkey/error.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ func (err ErrGPGKeyAccessDenied) Unwrap() error {
217217
// ErrKeyAccessDenied represents a "KeyAccessDenied" kind of error.
218218
type ErrKeyAccessDenied struct {
219219
UserID int64
220+
RepoID int64
220221
KeyID int64
221222
Note string
222223
}
@@ -228,8 +229,8 @@ func IsErrKeyAccessDenied(err error) bool {
228229
}
229230

230231
func (err ErrKeyAccessDenied) Error() string {
231-
return fmt.Sprintf("user does not have access to the key [user_id: %d, key_id: %d, note: %s]",
232-
err.UserID, err.KeyID, err.Note)
232+
return fmt.Sprintf("user does not have access to the key [user_id: %d, repo_id: %d, key_id: %d, note: %s]",
233+
err.UserID, err.RepoID, err.KeyID, err.Note)
233234
}
234235

235236
func (err ErrKeyAccessDenied) Unwrap() error {

models/repo.go

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,12 @@ package models
66

77
import (
88
"context"
9-
"fmt"
109
"strconv"
1110

1211
_ "image/jpeg" // Needed for jpeg support
1312

14-
asymkey_model "code.gitea.io/gitea/models/asymkey"
1513
"code.gitea.io/gitea/models/db"
1614
issues_model "code.gitea.io/gitea/models/issues"
17-
access_model "code.gitea.io/gitea/models/perm/access"
1815
repo_model "code.gitea.io/gitea/models/repo"
1916
"code.gitea.io/gitea/models/unit"
2017
user_model "code.gitea.io/gitea/models/user"
@@ -315,48 +312,3 @@ func DoctorUserStarNum(ctx context.Context) (err error) {
315312

316313
return err
317314
}
318-
319-
// DeleteDeployKey delete deploy keys
320-
func DeleteDeployKey(ctx context.Context, doer *user_model.User, id int64) error {
321-
key, err := asymkey_model.GetDeployKeyByID(ctx, id)
322-
if err != nil {
323-
if asymkey_model.IsErrDeployKeyNotExist(err) {
324-
return nil
325-
}
326-
return fmt.Errorf("GetDeployKeyByID: %w", err)
327-
}
328-
329-
// Check if user has access to delete this key.
330-
if !doer.IsAdmin {
331-
repo, err := repo_model.GetRepositoryByID(ctx, key.RepoID)
332-
if err != nil {
333-
return fmt.Errorf("GetRepositoryByID: %w", err)
334-
}
335-
has, err := access_model.IsUserRepoAdmin(ctx, repo, doer)
336-
if err != nil {
337-
return fmt.Errorf("GetUserRepoPermission: %w", err)
338-
} else if !has {
339-
return asymkey_model.ErrKeyAccessDenied{
340-
UserID: doer.ID,
341-
KeyID: key.ID,
342-
Note: "deploy",
343-
}
344-
}
345-
}
346-
347-
if _, err := db.DeleteByID[asymkey_model.DeployKey](ctx, key.ID); err != nil {
348-
return fmt.Errorf("delete deploy key [%d]: %w", key.ID, err)
349-
}
350-
351-
// Check if this is the last reference to same key content.
352-
has, err := asymkey_model.IsDeployKeyExistByKeyID(ctx, key.KeyID)
353-
if err != nil {
354-
return err
355-
} else if !has {
356-
if _, err = db.DeleteByID[asymkey_model.PublicKey](ctx, key.KeyID); err != nil {
357-
return err
358-
}
359-
}
360-
361-
return nil
362-
}

services/asymkey/deploy_key.go

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,75 @@ package asymkey
55

66
import (
77
"context"
8+
"fmt"
89

9-
"code.gitea.io/gitea/models"
10+
asymkey_model "code.gitea.io/gitea/models/asymkey"
1011
"code.gitea.io/gitea/models/db"
12+
access_model "code.gitea.io/gitea/models/perm/access"
13+
repo_model "code.gitea.io/gitea/models/repo"
1114
user_model "code.gitea.io/gitea/models/user"
1215
)
1316

17+
func DeleteRepoDeployKeys(ctx context.Context, doer *user_model.User, repoID int64) (int, error) {
18+
deployKeys, err := db.Find[asymkey_model.DeployKey](ctx, asymkey_model.ListDeployKeysOptions{RepoID: repoID})
19+
if err != nil {
20+
return 0, fmt.Errorf("listDeployKeys: %w", err)
21+
}
22+
23+
if err := checkDeployPerm(ctx, doer, repoID, 0); err != nil {
24+
return 0, err
25+
}
26+
27+
for _, dKey := range deployKeys {
28+
if err := deleteDeployKeyFromDB(ctx, doer, dKey); err != nil {
29+
return 0, fmt.Errorf("deleteDeployKeys: %w", err)
30+
}
31+
}
32+
return len(deployKeys), nil
33+
}
34+
35+
// checkDeployPerm Check if user has access to delete this key.
36+
func checkDeployPerm(ctx context.Context, doer *user_model.User, repoID, keyID int64) error {
37+
if doer.IsAdmin {
38+
return nil
39+
}
40+
repo, err := repo_model.GetRepositoryByID(ctx, repoID)
41+
if err != nil {
42+
return fmt.Errorf("GetRepositoryByID: %w", err)
43+
}
44+
has, err := access_model.IsUserRepoAdmin(ctx, repo, doer)
45+
if err != nil {
46+
return fmt.Errorf("IsUserRepoAdmin: %w", err)
47+
} else if !has {
48+
return asymkey_model.ErrKeyAccessDenied{
49+
UserID: doer.ID,
50+
RepoID: repoID,
51+
KeyID: keyID,
52+
Note: "deploy",
53+
}
54+
}
55+
return nil
56+
}
57+
58+
// deleteDeployKeyFromDB delete deploy keys from database
59+
func deleteDeployKeyFromDB(ctx context.Context, doer *user_model.User, key *asymkey_model.DeployKey) error {
60+
if _, err := db.DeleteByID[asymkey_model.DeployKey](ctx, key.ID); err != nil {
61+
return fmt.Errorf("delete deploy key [%d]: %w", key.ID, err)
62+
}
63+
64+
// Check if this is the last reference to same key content.
65+
has, err := asymkey_model.IsDeployKeyExistByKeyID(ctx, key.KeyID)
66+
if err != nil {
67+
return err
68+
} else if !has {
69+
if _, err = db.DeleteByID[asymkey_model.PublicKey](ctx, key.KeyID); err != nil {
70+
return err
71+
}
72+
}
73+
74+
return nil
75+
}
76+
1477
// DeleteDeployKey deletes deploy key from its repository authorized_keys file if needed.
1578
func DeleteDeployKey(ctx context.Context, doer *user_model.User, id int64) error {
1679
dbCtx, committer, err := db.TxContext(ctx)
@@ -19,7 +82,19 @@ func DeleteDeployKey(ctx context.Context, doer *user_model.User, id int64) error
1982
}
2083
defer committer.Close()
2184

22-
if err := models.DeleteDeployKey(dbCtx, doer, id); err != nil {
85+
key, err := asymkey_model.GetDeployKeyByID(ctx, id)
86+
if err != nil {
87+
if asymkey_model.IsErrDeployKeyNotExist(err) {
88+
return nil
89+
}
90+
return fmt.Errorf("GetDeployKeyByID: %w", err)
91+
}
92+
93+
if err := checkDeployPerm(ctx, doer, key.RepoID, key.ID); err != nil {
94+
return err
95+
}
96+
97+
if err := deleteDeployKeyFromDB(dbCtx, doer, key); err != nil {
2398
return err
2499
}
25100
if err := committer.Commit(); err != nil {

services/repository/delete.go

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,9 @@ import (
77
"context"
88
"fmt"
99

10-
"code.gitea.io/gitea/models"
1110
actions_model "code.gitea.io/gitea/models/actions"
1211
activities_model "code.gitea.io/gitea/models/activities"
1312
admin_model "code.gitea.io/gitea/models/admin"
14-
asymkey_model "code.gitea.io/gitea/models/asymkey"
1513
"code.gitea.io/gitea/models/db"
1614
git_model "code.gitea.io/gitea/models/git"
1715
issues_model "code.gitea.io/gitea/models/issues"
@@ -76,16 +74,11 @@ func DeleteRepositoryDirectly(ctx context.Context, doer *user_model.User, repoID
7674
}
7775

7876
// Delete Deploy Keys
79-
deployKeys, err := db.Find[asymkey_model.DeployKey](ctx, asymkey_model.ListDeployKeysOptions{RepoID: repoID})
77+
deleted, err := asymkey_service.DeleteRepoDeployKeys(ctx, doer, repoID)
8078
if err != nil {
81-
return fmt.Errorf("listDeployKeys: %w", err)
82-
}
83-
needRewriteKeysFile := len(deployKeys) > 0
84-
for _, dKey := range deployKeys {
85-
if err := models.DeleteDeployKey(ctx, doer, dKey.ID); err != nil {
86-
return fmt.Errorf("deleteDeployKeys: %w", err)
87-
}
79+
return err
8880
}
81+
needRewriteKeysFile := deleted > 0
8982

9083
if cnt, err := sess.ID(repoID).Delete(&repo_model.Repository{}); err != nil {
9184
return err

0 commit comments

Comments
 (0)