tuimon 0.1.0 → 0.3.0
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/AI.md +191 -0
- package/README.md +240 -94
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +3 -0
- package/dist/browser.js.map +1 -1
- package/dist/cli.js +224 -3
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +17 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +106 -0
- package/dist/config.js.map +1 -0
- package/dist/fkeybar.d.ts.map +1 -1
- package/dist/fkeybar.js +13 -0
- package/dist/fkeybar.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +148 -18
- package/dist/index.js.map +1 -1
- package/dist/layout/generator-css.d.ts +3 -0
- package/dist/layout/generator-css.d.ts.map +1 -0
- package/dist/layout/generator-css.js +202 -0
- package/dist/layout/generator-css.js.map +1 -0
- package/dist/layout/generator-js.d.ts +3 -0
- package/dist/layout/generator-js.d.ts.map +1 -0
- package/dist/layout/generator-js.js +353 -0
- package/dist/layout/generator-js.js.map +1 -0
- package/dist/layout/generator.d.ts +4 -0
- package/dist/layout/generator.d.ts.map +1 -0
- package/dist/layout/generator.js +124 -0
- package/dist/layout/generator.js.map +1 -0
- package/dist/layout/theme.d.ts +4 -0
- package/dist/layout/theme.d.ts.map +1 -0
- package/dist/layout/theme.js +28 -0
- package/dist/layout/theme.js.map +1 -0
- package/dist/layout/types.d.ts +68 -0
- package/dist/layout/types.d.ts.map +1 -0
- package/dist/layout/types.js +3 -0
- package/dist/layout/types.js.map +1 -0
- package/dist/quick/auto-layout.d.ts +5 -0
- package/dist/quick/auto-layout.d.ts.map +1 -0
- package/dist/quick/auto-layout.js +262 -0
- package/dist/quick/auto-layout.js.map +1 -0
- package/dist/quick/db/detect.d.ts +16 -0
- package/dist/quick/db/detect.d.ts.map +1 -0
- package/dist/quick/db/detect.js +131 -0
- package/dist/quick/db/detect.js.map +1 -0
- package/dist/quick/db/mongo.d.ts +10 -0
- package/dist/quick/db/mongo.d.ts.map +1 -0
- package/dist/quick/db/mongo.js +81 -0
- package/dist/quick/db/mongo.js.map +1 -0
- package/dist/quick/db/mysql.d.ts +8 -0
- package/dist/quick/db/mysql.d.ts.map +1 -0
- package/dist/quick/db/mysql.js +43 -0
- package/dist/quick/db/mysql.js.map +1 -0
- package/dist/quick/db/postgres.d.ts +8 -0
- package/dist/quick/db/postgres.d.ts.map +1 -0
- package/dist/quick/db/postgres.js +47 -0
- package/dist/quick/db/postgres.js.map +1 -0
- package/dist/quick/db/sqlite.d.ts +8 -0
- package/dist/quick/db/sqlite.d.ts.map +1 -0
- package/dist/quick/db/sqlite.js +43 -0
- package/dist/quick/db/sqlite.js.map +1 -0
- package/dist/quick/db-mode.d.ts +13 -0
- package/dist/quick/db-mode.d.ts.map +1 -0
- package/dist/quick/db-mode.js +159 -0
- package/dist/quick/db-mode.js.map +1 -0
- package/dist/quick/detect.d.ts +4 -0
- package/dist/quick/detect.d.ts.map +1 -0
- package/dist/quick/detect.js +76 -0
- package/dist/quick/detect.js.map +1 -0
- package/dist/quick/file-mode.d.ts +5 -0
- package/dist/quick/file-mode.d.ts.map +1 -0
- package/dist/quick/file-mode.js +158 -0
- package/dist/quick/file-mode.js.map +1 -0
- package/dist/quick/parsers/csv.d.ts +3 -0
- package/dist/quick/parsers/csv.d.ts.map +1 -0
- package/dist/quick/parsers/csv.js +145 -0
- package/dist/quick/parsers/csv.js.map +1 -0
- package/dist/quick/parsers/detect-meta.d.ts +7 -0
- package/dist/quick/parsers/detect-meta.d.ts.map +1 -0
- package/dist/quick/parsers/detect-meta.js +35 -0
- package/dist/quick/parsers/detect-meta.js.map +1 -0
- package/dist/quick/parsers/json.d.ts +3 -0
- package/dist/quick/parsers/json.d.ts.map +1 -0
- package/dist/quick/parsers/json.js +74 -0
- package/dist/quick/parsers/json.js.map +1 -0
- package/dist/quick/parsers/log.d.ts +3 -0
- package/dist/quick/parsers/log.d.ts.map +1 -0
- package/dist/quick/parsers/log.js +185 -0
- package/dist/quick/parsers/log.js.map +1 -0
- package/dist/quick/parsers/modsec.d.ts +3 -0
- package/dist/quick/parsers/modsec.d.ts.map +1 -0
- package/dist/quick/parsers/modsec.js +338 -0
- package/dist/quick/parsers/modsec.js.map +1 -0
- package/dist/quick/presets/coverage.d.ts +3 -0
- package/dist/quick/presets/coverage.d.ts.map +1 -0
- package/dist/quick/presets/coverage.js +362 -0
- package/dist/quick/presets/coverage.js.map +1 -0
- package/dist/quick/presets/deps.d.ts +3 -0
- package/dist/quick/presets/deps.d.ts.map +1 -0
- package/dist/quick/presets/deps.js +194 -0
- package/dist/quick/presets/deps.js.map +1 -0
- package/dist/quick/presets/docker.d.ts +3 -0
- package/dist/quick/presets/docker.d.ts.map +1 -0
- package/dist/quick/presets/docker.js +100 -0
- package/dist/quick/presets/docker.js.map +1 -0
- package/dist/quick/presets/git.d.ts +3 -0
- package/dist/quick/presets/git.d.ts.map +1 -0
- package/dist/quick/presets/git.js +116 -0
- package/dist/quick/presets/git.js.map +1 -0
- package/dist/quick/presets/ps.d.ts +3 -0
- package/dist/quick/presets/ps.d.ts.map +1 -0
- package/dist/quick/presets/ps.js +168 -0
- package/dist/quick/presets/ps.js.map +1 -0
- package/dist/quick/presets/runner.d.ts +3 -0
- package/dist/quick/presets/runner.d.ts.map +1 -0
- package/dist/quick/presets/runner.js +20 -0
- package/dist/quick/presets/runner.js.map +1 -0
- package/dist/quick/presets/types.d.ts +7 -0
- package/dist/quick/presets/types.d.ts.map +1 -0
- package/dist/quick/presets/types.js +2 -0
- package/dist/quick/presets/types.js.map +1 -0
- package/dist/quick/types.d.ts +90 -0
- package/dist/quick/types.d.ts.map +1 -0
- package/dist/quick/types.js +3 -0
- package/dist/quick/types.js.map +1 -0
- package/dist/quick/watch-mode.d.ts +3 -0
- package/dist/quick/watch-mode.d.ts.map +1 -0
- package/dist/quick/watch-mode.js +156 -0
- package/dist/quick/watch-mode.js.map +1 -0
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +9 -2
- package/dist/types.d.ts.map +1 -1
- package/examples/demo.ts +134 -0
- package/examples/generate-access-log.ts +42 -0
- package/examples/screenshot-test.ts +105 -0
- package/examples/screenshot.png +0 -0
- package/frame-log.txt +830 -0
- package/package.json +10 -5
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
const MAX_EVENTS = 10000;
|
|
3
|
+
const SECTION_RE = /^--([a-zA-Z0-9@._-]+)-([A-Z])--$/;
|
|
4
|
+
const RULE_ID_RE = /\[id "(\d+)"\]/g;
|
|
5
|
+
const RULE_TAG_RE = /\[tag "([^"]+)"\]/g;
|
|
6
|
+
const ACTION_RE = /Action: (\S+)/;
|
|
7
|
+
const ATTACK_CATEGORIES = {
|
|
8
|
+
'920': 'Protocol Violation',
|
|
9
|
+
'921': 'Protocol Attack',
|
|
10
|
+
'930': 'LFI (Local File Inclusion)',
|
|
11
|
+
'931': 'RFI (Remote File Inclusion)',
|
|
12
|
+
'932': 'RCE (Remote Code Execution)',
|
|
13
|
+
'933': 'PHP Injection',
|
|
14
|
+
'934': 'Node.js Injection',
|
|
15
|
+
'941': 'XSS (Cross-Site Scripting)',
|
|
16
|
+
'942': 'SQLi (SQL Injection)',
|
|
17
|
+
'943': 'Session Fixation',
|
|
18
|
+
'944': 'Java Attack',
|
|
19
|
+
'913': 'Scanner Detection',
|
|
20
|
+
};
|
|
21
|
+
export function parseModSecFile(filePath) {
|
|
22
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
23
|
+
// Try JSON lines format first
|
|
24
|
+
const trimmed = content.trimStart();
|
|
25
|
+
if (trimmed.startsWith('{')) {
|
|
26
|
+
return parseJsonModSec(content);
|
|
27
|
+
}
|
|
28
|
+
return parseSerialAuditLog(content);
|
|
29
|
+
}
|
|
30
|
+
// ─── Serial audit log format ────────────────────────────────────────────────
|
|
31
|
+
function parseSerialAuditLog(content) {
|
|
32
|
+
const lines = content.split('\n');
|
|
33
|
+
const events = [];
|
|
34
|
+
const eventSections = new Map();
|
|
35
|
+
const eventOrder = [];
|
|
36
|
+
let currentId = null;
|
|
37
|
+
let currentSection = null;
|
|
38
|
+
let currentLines = [];
|
|
39
|
+
for (const line of lines) {
|
|
40
|
+
const m = SECTION_RE.exec(line);
|
|
41
|
+
if (m) {
|
|
42
|
+
// Flush previous section
|
|
43
|
+
if (currentId && currentSection) {
|
|
44
|
+
let sections = eventSections.get(currentId);
|
|
45
|
+
if (!sections) {
|
|
46
|
+
sections = {};
|
|
47
|
+
eventSections.set(currentId, sections);
|
|
48
|
+
eventOrder.push(currentId);
|
|
49
|
+
}
|
|
50
|
+
sections[currentSection] = currentLines;
|
|
51
|
+
}
|
|
52
|
+
currentId = m[1];
|
|
53
|
+
currentSection = m[2];
|
|
54
|
+
currentLines = [];
|
|
55
|
+
// Init entry if new
|
|
56
|
+
if (!eventSections.has(currentId)) {
|
|
57
|
+
eventSections.set(currentId, {});
|
|
58
|
+
eventOrder.push(currentId);
|
|
59
|
+
}
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
currentLines.push(line);
|
|
63
|
+
}
|
|
64
|
+
// Flush last section
|
|
65
|
+
if (currentId && currentSection) {
|
|
66
|
+
let sections = eventSections.get(currentId);
|
|
67
|
+
if (!sections) {
|
|
68
|
+
sections = {};
|
|
69
|
+
eventSections.set(currentId, sections);
|
|
70
|
+
eventOrder.push(currentId);
|
|
71
|
+
}
|
|
72
|
+
sections[currentSection] = currentLines;
|
|
73
|
+
}
|
|
74
|
+
// Deduplicate eventOrder
|
|
75
|
+
const seen = new Set();
|
|
76
|
+
const uniqueOrder = eventOrder.filter((id) => {
|
|
77
|
+
if (seen.has(id))
|
|
78
|
+
return false;
|
|
79
|
+
seen.add(id);
|
|
80
|
+
return true;
|
|
81
|
+
});
|
|
82
|
+
// Parse each event (cap at MAX_EVENTS)
|
|
83
|
+
for (const id of uniqueOrder.slice(0, MAX_EVENTS)) {
|
|
84
|
+
const sections = eventSections.get(id);
|
|
85
|
+
if (!sections)
|
|
86
|
+
continue;
|
|
87
|
+
const event = parseSections(id, sections);
|
|
88
|
+
if (event)
|
|
89
|
+
events.push(event);
|
|
90
|
+
}
|
|
91
|
+
return buildModSecData(events);
|
|
92
|
+
}
|
|
93
|
+
function parseSections(uniqueId, sections) {
|
|
94
|
+
// Section A: header
|
|
95
|
+
const aLines = sections['A'] ?? [];
|
|
96
|
+
const aLine = aLines.find((l) => l.trim().length > 0);
|
|
97
|
+
let timestamp = '';
|
|
98
|
+
let clientIp = '';
|
|
99
|
+
let clientPort;
|
|
100
|
+
let serverIp;
|
|
101
|
+
let serverPort;
|
|
102
|
+
if (aLine) {
|
|
103
|
+
// Format: [dd/Mon/yyyy:HH:mm:ss +ZZZZ] uniqueId sourceIp sourcePort destIp destPort
|
|
104
|
+
const aMatch = aLine.match(/\[([^\]]+)\]\s+\S+\s+(\S+)\s+(\d+)\s+(\S+)\s+(\d+)/);
|
|
105
|
+
if (aMatch) {
|
|
106
|
+
timestamp = aMatch[1];
|
|
107
|
+
clientIp = aMatch[2];
|
|
108
|
+
clientPort = parseInt(aMatch[3], 10);
|
|
109
|
+
serverIp = aMatch[4];
|
|
110
|
+
serverPort = parseInt(aMatch[5], 10);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// v3 format or other variant — try simpler extraction
|
|
114
|
+
const simpleParts = aLine.trim().split(/\s+/);
|
|
115
|
+
// Look for timestamp in brackets
|
|
116
|
+
const tsMatch = aLine.match(/\[([^\]]+)\]/);
|
|
117
|
+
if (tsMatch)
|
|
118
|
+
timestamp = tsMatch[1];
|
|
119
|
+
// Look for IP-like strings
|
|
120
|
+
for (const part of simpleParts) {
|
|
121
|
+
if (/^\d+\.\d+\.\d+\.\d+$/.test(part) && !clientIp) {
|
|
122
|
+
clientIp = part;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Section B: request line + headers
|
|
128
|
+
const bLines = sections['B'] ?? [];
|
|
129
|
+
let method = '';
|
|
130
|
+
let uri = '';
|
|
131
|
+
let protocol;
|
|
132
|
+
const requestLine = bLines.find((l) => l.trim().length > 0);
|
|
133
|
+
if (requestLine) {
|
|
134
|
+
const parts = requestLine.trim().split(/\s+/);
|
|
135
|
+
method = parts[0] ?? '';
|
|
136
|
+
uri = parts[1] ?? '';
|
|
137
|
+
protocol = parts[2];
|
|
138
|
+
}
|
|
139
|
+
// Section F: response status
|
|
140
|
+
const fLines = sections['F'] ?? [];
|
|
141
|
+
let httpCode = 0;
|
|
142
|
+
const statusLine = fLines.find((l) => l.trim().length > 0);
|
|
143
|
+
if (statusLine) {
|
|
144
|
+
const fMatch = statusLine.match(/\S+\s+(\d+)/);
|
|
145
|
+
if (fMatch) {
|
|
146
|
+
httpCode = parseInt(fMatch[1], 10);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Section H: messages/trailer
|
|
150
|
+
const hLines = sections['H'] ?? [];
|
|
151
|
+
const hContent = hLines.join('\n');
|
|
152
|
+
const messages = parseHSection(hContent);
|
|
153
|
+
let action;
|
|
154
|
+
const actionMatch = ACTION_RE.exec(hContent);
|
|
155
|
+
if (actionMatch) {
|
|
156
|
+
action = actionMatch[1];
|
|
157
|
+
}
|
|
158
|
+
// Build raw from all sections
|
|
159
|
+
const rawParts = [];
|
|
160
|
+
for (const [key, val] of Object.entries(sections)) {
|
|
161
|
+
rawParts.push(`--${uniqueId}-${key}--`);
|
|
162
|
+
rawParts.push(...(val ?? []));
|
|
163
|
+
}
|
|
164
|
+
const raw = rawParts.join('\n');
|
|
165
|
+
const event = {
|
|
166
|
+
uniqueId,
|
|
167
|
+
timestamp,
|
|
168
|
+
clientIp,
|
|
169
|
+
method,
|
|
170
|
+
uri,
|
|
171
|
+
httpCode,
|
|
172
|
+
messages,
|
|
173
|
+
raw,
|
|
174
|
+
};
|
|
175
|
+
if (clientPort !== undefined)
|
|
176
|
+
event.clientPort = clientPort;
|
|
177
|
+
if (serverIp !== undefined)
|
|
178
|
+
event.serverIp = serverIp;
|
|
179
|
+
if (serverPort !== undefined)
|
|
180
|
+
event.serverPort = serverPort;
|
|
181
|
+
if (protocol !== undefined)
|
|
182
|
+
event.protocol = protocol;
|
|
183
|
+
if (action !== undefined)
|
|
184
|
+
event.action = action;
|
|
185
|
+
return event;
|
|
186
|
+
}
|
|
187
|
+
function parseHSection(content) {
|
|
188
|
+
// Find all rule IDs first, then match msgs/severities/tags at same positions
|
|
189
|
+
const ids = [];
|
|
190
|
+
let m;
|
|
191
|
+
const idRe = new RegExp(RULE_ID_RE.source, 'g');
|
|
192
|
+
while ((m = idRe.exec(content)) !== null) {
|
|
193
|
+
ids.push({ id: m[1], index: m.index });
|
|
194
|
+
}
|
|
195
|
+
if (ids.length === 0)
|
|
196
|
+
return [];
|
|
197
|
+
const messages = [];
|
|
198
|
+
for (let i = 0; i < ids.length; i++) {
|
|
199
|
+
const start = ids[i].index;
|
|
200
|
+
const end = i + 1 < ids.length ? ids[i + 1].index : content.length;
|
|
201
|
+
const segment = content.slice(start, end);
|
|
202
|
+
const msgMatch = /\[msg "([^"]+)"\]/.exec(segment);
|
|
203
|
+
const sevMatch = /\[severity "([^"]+)"\]/.exec(segment);
|
|
204
|
+
const tags = [];
|
|
205
|
+
const tagRe = new RegExp(RULE_TAG_RE.source, 'g');
|
|
206
|
+
let tagMatch;
|
|
207
|
+
while ((tagMatch = tagRe.exec(segment)) !== null) {
|
|
208
|
+
tags.push(tagMatch[1]);
|
|
209
|
+
}
|
|
210
|
+
const message = {
|
|
211
|
+
id: ids[i].id,
|
|
212
|
+
msg: msgMatch?.[1] ?? '',
|
|
213
|
+
severity: sevMatch?.[1] ?? '',
|
|
214
|
+
};
|
|
215
|
+
if (tags.length > 0)
|
|
216
|
+
message.tags = tags;
|
|
217
|
+
messages.push(message);
|
|
218
|
+
}
|
|
219
|
+
return messages;
|
|
220
|
+
}
|
|
221
|
+
// ─── JSON lines modsec format ───────────────────────────────────────────────
|
|
222
|
+
function parseJsonModSec(content) {
|
|
223
|
+
const lines = content.split('\n').filter((l) => l.trim());
|
|
224
|
+
const events = [];
|
|
225
|
+
for (const line of lines.slice(0, MAX_EVENTS)) {
|
|
226
|
+
let obj;
|
|
227
|
+
try {
|
|
228
|
+
obj = JSON.parse(line);
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
const tx = obj['transaction'];
|
|
234
|
+
if (!tx)
|
|
235
|
+
continue;
|
|
236
|
+
const request = tx['request'];
|
|
237
|
+
const response = tx['response'];
|
|
238
|
+
const rawMessages = tx['messages'];
|
|
239
|
+
const messages = (rawMessages ?? []).map((m) => {
|
|
240
|
+
const msg = {
|
|
241
|
+
id: String(m['id'] ?? ''),
|
|
242
|
+
msg: String(m['msg'] ?? m['message'] ?? ''),
|
|
243
|
+
severity: String(m['severity'] ?? ''),
|
|
244
|
+
};
|
|
245
|
+
if (Array.isArray(m['tags']))
|
|
246
|
+
msg.tags = m['tags'].map(String);
|
|
247
|
+
return msg;
|
|
248
|
+
});
|
|
249
|
+
const event = {
|
|
250
|
+
uniqueId: String(tx['unique_id'] ?? tx['id'] ?? ''),
|
|
251
|
+
timestamp: String(tx['timestamp'] ?? tx['time_stamp'] ?? ''),
|
|
252
|
+
clientIp: String(tx['client_ip'] ?? ''),
|
|
253
|
+
method: String(request?.['method'] ?? ''),
|
|
254
|
+
uri: String(request?.['uri'] ?? ''),
|
|
255
|
+
httpCode: typeof response?.['http_code'] === 'number' ? response['http_code'] : 0,
|
|
256
|
+
messages,
|
|
257
|
+
raw: line,
|
|
258
|
+
};
|
|
259
|
+
if (typeof tx['client_port'] === 'number')
|
|
260
|
+
event.clientPort = tx['client_port'];
|
|
261
|
+
if (typeof tx['server_ip'] === 'string')
|
|
262
|
+
event.serverIp = tx['server_ip'];
|
|
263
|
+
if (typeof tx['server_port'] === 'number')
|
|
264
|
+
event.serverPort = tx['server_port'];
|
|
265
|
+
if (typeof request?.['protocol'] === 'string')
|
|
266
|
+
event.protocol = request['protocol'];
|
|
267
|
+
if (typeof tx['action'] === 'string')
|
|
268
|
+
event.action = tx['action'];
|
|
269
|
+
events.push(event);
|
|
270
|
+
}
|
|
271
|
+
return buildModSecData(events);
|
|
272
|
+
}
|
|
273
|
+
// ─── Stats builder ──────────────────────────────────────────────────────────
|
|
274
|
+
function buildModSecData(events) {
|
|
275
|
+
const severityCounts = {};
|
|
276
|
+
const ruleCounts = {};
|
|
277
|
+
const ipCounts = {};
|
|
278
|
+
const attackCats = {};
|
|
279
|
+
let blockedRequests = 0;
|
|
280
|
+
let firstTimestamp;
|
|
281
|
+
let lastTimestamp;
|
|
282
|
+
for (const evt of events) {
|
|
283
|
+
// IP counts
|
|
284
|
+
if (evt.clientIp) {
|
|
285
|
+
ipCounts[evt.clientIp] = (ipCounts[evt.clientIp] ?? 0) + 1;
|
|
286
|
+
}
|
|
287
|
+
// Blocked?
|
|
288
|
+
if (evt.action === 'Intercepted' || evt.httpCode >= 400) {
|
|
289
|
+
blockedRequests++;
|
|
290
|
+
}
|
|
291
|
+
// Timestamps
|
|
292
|
+
if (evt.timestamp) {
|
|
293
|
+
if (!firstTimestamp)
|
|
294
|
+
firstTimestamp = evt.timestamp;
|
|
295
|
+
lastTimestamp = evt.timestamp;
|
|
296
|
+
}
|
|
297
|
+
// Messages
|
|
298
|
+
for (const msg of evt.messages) {
|
|
299
|
+
if (msg.severity) {
|
|
300
|
+
severityCounts[msg.severity] = (severityCounts[msg.severity] ?? 0) + 1;
|
|
301
|
+
}
|
|
302
|
+
if (msg.id) {
|
|
303
|
+
ruleCounts[msg.id] = (ruleCounts[msg.id] ?? 0) + 1;
|
|
304
|
+
// Attack category from first 3 digits of rule ID
|
|
305
|
+
const prefix = msg.id.slice(0, 3);
|
|
306
|
+
const category = ATTACK_CATEGORIES[prefix];
|
|
307
|
+
if (category) {
|
|
308
|
+
attackCats[category] = (attackCats[category] ?? 0) + 1;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
const uniqueIPs = new Set(events.map((e) => e.clientIp).filter(Boolean)).size;
|
|
314
|
+
const stats = {
|
|
315
|
+
totalEvents: events.length,
|
|
316
|
+
blockedRequests,
|
|
317
|
+
uniqueIPs,
|
|
318
|
+
severityCounts,
|
|
319
|
+
topRules: topN(ruleCounts, 20),
|
|
320
|
+
topIPs: topN(ipCounts, 20),
|
|
321
|
+
attackCategories: attackCats,
|
|
322
|
+
};
|
|
323
|
+
if (firstTimestamp && lastTimestamp) {
|
|
324
|
+
stats.timeRange = { start: firstTimestamp, end: lastTimestamp };
|
|
325
|
+
}
|
|
326
|
+
return {
|
|
327
|
+
type: 'modsec',
|
|
328
|
+
events,
|
|
329
|
+
stats,
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
function topN(map, n) {
|
|
333
|
+
const sorted = Object.entries(map)
|
|
334
|
+
.sort((a, b) => b[1] - a[1])
|
|
335
|
+
.slice(0, n);
|
|
336
|
+
return Object.fromEntries(sorted);
|
|
337
|
+
}
|
|
338
|
+
//# sourceMappingURL=modsec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modsec.js","sourceRoot":"","sources":["../../../src/quick/parsers/modsec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../../src/quick/presets/coverage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAib9C,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,CAkC7D"}
|