Skip to content

fix: make verified admin email an opt-in policy - #18

Merged
linkdata merged 3 commits into
mainfrom
fix/6-admin-email-policy
Oct 5, 2026
Merged

linkdata merged 3 commits into
mainfrom
fix/6-admin-email-policy

Conversation

@linkdata

@linkdata linkdata commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Adds Server.RequireVerifiedAdminEmail as an opt-in policy for non-empty admin allowlists. HTTP admin gates and JawsAuth.IsAdmin require a verified standard email claim when enabled. The default preserves provider-trusting behavior; the docs explain its limits, including Microsoft's guidance against using Entra email claims for authorization. Ordinary login and empty-list behavior remain unchanged.

Email parsing uses Go's net/mail.ParseAddress. Parsed session addresses are not parsed again, preserving literal characters in quoted local parts. Matching ignores ASCII case and preserves non-ASCII characters. UserInfo fallback requires a matching non-empty subject; verification transfers to an existing email only when the raw email claims match exactly, including case and whitespace. Session email and verification writes share the admin-check lock during refresh and logout.

Validation: go test -race ./..., go vet ./..., go build ./..., golangci-lint run, staticcheck ./..., and gosec ./... passed from both module roots. Tests cover quoted addresses, ASCII/Unicode distinctions, exact claim pairing, default and strict policies, and concurrent session updates. The final PR 17 redirect-limit commit is included, keeping code and docs at 8192 bytes.

Closes #6

@linkdata
linkdata changed the base branch from fix/12-login-redirects to main October 5, 2026 07:14
@linkdata
linkdata merged commit 1d37283 into main Oct 5, 2026
3 checks passed
@linkdata
linkdata deleted the fix/6-admin-email-policy branch October 5, 2026 10:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Admin gate trusts unverified (and Unicode-folded) email claims

1 participant