Skip to content

Commit 4b9f9f3

Browse files
committed
delete deploy keys on deletion of repository
1 parent f29d916 commit 4b9f9f3

File tree

2 files changed

+49
-14
lines changed

2 files changed

+49
-14
lines changed

models/repo.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1756,6 +1756,17 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
17561756
return ErrRepoNotExist{repoID, uid, "", ""}
17571757
}
17581758

1759+
// Delete Deploy Keys
1760+
deployKeys, err := listDeployKeys(sess, repo.ID)
1761+
if err != nil {
1762+
return fmt.Errorf("listDeployKeys: %v", err)
1763+
}
1764+
for _, dKey := range deployKeys {
1765+
if err := deleteDeployKey(sess, doer, dKey.ID); err != nil {
1766+
return fmt.Errorf("deleteDeployKeys: %v", err)
1767+
}
1768+
}
1769+
17591770
if cnt, err := sess.ID(repoID).Delete(&Repository{}); err != nil {
17601771
return err
17611772
} else if cnt != 1 {
@@ -1898,6 +1909,12 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
18981909
}
18991910

19001911
if err = sess.Commit(); err != nil {
1912+
if len(deployKeys) > 0 {
1913+
// We need to rewrite the public keys because the commit failed
1914+
if err2 := RewriteAllPublicKeys(); err2 != nil {
1915+
return fmt.Errorf("Commit: %v SSH Keys: %v", err, err2)
1916+
}
1917+
}
19011918
return fmt.Errorf("Commit: %v", err)
19021919
}
19031920

models/ssh_key.go

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ func UpdatePublicKeyUpdated(id int64) error {
518518
}
519519

520520
// deletePublicKeys does the actual key deletion but does not update authorized_keys file.
521-
func deletePublicKeys(e *xorm.Session, keyIDs ...int64) error {
521+
func deletePublicKeys(e Engine, keyIDs ...int64) error {
522522
if len(keyIDs) == 0 {
523523
return nil
524524
}
@@ -766,8 +766,12 @@ func AddDeployKey(repoID int64, name, content string, readOnly bool) (*DeployKey
766766

767767
// GetDeployKeyByID returns deploy key by given ID.
768768
func GetDeployKeyByID(id int64) (*DeployKey, error) {
769+
return getDeployKeyByID(x, id)
770+
}
771+
772+
func getDeployKeyByID(e Engine, id int64) (*DeployKey, error) {
769773
key := new(DeployKey)
770-
has, err := x.ID(id).Get(key)
774+
has, err := e.ID(id).Get(key)
771775
if err != nil {
772776
return nil, err
773777
} else if !has {
@@ -778,11 +782,15 @@ func GetDeployKeyByID(id int64) (*DeployKey, error) {
778782

779783
// GetDeployKeyByRepo returns deploy key by given public key ID and repository ID.
780784
func GetDeployKeyByRepo(keyID, repoID int64) (*DeployKey, error) {
785+
return getDeployKeyByRepo(x, keyID, repoID)
786+
}
787+
788+
func getDeployKeyByRepo(e Engine, keyID, repoID int64) (*DeployKey, error) {
781789
key := &DeployKey{
782790
KeyID: keyID,
783791
RepoID: repoID,
784792
}
785-
has, err := x.Get(key)
793+
has, err := e.Get(key)
786794
if err != nil {
787795
return nil, err
788796
} else if !has {
@@ -805,7 +813,19 @@ func UpdateDeployKey(key *DeployKey) error {
805813

806814
// DeleteDeployKey deletes deploy key from its repository authorized_keys file if needed.
807815
func DeleteDeployKey(doer *User, id int64) error {
808-
key, err := GetDeployKeyByID(id)
816+
sess := x.NewSession()
817+
defer sess.Close()
818+
if err := sess.Begin(); err != nil {
819+
return err
820+
}
821+
if err := deleteDeployKey(sess, doer, id); err != nil {
822+
return err
823+
}
824+
return sess.Commit()
825+
}
826+
827+
func deleteDeployKey(sess Engine, doer *User, id int64) error {
828+
key, err := getDeployKeyByID(sess, id)
809829
if err != nil {
810830
if IsErrDeployKeyNotExist(err) {
811831
return nil
@@ -815,24 +835,18 @@ func DeleteDeployKey(doer *User, id int64) error {
815835

816836
// Check if user has access to delete this key.
817837
if !doer.IsAdmin {
818-
repo, err := GetRepositoryByID(key.RepoID)
838+
repo, err := getRepositoryByID(sess, key.RepoID)
819839
if err != nil {
820840
return fmt.Errorf("GetRepositoryByID: %v", err)
821841
}
822-
has, err := IsUserRepoAdmin(repo, doer)
842+
has, err := isUserRepoAdmin(sess, repo, doer)
823843
if err != nil {
824844
return fmt.Errorf("GetUserRepoPermission: %v", err)
825845
} else if !has {
826846
return ErrKeyAccessDenied{doer.ID, key.ID, "deploy"}
827847
}
828848
}
829849

830-
sess := x.NewSession()
831-
defer sess.Close()
832-
if err = sess.Begin(); err != nil {
833-
return err
834-
}
835-
836850
if _, err = sess.ID(key.ID).Delete(new(DeployKey)); err != nil {
837851
return fmt.Errorf("delete deploy key [%d]: %v", key.ID, err)
838852
}
@@ -854,13 +868,17 @@ func DeleteDeployKey(doer *User, id int64) error {
854868
}
855869
}
856870

857-
return sess.Commit()
871+
return nil
858872
}
859873

860874
// ListDeployKeys returns all deploy keys by given repository ID.
861875
func ListDeployKeys(repoID int64) ([]*DeployKey, error) {
876+
return listDeployKeys(x, repoID)
877+
}
878+
879+
func listDeployKeys(e Engine, repoID int64) ([]*DeployKey, error) {
862880
keys := make([]*DeployKey, 0, 5)
863-
return keys, x.
881+
return keys, e.
864882
Where("repo_id = ?", repoID).
865883
Find(&keys)
866884
}

0 commit comments

Comments
 (0)