coordinator / test (push) Canceled after 0s
python / test (push) Canceled after 0s
release / binaries (amd64, darwin) (push) Canceled after 0s
release / binaries (amd64, linux) (push) Canceled after 0s
release / binaries (amd64, windows) (push) Canceled after 0s
release / binaries (arm64, darwin) (push) Canceled after 0s
release / binaries (arm64, linux) (push) Canceled after 0s
release / binaries (arm64, windows) (push) Canceled after 0s
release / image (push) Canceled after 0s
users / test (push) Canceled after 0s
release / release (push) Canceled after 0s
40 lines
1.2 KiB
Go
40 lines
1.2 KiB
Go
package usecase
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
"github.com/emil28092005/SciMesh/coordinator/internal/authctx"
|
|
"github.com/emil28092005/SciMesh/coordinator/internal/domain"
|
|
)
|
|
|
|
// ownerFromContext returns the authenticated user id to stamp on a new job, or
|
|
// nil when the request was not authenticated as a user — worker or legacy
|
|
// traffic, or user-JWT auth disabled. A nil owner is stored as NULL.
|
|
func ownerFromContext(ctx context.Context) *uuid.UUID {
|
|
if r, ok := authctx.From(ctx); ok {
|
|
id := r.UserID
|
|
return &id
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// authorizeJobAccess enforces that a non-admin user may only act on their own
|
|
// job. It returns ErrJobNotFound — not a 403 — on a mismatch, so the response
|
|
// never reveals that another user's job exists.
|
|
//
|
|
// Requests with no authenticated user (worker/legacy traffic, or JWT auth
|
|
// disabled) are not restricted here: the shared service token already gated
|
|
// them, and worker endpoints legitimately operate across all jobs.
|
|
func authorizeJobAccess(ctx context.Context, job *domain.Job) error {
|
|
r, ok := authctx.From(ctx)
|
|
if !ok || r.IsAdmin() {
|
|
return nil
|
|
}
|
|
if job.OwnerID == nil || *job.OwnerID != r.UserID {
|
|
return domain.ErrJobNotFound
|
|
}
|
|
return nil
|
|
}
|