708d983429
- internal/daemon/server.go: HTTP Server with lifecycle, logging middleware
- internal/daemon/health.go: /healthz (liveness), /readyz (db+ready), /v1/status
- internal/daemon/jobs_handler.go: GET /v1/jobs, /v1/jobs/{id}, /v1/jobs/{id}/tasks
- internal/daemon/nodes_handler.go: GET /v1/nodes
- internal/daemon/tasks_handler.go: GET /v1/tasks (with ?job_id and ?limit)
- internal/daemon/validate.go: input validation for path IDs
- internal/daemon/version.go: ldflags-friendly version var
- internal/store: added TaskRepo.ListRecent for unfiltered task listing
- internal/cli/daemon.go: CLI wiring with signal.NotifyContext shutdown
Personas: backend-engineer (handlers), cli-engineer (CLI wiring),
security-engineer (input validation, no secrets in access logs, slog JSON).
---ci---
project: orca
phase: 5
milestone: v0.1
status: execute
requirements:
covered: [REQ-006, REQ-017, REQ-019]
partial: []
---/ci---
29 lines
832 B
Go
29 lines
832 B
Go
package daemon
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
// idPattern constrains path IDs to a safe subset: alphanumerics, hyphens,
|
|
// and underscores. UUIDs and our internal IDs both fit. We reject anything
|
|
// that smells like a path-traversal, control character, or shell metachar.
|
|
var idPattern = regexp.MustCompile(`^[A-Za-z0-9_-]{1,128}$`)
|
|
|
|
// validateID checks that an ID is well-formed and within length limits.
|
|
// It exists primarily as a defense-in-depth measure against path traversal
|
|
// and accidental log-injection when the ID is echoed back in error messages.
|
|
func validateID(id string) error {
|
|
if id == "" {
|
|
return fmt.Errorf("id required")
|
|
}
|
|
if strings.ContainsAny(id, "\r\n\t\x00") {
|
|
return fmt.Errorf("invalid id")
|
|
}
|
|
if !idPattern.MatchString(id) {
|
|
return fmt.Errorf("invalid id format")
|
|
}
|
|
return nil
|
|
}
|