Harden runner updateTask and updateLog api (#32462)

Per proposal https://github.com/go-gitea/gitea/issues/32461
pull/32459/head^2
ChristopherHX 2 weeks ago committed by GitHub
parent a1892cf7e3
commit f888e45432
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 4
      models/actions/task.go
  2. 8
      routers/api/actions/runner/runner.go

@ -341,7 +341,7 @@ func UpdateTask(ctx context.Context, task *ActionTask, cols ...string) error {
// UpdateTaskByState updates the task by the state. // UpdateTaskByState updates the task by the state.
// It will always update the task if the state is not final, even there is no change. // It will always update the task if the state is not final, even there is no change.
// So it will update ActionTask.Updated to avoid the task being judged as a zombie task. // So it will update ActionTask.Updated to avoid the task being judged as a zombie task.
func UpdateTaskByState(ctx context.Context, state *runnerv1.TaskState) (*ActionTask, error) { func UpdateTaskByState(ctx context.Context, runnerID int64, state *runnerv1.TaskState) (*ActionTask, error) {
stepStates := map[int64]*runnerv1.StepState{} stepStates := map[int64]*runnerv1.StepState{}
for _, v := range state.Steps { for _, v := range state.Steps {
stepStates[v.Id] = v stepStates[v.Id] = v
@ -360,6 +360,8 @@ func UpdateTaskByState(ctx context.Context, state *runnerv1.TaskState) (*ActionT
return nil, err return nil, err
} else if !has { } else if !has {
return nil, util.ErrNotExist return nil, util.ErrNotExist
} else if runnerID != task.RunnerID {
return nil, fmt.Errorf("invalid runner for task")
} }
if task.Status.IsDone() { if task.Status.IsDone() {

@ -175,7 +175,9 @@ func (s *Service) UpdateTask(
ctx context.Context, ctx context.Context,
req *connect.Request[runnerv1.UpdateTaskRequest], req *connect.Request[runnerv1.UpdateTaskRequest],
) (*connect.Response[runnerv1.UpdateTaskResponse], error) { ) (*connect.Response[runnerv1.UpdateTaskResponse], error) {
task, err := actions_model.UpdateTaskByState(ctx, req.Msg.State) runner := GetRunner(ctx)
task, err := actions_model.UpdateTaskByState(ctx, runner.ID, req.Msg.State)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "update task: %v", err) return nil, status.Errorf(codes.Internal, "update task: %v", err)
} }
@ -237,11 +239,15 @@ func (s *Service) UpdateLog(
ctx context.Context, ctx context.Context,
req *connect.Request[runnerv1.UpdateLogRequest], req *connect.Request[runnerv1.UpdateLogRequest],
) (*connect.Response[runnerv1.UpdateLogResponse], error) { ) (*connect.Response[runnerv1.UpdateLogResponse], error) {
runner := GetRunner(ctx)
res := connect.NewResponse(&runnerv1.UpdateLogResponse{}) res := connect.NewResponse(&runnerv1.UpdateLogResponse{})
task, err := actions_model.GetTaskByID(ctx, req.Msg.TaskId) task, err := actions_model.GetTaskByID(ctx, req.Msg.TaskId)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Internal, "get task: %v", err) return nil, status.Errorf(codes.Internal, "get task: %v", err)
} else if runner.ID != task.RunnerID {
return nil, status.Errorf(codes.Internal, "invalid runner for task")
} }
ack := task.LogLength ack := task.LogLength

Loading…
Cancel
Save