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