fix(privacy): NODE_ENV-guard 4 debug-routes (before-launch privacy review)
Privacy/PII review-pass van Server Actions, API-routes, debug-paths en Sentry config: ✅ Sentry sendDefaultPii: false in alle drie configs (server/edge/client) ✅ Geen wachtwoord/email/token in console-logs ✅ Pair-id-logs zijn metadata-only (5-min TTL, geen secret) ⚠️ Vier debug-routes hadden geen auth-guard: - /api/debug/realtime-stream — rauwe pg_notify-stream zonder filtering - /api/debug/emit-test-notify — anonieme test-emit op het kanaal - /debug-env — lekt env-var-metadata (hostnames, lengtes, pooled-flag) - /debug-realtime — UI op dezelfde rauwe pg_notify-stream Allemaal gemarkeerd als TIJDELIJK met VERWIJDEREN-comments uit M8. Voor v1 launch: NODE_ENV-guard die in productie 404 retourneert. Lokaal dev blijft alles werken voor debugging. Toekomstige cleanup: kunnen worden verwijderd zodra M8-realtime stabiel draait in productie en niemand ze meer nodig heeft. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
95eff4087c
commit
0f40bc1c70
4 changed files with 18 additions and 0 deletions
|
|
@ -12,6 +12,11 @@ export const dynamic = 'force-dynamic'
|
||||||
const CHANNEL = 'scrum4me_changes'
|
const CHANNEL = 'scrum4me_changes'
|
||||||
|
|
||||||
export async function POST(request: Request) {
|
export async function POST(request: Request) {
|
||||||
|
// Productie-guard: anonieme test-emit op pg_notify is niet voor productie.
|
||||||
|
if (process.env.NODE_ENV === 'production') {
|
||||||
|
return new Response('Not found', { status: 404 })
|
||||||
|
}
|
||||||
|
|
||||||
const directUrl = process.env.DIRECT_URL ?? process.env.DATABASE_URL
|
const directUrl = process.env.DIRECT_URL ?? process.env.DATABASE_URL
|
||||||
if (!directUrl) {
|
if (!directUrl) {
|
||||||
return Response.json({ error: 'DIRECT_URL/DATABASE_URL niet gezet' }, { status: 500 })
|
return Response.json({ error: 'DIRECT_URL/DATABASE_URL niet gezet' }, { status: 500 })
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,11 @@ export const maxDuration = 300
|
||||||
const CHANNEL = 'scrum4me_changes'
|
const CHANNEL = 'scrum4me_changes'
|
||||||
|
|
||||||
export async function GET(request: NextRequest) {
|
export async function GET(request: NextRequest) {
|
||||||
|
// Productie-guard: deze debug-stream lekt rauw alle pg_notify-events.
|
||||||
|
if (process.env.NODE_ENV === 'production') {
|
||||||
|
return new Response('Not found', { status: 404 })
|
||||||
|
}
|
||||||
|
|
||||||
const directUrl = process.env.DIRECT_URL ?? process.env.DATABASE_URL
|
const directUrl = process.env.DIRECT_URL ?? process.env.DATABASE_URL
|
||||||
if (!directUrl) {
|
if (!directUrl) {
|
||||||
return Response.json({ error: 'DIRECT_URL/DATABASE_URL niet gezet' }, { status: 500 })
|
return Response.json({ error: 'DIRECT_URL/DATABASE_URL niet gezet' }, { status: 500 })
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
// VERWIJDEREN zodra env-config op Vercel bevestigd is.
|
// VERWIJDEREN zodra env-config op Vercel bevestigd is.
|
||||||
|
|
||||||
import { headers } from 'next/headers'
|
import { headers } from 'next/headers'
|
||||||
|
import { notFound } from 'next/navigation'
|
||||||
|
|
||||||
export const dynamic = 'force-dynamic'
|
export const dynamic = 'force-dynamic'
|
||||||
export const runtime = 'nodejs'
|
export const runtime = 'nodejs'
|
||||||
|
|
@ -45,6 +46,9 @@ function inspectSecret(name: string, raw: string | undefined): VarStatus {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async function DebugEnvPage() {
|
export default async function DebugEnvPage() {
|
||||||
|
// Productie-guard: lekt env-var-metadata (hostnames, lengtes, pooled-flag).
|
||||||
|
if (process.env.NODE_ENV === 'production') notFound()
|
||||||
|
|
||||||
// Force dynamic so each visit reads runtime env (niet build-time gecached)
|
// Force dynamic so each visit reads runtime env (niet build-time gecached)
|
||||||
await headers()
|
await headers()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,15 @@
|
||||||
//
|
//
|
||||||
// VERWIJDEREN VOOR M8 OUT-OF-DRAFT.
|
// VERWIJDEREN VOOR M8 OUT-OF-DRAFT.
|
||||||
|
|
||||||
|
import { notFound } from 'next/navigation'
|
||||||
import { DebugRealtimeClient } from './client'
|
import { DebugRealtimeClient } from './client'
|
||||||
|
|
||||||
export const dynamic = 'force-dynamic'
|
export const dynamic = 'force-dynamic'
|
||||||
|
|
||||||
export default function DebugRealtimePage() {
|
export default function DebugRealtimePage() {
|
||||||
|
// Productie-guard: deze pagina toont rauwe pg_notify-events zonder auth.
|
||||||
|
if (process.env.NODE_ENV === 'production') notFound()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={{ fontFamily: 'monospace', padding: 16 }}>
|
<div style={{ fontFamily: 'monospace', padding: 16 }}>
|
||||||
<h1 style={{ fontSize: 18, fontWeight: 'bold' }}>Realtime debug — scrum4me_changes</h1>
|
<h1 style={{ fontSize: 18, fontWeight: 'bold' }}>Realtime debug — scrum4me_changes</h1>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue