gitea源码

variables.go 2.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // Copyright 2024 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package actions
  4. import (
  5. "context"
  6. "regexp"
  7. actions_model "code.gitea.io/gitea/models/actions"
  8. "code.gitea.io/gitea/modules/log"
  9. "code.gitea.io/gitea/modules/util"
  10. secret_service "code.gitea.io/gitea/services/secrets"
  11. )
  12. func CreateVariable(ctx context.Context, ownerID, repoID int64, name, data, description string) (*actions_model.ActionVariable, error) {
  13. if err := secret_service.ValidateName(name); err != nil {
  14. return nil, err
  15. }
  16. if err := envNameCIRegexMatch(name); err != nil {
  17. return nil, err
  18. }
  19. v, err := actions_model.InsertVariable(ctx, ownerID, repoID, name, util.ReserveLineBreakForTextarea(data), description)
  20. if err != nil {
  21. return nil, err
  22. }
  23. return v, nil
  24. }
  25. func UpdateVariableNameData(ctx context.Context, variable *actions_model.ActionVariable) (bool, error) {
  26. if err := secret_service.ValidateName(variable.Name); err != nil {
  27. return false, err
  28. }
  29. if err := envNameCIRegexMatch(variable.Name); err != nil {
  30. return false, err
  31. }
  32. variable.Data = util.ReserveLineBreakForTextarea(variable.Data)
  33. return actions_model.UpdateVariableCols(ctx, variable, "name", "data", "description")
  34. }
  35. func DeleteVariableByID(ctx context.Context, variableID int64) error {
  36. return actions_model.DeleteVariable(ctx, variableID)
  37. }
  38. func DeleteVariableByName(ctx context.Context, ownerID, repoID int64, name string) error {
  39. if err := secret_service.ValidateName(name); err != nil {
  40. return err
  41. }
  42. if err := envNameCIRegexMatch(name); err != nil {
  43. return err
  44. }
  45. v, err := GetVariable(ctx, actions_model.FindVariablesOpts{
  46. OwnerID: ownerID,
  47. RepoID: repoID,
  48. Name: name,
  49. })
  50. if err != nil {
  51. return err
  52. }
  53. return actions_model.DeleteVariable(ctx, v.ID)
  54. }
  55. func GetVariable(ctx context.Context, opts actions_model.FindVariablesOpts) (*actions_model.ActionVariable, error) {
  56. vars, err := actions_model.FindVariables(ctx, opts)
  57. if err != nil {
  58. return nil, err
  59. }
  60. if len(vars) != 1 {
  61. return nil, util.NewNotExistErrorf("variable not found")
  62. }
  63. return vars[0], nil
  64. }
  65. // some regular expression of `variables` and `secrets`
  66. // reference to:
  67. // https://docs.github.com/en/actions/learn-github-actions/variables#naming-conventions-for-configuration-variables
  68. // https://docs.github.com/en/actions/security-guides/encrypted-secrets#naming-your-secrets
  69. var (
  70. forbiddenEnvNameCIRx = regexp.MustCompile("(?i)^CI")
  71. )
  72. func envNameCIRegexMatch(name string) error {
  73. if forbiddenEnvNameCIRx.MatchString(name) {
  74. log.Error("Env Name cannot be ci")
  75. return util.NewInvalidArgumentErrorf("env name cannot be ci")
  76. }
  77. return nil
  78. }