@@ -5,21 +5,69 @@ package asymkey
5
5
6
6
import (
7
7
"context"
8
+ "fmt"
8
9
9
- "code.gitea.io/gitea/models"
10
+ asymkey_model "code.gitea.io/gitea/models/asymkey "
10
11
"code.gitea.io/gitea/models/db"
11
- user_model "code.gitea.io/gitea/models/user "
12
+ repo_model "code.gitea.io/gitea/models/repo "
12
13
)
13
14
15
+ // DeleteRepoDeployKeys deletes all deploy keys of a repository. permissions check should be done outside
16
+ func DeleteRepoDeployKeys (ctx context.Context , repoID int64 ) (int , error ) {
17
+ deployKeys , err := db .Find [asymkey_model.DeployKey ](ctx , asymkey_model.ListDeployKeysOptions {RepoID : repoID })
18
+ if err != nil {
19
+ return 0 , fmt .Errorf ("listDeployKeys: %w" , err )
20
+ }
21
+
22
+ for _ , dKey := range deployKeys {
23
+ if err := deleteDeployKeyFromDB (ctx , dKey ); err != nil {
24
+ return 0 , fmt .Errorf ("deleteDeployKeys: %w" , err )
25
+ }
26
+ }
27
+ return len (deployKeys ), nil
28
+ }
29
+
30
+ // deleteDeployKeyFromDB delete deploy keys from database
31
+ func deleteDeployKeyFromDB (ctx context.Context , key * asymkey_model.DeployKey ) error {
32
+ if _ , err := db .DeleteByID [asymkey_model.DeployKey ](ctx , key .ID ); err != nil {
33
+ return fmt .Errorf ("delete deploy key [%d]: %w" , key .ID , err )
34
+ }
35
+
36
+ // Check if this is the last reference to same key content.
37
+ has , err := asymkey_model .IsDeployKeyExistByKeyID (ctx , key .KeyID )
38
+ if err != nil {
39
+ return err
40
+ } else if ! has {
41
+ if _ , err = db .DeleteByID [asymkey_model.PublicKey ](ctx , key .KeyID ); err != nil {
42
+ return err
43
+ }
44
+ }
45
+
46
+ return nil
47
+ }
48
+
14
49
// DeleteDeployKey deletes deploy key from its repository authorized_keys file if needed.
15
- func DeleteDeployKey (ctx context.Context , doer * user_model.User , id int64 ) error {
50
+ // Permissions check should be done outside.
51
+ func DeleteDeployKey (ctx context.Context , repo * repo_model.Repository , id int64 ) error {
16
52
dbCtx , committer , err := db .TxContext (ctx )
17
53
if err != nil {
18
54
return err
19
55
}
20
56
defer committer .Close ()
21
57
22
- if err := models .DeleteDeployKey (dbCtx , doer , id ); err != nil {
58
+ key , err := asymkey_model .GetDeployKeyByID (ctx , id )
59
+ if err != nil {
60
+ if asymkey_model .IsErrDeployKeyNotExist (err ) {
61
+ return nil
62
+ }
63
+ return fmt .Errorf ("GetDeployKeyByID: %w" , err )
64
+ }
65
+
66
+ if key .RepoID != repo .ID {
67
+ return fmt .Errorf ("deploy key %d does not belong to repository %d" , id , repo .ID )
68
+ }
69
+
70
+ if err := deleteDeployKeyFromDB (dbCtx , key ); err != nil {
23
71
return err
24
72
}
25
73
if err := committer .Commit (); err != nil {
0 commit comments