@@ -5,12 +5,75 @@ package asymkey
55
66import (
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.
1578func 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 {
0 commit comments