@@ -5,21 +5,69 @@ 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"
11- user_model "code.gitea.io/gitea/models/user "
12+ repo_model "code.gitea.io/gitea/models/repo "
1213)
1314
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+
1449// 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 {
1652 dbCtx , committer , err := db .TxContext (ctx )
1753 if err != nil {
1854 return err
1955 }
2056 defer committer .Close ()
2157
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 {
2371 return err
2472 }
2573 if err := committer .Commit (); err != nil {
0 commit comments