Address code review findings across API, web and deployment
release gate / check (push) Failing after 6m43s
release gate / check (push) Failing after 6m43s
High severity: - wire TRUSTED_PROXY through Compose/deploy/docs and warn at web startup - bucket public rate limits on effective client IP, add per-bookmark budget, and forward the signed browser identity from the share page - disable first-run bootstrap in server deployments and document seeding - serialize last-admin demotion in one advisory-locked transaction Medium/low: - cap and batch share recipient inserts - add a shared outbound budget for preview/CardDAV/IMAP/signal work - pin CardDAV dials to 443 and bound IMAP logout - fix rightward kanban column drags and normalize cards on column delete - classify backend outages in auth guards, add request timeouts and an error boundary, remove the dead login route, surface throttling - enforce pinned/unpinned page reorder grouping server-side - avoid preview work for stale bookmark versions; drop duplicate dialog fetch - sequence-guard collection/tag/calendar/quick-find loads - validate property config and fix MULTI_SELECT/DATE filter inputs - document index maintenance; apply same-origin check to sign-out - trim signup names, unique shared dates and kanban keys (migration 010), reset reference cache on identity changes, hide OIDC issuer, return 413 for oversized direct bodies, escape Markdown link destinations - remove dead template files and duplicate test helper Verified with go build/vet, full PostgreSQL race suite, db convergence, tsc, both ESLint configs and a Next production build.
This commit is contained in:
@@ -1,9 +1,11 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/url"
|
||||
"os"
|
||||
"strings"
|
||||
"sync"
|
||||
)
|
||||
|
||||
// DBURL returns the database connection string, preferring DATABASE_URL and
|
||||
@@ -76,11 +78,23 @@ func (c *Config) CookieSecure() bool {
|
||||
return err == nil && u.Scheme == "https"
|
||||
}
|
||||
|
||||
// adminEmailsCache memoizes the parsed ADMIN_EMAILS value by its raw env
|
||||
// string (review M-12: IsAdminEmail runs on the auth hot path and re-split
|
||||
// and re-lowercased the list on every call). Keying on the raw value keeps
|
||||
// t.Setenv-based tests correct without a process-global startup snapshot.
|
||||
var adminEmailsCache struct {
|
||||
mu sync.Mutex
|
||||
raw string
|
||||
out []string
|
||||
}
|
||||
|
||||
// AdminEmails splits env ADMIN_EMAILS on commas, trims, lowercases.
|
||||
func AdminEmails() []string {
|
||||
s := os.Getenv("ADMIN_EMAILS")
|
||||
if s == "" {
|
||||
return nil
|
||||
adminEmailsCache.mu.Lock()
|
||||
defer adminEmailsCache.mu.Unlock()
|
||||
if adminEmailsCache.raw == s {
|
||||
return adminEmailsCache.out
|
||||
}
|
||||
var out []string
|
||||
for _, email := range strings.Split(s, ",") {
|
||||
@@ -88,6 +102,7 @@ func AdminEmails() []string {
|
||||
out = append(out, email)
|
||||
}
|
||||
}
|
||||
adminEmailsCache.raw, adminEmailsCache.out = s, out
|
||||
return out
|
||||
}
|
||||
|
||||
@@ -111,3 +126,18 @@ func IsAdminEmail(email string) bool {
|
||||
func AllowBootstrapSignup() bool {
|
||||
return os.Getenv("ALLOW_BOOTSTRAP_SIGNUP") != "0"
|
||||
}
|
||||
|
||||
// Validate fails fast on configuration the app cannot use, instead of
|
||||
// discovering it on the first request (review M-12).
|
||||
func (c *Config) Validate() error {
|
||||
if strings.TrimSpace(c.Secret()) == "" {
|
||||
return fmt.Errorf("AUTH_SECRET (or NEXTAUTH_SECRET) must be set")
|
||||
}
|
||||
if c.NextAuthURL != "" {
|
||||
u, err := url.Parse(c.NextAuthURL)
|
||||
if err != nil || (u.Scheme != "http" && u.Scheme != "https") || u.Host == "" {
|
||||
return fmt.Errorf("NEXTAUTH_URL must be an absolute http(s) URL, got %q", c.NextAuthURL)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user