@panguard-ai/panguard 1.4.15 → 1.4.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +5 -6
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/chat.d.ts.map +1 -1
- package/dist/cli/commands/chat.js +11 -11
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/commands/config.d.ts +4 -4
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +32 -21
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/demo.js +5 -5
- package/dist/cli/commands/demo.js.map +1 -1
- package/dist/cli/commands/deploy.js +10 -10
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +30 -65
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/guard.d.ts.map +1 -1
- package/dist/cli/commands/guard.js +42 -45
- package/dist/cli/commands/guard.js.map +1 -1
- package/dist/cli/commands/hacktivity.d.ts +2 -2
- package/dist/cli/commands/hacktivity.d.ts.map +1 -1
- package/dist/cli/commands/hacktivity.js +10 -10
- package/dist/cli/commands/hacktivity.js.map +1 -1
- package/dist/cli/commands/hardening.js +6 -6
- package/dist/cli/commands/hardening.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +2 -2
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/login.js +1 -1
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/logout.js +1 -1
- package/dist/cli/commands/logout.js.map +1 -1
- package/dist/cli/commands/report.js +6 -6
- package/dist/cli/commands/report.js.map +1 -1
- package/dist/cli/commands/scan.d.ts.map +1 -1
- package/dist/cli/commands/scan.js +146 -10
- package/dist/cli/commands/scan.js.map +1 -1
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +16 -15
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/skills.d.ts.map +1 -1
- package/dist/cli/commands/skills.js +4 -4
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +4 -4
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/threat.d.ts.map +1 -1
- package/dist/cli/commands/threat.js +15 -15
- package/dist/cli/commands/threat.js.map +1 -1
- package/dist/cli/commands/trap.js +7 -7
- package/dist/cli/commands/trap.js.map +1 -1
- package/dist/cli/commands/up.d.ts.map +1 -1
- package/dist/cli/commands/up.js +249 -40
- package/dist/cli/commands/up.js.map +1 -1
- package/dist/cli/commands/upgrade.js +1 -1
- package/dist/cli/commands/upgrade.js.map +1 -1
- package/dist/cli/commands/whoami.js +1 -1
- package/dist/cli/commands/whoami.js.map +1 -1
- package/dist/cli/consent.js +1 -1
- package/dist/cli/consent.js.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/interactive/actions/audit.js +2 -2
- package/dist/cli/interactive/actions/audit.js.map +1 -1
- package/dist/cli/interactive/actions/scan.js +2 -2
- package/dist/cli/interactive/actions/scan.js.map +1 -1
- package/dist/cli/interactive.js +2 -2
- package/dist/cli/interactive.js.map +1 -1
- package/dist/init/config-writer.d.ts.map +1 -1
- package/dist/init/config-writer.js +2 -1
- package/dist/init/config-writer.js.map +1 -1
- package/dist/init/steps.js +2 -2
- package/dist/init/steps.js.map +1 -1
- package/dist/init/wizard-runner.js +18 -18
- package/dist/init/wizard-runner.js.map +1 -1
- package/package.json +12 -12
- package/dist/cli/commands/admin.d.ts +0 -9
- package/dist/cli/commands/admin.d.ts.map +0 -1
- package/dist/cli/commands/admin.js +0 -130
- package/dist/cli/commands/admin.js.map +0 -1
- package/dist/cli/commands/manager.d.ts +0 -7
- package/dist/cli/commands/manager.d.ts.map +0 -1
- package/dist/cli/commands/manager.js +0 -113
- package/dist/cli/commands/manager.js.map +0 -1
- package/dist/cli/commands/serve-admin.d.ts +0 -11
- package/dist/cli/commands/serve-admin.d.ts.map +0 -1
- package/dist/cli/commands/serve-admin.js +0 -302
- package/dist/cli/commands/serve-admin.js.map +0 -1
- package/dist/cli/commands/serve-auth.d.ts +0 -11
- package/dist/cli/commands/serve-auth.d.ts.map +0 -1
- package/dist/cli/commands/serve-auth.js +0 -119
- package/dist/cli/commands/serve-auth.js.map +0 -1
- package/dist/cli/commands/serve-core.d.ts +0 -25
- package/dist/cli/commands/serve-core.d.ts.map +0 -1
- package/dist/cli/commands/serve-core.js +0 -215
- package/dist/cli/commands/serve-core.js.map +0 -1
- package/dist/cli/commands/serve-tc.d.ts +0 -12
- package/dist/cli/commands/serve-tc.d.ts.map +0 -1
- package/dist/cli/commands/serve-tc.js +0 -287
- package/dist/cli/commands/serve-tc.js.map +0 -1
- package/dist/cli/commands/serve-types.d.ts +0 -38
- package/dist/cli/commands/serve-types.d.ts.map +0 -1
- package/dist/cli/commands/serve-types.js +0 -108
- package/dist/cli/commands/serve-types.js.map +0 -1
- package/dist/cli/commands/serve.d.ts +0 -14
- package/dist/cli/commands/serve.d.ts.map +0 -1
- package/dist/cli/commands/serve.js +0 -383
- package/dist/cli/commands/serve.js.map +0 -1
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auth, waitlist, and usage route handlers for panguard serve.
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Handle auth API routes (/api/auth/*, /api/waitlist/*, /api/usage/*).
|
|
6
|
-
* Returns true if the route was handled, false otherwise.
|
|
7
|
-
*/
|
|
8
|
-
export async function handleAuthRoutes(req, res, url, pathname, ctx) {
|
|
9
|
-
const { handlers } = ctx;
|
|
10
|
-
// ── Auth API routes ──────────────────────────────────────────
|
|
11
|
-
if (pathname === '/api/auth/register') {
|
|
12
|
-
await handlers.handleRegister(req, res);
|
|
13
|
-
return true;
|
|
14
|
-
}
|
|
15
|
-
if (pathname === '/api/auth/login') {
|
|
16
|
-
await handlers.handleLogin(req, res);
|
|
17
|
-
return true;
|
|
18
|
-
}
|
|
19
|
-
if (pathname === '/api/auth/logout') {
|
|
20
|
-
handlers.handleLogout(req, res);
|
|
21
|
-
return true;
|
|
22
|
-
}
|
|
23
|
-
if (pathname === '/api/auth/me') {
|
|
24
|
-
handlers.handleMe(req, res);
|
|
25
|
-
return true;
|
|
26
|
-
}
|
|
27
|
-
if (pathname === '/api/auth/delete-account') {
|
|
28
|
-
await handlers.handleDeleteAccount(req, res);
|
|
29
|
-
return true;
|
|
30
|
-
}
|
|
31
|
-
if (pathname === '/api/auth/export-data') {
|
|
32
|
-
handlers.handleExportData(req, res);
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
|
-
if (pathname === '/api/auth/totp/setup') {
|
|
36
|
-
handlers.handleTotpSetup(req, res);
|
|
37
|
-
return true;
|
|
38
|
-
}
|
|
39
|
-
if (pathname === '/api/auth/totp/verify') {
|
|
40
|
-
await handlers.handleTotpVerify(req, res);
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
if (pathname === '/api/auth/totp/disable') {
|
|
44
|
-
await handlers.handleTotpDisable(req, res);
|
|
45
|
-
return true;
|
|
46
|
-
}
|
|
47
|
-
if (pathname === '/api/auth/totp/status') {
|
|
48
|
-
handlers.handleTotpStatus(req, res);
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
if (pathname === '/api/auth/forgot-password') {
|
|
52
|
-
await handlers.handleForgotPassword(req, res);
|
|
53
|
-
return true;
|
|
54
|
-
}
|
|
55
|
-
if (pathname === '/api/auth/reset-password') {
|
|
56
|
-
await handlers.handleResetPassword(req, res);
|
|
57
|
-
return true;
|
|
58
|
-
}
|
|
59
|
-
if (pathname === '/api/auth/google') {
|
|
60
|
-
handlers.handleGoogleAuth(req, res);
|
|
61
|
-
return true;
|
|
62
|
-
}
|
|
63
|
-
if (pathname.startsWith('/api/auth/google/callback')) {
|
|
64
|
-
const urlObj = new URL(url, `http://${req.headers.host ?? 'localhost'}`);
|
|
65
|
-
const code = urlObj.searchParams.get('code') ?? '';
|
|
66
|
-
const state = urlObj.searchParams.get('state');
|
|
67
|
-
await handlers.handleGoogleCallback(req, res, code, state);
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
if (pathname === '/api/auth/oauth/exchange') {
|
|
71
|
-
await handlers.handleOAuthExchange(req, res);
|
|
72
|
-
return true;
|
|
73
|
-
}
|
|
74
|
-
if (pathname === '/api/auth/cli') {
|
|
75
|
-
handlers.handleCliAuth(req, res);
|
|
76
|
-
return true;
|
|
77
|
-
}
|
|
78
|
-
if (pathname === '/api/auth/cli/exchange') {
|
|
79
|
-
await handlers.handleCliExchange(req, res);
|
|
80
|
-
return true;
|
|
81
|
-
}
|
|
82
|
-
// ── Waitlist API routes ──────────────────────────────────────
|
|
83
|
-
if (pathname === '/api/waitlist/join') {
|
|
84
|
-
await handlers.handleWaitlistJoin(req, res);
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
if (pathname.startsWith('/api/waitlist/verify/')) {
|
|
88
|
-
const token = pathname.split('/api/waitlist/verify/')[1];
|
|
89
|
-
handlers.handleWaitlistVerify(req, res, token ?? '');
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
if (pathname === '/api/waitlist/stats') {
|
|
93
|
-
handlers.handleWaitlistStats(req, res);
|
|
94
|
-
return true;
|
|
95
|
-
}
|
|
96
|
-
if (pathname === '/api/waitlist/list') {
|
|
97
|
-
handlers.handleWaitlistList(req, res);
|
|
98
|
-
return true;
|
|
99
|
-
}
|
|
100
|
-
// ── Usage / Quota API routes ─────────────────────────────────
|
|
101
|
-
if (pathname === '/api/usage') {
|
|
102
|
-
handlers.handleUsageSummary(req, res);
|
|
103
|
-
return true;
|
|
104
|
-
}
|
|
105
|
-
if (pathname === '/api/usage/limits') {
|
|
106
|
-
handlers.handleUsageLimits(req, res);
|
|
107
|
-
return true;
|
|
108
|
-
}
|
|
109
|
-
if (pathname === '/api/usage/check') {
|
|
110
|
-
await handlers.handleUsageCheck(req, res);
|
|
111
|
-
return true;
|
|
112
|
-
}
|
|
113
|
-
if (pathname === '/api/usage/record') {
|
|
114
|
-
await handlers.handleUsageRecord(req, res);
|
|
115
|
-
return true;
|
|
116
|
-
}
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
//# sourceMappingURL=serve-auth.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"serve-auth.js","sourceRoot":"","sources":["../../../src/cli/commands/serve-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Core middleware, health check, static file serving, and rule seeding
|
|
3
|
-
* for panguard serve.
|
|
4
|
-
*/
|
|
5
|
-
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
6
|
-
import type { ThreatCloudDBInstance } from './serve-types.js';
|
|
7
|
-
/**
|
|
8
|
-
* Apply security headers and CORS to every response.
|
|
9
|
-
* Returns true if the request was fully handled (OPTIONS preflight).
|
|
10
|
-
*/
|
|
11
|
-
export declare function applyMiddleware(req: IncomingMessage, res: ServerResponse): boolean;
|
|
12
|
-
/**
|
|
13
|
-
* Handle core routes: /health, /openapi.json, /docs/api, /admin/*.
|
|
14
|
-
* Returns true if the route was handled, false otherwise.
|
|
15
|
-
*/
|
|
16
|
-
export declare function handleCoreRoutes(req: IncomingMessage, res: ServerResponse, pathname: string, db: {
|
|
17
|
-
healthCheck(): void;
|
|
18
|
-
}, threatDb: ThreatCloudDBInstance, adminDir: string | undefined): boolean;
|
|
19
|
-
/**
|
|
20
|
-
* Seed rules from bundled config/ directory into Threat Cloud DB.
|
|
21
|
-
* Reads ATR YAML files.
|
|
22
|
-
* Returns count of rules seeded.
|
|
23
|
-
*/
|
|
24
|
-
export declare function seedRulesFromBundled(threatDb: ThreatCloudDBInstance): Promise<number>;
|
|
25
|
-
//# sourceMappingURL=serve-core.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"serve-core.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/serve-core.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAMjE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAK9D;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CA8BlF;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE;IAAE,WAAW,IAAI,IAAI,CAAA;CAAE,EAC3B,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAgDT;AA2DD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqF3F"}
|
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Core middleware, health check, static file serving, and rule seeding
|
|
3
|
-
* for panguard serve.
|
|
4
|
-
*/
|
|
5
|
-
import { join, dirname, resolve, relative } from 'node:path';
|
|
6
|
-
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
7
|
-
import { fileURLToPath } from 'node:url';
|
|
8
|
-
import { c } from '@panguard-ai/core';
|
|
9
|
-
import { generateOpenApiSpec, generateSwaggerHtml } from '@panguard-ai/panguard-auth';
|
|
10
|
-
import { sendJson } from './serve-types.js';
|
|
11
|
-
// ── Security Headers & CORS Middleware ─────────────────────────
|
|
12
|
-
/**
|
|
13
|
-
* Apply security headers and CORS to every response.
|
|
14
|
-
* Returns true if the request was fully handled (OPTIONS preflight).
|
|
15
|
-
*/
|
|
16
|
-
export function applyMiddleware(req, res) {
|
|
17
|
-
// Security headers
|
|
18
|
-
res.setHeader('X-Content-Type-Options', 'nosniff');
|
|
19
|
-
res.setHeader('X-Frame-Options', 'SAMEORIGIN');
|
|
20
|
-
res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
|
|
21
|
-
res.setHeader('Permissions-Policy', 'camera=(), microphone=(), geolocation=()');
|
|
22
|
-
res.setHeader('X-XSS-Protection', '0');
|
|
23
|
-
if (process.env['NODE_ENV'] === 'production') {
|
|
24
|
-
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains; preload');
|
|
25
|
-
}
|
|
26
|
-
// CORS -- default to same-origin only; set CORS_ALLOWED_ORIGINS to allow cross-origin
|
|
27
|
-
const corsEnv = process.env['CORS_ALLOWED_ORIGINS'] ?? '';
|
|
28
|
-
const allowedOrigins = corsEnv ? corsEnv.split(',').map((o) => o.trim()) : [];
|
|
29
|
-
const origin = req.headers.origin ?? '';
|
|
30
|
-
if (allowedOrigins.includes('*') && process.env['NODE_ENV'] !== 'production') {
|
|
31
|
-
res.setHeader('Access-Control-Allow-Origin', origin || '*');
|
|
32
|
-
}
|
|
33
|
-
else if (origin && allowedOrigins.includes(origin)) {
|
|
34
|
-
res.setHeader('Access-Control-Allow-Origin', origin);
|
|
35
|
-
}
|
|
36
|
-
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, DELETE, OPTIONS');
|
|
37
|
-
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
38
|
-
if (req.method === 'OPTIONS') {
|
|
39
|
-
res.writeHead(204);
|
|
40
|
-
res.end();
|
|
41
|
-
return true;
|
|
42
|
-
}
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
// ── Core Routes (health, OpenAPI, static) ──────────────────────
|
|
46
|
-
/**
|
|
47
|
-
* Handle core routes: /health, /openapi.json, /docs/api, /admin/*.
|
|
48
|
-
* Returns true if the route was handled, false otherwise.
|
|
49
|
-
*/
|
|
50
|
-
export function handleCoreRoutes(req, res, pathname, db, threatDb, adminDir) {
|
|
51
|
-
// OpenAPI spec (JSON)
|
|
52
|
-
if (pathname === '/openapi.json') {
|
|
53
|
-
const spec = generateOpenApiSpec(process.env['PANGUARD_BASE_URL'] ?? `http://${req.headers.host ?? 'localhost'}`);
|
|
54
|
-
sendJson(res, 200, spec);
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
// Swagger UI
|
|
58
|
-
if (pathname === '/docs/api' || pathname === '/docs/api/') {
|
|
59
|
-
const specUrl = '/openapi.json';
|
|
60
|
-
const html = generateSwaggerHtml(specUrl);
|
|
61
|
-
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
62
|
-
res.end(html);
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
// Health check (minimal public response -- detailed status behind /api/admin/health)
|
|
66
|
-
if (pathname === '/health') {
|
|
67
|
-
try {
|
|
68
|
-
db.healthCheck();
|
|
69
|
-
sendJson(res, 200, {
|
|
70
|
-
ok: true,
|
|
71
|
-
data: {
|
|
72
|
-
status: 'healthy',
|
|
73
|
-
uptime: Math.round(process.uptime()),
|
|
74
|
-
db: 'connected',
|
|
75
|
-
threatCloud: threatDb ? 'connected' : 'unavailable',
|
|
76
|
-
},
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
sendJson(res, 503, {
|
|
81
|
-
ok: false,
|
|
82
|
-
data: { status: 'unhealthy', db: 'disconnected' },
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
// Admin static files
|
|
88
|
-
if (adminDir && pathname.startsWith('/admin')) {
|
|
89
|
-
serveStaticFile(req, res, adminDir, pathname);
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
// ── Static File Serving ────────────────────────────────────────
|
|
95
|
-
function serveStaticFile(_req, res, adminDir, pathname) {
|
|
96
|
-
// Map /admin -> /admin/index.html
|
|
97
|
-
const resolvedAdminDir = resolve(adminDir);
|
|
98
|
-
let filePath;
|
|
99
|
-
if (pathname === '/admin' || pathname === '/admin/') {
|
|
100
|
-
filePath = join(resolvedAdminDir, 'index.html');
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
// Strip /admin prefix and leading slash
|
|
104
|
-
const relativePath = pathname.slice('/admin'.length).replace(/^\//, '');
|
|
105
|
-
filePath = join(resolvedAdminDir, relativePath);
|
|
106
|
-
// If no extension, try .html
|
|
107
|
-
if (!relativePath.includes('.')) {
|
|
108
|
-
filePath = join(resolvedAdminDir, relativePath + '.html');
|
|
109
|
-
if (!existsSync(filePath)) {
|
|
110
|
-
filePath = join(resolvedAdminDir, relativePath, 'index.html');
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
// Prevent path traversal: resolved path must be within admin directory
|
|
115
|
-
if (!filePath.startsWith(resolvedAdminDir)) {
|
|
116
|
-
sendJson(res, 403, { ok: false, error: 'Forbidden' });
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
if (!existsSync(filePath)) {
|
|
120
|
-
sendJson(res, 404, { ok: false, error: 'Not found' });
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
const ext = filePath.split('.').pop() ?? '';
|
|
124
|
-
const mimeTypes = {
|
|
125
|
-
html: 'text/html',
|
|
126
|
-
css: 'text/css',
|
|
127
|
-
js: 'application/javascript',
|
|
128
|
-
json: 'application/json',
|
|
129
|
-
png: 'image/png',
|
|
130
|
-
svg: 'image/svg+xml',
|
|
131
|
-
ico: 'image/x-icon',
|
|
132
|
-
};
|
|
133
|
-
const contentType = mimeTypes[ext] ?? 'application/octet-stream';
|
|
134
|
-
const content = readFileSync(filePath);
|
|
135
|
-
res.writeHead(200, { 'Content-Type': contentType });
|
|
136
|
-
res.end(content);
|
|
137
|
-
}
|
|
138
|
-
// ── Rule Seeding ───────────────────────────────────────────────
|
|
139
|
-
/**
|
|
140
|
-
* Seed rules from bundled config/ directory into Threat Cloud DB.
|
|
141
|
-
* Reads ATR YAML files.
|
|
142
|
-
* Returns count of rules seeded.
|
|
143
|
-
*/
|
|
144
|
-
export async function seedRulesFromBundled(threatDb) {
|
|
145
|
-
let seeded = 0;
|
|
146
|
-
const now = new Date().toISOString();
|
|
147
|
-
// Resolve config directory (Docker: /app/config, monorepo: ../../config)
|
|
148
|
-
const configDirs = [
|
|
149
|
-
join(process.cwd(), 'config'),
|
|
150
|
-
join(dirname(fileURLToPath(import.meta.url)), '..', '..', '..', '..', '..', 'config'),
|
|
151
|
-
];
|
|
152
|
-
const configDir = configDirs.find((d) => {
|
|
153
|
-
try {
|
|
154
|
-
return statSync(d).isDirectory();
|
|
155
|
-
}
|
|
156
|
-
catch {
|
|
157
|
-
return false;
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
if (!configDir) {
|
|
161
|
-
console.log(` ${c.dim(' No config/ directory found -- skipping rule seeding')}`);
|
|
162
|
-
console.log(` ${c.dim(` Searched: ${configDirs.join(', ')}`)}`);
|
|
163
|
-
return 0;
|
|
164
|
-
}
|
|
165
|
-
console.log(` ${c.dim(` Using config directory: ${configDir}`)}`);
|
|
166
|
-
/** Recursively collect files matching extensions */
|
|
167
|
-
function collectFiles(dir, extensions) {
|
|
168
|
-
const results = [];
|
|
169
|
-
try {
|
|
170
|
-
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
171
|
-
const fullPath = join(dir, entry.name);
|
|
172
|
-
if (entry.isDirectory()) {
|
|
173
|
-
results.push(...collectFiles(fullPath, extensions));
|
|
174
|
-
}
|
|
175
|
-
else if (extensions.some((ext) => entry.name.endsWith(ext))) {
|
|
176
|
-
results.push(fullPath);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
catch (err) {
|
|
181
|
-
console.error(` [WARN] Cannot read directory ${dir}: ${err instanceof Error ? err.message : String(err)}`);
|
|
182
|
-
}
|
|
183
|
-
return results;
|
|
184
|
-
}
|
|
185
|
-
// ATR rules (.yaml, .yml) from atr package
|
|
186
|
-
const atrDirs = [
|
|
187
|
-
join(process.cwd(), 'node_modules', 'agent-threat-rules', 'rules'),
|
|
188
|
-
join(dirname(fileURLToPath(import.meta.url)), '..', '..', '..', '..', '..', 'packages', 'atr', 'rules'),
|
|
189
|
-
];
|
|
190
|
-
const atrDir = atrDirs.find((d) => {
|
|
191
|
-
try {
|
|
192
|
-
return statSync(d).isDirectory();
|
|
193
|
-
}
|
|
194
|
-
catch {
|
|
195
|
-
return false;
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
if (atrDir) {
|
|
199
|
-
try {
|
|
200
|
-
const atrFiles = collectFiles(atrDir, ['.yaml', '.yml']);
|
|
201
|
-
for (const file of atrFiles) {
|
|
202
|
-
const content = readFileSync(file, 'utf-8');
|
|
203
|
-
const ruleId = `atr:${relative(atrDir, file).replace(/\//g, ':')}`;
|
|
204
|
-
threatDb.upsertRule({ ruleId, ruleContent: content, publishedAt: now, source: 'atr' });
|
|
205
|
-
seeded++;
|
|
206
|
-
}
|
|
207
|
-
console.log(` ${c.dim(` ATR: ${atrFiles.length} files processed`)}`);
|
|
208
|
-
}
|
|
209
|
-
catch (err) {
|
|
210
|
-
console.error(` [WARN] ATR rule seeding failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
return seeded;
|
|
214
|
-
}
|
|
215
|
-
//# sourceMappingURL=serve-core.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"serve-core.js","sourceRoot":"","sources":["../../../src/cli/commands/serve-core.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Threat Cloud route handlers for panguard serve.
|
|
3
|
-
* Uses centralized Zod schemas from @panguard-ai/core for input validation.
|
|
4
|
-
*/
|
|
5
|
-
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
6
|
-
import type { RouteContext } from './serve-types.js';
|
|
7
|
-
/**
|
|
8
|
-
* Handle Threat Cloud API routes (/api/threats, /api/rules, /api/stats, etc.).
|
|
9
|
-
* Returns true if the route was handled, false otherwise.
|
|
10
|
-
*/
|
|
11
|
-
export declare function handleTCRoutes(req: IncomingMessage, res: ServerResponse, url: string, pathname: string, ctx: RouteContext): Promise<boolean>;
|
|
12
|
-
//# sourceMappingURL=serve-tc.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"serve-tc.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/serve-tc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAgFrD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,OAAO,CAAC,CAoOlB"}
|