code.gitea.io/gitea@v1.21.7/models/actions/runner_token.go (about)

     1  // Copyright 2022 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package actions
     5  
     6  import (
     7  	"context"
     8  	"fmt"
     9  
    10  	"code.gitea.io/gitea/models/db"
    11  	repo_model "code.gitea.io/gitea/models/repo"
    12  	user_model "code.gitea.io/gitea/models/user"
    13  	"code.gitea.io/gitea/modules/timeutil"
    14  	"code.gitea.io/gitea/modules/util"
    15  )
    16  
    17  // ActionRunnerToken represents runner tokens
    18  type ActionRunnerToken struct {
    19  	ID       int64
    20  	Token    string                 `xorm:"UNIQUE"`
    21  	OwnerID  int64                  `xorm:"index"` // org level runner, 0 means system
    22  	Owner    *user_model.User       `xorm:"-"`
    23  	RepoID   int64                  `xorm:"index"` // repo level runner, if orgid also is zero, then it's a global
    24  	Repo     *repo_model.Repository `xorm:"-"`
    25  	IsActive bool                   // true means it can be used
    26  
    27  	Created timeutil.TimeStamp `xorm:"created"`
    28  	Updated timeutil.TimeStamp `xorm:"updated"`
    29  	Deleted timeutil.TimeStamp `xorm:"deleted"`
    30  }
    31  
    32  func init() {
    33  	db.RegisterModel(new(ActionRunnerToken))
    34  }
    35  
    36  // GetRunnerToken returns a action runner via token
    37  func GetRunnerToken(ctx context.Context, token string) (*ActionRunnerToken, error) {
    38  	var runnerToken ActionRunnerToken
    39  	has, err := db.GetEngine(ctx).Where("token=?", token).Get(&runnerToken)
    40  	if err != nil {
    41  		return nil, err
    42  	} else if !has {
    43  		return nil, fmt.Errorf("runner token %q: %w", token, util.ErrNotExist)
    44  	}
    45  	return &runnerToken, nil
    46  }
    47  
    48  // UpdateRunnerToken updates runner token information.
    49  func UpdateRunnerToken(ctx context.Context, r *ActionRunnerToken, cols ...string) (err error) {
    50  	e := db.GetEngine(ctx)
    51  
    52  	if len(cols) == 0 {
    53  		_, err = e.ID(r.ID).AllCols().Update(r)
    54  	} else {
    55  		_, err = e.ID(r.ID).Cols(cols...).Update(r)
    56  	}
    57  	return err
    58  }
    59  
    60  // NewRunnerToken creates a new active runner token and invalidate all old tokens
    61  func NewRunnerToken(ctx context.Context, ownerID, repoID int64) (*ActionRunnerToken, error) {
    62  	token, err := util.CryptoRandomString(40)
    63  	if err != nil {
    64  		return nil, err
    65  	}
    66  	runnerToken := &ActionRunnerToken{
    67  		OwnerID:  ownerID,
    68  		RepoID:   repoID,
    69  		IsActive: true,
    70  		Token:    token,
    71  	}
    72  
    73  	return runnerToken, db.WithTx(ctx, func(ctx context.Context) error {
    74  		if _, err := db.GetEngine(ctx).Where("owner_id =? AND repo_id = ?", ownerID, repoID).Cols("is_active").Update(&ActionRunnerToken{
    75  			IsActive: false,
    76  		}); err != nil {
    77  			return err
    78  		}
    79  
    80  		_, err = db.GetEngine(ctx).Insert(runnerToken)
    81  		return err
    82  	})
    83  }
    84  
    85  // GetLastestRunnerToken returns the latest runner token
    86  func GetLastestRunnerToken(ctx context.Context, ownerID, repoID int64) (*ActionRunnerToken, error) {
    87  	var runnerToken ActionRunnerToken
    88  	has, err := db.GetEngine(ctx).Where("owner_id=? AND repo_id=?", ownerID, repoID).
    89  		OrderBy("id DESC").Get(&runnerToken)
    90  	if err != nil {
    91  		return nil, err
    92  	} else if !has {
    93  		return nil, fmt.Errorf("runner token: %w", util.ErrNotExist)
    94  	}
    95  	return &runnerToken, nil
    96  }