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 }