Commit graph

41 commits

Author SHA1 Message Date
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
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
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
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
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
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
d588c49946 Many an update! 2025-12-01 15:26:42 +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
e8e3b84276 Lots of UI fixes 2025-10-08 19:02:24 +01:00
fb02688166 Add light/dark mode support with CSS variables 2025-10-06 19:54:20 +01:00
970b185151 Updates to profile 2025-10-06 14:52:03 +01:00
1b8dacf92a Add peer support functionality and UI 2025-10-06 11:29:47 +01:00
2b55ca4104 Adding features 2025-10-05 16:15:09 +01:00
600fef2b7c Enhance authentication flow: Add authentication-based buttons in AppNavigation for logged-in users, improve member status checks in useAuth, and update join page to automatically redirect to the dashboard after registration. Adjust cookie settings for better development experience. 2025-09-03 16:55:01 +01:00
2ca290d6e0 Implement multi-step registration process: Add step indicators, error handling, and payment processing for membership registration. Enhance form validation and user feedback with success and error messages. Refactor state management for improved clarity and maintainability. 2025-09-03 14:47:13 +01:00
a88aa62198 Add series management and ticketing features: Introduce series event functionality in event creation, enhance event display with series information, and implement ticketing options for public events. Update layouts and improve form handling for better user experience. 2025-08-27 20:40:54 +01:00
e4a0a9ab0f Enhance application structure: Add runtime configuration for environment variables, integrate new dependencies for Cloudinary and UI components, and refactor member management features including improved forms and member dashboard. Update styles and layout for better user experience. 2025-08-27 16:49:51 +01:00
6e7e27ac4e Enhance UI and functionality: Update main page layout, add contribution options in join form, and improve member dashboard display. Refactor API endpoints for member creation and login. 2025-08-26 18:21:52 +01:00
826517a798 Initial commit 2025-08-26 14:17:16 +01:00