@@ -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