(hookTargetType, signature string, forgeType params.EndpointType, jobData []byte)
| 833 | } |
| 834 | |
| 835 | func (r *Runner) DispatchWorkflowJob(hookTargetType, signature string, forgeType params.EndpointType, jobData []byte) error { |
| 836 | if len(jobData) == 0 { |
| 837 | slog.ErrorContext(r.ctx, "missing job data") |
| 838 | return runnerErrors.NewBadRequestError("missing job data") |
| 839 | } |
| 840 | |
| 841 | var job params.WorkflowJob |
| 842 | if err := json.Unmarshal(jobData, &job); err != nil { |
| 843 | slog.ErrorContext(r.ctx, "failed to unmarshal job data", "error", err) |
| 844 | return fmt.Errorf("invalid job data %s: %w", err, runnerErrors.ErrBadRequest) |
| 845 | } |
| 846 | |
| 847 | endpoint, err := r.findEndpointForJob(job, forgeType) |
| 848 | if err != nil { |
| 849 | slog.ErrorContext(r.ctx, "failed to find endpoint for job", "error", err) |
| 850 | return fmt.Errorf("error finding endpoint for job: %w", err) |
| 851 | } |
| 852 | |
| 853 | var poolManager common.PoolManager |
| 854 | |
| 855 | switch HookTargetType(hookTargetType) { |
| 856 | case RepoHook: |
| 857 | slog.DebugContext( |
| 858 | r.ctx, "got hook for repo", |
| 859 | "repo_owner", util.SanitizeLogEntry(job.Repository.Owner.Login), |
| 860 | "repo_name", util.SanitizeLogEntry(job.Repository.Name), |
| 861 | "endpoint", endpoint.Name) |
| 862 | poolManager, err = r.findRepoPoolManager(job.Repository.Owner.Login, job.Repository.Name, endpoint.Name) |
| 863 | case OrganizationHook: |
| 864 | slog.DebugContext( |
| 865 | r.ctx, "got hook for organization", |
| 866 | "organization", util.SanitizeLogEntry(job.GetOrgName(forgeType)), |
| 867 | "endpoint", endpoint.Name) |
| 868 | poolManager, err = r.findOrgPoolManager(job.GetOrgName(forgeType), endpoint.Name) |
| 869 | case EnterpriseHook: |
| 870 | slog.DebugContext( |
| 871 | r.ctx, "got hook for enterprise", |
| 872 | "enterprise", util.SanitizeLogEntry(job.Enterprise.Slug), |
| 873 | "endpoint", endpoint.Name) |
| 874 | poolManager, err = r.findEnterprisePoolManager(job.Enterprise.Slug, endpoint.Name) |
| 875 | default: |
| 876 | return runnerErrors.NewBadRequestError("cannot handle hook target type %s", hookTargetType) |
| 877 | } |
| 878 | |
| 879 | slog.DebugContext(r.ctx, "found pool manager", "pool_manager", poolManager.ID()) |
| 880 | if err != nil { |
| 881 | slog.ErrorContext(r.ctx, "failed to find pool manager", "error", err, "hook_target_type", hookTargetType) |
| 882 | // We don't have a repository or organization configured that |
| 883 | // can handle this workflow job. |
| 884 | return fmt.Errorf("error fetching poolManager: %w", err) |
| 885 | } |
| 886 | |
| 887 | // We found a pool. Validate the webhook job. If a secret is configured, |
| 888 | // we make sure that the source of this workflow job is valid. |
| 889 | secret := poolManager.WebhookSecret() |
| 890 | if err := r.validateHookBody(signature, secret, jobData); err != nil { |
| 891 | slog.ErrorContext(r.ctx, "failed to validate webhook data", "error", err) |
| 892 | return fmt.Errorf("error validating webhook data: %w", err) |
no test coverage detected