Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
4bdb214
security: 20260922230000_complete_security_hardening.sql
SamRepository25 Sep 22, 2026
ee1b465
security: security.yml
SamRepository25 Sep 22, 2026
ee17c30
security: remove hard-coded admin identity and scope login lockout by IP
SamRepository25 Sep 22, 2026
82b75f6
security: require MFA setup after admin password login
SamRepository25 Sep 22, 2026
00ba51b
security: support mandatory MFA setup flow
SamRepository25 Sep 22, 2026
d598eea
security: add mandatory MFA setup route
SamRepository25 Sep 22, 2026
de584aa
security: require MFA on all authenticated admin routes
SamRepository25 Sep 22, 2026
2f00578
security: validate Turnstile action and hostname
SamRepository25 Sep 22, 2026
47f794e
security: bind Turnstile widgets to explicit actions
SamRepository25 Sep 22, 2026
07f2c9b
security: make contact rate limiting atomic
SamRepository25 Sep 22, 2026
45e21eb
chore: remove obsolete contact rate limit constants
SamRepository25 Sep 22, 2026
6da1926
security: bind contact Turnstile action
SamRepository25 Sep 22, 2026
78ae3d1
security: bind comment Turnstile action
SamRepository25 Sep 22, 2026
35879c7
security: escape blog JSON-LD output
SamRepository25 Sep 22, 2026
7981641
security: use CSPRNG for recovery codes
SamRepository25 Sep 22, 2026
ecf44d1
security: document Turnstile hostnames and login salt
SamRepository25 Sep 22, 2026
ff21392
test: extend security regression coverage
SamRepository25 Sep 22, 2026
db03086
chore: add contact security RPC to Supabase types
SamRepository25 Sep 22, 2026
62bc57c
chore: add recovery code table types
SamRepository25 Sep 22, 2026
c981d91
security: make admin MFA non-disableable
SamRepository25 Sep 22, 2026
2de9e44
docs: clarify mandatory administrator MFA
SamRepository25 Sep 22, 2026
b7bc66d
security: use role-based admin authorization for MFA functions
SamRepository25 Sep 22, 2026
53765f2
security: enforce admin-only MFA verification flow
SamRepository25 Sep 22, 2026
203d1b4
docs: update admin MFA capability comment
SamRepository25 Sep 22, 2026
59c1fb5
security: require AAL2 for edit mode
SamRepository25 Sep 22, 2026
211cbb8
security: bind auth Turnstile action
SamRepository25 Sep 22, 2026
8fdcf3f
security: bind comment Turnstile action
SamRepository25 Sep 22, 2026
35ee157
security: prefer Vercel trusted client IP header
SamRepository25 Sep 22, 2026
0274051
security: replace nonfunctional recovery codes with backup TOTP enrol…
SamRepository25 Sep 22, 2026
e13cd7a
security: use backup TOTP factors instead of nonfunctional recovery c…
SamRepository25 Sep 22, 2026
a37aa0b
security: allow backup TOTP factor selection at login
SamRepository25 Sep 22, 2026
8b16b49
security: remove unused custom recovery-code implementation
SamRepository25 Sep 22, 2026
39f15d0
docs: remove misleading recovery-code setup text
SamRepository25 Sep 22, 2026
0412533
security: use CSPRNG for guest visitor identifiers
SamRepository25 Sep 22, 2026
7beb47e
security: validate Turnstile against deployment hostname
SamRepository25 Sep 22, 2026
49d0652
security: remove unsupported custom recovery-code store
SamRepository25 Sep 22, 2026
53041ac
chore: remove obsolete recovery-code table types
SamRepository25 Sep 22, 2026
7e19aeb
test: remove obsolete recovery-code table assertions
SamRepository25 Sep 22, 2026
737b1af
ci: avoid failing on pre-existing repository-wide formatting debt
SamRepository25 Sep 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ CONTACT_FROM_EMAIL=CodeForge <onboarding@resend.dev>
# skipped outside production but fails closed (blocks all
# submissions) when NODE_ENV=production.
TURNSTILE_SECRET_KEY=your_turnstile_secret_key
# Comma-separated production hostnames returned by Turnstile Siteverify.
TURNSTILE_HOSTNAMES=codeforgedev.vercel.app

# Cloudflare Turnstile site key — public, used client-side to render
# the widget. Must be set together with TURNSTILE_SECRET_KEY above,
Expand All @@ -55,3 +57,6 @@ VITE_TURNSTILE_SITE_KEY=your_turnstile_site_key
# but setting your own value is recommended.
CONTACT_IP_HASH_SALT=choose_a_random_string


# Server-only random salt used to hash client IPs for login lockout keys.
LOGIN_IP_HASH_SALT=replace_with_a_long_random_secret
32 changes: 32 additions & 0 deletions .github/workflows/security.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Security checks

on:
pull_request:
push:
branches: [main]

permissions:
contents: read

jobs:
application:
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
cache: npm

- name: Install dependencies
run: npm ci

- name: Build
run: npm run build

- name: Dependency audit
run: npm audit --audit-level=high
Loading
Loading