gitea源码

deploy_key.go 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package asymkey
  4. import (
  5. "context"
  6. "fmt"
  7. asymkey_model "code.gitea.io/gitea/models/asymkey"
  8. "code.gitea.io/gitea/models/db"
  9. repo_model "code.gitea.io/gitea/models/repo"
  10. )
  11. // DeleteRepoDeployKeys deletes all deploy keys of a repository. permissions check should be done outside
  12. func DeleteRepoDeployKeys(ctx context.Context, repoID int64) (int, error) {
  13. deployKeys, err := db.Find[asymkey_model.DeployKey](ctx, asymkey_model.ListDeployKeysOptions{RepoID: repoID})
  14. if err != nil {
  15. return 0, fmt.Errorf("listDeployKeys: %w", err)
  16. }
  17. for _, dKey := range deployKeys {
  18. if err := deleteDeployKeyFromDB(ctx, dKey); err != nil {
  19. return 0, fmt.Errorf("deleteDeployKeys: %w", err)
  20. }
  21. }
  22. return len(deployKeys), nil
  23. }
  24. // deleteDeployKeyFromDB delete deploy keys from database
  25. func deleteDeployKeyFromDB(ctx context.Context, key *asymkey_model.DeployKey) error {
  26. if _, err := db.DeleteByID[asymkey_model.DeployKey](ctx, key.ID); err != nil {
  27. return fmt.Errorf("delete deploy key [%d]: %w", key.ID, err)
  28. }
  29. // Check if this is the last reference to same key content.
  30. has, err := asymkey_model.IsDeployKeyExistByKeyID(ctx, key.KeyID)
  31. if err != nil {
  32. return err
  33. } else if !has {
  34. if _, err = db.DeleteByID[asymkey_model.PublicKey](ctx, key.KeyID); err != nil {
  35. return err
  36. }
  37. }
  38. return nil
  39. }
  40. // DeleteDeployKey deletes deploy key from its repository authorized_keys file if needed.
  41. // Permissions check should be done outside.
  42. func DeleteDeployKey(ctx context.Context, repo *repo_model.Repository, id int64) error {
  43. if err := db.WithTx(ctx, func(ctx context.Context) error {
  44. key, err := asymkey_model.GetDeployKeyByID(ctx, id)
  45. if err != nil {
  46. if asymkey_model.IsErrDeployKeyNotExist(err) {
  47. return nil
  48. }
  49. return fmt.Errorf("GetDeployKeyByID: %w", err)
  50. }
  51. if key.RepoID != repo.ID {
  52. return fmt.Errorf("deploy key %d does not belong to repository %d", id, repo.ID)
  53. }
  54. return deleteDeployKeyFromDB(ctx, key)
  55. }); err != nil {
  56. return err
  57. }
  58. return RewriteAllPublicKeys(ctx)
  59. }