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  }