Phase 1 foundation. Local auth per ADR-0006: Argon2id passwords, opaque hashed session tokens with idle/absolute expiry, CSRF token plus Origin check on cookie sessions, per-IP token bucket and per-account exponential lockout, three roles enforced by middleware, personal API tokens for noemactl. Audit log writer used by every admin mutation. API: request ids, panic recovery, strict CSP and security headers, body limits, single JSON error envelope, health/ready/status, users, sessions, tokens, audit, token-protected /metrics. UI: embedded html/template pages (login, first-run setup, dashboard, system, users, account, audit, interpretation boundary), light/dark theme, dependency-free app.js with CSRF-aware fetch and SSE helper. Binaries: noemad with graceful shutdown, migrations at start, bootstrap admin from environment, supervised background tasks; noemactl with status, migrate, user create and meaningful exit codes.
23 lines
737 B
Go
23 lines
737 B
Go
package auth
|
|
|
|
// Role is a coarse permission level. Higher roles include lower ones.
|
|
type Role string
|
|
|
|
// Roles in ascending order of privilege.
|
|
const (
|
|
RoleObserver Role = "observer"
|
|
RoleOperator Role = "operator"
|
|
RoleAdministrator Role = "administrator"
|
|
)
|
|
|
|
var roleRank = map[Role]int{RoleObserver: 1, RoleOperator: 2, RoleAdministrator: 3}
|
|
|
|
// Valid reports whether r is a known role.
|
|
func (r Role) Valid() bool { return roleRank[r] > 0 }
|
|
|
|
// AtLeast reports whether r grants everything min grants.
|
|
func (r Role) AtLeast(min Role) bool { return roleRank[r] >= roleRank[min] }
|
|
|
|
// AllRoles lists valid roles for forms and validation.
|
|
func AllRoles() []Role { return []Role{RoleObserver, RoleOperator, RoleAdministrator} }
|