From 4a7607d3a5b846bb96579d75e2e4a94a472cbd82 Mon Sep 17 00:00:00 2001 From: amertensreplit <49614208-amertensreplit@users.noreply.replit.com> Date: Thu, 11 Jun 2026 05:23:53 +0000 Subject: [PATCH] Merged changes from qt0ebghx/main Replit-Task-Id: e786be21-972b-4d23-bbe7-9eb4ae617f7b --- .agents/memory/MEMORY.md | 1 + .agents/memory/clerk-shadcn-theme-tailwind.md | 13 + .replit | 4 + artifacts/api-server/package.json | 4 + artifacts/api-server/src/app.ts | 29 +- artifacts/api-server/src/middlewares/auth.ts | 75 ++++++ .../src/middlewares/clerkProxyMiddleware.ts | 91 +++++++ artifacts/api-server/src/routes/auth.ts | 18 ++ artifacts/api-server/src/routes/index.ts | 20 +- .../src/routes/providers.listModels.test.ts | 18 ++ artifacts/api-server/src/routes/rules.ts | 3 +- artifacts/api-server/src/routes/scans.ts | 119 ++++++++- artifacts/skillguard/package.json | 4 + artifacts/skillguard/public/logo.svg | 5 + artifacts/skillguard/public/opengraph.jpg | Bin 78144 -> 72469 bytes artifacts/skillguard/src/App.tsx | 249 +++++++++++++++--- .../skillguard/src/components/layout.tsx | 71 +++-- .../src/components/public-layout.tsx | 55 ++-- .../src/components/require-admin.tsx | 74 ++++++ artifacts/skillguard/src/index.css | 2 + artifacts/skillguard/src/pages/catalog.tsx | 170 ++++++++++++ .../skillguard/src/pages/scan-history.tsx | 40 ++- .../skillguard/src/pages/scan-report.tsx | 51 +++- artifacts/skillguard/vite.config.ts | 2 +- .../src/generated/api.schemas.ts | 17 ++ lib/api-client-react/src/generated/api.ts | 153 +++++++++++ lib/api-spec/openapi.yaml | 72 +++++ lib/api-zod/src/generated/api.ts | 57 ++++ lib/api-zod/src/generated/types/authMe.ts | 17 ++ lib/api-zod/src/generated/types/index.ts | 2 + lib/api-zod/src/generated/types/scan.ts | 2 + .../generated/types/scanModerationUpdate.ts | 12 + lib/db/src/schema/scans.ts | 1 + pnpm-lock.yaml | 212 +++++++++++++++ 34 files changed, 1573 insertions(+), 90 deletions(-) create mode 100644 .agents/memory/clerk-shadcn-theme-tailwind.md create mode 100644 artifacts/api-server/src/middlewares/auth.ts create mode 100644 artifacts/api-server/src/middlewares/clerkProxyMiddleware.ts create mode 100644 artifacts/api-server/src/routes/auth.ts create mode 100644 artifacts/skillguard/public/logo.svg create mode 100644 artifacts/skillguard/src/components/require-admin.tsx create mode 100644 artifacts/skillguard/src/pages/catalog.tsx create mode 100644 lib/api-zod/src/generated/types/authMe.ts create mode 100644 lib/api-zod/src/generated/types/scanModerationUpdate.ts diff --git a/.agents/memory/MEMORY.md b/.agents/memory/MEMORY.md index a076e0d..7878b28 100644 --- a/.agents/memory/MEMORY.md +++ b/.agents/memory/MEMORY.md @@ -5,3 +5,4 @@ - [Testing api-server from shell](api-server-local-curl.md) — external `$REPLIT_DEV_DOMAIN/api` curl returns HTTP 000; curl `http://localhost:/api` instead (port from workflow log). - [Stale codegen & unapplied migrations](skillguard-stale-codegen-and-migrations.md) — "field already in API" tasks: dev/test DB + lib `dist/*.d.ts` lag; run drizzle push + `tsc -b` the lib. - [Mocking fetch in api-server route tests](api-server-fetch-mocking-in-tests.md) — route tests run app in-process; delegate localhost requests to real fetch, only synthesize upstream; filter spy calls by URL. +- [Clerk shadcn theme + Tailwind v4](clerk-shadcn-theme-tailwind.md) — Clerk shadcn.css needs `optimize:false` + explicit `@layer` order or sign-in/up widgets render unstyled. diff --git a/.agents/memory/clerk-shadcn-theme-tailwind.md b/.agents/memory/clerk-shadcn-theme-tailwind.md new file mode 100644 index 0000000..a6e250b --- /dev/null +++ b/.agents/memory/clerk-shadcn-theme-tailwind.md @@ -0,0 +1,13 @@ +--- +name: Clerk shadcn theme + Tailwind v4 +description: Why Clerk's shadcn.css theme needs Tailwind optimize:false and a layer order in a Vite app +--- + +When wiring Clerk components to match a shadcn/ui design (via `@import "@clerk/themes/shadcn.css"`), two non-obvious settings are required in a Tailwind v4 + Vite app: + +- `index.css` must declare the cascade layer order explicitly, e.g. `@layer theme, base, clerk, components, utilities;` before importing the Clerk theme, so Clerk styles land in the right layer and don't get overridden by (or override) app styles. +- `vite.config.ts` must set `tailwindcss({ optimize: false })`. + +**Why:** Tailwind v4's CSS optimizer/minifier prunes the Clerk theme's selectors (it can't see Clerk's runtime-generated class usage), so with optimization on the Clerk sign-in/sign-up widgets render unstyled. Disabling optimize keeps the imported theme intact. + +**How to apply:** Any artifact that themes Clerk widgets through the shadcn theme import. Symptom if missing: Clerk ``/`` appear unstyled or mismatched despite the import being present. diff --git a/.replit b/.replit index cf5c912..8d0abcc 100644 --- a/.replit +++ b/.replit @@ -47,6 +47,10 @@ externalPort = 80 localPort = 8081 externalPort = 8081 +[[ports]] +localPort = 8082 +externalPort = 3001 + [[ports]] localPort = 20892 externalPort = 3000 diff --git a/artifacts/api-server/package.json b/artifacts/api-server/package.json index 59b62df..ef084a9 100644 --- a/artifacts/api-server/package.json +++ b/artifacts/api-server/package.json @@ -11,13 +11,17 @@ "test": "vitest run" }, "dependencies": { + "@clerk/express": "^2.1.23", + "@clerk/shared": "^4.15.0", "@workspace/api-zod": "workspace:*", "@workspace/db": "workspace:*", "cookie-parser": "^1.4.7", "cors": "^2.8.6", "drizzle-orm": "catalog:", "express": "^5.2.1", + "express-rate-limit": "^8.5.2", "fflate": "^0.8.3", + "http-proxy-middleware": "^4.1.0", "pino": "^9.14.0", "pino-http": "^10.5.0" }, diff --git a/artifacts/api-server/src/app.ts b/artifacts/api-server/src/app.ts index 41eae81..ffade8a 100644 --- a/artifacts/api-server/src/app.ts +++ b/artifacts/api-server/src/app.ts @@ -1,11 +1,21 @@ import express, { type Express } from "express"; import cors from "cors"; import pinoHttp from "pino-http"; +import { clerkMiddleware } from "@clerk/express"; +import { publishableKeyFromHost } from "@clerk/shared/keys"; +import { + CLERK_PROXY_PATH, + clerkProxyMiddleware, + getClerkProxyHost, +} from "./middlewares/clerkProxyMiddleware"; import router from "./routes"; import { logger } from "./lib/logger"; const app: Express = express(); +// Trust the Replit proxy so req.ip reflects the client for rate limiting. +app.set("trust proxy", 1); + app.use( pinoHttp({ logger, @@ -25,10 +35,27 @@ app.use( }, }), ); -app.use(cors()); + +// Clerk Frontend API proxy must be mounted before the body parsers since it +// streams raw bytes. Active in production only. +app.use(CLERK_PROXY_PATH, clerkProxyMiddleware()); + +app.use(cors({ credentials: true, origin: true })); app.use(express.json({ limit: "25mb" })); app.use(express.urlencoded({ extended: true, limit: "25mb" })); +// Resolve the publishable key from the incoming request host so the same +// server can serve multiple Clerk custom domains. Falls back to +// CLERK_PUBLISHABLE_KEY when the host doesn't map to a custom domain. +app.use( + clerkMiddleware((req) => ({ + publishableKey: publishableKeyFromHost( + getClerkProxyHost(req) ?? "", + process.env.CLERK_PUBLISHABLE_KEY, + ), + })), +); + app.use("/api", router); export default app; diff --git a/artifacts/api-server/src/middlewares/auth.ts b/artifacts/api-server/src/middlewares/auth.ts new file mode 100644 index 0000000..349f86b --- /dev/null +++ b/artifacts/api-server/src/middlewares/auth.ts @@ -0,0 +1,75 @@ +import type { Request, Response, NextFunction } from "express"; +import { getAuth, clerkClient } from "@clerk/express"; +import { logger } from "../lib/logger"; + +/** + * Admin access is restricted to an allowlist of email addresses configured via + * the ADMIN_EMAILS environment variable (comma-separated, case-insensitive). + * Signing in alone never grants admin access — the email must be on the list. + */ +export function getAdminAllowlist(): string[] { + return (process.env.ADMIN_EMAILS ?? "") + .split(",") + .map((e) => e.trim().toLowerCase()) + .filter(Boolean); +} + +export type AuthInfo = { + userId: string | null; + email: string | null; + isAdmin: boolean; +}; + +/** + * Resolve the caller's authentication state without throwing. Anonymous + * visitors short-circuit before any Clerk API call so public endpoints stay + * fast; only signed-in users incur a user lookup to read their email. + */ +export async function resolveAuth(req: Request): Promise { + const auth = getAuth(req); + const userId = auth?.userId ?? null; + if (!userId) return { userId: null, email: null, isAdmin: false }; + + let email: string | null = null; + try { + const user = await clerkClient.users.getUser(userId); + email = + user.primaryEmailAddress?.emailAddress ?? + user.emailAddresses[0]?.emailAddress ?? + null; + } catch (err) { + logger.error({ err }, "Clerk-Benutzer konnte nicht geladen werden"); + email = null; + } + + const allowlist = getAdminAllowlist(); + const isAdmin = !!email && allowlist.includes(email.toLowerCase()); + return { userId, email, isAdmin }; +} + +declare global { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace Express { + interface Request { + auth?: AuthInfo; + } + } +} + +export async function requireAdmin( + req: Request, + res: Response, + next: NextFunction, +): Promise { + const info = await resolveAuth(req); + if (!info.userId) { + res.status(401).json({ error: "Nicht angemeldet." }); + return; + } + if (!info.isAdmin) { + res.status(403).json({ error: "Kein Administratorzugriff." }); + return; + } + req.auth = info; + next(); +} diff --git a/artifacts/api-server/src/middlewares/clerkProxyMiddleware.ts b/artifacts/api-server/src/middlewares/clerkProxyMiddleware.ts new file mode 100644 index 0000000..11834b8 --- /dev/null +++ b/artifacts/api-server/src/middlewares/clerkProxyMiddleware.ts @@ -0,0 +1,91 @@ +/** + * Clerk Frontend API Proxy Middleware + * + * Proxies Clerk Frontend API requests through your domain, enabling Clerk + * authentication on custom domains and .replit.app deployments without + * requiring CNAME DNS configuration. + * + * AUTH CONFIGURATION: To manage users, enable/disable login providers + * (Google, GitHub, etc.), change app branding, or configure OAuth credentials, + * use the Auth pane in the workspace toolbar. There is no external Clerk + * dashboard — all auth configuration is done through the Auth pane. + * + * IMPORTANT: + * - Only active in production (Clerk proxying doesn't work for dev instances) + * - Must be mounted BEFORE express.json() middleware + * + * Usage in app.ts: + * import { CLERK_PROXY_PATH, clerkProxyMiddleware } from "./middlewares/clerkProxyMiddleware"; + * app.use(CLERK_PROXY_PATH, clerkProxyMiddleware()); + */ + +import { createProxyMiddleware } from "http-proxy-middleware"; +import type { RequestHandler } from "express"; +import type { IncomingHttpHeaders } from "http"; + +const CLERK_FAPI = "https://frontend-api.clerk.dev"; +export const CLERK_PROXY_PATH = "/api/__clerk"; + +/** + * Returns the first effective public hostname for the given request, + * preferring x-forwarded-host over the Host header so callers behind a + * proxy see the original client-facing host. + * + * x-forwarded-host can take three shapes: + * - undefined (no proxy involved) + * - a single string (one proxy hop) + * - a comma-delimited string when an upstream appended rather than + * replaced the header (Node folds duplicate headers this way), or a + * string[] in some Express typings + * In the multi-value case, the leftmost value is the original client- + * facing host. Take that one in all forms. Exported so that app.ts + * (clerkMiddleware callback) and this proxy middleware agree on which + * hostname is canonical — otherwise multi-domain/custom-domain flows + * break. + */ +export function getClerkProxyHost(req: { + headers: IncomingHttpHeaders; +}): string | undefined { + const forwarded = req.headers["x-forwarded-host"]; + const raw = Array.isArray(forwarded) ? forwarded[0] : forwarded; + const firstHop = raw?.split(",")[0]?.trim(); + return firstHop || req.headers.host?.trim() || undefined; +} + +export function clerkProxyMiddleware(): RequestHandler { + // Only run proxy in production — Clerk proxying doesn't work for dev instances + if (process.env.NODE_ENV !== "production") { + return (_req, _res, next) => next(); + } + + const secretKey = process.env.CLERK_SECRET_KEY; + if (!secretKey) { + return (_req, _res, next) => next(); + } + + return createProxyMiddleware({ + target: CLERK_FAPI, + changeOrigin: true, + pathRewrite: (path: string) => + path.replace(new RegExp(`^${CLERK_PROXY_PATH}`), ""), + on: { + proxyReq: (proxyReq, req) => { + const protocol = req.headers["x-forwarded-proto"] || "https"; + const host = getClerkProxyHost(req) || ""; + const proxyUrl = `${protocol}://${host}${CLERK_PROXY_PATH}`; + + proxyReq.setHeader("Clerk-Proxy-Url", proxyUrl); + proxyReq.setHeader("Clerk-Secret-Key", secretKey); + + const xff = req.headers["x-forwarded-for"]; + const clientIp = + (Array.isArray(xff) ? xff[0] : xff)?.split(",")[0]?.trim() || + req.socket?.remoteAddress || + ""; + if (clientIp) { + proxyReq.setHeader("X-Forwarded-For", clientIp); + } + }, + }, + }) as RequestHandler; +} diff --git a/artifacts/api-server/src/routes/auth.ts b/artifacts/api-server/src/routes/auth.ts new file mode 100644 index 0000000..8934d28 --- /dev/null +++ b/artifacts/api-server/src/routes/auth.ts @@ -0,0 +1,18 @@ +import { Router, type IRouter } from "express"; +import { GetMeResponse } from "@workspace/api-zod"; +import { resolveAuth } from "../middlewares/auth"; + +const router: IRouter = Router(); + +router.get("/me", async (req, res) => { + const info = await resolveAuth(req); + res.json( + GetMeResponse.parse({ + authenticated: !!info.userId, + isAdmin: info.isAdmin, + email: info.email, + }), + ); +}); + +export default router; diff --git a/artifacts/api-server/src/routes/index.ts b/artifacts/api-server/src/routes/index.ts index 580e827..759f5ac 100644 --- a/artifacts/api-server/src/routes/index.ts +++ b/artifacts/api-server/src/routes/index.ts @@ -1,18 +1,32 @@ import { Router, type IRouter } from "express"; import healthRouter from "./health"; +import authRouter from "./auth"; import dashboardRouter from "./dashboard"; import scansRouter from "./scans"; import providersRouter from "./providers"; import promptsRouter from "./prompts"; import rulesRouter from "./rules"; +import { requireAdmin } from "../middlewares/auth"; const router: IRouter = Router(); +// Public endpoints (no login required). router.use(healthRouter); -router.use(dashboardRouter); +router.use(authRouter); +// Scans router owns its own auth: public list/report/download/create, but +// admin-only delete and moderation. Rules expose a public GET with an +// admin-only PATCH (enforced inside the router). router.use(scansRouter); -router.use(providersRouter); -router.use(promptsRouter); router.use(rulesRouter); +// Admin-only resources: the entire /providers, /prompts and /dashboard +// surfaces require an allowlisted admin. Path-scoped so public routes above +// are never gated. +router.use("/providers", requireAdmin); +router.use("/prompts", requireAdmin); +router.use("/dashboard", requireAdmin); +router.use(providersRouter); +router.use(promptsRouter); +router.use(dashboardRouter); + export default router; diff --git a/artifacts/api-server/src/routes/providers.listModels.test.ts b/artifacts/api-server/src/routes/providers.listModels.test.ts index 0a503a5..629fd4c 100644 --- a/artifacts/api-server/src/routes/providers.listModels.test.ts +++ b/artifacts/api-server/src/routes/providers.listModels.test.ts @@ -9,6 +9,24 @@ import { } from "vitest"; import type { AddressInfo } from "node:net"; import type { Server } from "node:http"; + +// The /providers routes are admin-gated. These tests exercise the route logic +// itself, not the Clerk allowlist, so we stub the auth middleware to grant +// admin access. Auth enforcement is covered separately. +vi.mock("../middlewares/auth", () => ({ + getAdminAllowlist: () => ["admin@test.local"], + resolveAuth: async () => ({ + userId: "test-admin", + email: "admin@test.local", + isAdmin: true, + }), + requireAdmin: ( + _req: unknown, + _res: unknown, + next: () => void, + ) => next(), +})); + import app from "../app"; import { db, pool, aiProvidersTable } from "@workspace/db"; import { inArray } from "drizzle-orm"; diff --git a/artifacts/api-server/src/routes/rules.ts b/artifacts/api-server/src/routes/rules.ts index d330254..8018214 100644 --- a/artifacts/api-server/src/routes/rules.ts +++ b/artifacts/api-server/src/routes/rules.ts @@ -8,6 +8,7 @@ import { UpdateRuleBody, UpdateRuleResponse, } from "@workspace/api-zod"; +import { requireAdmin } from "../middlewares/auth"; const router: IRouter = Router(); @@ -30,7 +31,7 @@ router.get("/rules", async (_req, res) => { res.json(ListRulesResponse.parse(rows.map(serializeRule))); }); -router.patch("/rules/:id", async (req, res) => { +router.patch("/rules/:id", requireAdmin, async (req, res) => { const params = UpdateRuleParams.safeParse(req.params); if (!params.success) return res.status(400).json({ message: "Ungültige ID" }); const parsed = UpdateRuleBody.safeParse(req.body); diff --git a/artifacts/api-server/src/routes/scans.ts b/artifacts/api-server/src/routes/scans.ts index 8279d4e..b61f4b7 100644 --- a/artifacts/api-server/src/routes/scans.ts +++ b/artifacts/api-server/src/routes/scans.ts @@ -13,6 +13,8 @@ import { type Prompt, } from "@workspace/db"; import { eq, desc, count } from "drizzle-orm"; +import rateLimit from "express-rate-limit"; +import { zipSync, strToU8 } from "fflate"; import { ListScansResponse, CreateScanBody, @@ -22,7 +24,11 @@ import { CompareScansParams, CompareScansResponse, GetScanLineageResponse, + ModerateScanParams, + ModerateScanBody, + ModerateScanResponse, } from "@workspace/api-zod"; +import { resolveAuth, requireAdmin } from "../middlewares/auth"; import { parseUpload, parseText, @@ -56,10 +62,23 @@ export function serializeScan(scan: Scan) { relation: scan.relation, similarity: scan.similarity, comparedScanId: scan.comparedScanId, + hidden: scan.hidden, createdAt: scan.createdAt.toISOString(), }; } +// Public scan creation is rate-limited per client to curb abuse of the open +// upload/test endpoints. Admin and read endpoints are unaffected. +const scanRateLimiter = rateLimit({ + windowMs: 60 * 1000, + limit: 10, + standardHeaders: true, + legacyHeaders: false, + message: { + message: "Zu viele Scans in kurzer Zeit. Bitte später erneut versuchen.", + }, +}); + function serializeFile(f: ScanFile) { return { path: f.path, @@ -413,15 +432,19 @@ async function persistScan( return { scan, files: insertedFiles, findings: insertedFindings }; } -router.get("/scans", async (_req, res) => { +router.get("/scans", async (req, res) => { + // Public visitors only see the released catalog; admins also see hidden scans + // so they can manage moderation. + const info = await resolveAuth(req); const rows = await db .select() .from(scansTable) + .where(info.isAdmin ? undefined : eq(scansTable.hidden, false)) .orderBy(desc(scansTable.createdAt)); res.json(ListScansResponse.parse(rows.map(serializeScan))); }); -router.post("/scans", async (req, res) => { +router.post("/scans", scanRateLimiter, async (req, res) => { const parsed = CreateScanBody.safeParse(req.body); if (!parsed.success) { return res @@ -453,7 +476,7 @@ router.post("/scans", async (req, res) => { const STREAM_PACING_MS = 80; const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); -router.post("/scans/stream", async (req, res) => { +router.post("/scans/stream", scanRateLimiter, async (req, res) => { const parsed = CreateScanBody.safeParse(req.body); if (!parsed.success) { res @@ -544,6 +567,13 @@ router.get("/scans/:id", async (req, res) => { .where(eq(scansTable.id, params.data.id)); if (!scan) return res.status(404).json({ message: "Scan nicht gefunden" }); + // Hidden scans are invisible to the public; only admins can open the report. + if (scan.hidden) { + const info = await resolveAuth(req); + if (!info.isAdmin) + return res.status(404).json({ message: "Scan nicht gefunden" }); + } + const files = await db .select() .from(scanFilesTable) @@ -557,6 +587,87 @@ router.get("/scans/:id", async (req, res) => { return res.json(GetScanResponse.parse(await buildScanDetail(scan, files, findings))); }); +// Public download of a skill that PASSED. Bundles the stored text files back +// into a ZIP. Binary files were never persisted, so they are omitted. Blocked +// for non-pass verdicts and for hidden scans (unless the caller is an admin). +function safeFilename(name: string): string { + const cleaned = name + .replace(/[^a-zA-Z0-9._-]+/g, "-") + .replace(/^-+|-+$/g, "") + .slice(0, 80); + return cleaned || "skill"; +} + +router.get("/scans/:id/download", async (req, res) => { + const params = GetScanParams.safeParse(req.params); + if (!params.success) + return res.status(400).json({ message: "Ungültige ID" }); + + const [scan] = await db + .select() + .from(scansTable) + .where(eq(scansTable.id, params.data.id)); + if (!scan) return res.status(404).json({ message: "Scan nicht gefunden" }); + + if (scan.hidden) { + const info = await resolveAuth(req); + if (!info.isAdmin) + return res.status(404).json({ message: "Scan nicht gefunden" }); + } + + if (scan.verdict !== "pass") { + return res.status(403).json({ + message: + "Nur Skills mit dem Ergebnis „Bestanden“ können heruntergeladen werden.", + }); + } + + const files = await db + .select() + .from(scanFilesTable) + .where(eq(scanFilesTable.scanId, scan.id)); + + const entries: Record = {}; + for (const f of files) { + if (f.content === null) continue; // binary content was not stored + entries[f.path] = strToU8(f.content); + } + + if (Object.keys(entries).length === 0) { + return res.status(404).json({ + message: "Für dieses Skill sind keine herunterladbaren Dateien gespeichert.", + }); + } + + const zipped = zipSync(entries, { level: 6 }); + const filename = `${safeFilename(scan.name)}.zip`; + res.setHeader("Content-Type", "application/zip"); + res.setHeader( + "Content-Disposition", + `attachment; filename="${filename}"`, + ); + return res.send(Buffer.from(zipped)); +}); + +router.patch("/scans/:id", requireAdmin, async (req, res) => { + const params = ModerateScanParams.safeParse(req.params); + if (!params.success) + return res.status(400).json({ message: "Ungültige ID" }); + const parsed = ModerateScanBody.safeParse(req.body); + if (!parsed.success) + return res + .status(400) + .json({ message: "Ungültige Eingabe", details: parsed.error.issues }); + + const [updated] = await db + .update(scansTable) + .set({ hidden: parsed.data.hidden }) + .where(eq(scansTable.id, params.data.id)) + .returning(); + if (!updated) return res.status(404).json({ message: "Scan nicht gefunden" }); + return res.json(ModerateScanResponse.parse(serializeScan(updated))); +}); + router.get("/scans/:id/compare/:otherId", async (req, res) => { const params = CompareScansParams.safeParse(req.params); if (!params.success) @@ -729,7 +840,7 @@ router.get("/scans/:id/lineage", async (req, res) => { return res.json(GetScanLineageResponse.parse(entries)); }); -router.delete("/scans/:id", async (req, res) => { +router.delete("/scans/:id", requireAdmin, async (req, res) => { const params = DeleteScanParams.safeParse(req.params); if (!params.success) return res.status(400).json({ message: "Ungültige ID" }); diff --git a/artifacts/skillguard/package.json b/artifacts/skillguard/package.json index 182f223..82a629e 100644 --- a/artifacts/skillguard/package.json +++ b/artifacts/skillguard/package.json @@ -73,5 +73,9 @@ "vite": "catalog:", "wouter": "^3.3.5", "zod": "catalog:" + }, + "dependencies": { + "@clerk/react": "^6.7.3", + "@clerk/themes": "^2.4.57" } } diff --git a/artifacts/skillguard/public/logo.svg b/artifacts/skillguard/public/logo.svg new file mode 100644 index 0000000..f0e19e3 --- /dev/null +++ b/artifacts/skillguard/public/logo.svg @@ -0,0 +1,5 @@ + + + + SkillGuard + diff --git a/artifacts/skillguard/public/opengraph.jpg b/artifacts/skillguard/public/opengraph.jpg index 1715a0b1eefe68569836f70fb1d6fae471c65aae..48325ff5ce2bcdfe45e3a9ff51eef127b19e2b53 100644 GIT binary patch literal 72469 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"#r!N)i)1`uv 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 AHUIzs diff --git a/artifacts/skillguard/src/App.tsx b/artifacts/skillguard/src/App.tsx index c486795..fe18913 100644 --- a/artifacts/skillguard/src/App.tsx +++ b/artifacts/skillguard/src/App.tsx @@ -1,12 +1,17 @@ -import { Switch, Route, Router as WouterRouter } from "wouter"; -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { useEffect, useRef } from "react"; +import { ClerkProvider, SignIn, SignUp, useClerk } from "@clerk/react"; +import { publishableKeyFromHost } from "@clerk/react/internal"; +import { shadcn } from "@clerk/themes"; +import { Switch, Route, useLocation, Router as WouterRouter } from "wouter"; +import { QueryClient, QueryClientProvider, useQueryClient } from "@tanstack/react-query"; import { Toaster } from "@/components/ui/toaster"; import { TooltipProvider } from "@/components/ui/tooltip"; -import { AppLayout } from "@/components/layout"; import { PublicLayout } from "@/components/public-layout"; +import { AppLayout } from "@/components/layout"; +import { RequireAdmin } from "@/components/require-admin"; import NotFound from "@/pages/not-found"; -import Landing from "@/pages/landing"; +import Catalog from "@/pages/catalog"; import Dashboard from "@/pages/dashboard"; import ScanForm from "@/pages/scan-form"; import ScanReport from "@/pages/scan-report"; @@ -16,45 +21,223 @@ import Admin from "@/pages/admin"; import Impressum from "@/pages/impressum"; import Haftungsausschluss from "@/pages/haftungsausschluss"; +// REQUIRED — copy verbatim. Resolves the key from window.location.hostname so the +// same build serves multiple Clerk custom domains. +const clerkPubKey = publishableKeyFromHost( + window.location.hostname, + import.meta.env.VITE_CLERK_PUBLISHABLE_KEY, +); + +// REQUIRED — copy verbatim. Empty in dev, auto-set in prod. +const clerkProxyUrl = import.meta.env.VITE_CLERK_PROXY_URL; + +const basePath = import.meta.env.BASE_URL.replace(/\/$/, ""); + +// Clerk passes full paths to routerPush/routerReplace, but wouter's +// setLocation prepends the base — strip it to avoid doubling. +function stripBase(path: string): string { + return basePath && path.startsWith(basePath) ? path.slice(basePath.length) || "/" : path; +} + +if (!clerkPubKey) { + throw new Error("Missing VITE_CLERK_PUBLISHABLE_KEY in .env file"); +} + const queryClient = new QueryClient(); -function Router() { +const clerkAppearance = { + theme: shadcn, + cssLayerName: "clerk", + options: { + logoPlacement: "inside" as const, + logoLinkUrl: basePath || "/", + logoImageUrl: `${window.location.origin}${basePath}/logo.svg`, + }, + variables: { + colorPrimary: "hsl(215, 25%, 27%)", + colorForeground: "hsl(222, 47%, 11%)", + colorMutedForeground: "hsl(215, 16%, 47%)", + colorDanger: "hsl(0, 84%, 60%)", + colorBackground: "hsl(0, 0%, 100%)", + colorInput: "hsl(0, 0%, 100%)", + colorInputForeground: "hsl(222, 47%, 11%)", + colorNeutral: "hsl(214, 32%, 91%)", + fontFamily: "'Inter', sans-serif", + borderRadius: "0.5rem", + }, + elements: { + rootBox: "w-full flex justify-center", + cardBox: "bg-white rounded-2xl w-[440px] max-w-full overflow-hidden shadow-lg border border-slate-200", + card: "!shadow-none !border-0 !bg-transparent !rounded-none", + footer: "!shadow-none !border-0 !bg-transparent !rounded-none", + headerTitle: "text-slate-900 font-bold", + headerSubtitle: "text-slate-500", + socialButtonsBlockButtonText: "text-slate-700 font-medium", + formFieldLabel: "text-slate-700 font-medium", + footerActionLink: "text-slate-800 font-semibold hover:text-slate-900", + footerActionText: "text-slate-500", + dividerText: "text-slate-400", + identityPreviewEditButton: "text-slate-700", + formFieldSuccessText: "text-emerald-600", + alertText: "text-slate-700", + logoBox: "h-9", + logoImage: "h-9 w-auto", + socialButtonsBlockButton: "border border-slate-200 hover:bg-slate-50", + formButtonPrimary: "bg-slate-800 hover:bg-slate-900 text-white", + formFieldInput: "border border-slate-200 bg-white text-slate-900", + footerAction: "text-slate-500", + dividerLine: "bg-slate-200", + alert: "border border-slate-200 bg-slate-50", + otpCodeFieldInput: "border border-slate-200 text-slate-900", + formFieldRow: "gap-2", + main: "gap-4", + }, +}; + +function SignInPage() { return ( - - - - - - - - +

+ ); +} + +function SignUpPage() { + return ( +
+ +
+ ); +} + +// Keeps the cache fresh when the signed-in user changes. +function ClerkQueryClientCacheInvalidator() { + const { addListener } = useClerk(); + const qc = useQueryClient(); + const prevUserIdRef = useRef(undefined); + + useEffect(() => { + const unsubscribe = addListener(({ user }) => { + const userId = user?.id ?? null; + if (prevUserIdRef.current !== undefined && prevUserIdRef.current !== userId) { + qc.clear(); + } + prevUserIdRef.current = userId; + }); + return unsubscribe; + }, [addListener, qc]); + + return null; +} + +function ClerkProviderWithRoutes() { + const [, setLocation] = useLocation(); + + return ( + setLocation(stripBase(to))} + routerReplace={(to) => setLocation(stripBase(to), { replace: true })} + > + + + - - - - - - - - - + {/* Public area */} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {/* Auth */} + + + + {/* Admin back office */} + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + ); } function App() { return ( - - - - - - - - + + + ); } diff --git a/artifacts/skillguard/src/components/layout.tsx b/artifacts/skillguard/src/components/layout.tsx index e03b39e..300503c 100644 --- a/artifacts/skillguard/src/components/layout.tsx +++ b/artifacts/skillguard/src/components/layout.tsx @@ -1,61 +1,68 @@ import { Link, useLocation } from "wouter"; -import { Shield, LayoutDashboard, Search, History, Settings } from "lucide-react"; -import { Sidebar, SidebarContent, SidebarHeader, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarProvider, SidebarGroup, SidebarGroupContent, SidebarGroupLabel } from "@/components/ui/sidebar"; +import { Shield, LayoutDashboard, History, Settings, LogOut, ExternalLink } from "lucide-react"; +import { useClerk, useUser } from "@clerk/react"; +import { Sidebar, SidebarContent, SidebarHeader, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarProvider, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarFooter } from "@/components/ui/sidebar"; + +const basePath = import.meta.env.BASE_URL.replace(/\/$/, ""); export function AppLayout({ children }: { children: React.ReactNode }) { const [location] = useLocation(); + const { signOut } = useClerk(); + const { user } = useUser(); return (
- - - - SkillGuard - + + +
+ SkillGuard + Administration +
- Navigation + Verwaltung - - + + Dashboard - - - - Skill Prüfen + + + + Verlauf - - - - Verlauf + + + + Konfiguration - - + + + Öffentlich - - - - Administration + + + + Zum Katalog @@ -63,6 +70,22 @@ export function AppLayout({ children }: { children: React.ReactNode }) { + + + {user && ( +
+ {user.primaryEmailAddress?.emailAddress ?? "Angemeldet"} +
+ )} + + + signOut({ redirectUrl: basePath || "/" })}> + + Abmelden + + + +
diff --git a/artifacts/skillguard/src/components/public-layout.tsx b/artifacts/skillguard/src/components/public-layout.tsx index bdb620c..cf2e14b 100644 --- a/artifacts/skillguard/src/components/public-layout.tsx +++ b/artifacts/skillguard/src/components/public-layout.tsx @@ -1,10 +1,18 @@ -import { Link } from "wouter"; -import { Shield, Search, LayoutDashboard } from "lucide-react"; +import { Link, useLocation } from "wouter"; +import { Shield, Search, ShieldCheck, Settings, LayoutDashboard } from "lucide-react"; import { Button } from "@/components/ui/button"; +import { cn } from "@/lib/utils"; + +const NAV = [ + { href: "/", label: "Katalog", match: (l: string) => l === "/" }, + { href: "/pruefen", label: "Skill prüfen", match: (l: string) => l.startsWith("/pruefen") }, +]; export function PublicLayout({ children }: { children: React.ReactNode }) { + const [location] = useLocation(); + return ( -
+
@@ -12,28 +20,39 @@ export function PublicLayout({ children }: { children: React.ReactNode }) { SkillGuard
-
{children}
+
+
{children}
+
-