Commit graph

66 commits

Author SHA1 Message Date
df2e7e3356 Fix Go to Wiki and Sign out appearing side by side
Make both elements block w-full so they always stack vertically.
2026-03-19 18:13:33 +00:00
7cf6ce1833 Polish coming-soon and login modal styling
Move sign out below wiki button, tweak hover color, remove email
field label, rename 'Join Ghost Guild' to 'Pre-Register', and
remove 'Don't have an account?' text from login modal.
2026-03-19 18:07:20 +00:00
28795146de Slight fix 2026-03-19 16:39:30 +00:00
640e633380 Style tweaks 2026-03-19 16:36:31 +00:00
eda8ac6449 Refine coming-soon page for logged-in members
Hide 'Coming Soon' text when authenticated, change greeting to
'Welcome, Name' with inline underlined sign-out link, and force
Inter (font-sans) on all text.
2026-03-19 16:24:42 +00:00
78c592c13a Fix duplicate /api/auth/member call and add request deduplication
Remove redundant checkMemberStatus() from coming-soon page since the
auth-init plugin already handles it. Add in-flight request deduplication
to prevent concurrent calls from any source. Strip debug console.logs.
2026-03-19 15:04:04 +00:00
52bb17e25d Comment out Quietism font-face declarations to fix slow page loads
The .woff2 files are missing from public/fonts/, causing failed requests
that 302 redirect and stall page load (16+ seconds). Swap display font
to Georgia as a fallback until Quietism files are available.
2026-03-19 13:43:18 +00:00
c785a23910 Redirect regular members to coming-soon page after magic link login
Instead of sending members directly to the wiki (where they hit
Outline's login page and have to click again), land them on the
coming-soon page which shows a welcome message and wiki link.
2026-03-19 13:02:12 +00:00
2705d171bd Add missing schemas, member model fields, and import endpoint
Adds memberInviteSchema and bulkMemberImportSchema needed by the invite
and CSV import endpoints. Adds inviteEmailSent/inviteEmailSentAt fields
to member model. Adds the bulk import API route.
2026-03-19 11:44:49 +00:00
5b4ca1b41d Replace native checkboxes with UCheckbox on admin members page
Native <input type="checkbox"> elements were invisible in production
because @tailwindcss/forms is not installed. UCheckbox renders properly
with the Nuxt UI theme.
2026-03-19 11:10:31 +00:00
1024a80731 Add login form to coming-soon page and allow admin routes through
Coming-soon page now shows a magic link login form for unauthenticated
visitors and a wiki link + sign out for logged-in members. The
coming-soon middleware allows /admin routes through (still protected by
admin middleware). A /login redirect page ensures invite email links work.
2026-03-19 11:01:03 +00:00
772f57c2b2 Route login redirect by role: admins to /admin, everyone else to wiki 2026-03-19 10:48:35 +00:00
c0dcfac173 Redirect invite logins to wiki, regular logins to /members
Invite tokens now include a redirect claim so the verify endpoint
can distinguish them from regular login tokens. Only invite links
redirect to wiki.ghostguild.org; normal logins go to /members.
2026-03-19 10:48:00 +00:00
27c07cd3e9 Send invite emails as HTML with clickable button, redirect login to wiki
Invite emails now include both plain text and HTML versions. The
{loginLink} placeholder renders as a styled button in HTML email
clients. Other URLs in the template are auto-linked. The auth verify
endpoint redirects to wiki.ghostguild.org instead of /members.
2026-03-19 10:41:21 +00:00
ea6c4d8329 Lock down coming-soon mode to block all users including authenticated
Remove auth bypass from coming-soon middleware so no one can access
the in-development site in production. Remove unused login button
from coming-soon page since wiki has its own OIDC login flow.
2026-03-19 10:27:19 +00:00
44805dbecf Remove serif fonts from wiki login and logout pages 2026-03-11 14:22:06 +00:00
2258f9d2ae Switch wiki login email to plain text format 2026-03-11 14:13:59 +00:00
b9961409ad Redesign wiki login page with refined guild aesthetic
Replace generic card layout with editorial-style login gate using
display typography, gradient divider, scoped CSS with design system
tokens, and smooth form-to-confirmation transitions.
2026-03-11 14:04:19 +00:00
ba5cce62fb Fix OIDC logout form posting to http:// behind reverse proxy
The oidc-provider generates form actions using http:// despite proxy
trust settings, causing an insecure form submission warning. Rewrite
the form action URL to https:// before rendering.
2026-03-05 23:11:00 +00:00
fed1cc4bc7 Skip CSP on OIDC routes to fix logout form submission
The oidc-provider generates form actions with http:// URLs that
conflict with the CSP form-action directive. OIDC routes serve
self-contained HTML outside Nuxt, so CSP is not needed there.
2026-03-05 23:05:52 +00:00
ba92075366 Fix OIDC issuer generating http:// URLs in production
The OIDC provider was falling back to config.public.appUrl for its
issuer, which could resolve to an http:// URL. This caused the logout
form action to use http://, violating the CSP form-action directive.
Hardcode the issuer fallback to https://ghostguild.org.
2026-03-05 22:42:12 +00:00
17d29647b4 Allow OIDC logout form submission in CSP form-action directive
The oidc-provider library renders logout forms with absolute URLs,
which gets blocked by the strict form-action 'self' CSP directive.
2026-03-05 22:33:11 +00:00
c3c8b6bcd4 Refactor email templates to use plain text format and update sender addresses
- Simplified the magic link email format to plain text for better compatibility.
- Updated the welcome email to use plain text and changed the sender address to match the domain.
- Enhanced event registration email format to plain text, removing HTML styling for a cleaner approach.
2026-03-05 18:40:37 +00:00
8143631364 Style tweaks 2026-03-04 18:29:32 +00:00
fadf473dde Readying for design 2026-03-04 18:24:20 +00:00
d73256ca2b Tidy template 2026-03-04 17:40:49 +00:00
bf57f4b33d Style wiki auth screens with guild design system
Add guild-styled HTML templates for OIDC logout confirmation, post-logout
success, and error pages. Update wiki login heading to brand convention
(candlelight + warm-text). Restyle magic link email from blue to guild
colour tokens.
2026-03-04 17:26:48 +00:00
79d3ba0f78 Allow authenticated members to bypass coming-soon page
Add JWT-verified session check to coming-soon middleware so logged-in
members can access the full site. Add member login link and modal to
the coming-soon page so members can sign in before launch.
2026-03-01 19:51:50 +00:00
6f297cf137 Exempt OIDC login page from coming-soon redirect
The wiki-login page needs to be accessible even in coming-soon mode
so the OIDC login flow can complete.
2026-03-01 17:26:40 +00:00
4b3fed9689 Move OIDC login page to /auth/wiki-login to avoid catch-all conflict
The /oidc/[...] server catch-all was intercepting /oidc/login before
the Nuxt page router could render it. Moving the page outside /oidc/
avoids the conflict entirely.
2026-03-01 17:19:41 +00:00
3187b5118b Skip /oidc/login in catch-all so Nuxt renders the login page
The server catch-all route was intercepting /oidc/login and passing
it to oidc-provider, which returned 404. Now it falls through to
the Vue page router instead.
2026-03-01 17:12:31 +00:00
025c1a180f Add Zod validation to all API endpoints and remove debug test route
Adds schema-based input validation across helcim, events, members,
series, admin, and updates API endpoints. Removes the peer-support
debug test endpoint. Adds validation test coverage.
2026-03-01 17:04:26 +00:00
e4813075b7 Force x-forwarded-proto to https for OIDC endpoints 2026-03-01 16:53:38 +00:00
a3b4f1118c Ensure OIDC endpoints use https behind reverse proxy
Set x-forwarded-proto header on requests before passing to
oidc-provider so generated URLs use https:// in production.
2026-03-01 16:49:40 +00:00
f43d1bf500 Trust proxy headers for OIDC provider
Set proxy: true so oidc-provider reads X-Forwarded-Proto from Traefik
and generates https:// endpoint URLs in the discovery document.
2026-03-01 16:45:44 +00:00
a055874680 Fix OIDC endpoint URLs to include /oidc prefix
Configure oidc-provider routes with explicit /oidc prefix so the
discovery document and token endpoints resolve correctly. Previously
the catch-all stripped the prefix, causing the provider to generate
URLs without it.
2026-03-01 16:41:38 +00:00
8a529a8e7c Add OIDC provider for Outline wiki SSO
Add oidc-provider with MongoDB adapter so ghostguild.org can act as
the identity provider for the self-hosted Outline wiki. Members
authenticate via the existing magic-link flow, with automatic SSO
when an active session exists. Includes interaction routes, well-known
discovery endpoint, and login page.
2026-03-01 15:46:01 +00:00
a232a7bbf8 Handle error status codes in profile patch and update endpoints 2026-03-01 14:18:29 +00:00
a8ae173914 Fix session token expiry 2026-03-01 14:05:26 +00:00
b7279f57d1 Add Zod validation, fix mass assignment, remove test endpoints and dead code
- Add centralized Zod schemas (server/utils/schemas.js) and validateBody
  utility for all API endpoints
- Fix critical mass assignment in member creation: raw body no longer
  passed to new Member(), only validated fields (email, name, circle,
  contributionTier) are accepted
- Apply Zod validation to login, profile patch, event registration,
  updates, verify-payment, and admin event creation endpoints
- Fix logout cookie flags to match login (httpOnly: true, secure
  conditional on NODE_ENV)
- Delete unauthenticated test/debug endpoints (test-connection,
  test-subscription, test-bot)
- Remove sensitive console.log statements from Helcim and member
  endpoints
- Remove unused bcryptjs dependency
- Add 10MB file size limit on image uploads
- Use runtime config for JWT secret across all endpoints
- Add 38 validation tests (117 total, all passing)
2026-03-01 14:02:46 +00:00
26c300c357 Implement OWASP ASVS L1 security remediation (Phases 0-2)
Auth: Add requireAuth/requireAdmin guards with JWT cookie verification,
member status checks (suspended/cancelled = 403), and admin role
enforcement. Apply to all admin, upload, and payment endpoints. Add
role field to Member model.

CSRF: Double-submit cookie middleware with client plugin. Exempt
webhook and magic-link verify routes.

Headers: X-Content-Type-Options, X-Frame-Options, X-XSS-Protection,
Referrer-Policy, Permissions-Policy on all responses. HSTS and CSP
(Helcim/Cloudinary/Plausible sources) in production only.

Rate limiting: Auth 5/5min, payment 10/min, upload 10/min, general
100/min via rate-limiter-flexible, keyed by client IP.

XSS: DOMPurify sanitization on marked() output with tag/attr
allowlists. escapeHtml() utility for email template interpolation.

Anti-enumeration: Login returns identical response for existing and
non-existing emails. Remove 404 handling from login UI components.

Mass assignment: Remove helcimCustomerId from profile allowedFields.

Session: 7-day token expiry, refresh endpoint, httpOnly+secure cookies.

Environment: Validate required secrets on startup via server plugin.
Remove JWT_SECRET hardcoded fallback.
2026-03-01 12:53:18 +00:00
29c96a207e Add Vitest security test suite and update security evaluation doc
Set up Vitest with server (node) and client (jsdom) test projects.
79 tests across 8 files verify all Phase 0-1 security controls:
escapeHtml sanitization, DOMPurify markdown XSS prevention, CSRF
enforcement, security headers, rate limiting, auth guards, profile
field allowlist, and login anti-enumeration. Updated SECURITY_EVALUATION.md
with remediation status, implementation summary, and automated test
coverage details.
2026-03-01 12:30:06 +00:00
d5c95ace0a Update all npm dependencies and resolve security vulnerabilities
Upgrade nuxt 4.0.3→4.3.1, @nuxt/ui 4.0.0→4.5.0, vue 3.5.20→3.5.29,
jsonwebtoken 9.0.2→9.0.3, mongoose 8.18.0→8.23.0, and 12 other packages.
Bump @nuxtjs/plausible to v3 and marked to v17. Remove vue-router from
explicit dependencies (Nuxt manages it internally). Reduces audit
vulnerabilities from 42 to 17.
2026-02-24 20:01:19 +00:00
a62e167876 Migrate design system from ethereal/cool to warm/craft/guild theme
Replace ghost/whisper/sparkle color palettes with guild/candlelight/parchment/ember/earth tokens.
Switch typography from NB Television Pro to Quietism serif. Update all 25 Vue components,
layouts, and pages to new design system. Add circle color tokens, typography scale, prose-guild
class, and warm texture effects. Clean up stale documentation files.
2026-02-24 20:01:11 +00:00
d588c49946 Many an update! 2025-12-01 15:26:42 +00:00
85195d6c7a Update nave 2025-11-09 14:23:25 +00:00
bce86ee840 Add landing page 2025-11-03 11:17:51 +00:00
3fea484585 Switch UI components to new design system tokens
Standardizes color values and styling using the new tokens:
- Replaces hardcoded colors with semantic variables
- Updates background/text/border classes for light/dark mode
- Migrates inputs to UInput/USelect/UTextarea components
- Removes redundant style declarations
2025-10-13 15:05:29 +01:00
9b45652b83 Fix production flag 2025-10-09 17:05:16 +01:00
260e10d31a Add event series badge component 2025-10-09 16:45:00 +01:00