1
0
mirror of https://github.com/go-gitea/gitea.git synced 2025-04-18 00:47:48 -04:00

feat: generate token for task

This commit is contained in:
Jason Song 2022-10-31 14:45:39 +08:00
parent 30df383ca0
commit b4b22e78ad
2 changed files with 37 additions and 6 deletions

View File

@ -12,13 +12,17 @@ import (
"fmt"
"io"
auth_model "code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/bots"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/timeutil"
"code.gitea.io/gitea/modules/util"
runnerv1 "gitea.com/gitea/proto-go/runner/v1"
"xorm.io/builder"
gouuid "github.com/google/uuid"
"github.com/nektos/act/pkg/jobparser"
)
@ -35,6 +39,11 @@ type Task struct {
Started timeutil.TimeStamp
Stopped timeutil.TimeStamp
Token string `xorm:"-"`
TokenHash string `xorm:"UNIQUE"` // sha256 of token
TokenSalt string
TokenLastEight string `xorm:"token_last_eight"`
LogFilename string // file name of log
LogInStorage bool // read log from database or from storage
LogLength int64 // lines count
@ -139,6 +148,18 @@ func (task *Task) FullSteps() []*TaskStep {
return steps
}
func (task *Task) GenerateToken() error {
salt, err := util.CryptoRandomString(10)
if err != nil {
return err
}
task.TokenSalt = salt
task.Token = base.EncodeSha1(gouuid.New().String())
task.TokenHash = auth_model.HashToken(task.Token, task.TokenSalt)
task.TokenLastEight = task.Token[len(task.Token)-8:]
return nil
}
type LogIndexes []int64
func (i *LogIndexes) FromDB(b []byte) error {
@ -240,14 +261,17 @@ func CreateTaskForRunner(ctx context.Context, runner *Runner) (*Task, bool, erro
Started: now,
Status: StatusRunning,
}
if err := task.GenerateToken(); err != nil {
return nil, false, err
}
var wolkflowJob *jobparser.Job
var workflowJob *jobparser.Job
if gots, err := jobparser.Parse(job.WorkflowPayload); err != nil {
return nil, false, fmt.Errorf("parse workflow of job %d: %w", job.ID, err)
} else if len(gots) != 1 {
return nil, false, fmt.Errorf("workflow of job %d: not signle workflow", job.ID)
} else {
_, wolkflowJob = gots[0].Job()
_, workflowJob = gots[0].Job()
}
if _, err := e.Insert(task); err != nil {
@ -259,8 +283,8 @@ func CreateTaskForRunner(ctx context.Context, runner *Runner) (*Task, bool, erro
return nil, false, err
}
steps := make([]*TaskStep, len(wolkflowJob.Steps))
for i, v := range wolkflowJob.Steps {
steps := make([]*TaskStep, len(workflowJob.Steps))
for i, v := range workflowJob.Steps {
steps[i] = &TaskStep{
Name: v.String(),
TaskID: task.ID,

View File

@ -294,16 +294,23 @@ func pickTask(ctx context.Context, runner *bots_model.Runner) (*runnerv1.Task, b
"ref_type": "",
"head_ref": "",
"base_ref": "",
"token": "",
"token": t.Token,
"repository_owner": fmt.Sprint(t.Job.Run.Repo.OwnerName),
"retention_days": "",
})
secrets := getSecretsOfTask(ctx, t)
if _, ok := secrets["GITHUB_TOKEN"]; !ok {
secrets["GITHUB_TOKEN"] = t.Token
}
if _, ok := secrets["GITEA_TOKEN"]; !ok {
secrets["GITEA_TOKEN"] = t.Token
}
task := &runnerv1.Task{
Id: t.ID,
WorkflowPayload: t.Job.WorkflowPayload,
Context: taskContext,
Secrets: getSecretsOfTask(ctx, t),
Secrets: secrets,
}
return task, true, nil
}