Files
podstalk/docs/specs/2026-08-19-allow-signup-env-design.md
T
jbrechtel d4d552b3f4
Build and Deploy / build-and-deploy (push) Successful in 1m44s
Fix sign-in page to show Sign Up link only when sign-up is enabled
2026-08-19 10:22:09 -04:00

64 lines
2.1 KiB
Markdown

# Allow Sign-Up Via Environment Variable
Date: 2026-08-19
Status: Draft
## Summary
Replace the current "count of users" check that gates sign-up with a
single environment variable. This lets an operator explicitly control
whether public sign-up is available, instead of Podstalk inferring it
from how many users already exist.
## Motivation
Today `ServeSignup` disables sign-up once a user already exists
(`store.UserCount() > 0`). That is implicit and easy to get wrong: the
first user must register before anyone can log in, and once that happens
no one can ever register again. Controlling this with an explicit
environment variable is predictable and self-documenting.
## Behavior
New environment variable: `PODSTALK_ALLOW_SIGNUP`.
- Unset or any falsy value (`false`, `0`, `no`, `off`): sign-up **disabled**.
- Truthy value (`true`, `1`, `yes`, `on`): sign-up **enabled**.
Default (unset) is **disabled**.
## Changes
### `main.go`
Read `PODSTALK_ALLOW_SIGNUP` from the environment and resolve it with a
truthy-value parser. Set the resulting boolean on the `AuthHandler`.
### `handler/auth.go`
- Add an `AllowSignup bool` field to `AuthHandler`.
- `ServeSignup`: redirect to `/signin` when `!AllowSignup` (replaces the
`UserCount() > 0` check).
- Replace the `hasUsers()` helper (driven by user count) with a check on
`AllowSignup`, so the Sign In page shows/ hides the "Sign Up" nav link
based on whether sign-up is enabled. The sign-in template passes
`AllowSignup` and renders the link with `{{if .AllowSignup}}`.
### Unchanged
`store.UserCount()` remains in the store package. It is no longer used by
authentication but is left in place as a general utility.
## Out of Scope
- No admin/user-management UI to invite specific users.
- No change to the existing `adduser` CLI command (operator provisioning
still works regardless of the sign-up toggle).
- No change to sign-in/sign-out behavior.
## Testing
- `scripts/build` passes (gofmt, go vet, go build, docker build).
- Manual verification is limited by the sandbox; behavior relies on the
straightforward boolean branch and the truthy parser.