@socprime/logtotal-sanitizer 0.2.0-beta.1 → 0.2.0-beta.3

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/CHANGELOG.md CHANGED
@@ -5,7 +5,32 @@ All notable changes to this project are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- ## [Unreleased]
8
+ ## [0.2.0-beta.3] - 2026-09-23
9
+
10
+ ### Fixed
11
+
12
+ - JSON replacement context: `report.contextChars` for values redacted by `jsonKeys` or
13
+ `jsonKeyContains` now locates the quoted JSON value instead of the first bare
14
+ substring.
15
+
16
+ ## [0.2.0-beta.2] - 2026-09-21
17
+
18
+ ### Fixed
19
+
20
+ - JSON field redaction: Windows placeholder values (`""` and `"-"`) are left unchanged instead
21
+ of being replaced with a token.
22
+ - `users` rule: `DOMAIN\user` is now also matched when the separator is JSON-escaped
23
+ (`"User": "CORP\\jdoe"`), so accounts in pretty-printed JSON that never parses line by line are
24
+ redacted. The account segment gets the same token as the plain-text form.
25
+ - `hosts` rule: quoted JSON host fields (`"Computer": "box1"`, `"SubjectDomainName": "CORP"`) are
26
+ matched by key name, case- and `-`/`_`-insensitive. The plain-text `computer=` pattern only
27
+ matched lowercase keys with no quote between the key and the separator.
28
+ - `hosts` rule: the domain half of a quoted `"DOMAIN\account"` value becomes a `HOST` token, so a
29
+ workstation name correlates with the same name in a `Computer` field. Anchored on both quotes,
30
+ and guarded by the well-known-domain and filename exclusions the `users` rule already uses, so
31
+ path segments such as `"System32\cmd.exe"` are left alone.
32
+ - `hosts` rule: UNC computer names are also matched when the separators are JSON-escaped
33
+ (`"\\\\FILESRV01\\share"`).
9
34
 
10
35
  ## [0.2.0-beta.1] - 2026-09-15
11
36
 
package/README.md CHANGED
@@ -205,3 +205,43 @@ Exit codes: `0` ok, `1` runtime error or `--fail-on-match`, `2` usage error.
205
205
  ## Token correlation
206
206
 
207
207
  Tokens are HMAC-SHA-256 of `ruleId || 0x00 || original`, truncated to 16 hex chars. Same key + same value + same rule ⇒ same token. A different key produces different tokens. Generated keys use encoding `hex`; pasted keys default to `utf8`.
208
+
209
+ ## Integrations
210
+
211
+ The sanitizer is a library first, so most real deployments wrap it in something else: a pipeline function, a stream processor, a sidecar. This index tracks integrations that exist today and ones we (or partners) intend to build. Entries maintained outside SOC Prime are marked as such and are not endorsed or supported by SOC Prime.
212
+
213
+ Status values: **Available** — released and usable. **Planned** — committed, in design or development. **Wanted** — no owner yet; open an issue to claim one.
214
+
215
+ | Integration | Maintainer | Status | Description |
216
+ | --- | --- | --- | --- |
217
+ | [Cribl Stream Pack](https://github.com/M3NIX/cribl-logtotal-sanitizer) | [@M3NIX](https://github.com/M3NIX) (community) | Available | Cribl Stream Pack that sanitizes `_raw` in-pipeline using a Worker Group Secret as the HMAC key. Ships a Function, a passthrough fallback route, and 100 synthetic preview events. Also on [packs.cribl.io](https://packs.cribl.io/packs/cc-stream-logtotal-sanitizer). |
218
+ | Kafka — sanitize on produce | SOC Prime | Planned | Sanitizes events at the ingestion edge, before they are written to the topic, so raw secrets and identifiers never land in Kafka storage or replicas. |
219
+ | Kafka — sanitize on consume | SOC Prime | Planned | Leaves the topic intact and sanitizes on read, for cases where the cluster is trusted but a specific downstream consumer or third party is not. |
220
+ | [Tenzir](https://tenzir.com) | Open — contributors welcome | Planned | Sanitizer operator for TQL pipelines, applied to selected fields. Likely via the Python or shell operator until a native operator exists. |
221
+ | [Onum](https://onum.com) (CrowdStrike) | Open — contributors welcome | Planned | Sanitizer action in an Onum pipeline, ahead of delivery to Falcon Next-Gen SIEM or any other destination. |
222
+ | [Vector](https://vector.dev) (Datadog) | Open — contributors welcome | Wanted | Sanitization stage in a Vector topology, via an `exec` transform or an HTTP round trip to a sanitizer sidecar. |
223
+ | [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/) | Open — contributors welcome | Wanted | Log record processor. The Collector is Go, so this is an external-processor or sidecar pattern rather than an in-process extension. |
224
+ | [Logstash](https://www.elastic.co/logstash) | Open — contributors welcome | Wanted | Filter stage. JRuby runtime means calling the Node CLI or a sanitizer service rather than embedding the library. |
225
+ | [Fluent Bit](https://fluentbit.io) | Open — contributors welcome | Wanted | Filter plugin. Needs either a WASM port of the rule engine or a sidecar; the Lua filter cannot host the library directly. |
226
+ | [Redpanda Connect](https://www.redpanda.com/connect) (Benthos) | Open — contributors welcome | Wanted | Processor in a Connect pipeline, using the `subprocess` or `http` processor against the CLI or a sanitizer service. |
227
+ | [Apache NiFi](https://nifi.apache.org) | Open — contributors welcome | Wanted | Custom processor or `ExecuteStreamCommand` wrapping the CLI, for flow-file content sanitization. |
228
+ | [Splunk Edge Processor / Ingest Processor](https://www.splunk.com/en_us/products/ingest-processor.html) | Open — contributors welcome | Wanted | Sanitization before data reaches the indexer. SPL2 pipelines do not currently accept custom code, so feasibility needs evaluation. |
229
+ | [Elastic ingest pipeline](https://www.elastic.co/guide/en/elasticsearch/reference/current/ingest.html) | Open — contributors welcome | Wanted | Index-time sanitization. Painless cannot host the library, so realistically this means sanitizing upstream in Logstash or a sidecar and documenting the pattern. |
230
+ | [Microsoft Sentinel DCR transformation](https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/data-collection-transformations) | Open — contributors welcome | Wanted | Sanitization before ingestion into Log Analytics. DCR transformations are KQL-only, so this needs an upstream agent or Azure Function approach. |
231
+ | [DataBahn](https://databahn.ai) | Open — contributors welcome | Wanted | Sanitizer stage in a DataBahn pipeline, ahead of any downstream destination. |
232
+ | [Observo AI](https://observo.ai) | Open — contributors welcome | Wanted | Sanitizer stage in an Observo pipeline, complementing its own reduction and routing. |
233
+ | [Axoflow / AxoSyslog](https://axoflow.com) | Open — contributors welcome | Wanted | Sanitization in an AxoSyslog / Axoflow pipeline before forwarding to a SIEM or object storage. |
234
+ | [Abstract Security](https://www.abstract.security) | Open — contributors welcome | Wanted | Sanitizer stage in an Abstract streaming pipeline ahead of routing to a lake or SIEM. |
235
+ | [VirtualMetric DataStream](https://virtualmetric.com) | Open — contributors welcome | Wanted | Sanitization stage in a DataStream pipeline before delivery to downstream destinations. |
236
+ | [Beacon](https://beacon.security/) | Open — contributors welcome | Wanted | Sanitization stage in a Beacon pipeline before delivery to downstream destinations. |
237
+
238
+ ### Contributing an integration
239
+
240
+ Integrations live in their own repositories under their own maintainers; this table is just an index. To be listed, open a PR adding a row with a working link, and make sure the project:
241
+
242
+ - pins a released `@socprime/logtotal-sanitizer` version and states the minimum supported one
243
+ - reads the HMAC key from the host platform's secret store, never from a config file or
244
+ a hardcoded default
245
+ - documents that token stability requires the same key, library version, and rule set
246
+ across every node
247
+ - ships a synthetic sample for testing, with no real log data
@@ -314,6 +314,15 @@ var homePathsRule = {
314
314
  validate: validateHomeUser
315
315
  };
316
316
 
317
+ // src/rules/shared/windowsAccounts.ts
318
+ var BACKSLASH = "\\\\";
319
+ var JSON_BACKSLASH = "\\\\\\\\";
320
+ var WINDOWS_FILE_EXT = "exe|dll|sys|bat|cmd|ps1|vbs|msi|tmp|hiv|log|dat|txt|ini|xml|json|lnk|cpl|ocx|drv";
321
+ var NOT_WINDOWS_FILENAME = `(?![A-Za-z0-9_$.-]*\\.(?:${WINDOWS_FILE_EXT})(?![A-Za-z0-9]))`;
322
+ var WELL_KNOWN_DOMAIN = "(?:BUILTIN|NT SERVICE|NT AUTHORITY|Users|Settings|Files)";
323
+ var NETBIOS_DOMAIN = "[A-Za-z0-9](?:[A-Za-z0-9.-]{0,13}[A-Za-z0-9])?";
324
+ var ACCOUNT_SEGMENT = "[A-Za-z0-9_](?:[A-Za-z0-9_.$-]*[A-Za-z0-9$])";
325
+
317
326
  // src/rules/definitions/hostnames.ts
318
327
  var GTLD = [
319
328
  "abbott",
@@ -1279,10 +1288,39 @@ var TLD_COLLISION = FILE_EXT_COLLISION_TLDS.join("|");
1279
1288
  var LABEL = "[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?";
1280
1289
  var HOST_EXACT = `(?:(?<![\\w.$-])(?<![^:/\\\\][/\\\\])(?:${LABEL}\\.)+(?:${TLD_EXACT})(?!\\.?\\w))`;
1281
1290
  var HOST_COLLISION = `(?:(?:https?|sftp|ftps?|wss?)://(?:[^/@\\s]+@)?)((?:${LABEL}\\.)+(?:${TLD_COLLISION}))(?!\\.?\\w)`;
1282
- var UNC_COMPUTER = "(?:\\\\\\\\)([A-Za-z][A-Za-z0-9-]{0,14})(?=\\\\[A-Za-z0-9$])";
1291
+ function uncComputerPattern(separator) {
1292
+ return `(?:${separator}${separator})([A-Za-z][A-Za-z0-9-]{0,14})(?=${separator}[A-Za-z0-9$])`;
1293
+ }
1294
+ var UNC_COMPUTER = uncComputerPattern(BACKSLASH);
1295
+ var UNC_COMPUTER_JSON = uncComputerPattern(JSON_BACKSLASH);
1283
1296
  var SPN_HOST = "(?:\\b[A-Za-z][A-Za-z0-9]*/)([A-Za-z0-9][A-Za-z0-9.-]*)(?=@[A-Z0-9.-]+\\b)";
1284
1297
  var HOST_CTX_KEY = "(?:host|hostname|computer)";
1285
- var HOST_CTX = `(?:\\b${HOST_CTX_KEY}\\s*[=:]\\s*)([A-Za-z0-9](?:[A-Za-z0-9.-]*[A-Za-z0-9])?)`;
1298
+ var HOST_VALUE = "[A-Za-z0-9](?:[A-Za-z0-9.-]*[A-Za-z0-9])?";
1299
+ var HOST_CTX = `(?:\\b${HOST_CTX_KEY}\\s*[=:]\\s*)(${HOST_VALUE})`;
1300
+ function anyCase(word) {
1301
+ let pattern = "";
1302
+ for (const char of word) {
1303
+ const lower = char.toLowerCase();
1304
+ const upper = char.toUpperCase();
1305
+ pattern += lower === upper ? char : `[${lower}${upper}]`;
1306
+ }
1307
+ return pattern;
1308
+ }
1309
+ var QUOTED_DOMAIN_ACCOUNT = `(?:")(?!${WELL_KNOWN_DOMAIN}\\\\{1,2})(${NETBIOS_DOMAIN})(?=\\\\{1,2}${NOT_WINDOWS_FILENAME}${ACCOUNT_SEGMENT}")`;
1310
+ var KEY_WORD = "[A-Za-z_]*";
1311
+ var JSON_HOST_KEY = [
1312
+ `${KEY_WORD}${anyCase("computer")}${KEY_WORD}`,
1313
+ `${KEY_WORD}${anyCase("domain")}[_-]?${anyCase("name")}`,
1314
+ `${anyCase("host")}(?:[_-]?${anyCase("name")})?`,
1315
+ anyCase("fqdn"),
1316
+ anyCase("domain"),
1317
+ `${anyCase("server")}[_-]?${anyCase("name")}`,
1318
+ `${anyCase("node")}[_-]?${anyCase("name")}`,
1319
+ `${anyCase("dns")}[_-]?${anyCase("name")}`,
1320
+ `${anyCase("machine")}[_-]?${anyCase("name")}`,
1321
+ `${anyCase("target")}[_-]?${anyCase("host")}`
1322
+ ].join("|");
1323
+ var HOST_JSON_CTX = `(?:"(?:${JSON_HOST_KEY})"\\s*:\\s*")(${HOST_VALUE})(?=")`;
1286
1324
  var NETBIOS_AGGRESSIVE = "(?:\\b(?:WIN|DESKTOP)-[A-Z0-9]{7,10}\\b)";
1287
1325
  var SYSLOG_MONTH = "(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)";
1288
1326
  var SYSLOG_BSD_TS = `${SYSLOG_MONTH}\\s+\\d{1,2}\\s+\\d{2}:\\d{2}:\\d{2}`;
@@ -1295,10 +1333,20 @@ var INVENTORY_HOST = `(?:\\b${INVENTORY_PREFIX}-[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*-\
1295
1333
  var hostnamesRule = {
1296
1334
  id: "hosts",
1297
1335
  label: "Hostnames & domains",
1298
- description: "FQDNs, UNC computer names, Kerberos SPN hosts and syslog host fields become the same token everywhere within a session.",
1336
+ description: "FQDNs, UNC computer names, Kerberos SPN hosts, quoted JSON host fields, the domain half of a quoted DOMAIN\\account value and syslog host fields become the same token everywhere within a session.",
1299
1337
  mode: "pseudo",
1300
1338
  token: "HOST",
1301
- patterns: [HOST_EXACT, HOST_COLLISION, UNC_COMPUTER, SPN_HOST, HOST_CTX, SYSLOG_HOST],
1339
+ patterns: [
1340
+ HOST_EXACT,
1341
+ HOST_COLLISION,
1342
+ UNC_COMPUTER,
1343
+ UNC_COMPUTER_JSON,
1344
+ SPN_HOST,
1345
+ HOST_CTX,
1346
+ HOST_JSON_CTX,
1347
+ QUOTED_DOMAIN_ACCOUNT,
1348
+ SYSLOG_HOST
1349
+ ],
1302
1350
  aggressivePatterns: [NETBIOS_AGGRESSIVE, INVENTORY_HOST],
1303
1351
  jsonKeys: [
1304
1352
  "hostname",
@@ -1993,15 +2041,18 @@ var EMAIL_LOCAL = "[A-Za-z0-9._%+-]+";
1993
2041
  var EMAIL_DOMAIN = "[A-Za-z0-9.-]+\\.[A-Za-z]{2,}";
1994
2042
  var EMAIL = `(?:\\b${EMAIL_LOCAL}@${EMAIL_DOMAIN})`;
1995
2043
  var EMAIL_IP_LITERAL = `(?:\\b${EMAIL_LOCAL}@\\[[0-9a-fA-F.:]+\\])`;
1996
- var WIN_DOMAIN_EXCLUDE = "(?:BUILTIN|NT SERVICE|NT AUTHORITY|Users|Settings|Files)\\\\";
1997
- var USER_SEG_SIMPLE = "[A-Za-z0-9_](?:[A-Za-z0-9_.$-]*[A-Za-z0-9$])";
1998
- var FILE_EXT = "exe|dll|sys|bat|cmd|ps1|vbs|msi|tmp|hiv|log|dat|txt|ini|xml|json|lnk|cpl|ocx|drv";
1999
- var NOT_FILENAME = `(?![A-Za-z0-9_$.-]*\\.(?:${FILE_EXT})(?![A-Za-z0-9]))`;
2044
+ var USER_SEG_SIMPLE = ACCOUNT_SEGMENT;
2000
2045
  var NOT_GUID = "(?![0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-)";
2001
2046
  var ACCOUNT_END = "(?![A-Za-z0-9_$\\\\/-])";
2002
- var PATH_ROOT = "(?:\\b(?:HKLM|HKCU|HKU|HKCR|HKEY_[A-Z_]+)|\\b[A-Za-z]:)\\\\";
2003
- var NOT_UNDER_PATH_ROOT = `(?<!${PATH_ROOT}(?:(?! [-/])[^<>'"\\n])*)`;
2004
- var DOMAIN_USER = `(?:(?:(?:^|[^\\\\.-])\\b[A-Za-z0-9](?:[A-Za-z0-9.-]{0,13}[A-Za-z0-9])?\\\\)(?<!${WIN_DOMAIN_EXCLUDE})${NOT_FILENAME}${NOT_GUID}(${USER_SEG_SIMPLE})${ACCOUNT_END}${NOT_UNDER_PATH_ROOT})`;
2047
+ function domainUserPattern(separator) {
2048
+ const winDomainExclude = `${WELL_KNOWN_DOMAIN}${separator}`;
2049
+ const pathRoot = `(?:\\b(?:HKLM|HKCU|HKU|HKCR|HKEY_[A-Z_]+)|\\b[A-Za-z]:)${separator}`;
2050
+ const notUnderPathRoot = `(?<!${pathRoot}(?:(?! [-/])[^<>'"\\n])*)`;
2051
+ const domain = `(?:^|[^\\\\.-])\\b${NETBIOS_DOMAIN}${separator}`;
2052
+ return `(?:(?:${domain})(?<!${winDomainExclude})${NOT_WINDOWS_FILENAME}${NOT_GUID}(${USER_SEG_SIMPLE})${ACCOUNT_END}${notUnderPathRoot})`;
2053
+ }
2054
+ var DOMAIN_USER = domainUserPattern(BACKSLASH);
2055
+ var DOMAIN_USER_JSON = domainUserPattern(JSON_BACKSLASH);
2005
2056
  var SID = "(?:\\bS-1-(?:\\d+-){1,14}\\d+\\b)";
2006
2057
  var VALUE_WITH_LETTER = "[\\w.@+-]*[A-Za-z][\\w.@+-]*";
2007
2058
  var LDAP_DN_SINGLE = `(?:\\b(?:uid|sAMAccountName)=)(${VALUE_WITH_LETTER})`;
@@ -2062,6 +2113,7 @@ var usersRule = {
2062
2113
  EMAIL_IP_LITERAL,
2063
2114
  EMAIL,
2064
2115
  DOMAIN_USER,
2116
+ DOMAIN_USER_JSON,
2065
2117
  SID,
2066
2118
  LDAP_DN_SINGLE,
2067
2119
  LDAP_DN_CN,
@@ -2353,5 +2405,5 @@ exports.getBuiltinRule = getBuiltinRule;
2353
2405
  exports.isSanitizerError = isSanitizerError;
2354
2406
  exports.lineHasAnyChar = lineHasAnyChar;
2355
2407
  exports.validateRule = validateRule;
2356
- //# sourceMappingURL=chunk-ABKPPAHE.cjs.map
2357
- //# sourceMappingURL=chunk-ABKPPAHE.cjs.map
2408
+ //# sourceMappingURL=chunk-EUNFMCKE.cjs.map
2409
+ //# sourceMappingURL=chunk-EUNFMCKE.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/errors.ts","../src/rules/definitions/geoLocation.ts","../src/rules/definitions/govIdentifiers.ts","../src/rules/definitions/healthInfo.ts","../src/rules/definitions/homePaths.ts","../src/rules/shared/windowsAccounts.ts","../src/rules/definitions/hostnames.ts","../src/rules/definitions/ipAddresses.ts","../src/rules/shared/hmacSha256.ts","../src/rules/definitions/paymentInfo.ts","../src/rules/definitions/phoneNumbers.ts","../src/rules/definitions/secrets.ts","../src/rules/definitions/sessionCookies.ts","../src/rules/definitions/users.ts","../src/rules/registry.ts","../src/core/regexSource.ts","../src/rules/validateRule.ts","../src/rules/defineRule.ts"],"names":["luhnCheck"],"mappings":"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","file":"chunk-EUNFMCKE.cjs","sourcesContent":["const ERROR_BRAND = Symbol.for('@socprime/logtotal-sanitizer/error');\n\n/**\n * Machine-readable cause of a {@link SanitizerError}.\n */\nexport type SanitizerErrorCode =\n | 'INVALID_RULE'\n | 'UNKNOWN_RULE'\n | 'INVALID_KEY'\n | 'INVALID_OPTION'\n | 'ABORTED';\n\n/**\n * Base class for every error this package throws.\n */\nexport class SanitizerError extends Error {\n /** Machine-readable cause, stable across releases. */\n readonly code: SanitizerErrorCode;\n\n constructor(code: SanitizerErrorCode, message: string) {\n super(message);\n this.name = 'SanitizerError';\n this.code = code;\n Object.defineProperty(this, ERROR_BRAND, { value: true, enumerable: false });\n }\n}\n\n/** A rule object is malformed. */\nexport class InvalidRuleError extends SanitizerError {\n constructor(message: string) {\n super('INVALID_RULE', message);\n this.name = 'InvalidRuleError';\n }\n}\n\n/** A rule identifier does not match any built-in rule. */\nexport class UnknownRuleError extends SanitizerError {\n constructor(message: string) {\n super('UNKNOWN_RULE', message);\n this.name = 'UnknownRuleError';\n }\n}\n\n/** A key is malformed, or no secure random source is available to generate one. */\nexport class InvalidKeyError extends SanitizerError {\n constructor(message: string) {\n super('INVALID_KEY', message);\n this.name = 'InvalidKeyError';\n }\n}\n\n/** An option value is outside its allowed range. */\nexport class InvalidOptionError extends SanitizerError {\n constructor(message: string) {\n super('INVALID_OPTION', message);\n this.name = 'InvalidOptionError';\n }\n}\n\n/** A streaming run was stopped through its `AbortSignal`. */\nexport class SanitizationAbortedError extends SanitizerError {\n constructor(message = 'Sanitization was aborted.') {\n super('ABORTED', message);\n this.name = 'SanitizationAbortedError';\n }\n}\n\n/**\n * Whether a caught value is an error thrown by this package.\n *\n * Prefer this over `instanceof` when the value may have crossed a bundle, worker or realm\n * boundary, where class identity is not preserved.\n */\nexport function isSanitizerError(value: unknown): value is SanitizerError {\n return typeof value === 'object' && value !== null && ERROR_BRAND in value;\n}\n","import type { SanitizeRule } from '../../types';\n\nfunction parseLatLonPair(match: string): { lat: number; lon: number } | null {\n const stripped = match.replace(/[()\\s]/g, '');\n\n if (!/^-?\\d+\\.\\d+[,;]-?\\d+\\.\\d+$/.test(stripped)) {\n return null;\n }\n\n const [latStr, lonStr] = stripped.split(/[,;]/);\n const lat = Number(latStr);\n const lon = Number(lonStr);\n\n if (!Number.isFinite(lat) || !Number.isFinite(lon)) {\n return null;\n }\n\n return { lat, lon };\n}\n\nfunction isPlausibleLatLon(lat: number, lon: number): boolean {\n if (lat === 0 && lon === 0) {\n return false;\n }\n\n return lat >= -90 && lat <= 90 && lon >= -180 && lon <= 180;\n}\n\nfunction validateGeo(match: string): boolean {\n const pair = parseLatLonPair(match);\n\n if (pair) {\n return isPlausibleLatLon(pair.lat, pair.lon);\n }\n\n return true;\n}\n\nconst LAT_KEY = '(?:latitude|lat)';\nconst LON_KEY = '(?:longitude|long|lon|lng)';\nconst ZIP_KEY = '(?:zipCode|postalCode|postcode|zip)';\nconst ADDR_KEY = '(?:addressLine1|address|street)';\nconst OLC = '[23456789CFGHJMPQRVWXcfghjmpqrvwx]';\nconst GEOHASH = '[0-9b-hjkmnp-zB-HJKMNP-Z]';\n\nexport const geoLocationRule: SanitizeRule = {\n id: 'geoLocation',\n label: 'Geo location',\n description:\n 'Coordinates, geohashes, plus codes, postcodes and context-anchored addresses become a stable <GEO:…> token — the same value maps to the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'GEO',\n patterns: [\n '(?:\\\\(\\\\s*-?\\\\d{1,3}\\\\.\\\\d{3,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{3,}\\\\s*\\\\))',\n '(?:(?<![\\\\d.])-?\\\\d{1,3}\\\\.\\\\d{3,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{3,}(?!\\\\d))',\n `(?:\\\\b${LAT_KEY}\\\\s*[=:]\\\\s*)(-?\\\\d{1,3}\\\\.\\\\d+)`,\n `(?:\\\\b${LON_KEY}\\\\s*[=:]\\\\s*)(-?\\\\d{1,3}\\\\.\\\\d+)`,\n `(?:\\\\bgeohash\\\\s*[=:]\\\\s*)(${GEOHASH}{5,12}\\\\b)`,\n `(?:(?<![\\\\w+])${OLC}{4,8}\\\\+${OLC}{2,3}(?![\\\\w+]))`,\n '(?:\\\\b\\\\d{1,3}°\\\\d{1,2}\\'\\\\d{1,2}(?:\\\\.\\\\d+)?\"[NSEW]\\\\b)',\n '(?:\\\\b[A-Za-z]{1,2}\\\\d{1,2}[A-Za-z]?\\\\s\\\\d[A-Za-z]{2}\\\\b)',\n `(?:\\\\b${ZIP_KEY}\\\\s*[=:]\\\\s*)(\\\\d{5}(?:-\\\\d{4})?\\\\b)`,\n ],\n aggressivePatterns: [\n '(?:\\\\(\\\\s*-?\\\\d{1,3}\\\\.\\\\d{2,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{2,}\\\\s*\\\\))',\n '(?:(?<![\\\\d.])-?\\\\d{1,3}\\\\.\\\\d{2,}\\\\s*[,;]\\\\s*-?\\\\d{1,3}\\\\.\\\\d{2,}(?!\\\\d))',\n `(?:(?<=\\\\b${ADDR_KEY}\\\\s*[=:]\\\\s*)[^\\\\n\"'<>]{5,80})`,\n ],\n validate: validateGeo,\n jsonKeys: [\n 'latitude',\n 'longitude',\n 'lat',\n 'lon',\n 'lng',\n 'long',\n 'coordinates',\n 'coords',\n 'geo',\n 'streetAddress',\n 'addressLine1',\n 'addressLine2',\n 'postalCode',\n 'postcode',\n 'zip',\n 'zipCode',\n 'geohash',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nfunction luhnCheck(digits: string): boolean {\n if (!/^\\d+$/.test(digits) || /^0+$/.test(digits)) {\n return false;\n }\n\n let sum = 0;\n let doubleIt = false;\n\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let digit = Number(digits[i]);\n\n if (doubleIt) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n\n sum += digit;\n doubleIt = !doubleIt;\n }\n\n return sum % 10 === 0;\n}\n\nfunction isValidSsn(area: string, group: string, serial: string): boolean {\n if (area === '000' || area === '666' || area.startsWith('9')) {\n return false;\n }\n\n return group !== '00' && serial !== '0000';\n}\n\nfunction isValidItin(area: string, group: string, serial: string): boolean {\n if (!area.startsWith('9') || serial === '0000') {\n return false;\n }\n\n const groupNum = Number(group);\n\n return (\n (groupNum >= 70 && groupNum <= 88) ||\n (groupNum >= 90 && groupNum <= 92) ||\n (groupNum >= 94 && groupNum <= 99)\n );\n}\n\nfunction isValidNhs(digits: string): boolean {\n if (!/^\\d{10}$/.test(digits) || /^0+$/.test(digits)) {\n return false;\n }\n\n let sum = 0;\n\n for (let i = 0; i < 9; i += 1) {\n sum += Number(digits[i]) * (10 - i);\n }\n\n const remainder = sum % 11;\n let check = 11 - remainder;\n\n if (check === 11) {\n check = 0;\n }\n\n if (check === 10) {\n return false;\n }\n\n return check === Number(digits[9]);\n}\n\nfunction validateGovId(match: string): boolean {\n const dashed = /^(\\d{3})-(\\d{2})-(\\d{4})$/.exec(match);\n\n if (dashed?.[1] && dashed[2] && dashed[3]) {\n return (\n isValidSsn(dashed[1], dashed[2], dashed[3]) || isValidItin(dashed[1], dashed[2], dashed[3])\n );\n }\n\n if (/^\\d{3}-\\d{3}-\\d{3}$/.test(match)) {\n return luhnCheck(match.replace(/-/g, ''));\n }\n\n if (/^\\d{3} \\d{3} \\d{4}$/.test(match)) {\n return isValidNhs(match.replace(/ /g, ''));\n }\n\n const nhsPrefixed = /(?:NHS|nhs)(?:[_-]?number)?\\s*[=:]\\s*(\\d{10})$/.exec(match);\n const nhsDigits = nhsPrefixed?.[1];\n\n if (nhsDigits) {\n return isValidNhs(nhsDigits);\n }\n\n return true;\n}\n\nconst SSN_CTX =\n '(?:[Ss][Ss][Nn]|[Ee][Ii][Nn]|[Ss][Ii][Nn]|tax[_-]?id|social[_ -]?security(?:[_ -]?number)?)';\nconst ID_CTX = '(?:passport(?:_no|_number)?|driver[_-]?license|national[_-]?id|tax[_-]?id)';\n\nexport const govIdentifiersRule: SanitizeRule = {\n id: 'govIds',\n label: 'Government identifiers',\n description: 'Passport numbers, tax numbers, SSNs and similar IDs are redacted outright.',\n mode: 'mask',\n token: 'GOV_ID',\n patterns: [\n '(?:(?<![A-Z0-9<])P<[A-Z0-9<]{42}(?![A-Z0-9<]))',\n '(?:\\\\b\\\\d{3}-\\\\d{2}-\\\\d{4}\\\\b)',\n '(?:\\\\b\\\\d{3}-\\\\d{3}-\\\\d{3}\\\\b)',\n '(?:\\\\b\\\\d{3} \\\\d{3} \\\\d{4}\\\\b)',\n '(?:\\\\b(?:NHS|nhs)(?:[_-]?number)?\\\\s*[=:]\\\\s*\\\\d{10}\\\\b)',\n '(?:\\\\b(?!BG|GB|NK|KN|TN|NT|ZZ)[A-CEGHJ-PR-TW-Z][A-CEGHJ-NPR-TW-Z]\\\\d{6}\\\\s?[A-D]\\\\b)',\n '(?:(?<![A-Za-z0-9А-ЯІЇЄҐа-яіїєґ])[А-ЯІЇЄҐ]{2}\\\\d{6}\\\\b)',\n `(?:\\\\b${SSN_CTX}\\\\s*[=:]?\\\\s*)(\\\\d{9})\\\\b`,\n '(?:(?:ІПН|РНОКПП|tax[_-]?id)\\\\s*[=:]?\\\\s*)(\\\\d{10})\\\\b',\n `(?:\\\\b${ID_CTX}\\\\s*[=:]\\\\s*)([A-Za-z0-9<]{5,32})`,\n ],\n aggressivePatterns: ['(?:\\\\b[A-Z]{1,2}\\\\d{6,9}\\\\b)', '(?:\\\\b\\\\d{9,11}\\\\b)'],\n validate: validateGovId,\n jsonKeys: [\n 'ssn',\n 'passportNumber',\n 'taxId',\n 'nationalId',\n 'socialSecurityNumber',\n 'passport',\n 'nino',\n 'nhsNumber',\n 'driverLicense',\n 'licenseNumber',\n 'personalId',\n 'dob',\n 'dateOfBirth',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nfunction isValidDea(match: string): boolean {\n if (!/^[ABFGMPRX][A-Z9]\\d{7}$/.test(match)) {\n return false;\n }\n\n const digits = match.slice(2);\n const sum =\n Number(digits[0]) +\n Number(digits[2]) +\n Number(digits[4]) +\n 2 * (Number(digits[1]) + Number(digits[3]) + Number(digits[5]));\n\n return sum % 10 === Number(digits[6]);\n}\n\nfunction validateHealth(match: string): boolean {\n if (/^[ABFGMPRX][A-Z9]\\d{7}$/.test(match)) {\n return isValidDea(match);\n }\n\n return true;\n}\n\nconst MRN_KEY = '(?:[Mm][Rr][Nn]|medical[_-]?record(?:[_-]?number)?)';\n\nexport const healthInfoRule: SanitizeRule = {\n id: 'healthInfo',\n label: 'Protected health information',\n description:\n 'PHI in SOC logs is almost always structured: JSON field names (diagnosis, medication, MRN, …) carry most of the coverage. Freeform patterns only match context-anchored medical codes (ICD, SNOMED, LOINC, NDC, DEA, MRN).',\n mode: 'mask',\n token: 'PHI',\n patterns: [\n '(?:\\\\b(?:[Ii][Cc][Dd]-10|[Ii][Cc][Dd]10):?\\\\s*[A-Z]\\\\d{2}(?:\\\\.\\\\d{1,4})?\\\\b)',\n '(?:\\\\b(?:[Ii][Cc][Dd]-9|[Ii][Cc][Dd]9):?\\\\s*(?:[VE]\\\\d{2,3}|\\\\d{3})(?:\\\\.\\\\d{1,2})?\\\\b)',\n '(?:\\\\b(?:SNOMED(?:\\\\s*CT)?|[Ss]nomed(?:\\\\s*CT)?)[:\\\\s]+\\\\d{6,18}\\\\b)',\n '(?:\\\\b(?:LOINC|[Ll]oinc)[:\\\\s]+\\\\d{1,5}-\\\\d\\\\b)',\n '(?:\\\\b(?:NDC|[Nn]dc)[:\\\\s]+\\\\d{4,5}-\\\\d{3,4}-\\\\d{1,2}\\\\b)',\n '(?:\\\\b[ABFGMPRX][A-Z9]\\\\d{7}\\\\b)',\n '(?:\\\\b(?:[Nn][Pp][Ii])\\\\s*[=:]\\\\s*\\\\d{10}\\\\b)',\n `(?:\\\\b${MRN_KEY}\\\\s*[=:]\\\\s*)([A-Za-z0-9-]{4,})\\\\b`,\n ],\n aggressivePatterns: ['(?:(?<![A-Za-z0-9])[A-TV-Z]\\\\d{2}(?:\\\\.\\\\w{1,4})?(?![A-Za-z0-9:]))'],\n validate: validateHealth,\n jsonKeys: [\n 'diagnosis',\n 'prescription',\n 'medication',\n 'icd10',\n 'icd9',\n 'snomed',\n 'condition',\n 'allergy',\n 'allergies',\n 'bloodType',\n 'patientId',\n 'mrn',\n 'medicalRecordNumber',\n 'insuranceNumber',\n 'labResult',\n 'observation',\n 'vitalSigns',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst USER_SEG = '[^/\\\\\\\\\\\\s\"\\'<>]+';\n\nfunction validateHomeUser(match: string): boolean {\n return match !== '.' && match !== '..';\n}\n\nexport const homePathsRule: SanitizeRule = {\n id: 'paths',\n label: 'Home-directory usernames',\n description:\n 'Only the username segment of a home-directory path is redacted (e.g. /home/jdoe/app → /home/<R:…>/app); the rest of the path stays visible.',\n mode: 'mask',\n token: 'PATH',\n patterns: [\n `(?:/export/home/(${USER_SEG}))`,\n `(?:/usr/home/(${USER_SEG}))`,\n `(?:/var/home/(${USER_SEG}))`,\n `(?:/home/(${USER_SEG}))`,\n `(?:/Users/(${USER_SEG}))`,\n `(?:[A-Za-z]:\\\\\\\\Users\\\\\\\\(${USER_SEG}))`,\n `(?:[A-Za-z]:/Users/(${USER_SEG}))`,\n `(?:\\\\\\\\\\\\\\\\\\\\?\\\\\\\\[A-Za-z]:\\\\\\\\Users\\\\\\\\(${USER_SEG}))`,\n `(?:[A-Za-z]:\\\\\\\\Documents and Settings\\\\\\\\(${USER_SEG}))`,\n `(?:[A-Za-z]:\\\\\\\\\\\\\\\\Users\\\\\\\\\\\\\\\\(${USER_SEG}))`,\n `(?:/mnt/[A-Za-z]/Users/(${USER_SEG}))`,\n `(?://wsl\\\\$/(?:[A-Za-z0-9_-]+)/home/(${USER_SEG}))`,\n ],\n validate: validateHomeUser,\n};\n","export const BACKSLASH = '\\\\\\\\';\n\nexport const JSON_BACKSLASH = '\\\\\\\\\\\\\\\\';\n\nexport const WINDOWS_FILE_EXT =\n 'exe|dll|sys|bat|cmd|ps1|vbs|msi|tmp|hiv|log|dat|txt|ini|xml|json|lnk|cpl|ocx|drv';\n\nexport const NOT_WINDOWS_FILENAME = `(?![A-Za-z0-9_$.-]*\\\\.(?:${WINDOWS_FILE_EXT})(?![A-Za-z0-9]))`;\n\nexport const WELL_KNOWN_DOMAIN = '(?:BUILTIN|NT SERVICE|NT AUTHORITY|Users|Settings|Files)';\n\nexport const NETBIOS_DOMAIN = '[A-Za-z0-9](?:[A-Za-z0-9.-]{0,13}[A-Za-z0-9])?';\n\nexport const ACCOUNT_SEGMENT = '[A-Za-z0-9_](?:[A-Za-z0-9_.$-]*[A-Za-z0-9$])';\n","import type { SanitizeRule } from '../../types';\nimport {\n ACCOUNT_SEGMENT,\n BACKSLASH,\n JSON_BACKSLASH,\n NETBIOS_DOMAIN,\n NOT_WINDOWS_FILENAME,\n WELL_KNOWN_DOMAIN,\n} from '../shared/windowsAccounts';\n\nconst GTLD = [\n 'abbott',\n 'abogado',\n 'ac',\n 'academy',\n 'accountant',\n 'accountants',\n 'active',\n 'actor',\n 'ad',\n 'ads',\n 'adult',\n 'ae',\n 'aero',\n 'af',\n 'afl',\n 'ag',\n 'agency',\n 'ai',\n 'airforce',\n 'al',\n 'allfinanz',\n 'alsace',\n 'am',\n 'amsterdam',\n 'an',\n 'android',\n 'ao',\n 'apartments',\n 'aq',\n 'aquarelle',\n 'ar',\n 'archi',\n 'army',\n 'arpa',\n 'as',\n 'asia',\n 'associates',\n 'at',\n 'attorney',\n 'au',\n 'auction',\n 'audio',\n 'autos',\n 'aw',\n 'ax',\n 'axa',\n 'az',\n 'ba',\n 'band',\n 'bank',\n 'bar',\n 'barclaycard',\n 'barclays',\n 'bargains',\n 'bauhaus',\n 'bayern',\n 'bb',\n 'bbc',\n 'bd',\n 'be',\n 'beer',\n 'berlin',\n 'best',\n 'bf',\n 'bg',\n 'bh',\n 'bi',\n 'bid',\n 'bike',\n 'bingo',\n 'bio',\n 'biz',\n 'bj',\n 'bl',\n 'black',\n 'blackfriday',\n 'bloomberg',\n 'blue',\n 'bm',\n 'bmw',\n 'bn',\n 'bnpparibas',\n 'bo',\n 'boats',\n 'bond',\n 'boo',\n 'boutique',\n 'bq',\n 'br',\n 'brussels',\n 'bs',\n 'bt',\n 'budapest',\n 'build',\n 'builders',\n 'business',\n 'buzz',\n 'bv',\n 'bw',\n 'by',\n 'bz',\n 'bzh',\n 'ca',\n 'cab',\n 'cafe',\n 'cal',\n 'camera',\n 'camp',\n 'cancerresearch',\n 'canon',\n 'capetown',\n 'capital',\n 'caravan',\n 'cards',\n 'care',\n 'career',\n 'careers',\n 'cartier',\n 'casa',\n 'cash',\n 'casino',\n 'cat',\n 'catering',\n 'cbn',\n 'cc',\n 'cd',\n 'center',\n 'ceo',\n 'cern',\n 'cf',\n 'cfd',\n 'cg',\n 'ch',\n 'channel',\n 'chat',\n 'cheap',\n 'chloe',\n 'christmas',\n 'chrome',\n 'church',\n 'ci',\n 'citic',\n 'city',\n 'ck',\n 'cl',\n 'claims',\n 'cleaning',\n 'click',\n 'clinic',\n 'clothing',\n 'club',\n 'cm',\n 'cn',\n 'co',\n 'coach',\n 'codes',\n 'coffee',\n 'college',\n 'cologne',\n 'com',\n 'community',\n 'company',\n 'computer',\n 'condos',\n 'construction',\n 'consulting',\n 'contractors',\n 'cooking',\n 'cool',\n 'coop',\n 'country',\n 'courses',\n 'cr',\n 'credit',\n 'creditcard',\n 'cricket',\n 'crs',\n 'cruises',\n 'cu',\n 'cuisinella',\n 'cv',\n 'cw',\n 'cx',\n 'cy',\n 'cymru',\n 'cyou',\n 'cz',\n 'dabur',\n 'dad',\n 'dance',\n 'date',\n 'dating',\n 'datsun',\n 'day',\n 'dclk',\n 'de',\n 'deals',\n 'degree',\n 'delivery',\n 'democrat',\n 'dental',\n 'dentist',\n 'desi',\n 'design',\n 'dev',\n 'diamonds',\n 'diet',\n 'digital',\n 'direct',\n 'directory',\n 'discount',\n 'dj',\n 'dk',\n 'dm',\n 'dnp',\n 'do',\n 'docs',\n 'doha',\n 'domains',\n 'doosan',\n 'download',\n 'durban',\n 'dvag',\n 'dz',\n 'eat',\n 'ec',\n 'edu',\n 'education',\n 'ee',\n 'eg',\n 'eh',\n 'email',\n 'emerck',\n 'energy',\n 'engineer',\n 'engineering',\n 'enterprises',\n 'epson',\n 'equipment',\n 'er',\n 'erni',\n 'es',\n 'esq',\n 'estate',\n 'et',\n 'eu',\n 'eurovision',\n 'eus',\n 'events',\n 'everbank',\n 'exchange',\n 'expert',\n 'exposed',\n 'express',\n 'fail',\n 'faith',\n 'fan',\n 'fans',\n 'farm',\n 'fashion',\n 'feedback',\n 'fi',\n 'film',\n 'finance',\n 'financial',\n 'firmdale',\n 'fish',\n 'fishing',\n 'fit',\n 'fitness',\n 'fj',\n 'fk',\n 'flights',\n 'florist',\n 'flowers',\n 'flsmidth',\n 'fly',\n 'fm',\n 'fo',\n 'foo',\n 'football',\n 'forex',\n 'forsale',\n 'foundation',\n 'fr',\n 'frl',\n 'frogans',\n 'fund',\n 'furniture',\n 'futbol',\n 'ga',\n 'gal',\n 'gallery',\n 'garden',\n 'gb',\n 'gbiz',\n 'gd',\n 'gdn',\n 'ge',\n 'gent',\n 'gf',\n 'gg',\n 'ggee',\n 'gh',\n 'gi',\n 'gift',\n 'gifts',\n 'gives',\n 'gl',\n 'glass',\n 'gle',\n 'global',\n 'globo',\n 'gm',\n 'gmail',\n 'gmo',\n 'gmx',\n 'gn',\n 'gold',\n 'goldpoint',\n 'golf',\n 'goo',\n 'goog',\n 'google',\n 'gop',\n 'gov',\n 'gp',\n 'gq',\n 'gr',\n 'graphics',\n 'gratis',\n 'green',\n 'gripe',\n 'gs',\n 'gt',\n 'gu',\n 'guge',\n 'guide',\n 'guitars',\n 'guru',\n 'gw',\n 'gy',\n 'hamburg',\n 'hangout',\n 'haus',\n 'healthcare',\n 'help',\n 'here',\n 'hermes',\n 'hiphop',\n 'hiv',\n 'hk',\n 'hm',\n 'hn',\n 'holdings',\n 'holiday',\n 'homes',\n 'horse',\n 'host',\n 'hosting',\n 'house',\n 'how',\n 'hr',\n 'ht',\n 'hu',\n 'ibm',\n 'id',\n 'ie',\n 'ifm',\n 'il',\n 'im',\n 'immo',\n 'immobilien',\n 'in',\n 'industries',\n 'infiniti',\n 'info',\n 'ing',\n 'ink',\n 'institute',\n 'insure',\n 'int',\n 'international',\n 'investments',\n 'io',\n 'iq',\n 'ir',\n 'irish',\n 'is',\n 'it',\n 'iwc',\n 'java',\n 'jcb',\n 'je',\n 'jetzt',\n 'jm',\n 'jo',\n 'jobs',\n 'joburg',\n 'jp',\n 'juegos',\n 'kaufen',\n 'kddi',\n 'ke',\n 'kg',\n 'kh',\n 'ki',\n 'kim',\n 'kitchen',\n 'kiwi',\n 'km',\n 'kn',\n 'koeln',\n 'komatsu',\n 'kp',\n 'kr',\n 'krd',\n 'kred',\n 'kw',\n 'ky',\n 'kyoto',\n 'kz',\n 'la',\n 'lacaixa',\n 'land',\n 'lat',\n 'latrobe',\n 'lawyer',\n 'lb',\n 'lc',\n 'lds',\n 'lease',\n 'leclerc',\n 'legal',\n 'lgbt',\n 'li',\n 'lidl',\n 'life',\n 'lighting',\n 'limited',\n 'limo',\n 'link',\n 'lk',\n 'loan',\n 'loans',\n 'london',\n 'lotte',\n 'lotto',\n 'love',\n 'lr',\n 'ls',\n 'lt',\n 'ltda',\n 'lu',\n 'luxe',\n 'luxury',\n 'lv',\n 'ly',\n 'ma',\n 'madrid',\n 'maif',\n 'maison',\n 'management',\n 'mango',\n 'market',\n 'marketing',\n 'markets',\n 'marriott',\n 'mc',\n 'md',\n 'me',\n 'media',\n 'meet',\n 'melbourne',\n 'meme',\n 'memorial',\n 'menu',\n 'mf',\n 'mg',\n 'mh',\n 'miami',\n 'mil',\n 'mini',\n 'mk',\n 'ml',\n 'mm',\n 'mma',\n 'mn',\n 'mo',\n 'mobi',\n 'moda',\n 'moe',\n 'monash',\n 'money',\n 'mormon',\n 'mortgage',\n 'moscow',\n 'motorcycles',\n 'mov',\n 'movie',\n 'mp',\n 'mq',\n 'mr',\n 'ms',\n 'mt',\n 'mtn',\n 'mtpc',\n 'mu',\n 'museum',\n 'mv',\n 'mw',\n 'mx',\n 'my',\n 'mz',\n 'na',\n 'nagoya',\n 'name',\n 'navy',\n 'nc',\n 'ne',\n 'net',\n 'network',\n 'neustar',\n 'new',\n 'news',\n 'nexus',\n 'nf',\n 'ng',\n 'ngo',\n 'nhk',\n 'ni',\n 'nico',\n 'ninja',\n 'nissan',\n 'nl',\n 'no',\n 'np',\n 'nr',\n 'nra',\n 'nrw',\n 'ntt',\n 'nu',\n 'nyc',\n 'nz',\n 'okinawa',\n 'om',\n 'one',\n 'ong',\n 'onl',\n 'online',\n 'ooo',\n 'org',\n 'organic',\n 'osaka',\n 'otsuka',\n 'ovh',\n 'pa',\n 'page',\n 'panerai',\n 'paris',\n 'partners',\n 'parts',\n 'party',\n 'pe',\n 'pf',\n 'pg',\n 'ph',\n 'pharmacy',\n 'photo',\n 'photography',\n 'photos',\n 'physio',\n 'piaget',\n 'pics',\n 'pictet',\n 'pictures',\n 'pink',\n 'pizza',\n 'pk',\n 'pl',\n 'place',\n 'plumbing',\n 'plus',\n 'pm',\n 'pn',\n 'pohl',\n 'poker',\n 'porn',\n 'post',\n 'pr',\n 'praxi',\n 'press',\n 'pro',\n 'prod',\n 'productions',\n 'prof',\n 'properties',\n 'property',\n 'ps',\n 'pt',\n 'pub',\n 'pw',\n 'py',\n 'qa',\n 'qpon',\n 'quebec',\n 'racing',\n 're',\n 'realtor',\n 'recipes',\n 'red',\n 'redstone',\n 'rehab',\n 'reise',\n 'reisen',\n 'reit',\n 'ren',\n 'rentals',\n 'repair',\n 'report',\n 'republican',\n 'rest',\n 'restaurant',\n 'review',\n 'reviews',\n 'rich',\n 'rio',\n 'rip',\n 'ro',\n 'rocks',\n 'rodeo',\n 'rs',\n 'rsvp',\n 'ru',\n 'ruhr',\n 'rw',\n 'ryukyu',\n 'sa',\n 'saarland',\n 'sale',\n 'samsung',\n 'sap',\n 'sarl',\n 'saxo',\n 'sb',\n 'sc',\n 'sca',\n 'scb',\n 'schmidt',\n 'scholarships',\n 'school',\n 'schule',\n 'schwarz',\n 'science',\n 'scot',\n 'sd',\n 'se',\n 'services',\n 'sew',\n 'sexy',\n 'sg',\n 'sh',\n 'shiksha',\n 'shoes',\n 'shriram',\n 'si',\n 'singles',\n 'site',\n 'sj',\n 'sk',\n 'sky',\n 'sl',\n 'sm',\n 'sn',\n 'so',\n 'social',\n 'software',\n 'sohu',\n 'solar',\n 'solutions',\n 'soy',\n 'space',\n 'spiegel',\n 'spreadbetting',\n 'sr',\n 'ss',\n 'st',\n 'study',\n 'style',\n 'su',\n 'sucks',\n 'supplies',\n 'supply',\n 'support',\n 'surf',\n 'surgery',\n 'suzuki',\n 'sv',\n 'sx',\n 'sy',\n 'sydney',\n 'systems',\n 'sz',\n 'taipei',\n 'tatar',\n 'tattoo',\n 'tax',\n 'tc',\n 'td',\n 'tech',\n 'technology',\n 'tel',\n 'temasek',\n 'tennis',\n 'tf',\n 'tg',\n 'th',\n 'tickets',\n 'tienda',\n 'tips',\n 'tires',\n 'tirol',\n 'tj',\n 'tk',\n 'tl',\n 'tm',\n 'tn',\n 'to',\n 'today',\n 'tokyo',\n 'tools',\n 'top',\n 'toshiba',\n 'tours',\n 'town',\n 'toys',\n 'tp',\n 'tr',\n 'trade',\n 'trading',\n 'training',\n 'travel',\n 'trust',\n 'tt',\n 'tui',\n 'tv',\n 'tw',\n 'tz',\n 'ua',\n 'ug',\n 'uk',\n 'um',\n 'university',\n 'uno',\n 'uol',\n 'us',\n 'uy',\n 'uz',\n 'va',\n 'vacations',\n 'vc',\n 've',\n 'vegas',\n 'ventures',\n 'versicherung',\n 'vet',\n 'vg',\n 'vi',\n 'viajes',\n 'video',\n 'villas',\n 'vision',\n 'vlaanderen',\n 'vn',\n 'vodka',\n 'vote',\n 'voting',\n 'voto',\n 'voyage',\n 'vu',\n 'wales',\n 'wang',\n 'watch',\n 'webcam',\n 'website',\n 'wed',\n 'wedding',\n 'wf',\n 'whoswho',\n 'wien',\n 'wiki',\n 'williamhill',\n 'win',\n 'wme',\n 'work',\n 'works',\n 'world',\n 'ws',\n 'wtc',\n 'wtf',\n 'xin',\n '测试',\n 'परीक्षा',\n '佛山',\n '慈善',\n '集团',\n '在线',\n '한국',\n 'ভারত',\n '八卦',\n 'موقع',\n 'বাংলা',\n '公益',\n '公司',\n '移动',\n '我爱你',\n 'москва',\n 'испытание',\n 'қаз',\n 'онлайн',\n 'сайт',\n 'срб',\n 'бел',\n '时尚',\n '테스트',\n '淡马锡',\n 'орг',\n '삼성',\n 'சிங்கப்பூர்',\n '商标',\n '商店',\n '商城',\n 'дети',\n 'мкд',\n 'טעסט',\n '中文网',\n '中信',\n '中国',\n '中國',\n '谷歌',\n 'భారత్',\n 'ලංකා',\n '測試',\n 'ભારત',\n 'भारत',\n 'آزمایشی',\n 'பரிட்சை',\n '网店',\n 'संगठन',\n '网络',\n 'укр',\n '香港',\n 'δοκιμή',\n '飞利浦',\n 'إختبار',\n '台湾',\n '台灣',\n '手机',\n 'мон',\n 'الجزائر',\n 'عمان',\n 'ایران',\n 'امارات',\n 'بازار',\n 'پاکستان',\n 'الاردن',\n 'بھارت',\n 'المغرب',\n 'السعودية',\n 'سودان',\n 'عراق',\n 'مليسيا',\n '政府',\n 'شبكة',\n 'გე',\n '机构',\n '组织机构',\n '健康',\n 'ไทย',\n 'سورية',\n 'рус',\n 'рф',\n 'تونس',\n 'みんな',\n 'グーグル',\n '世界',\n 'ਭਾਰਤ',\n '网址',\n '游戏',\n 'vermögensberater',\n 'vermögensberatung',\n '企业',\n '信息',\n 'مصر',\n 'قطر',\n '广东',\n 'இலங்கை',\n 'இந்தியா',\n 'հայ',\n '新加坡',\n 'فلسطين',\n 'テスト',\n '政务',\n 'xxx',\n 'xyz',\n 'yachts',\n 'yandex',\n 'ye',\n 'yodobashi',\n 'yoga',\n 'yokohama',\n 'youtube',\n 'yt',\n 'za',\n 'zm',\n 'zone',\n 'zuerich',\n 'zw',\n];\nconst INTERNAL_SUFFIXES = [\n 'local',\n 'internal',\n 'intranet',\n 'corp',\n 'lan',\n 'home',\n 'localdomain',\n 'arpa',\n];\nconst INTERNAL_COMPOUND_SUFFIXES = [\n 'svc\\\\.cluster\\\\.local',\n 'ec2\\\\.internal',\n 'compute\\\\.internal',\n];\n\nconst FILE_EXT_COLLISION_TLDS = [\n 'ac',\n 'am',\n 'cc',\n 'gs',\n 'hiv',\n 'in',\n 'is',\n 'it',\n 'java',\n 'la',\n 'md',\n 'ml',\n 'pl',\n 'py',\n 'rs',\n 'sh',\n 'so',\n 'tf',\n];\nconst COLLISION_TLD_SET = new Set(FILE_EXT_COLLISION_TLDS);\nconst GTLD_UNRESTRICTED = GTLD.filter((tld) => !COLLISION_TLD_SET.has(tld));\n\nconst TLD_EXACT = [...INTERNAL_COMPOUND_SUFFIXES, ...GTLD_UNRESTRICTED, ...INTERNAL_SUFFIXES].join(\n '|',\n);\nconst TLD_COLLISION = FILE_EXT_COLLISION_TLDS.join('|');\nconst LABEL = '[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?';\n\nconst HOST_EXACT = `(?:(?<![\\\\w.$-])(?<![^:/\\\\\\\\][/\\\\\\\\])(?:${LABEL}\\\\.)+(?:${TLD_EXACT})(?!\\\\.?\\\\w))`;\n\nconst HOST_COLLISION = `(?:(?:https?|sftp|ftps?|wss?)://(?:[^/@\\\\s]+@)?)((?:${LABEL}\\\\.)+(?:${TLD_COLLISION}))(?!\\\\.?\\\\w)`;\n\nfunction uncComputerPattern(separator: string): string {\n return `(?:${separator}${separator})([A-Za-z][A-Za-z0-9-]{0,14})(?=${separator}[A-Za-z0-9$])`;\n}\n\nconst UNC_COMPUTER = uncComputerPattern(BACKSLASH);\nconst UNC_COMPUTER_JSON = uncComputerPattern(JSON_BACKSLASH);\n\nconst SPN_HOST = '(?:\\\\b[A-Za-z][A-Za-z0-9]*/)([A-Za-z0-9][A-Za-z0-9.-]*)(?=@[A-Z0-9.-]+\\\\b)';\n\nconst HOST_CTX_KEY = '(?:host|hostname|computer)';\nconst HOST_VALUE = '[A-Za-z0-9](?:[A-Za-z0-9.-]*[A-Za-z0-9])?';\nconst HOST_CTX = `(?:\\\\b${HOST_CTX_KEY}\\\\s*[=:]\\\\s*)(${HOST_VALUE})`;\n\nfunction anyCase(word: string): string {\n let pattern = '';\n\n for (const char of word) {\n const lower = char.toLowerCase();\n const upper = char.toUpperCase();\n pattern += lower === upper ? char : `[${lower}${upper}]`;\n }\n\n return pattern;\n}\n\nconst QUOTED_DOMAIN_ACCOUNT = `(?:\")(?!${WELL_KNOWN_DOMAIN}\\\\\\\\{1,2})(${NETBIOS_DOMAIN})(?=\\\\\\\\{1,2}${NOT_WINDOWS_FILENAME}${ACCOUNT_SEGMENT}\")`;\n\nconst KEY_WORD = '[A-Za-z_]*';\nconst JSON_HOST_KEY = [\n `${KEY_WORD}${anyCase('computer')}${KEY_WORD}`,\n `${KEY_WORD}${anyCase('domain')}[_-]?${anyCase('name')}`,\n `${anyCase('host')}(?:[_-]?${anyCase('name')})?`,\n anyCase('fqdn'),\n anyCase('domain'),\n `${anyCase('server')}[_-]?${anyCase('name')}`,\n `${anyCase('node')}[_-]?${anyCase('name')}`,\n `${anyCase('dns')}[_-]?${anyCase('name')}`,\n `${anyCase('machine')}[_-]?${anyCase('name')}`,\n `${anyCase('target')}[_-]?${anyCase('host')}`,\n].join('|');\nconst HOST_JSON_CTX = `(?:\"(?:${JSON_HOST_KEY})\"\\\\s*:\\\\s*\")(${HOST_VALUE})(?=\")`;\n\nconst NETBIOS_AGGRESSIVE = '(?:\\\\b(?:WIN|DESKTOP)-[A-Z0-9]{7,10}\\\\b)';\n\nconst SYSLOG_MONTH = '(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)';\nconst SYSLOG_BSD_TS = `${SYSLOG_MONTH}\\\\s+\\\\d{1,2}\\\\s+\\\\d{2}:\\\\d{2}:\\\\d{2}`;\nconst SYSLOG_ISO_TS =\n '\\\\d{4}-\\\\d{2}-\\\\d{2}[T ]\\\\d{2}:\\\\d{2}:\\\\d{2}(?:\\\\.\\\\d+)?(?:Z|[+-]\\\\d{2}:?\\\\d{2})?';\nconst SYSLOG_HOST_NAME = `${LABEL}(?:\\\\.${LABEL})*`;\nconst SYSLOG_HOST_LOOKAHEAD = '(?=\\\\s+[A-Za-z][A-Za-z0-9_.@-]*(?:\\\\[\\\\d+\\\\])?:)';\nconst SYSLOG_HOST = `(?:(?:${SYSLOG_BSD_TS}|${SYSLOG_ISO_TS})\\\\s+)(${SYSLOG_HOST_NAME})${SYSLOG_HOST_LOOKAHEAD}`;\n\nconst INVENTORY_PREFIX =\n '(?:[Ss][Rr][Vv]|[Ww][Ee][Bb]|[Dd][Bb]|[Aa][Pp][Pp]|[Hh][Oo][Ss][Tt]|[Nn][Oo][Dd][Ee]|[Pp][Oo][Dd])';\nconst INVENTORY_HOST = `(?:\\\\b${INVENTORY_PREFIX}-[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*-\\\\d+\\\\b)`;\n\nexport const hostnamesRule: SanitizeRule = {\n id: 'hosts',\n label: 'Hostnames & domains',\n description:\n 'FQDNs, UNC computer names, Kerberos SPN hosts, quoted JSON host fields, the domain half of a quoted DOMAIN\\\\account value and syslog host fields become the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'HOST',\n patterns: [\n HOST_EXACT,\n HOST_COLLISION,\n UNC_COMPUTER,\n UNC_COMPUTER_JSON,\n SPN_HOST,\n HOST_CTX,\n HOST_JSON_CTX,\n QUOTED_DOMAIN_ACCOUNT,\n SYSLOG_HOST,\n ],\n aggressivePatterns: [NETBIOS_AGGRESSIVE, INVENTORY_HOST],\n jsonKeys: [\n 'hostname',\n 'host',\n 'fqdn',\n 'domain',\n 'computer',\n 'computerName',\n 'serverName',\n 'nodeName',\n 'dnsName',\n 'machineName',\n 'targetHost',\n ],\n jsonKeyContains: ['computer', 'domainname'],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst IPV4_OCTET = '(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]?\\\\d)';\nconst IPV4 = `(?:(?<![\\\\d.])\\\\b${IPV4_OCTET}(?:\\\\.${IPV4_OCTET}){3}\\\\b(?!\\\\.\\\\d))`;\n\nconst IPV6_SEG = '[0-9a-fA-F]{1,4}';\nconst IPV6_FULL = `(?:${IPV6_SEG}:){7}${IPV6_SEG}`;\nconst IPV6_COMPRESSED = `(?:(?:${IPV6_SEG}:){1,7}:|(?:${IPV6_SEG}:){1,6}:${IPV6_SEG}|(?:${IPV6_SEG}:){1,5}(?::${IPV6_SEG}){1,2}|(?:${IPV6_SEG}:){1,4}(?::${IPV6_SEG}){1,3}|(?:${IPV6_SEG}:){1,3}(?::${IPV6_SEG}){1,4}|(?:${IPV6_SEG}:){1,2}(?::${IPV6_SEG}){1,5}|${IPV6_SEG}:(?::${IPV6_SEG}){1,6}|:(?:(?::${IPV6_SEG}){1,7}|:))`;\nconst IPV4_MAPPED = `(?:::ffff:${IPV4})`;\nconst IPV6 = `(?:(?<![A-Za-z0-9])(?:${IPV4_MAPPED}|${IPV6_FULL}|${IPV6_COMPRESSED})(?![A-Za-z0-9:])(?!\\\\.\\\\d)(?:%[A-Za-z0-9_.-]+)?)`;\n\nconst PTR_V4 = '(?:\\\\b(?:\\\\d{1,3}\\\\.){4}in-addr\\\\.arpa\\\\b)';\nconst PTR_V6 = '(?:\\\\b(?:[0-9a-fA-F]\\\\.){4,32}ip6\\\\.arpa\\\\b)';\n\nconst MAC_COLON = '(?:(?<!&)\\\\b[0-9A-Fa-f]{2}(?::[0-9A-Fa-f]{2}){5}\\\\b)';\nconst MAC_DASH = '(?:\\\\b[0-9A-Fa-f]{2}(?:-[0-9A-Fa-f]{2}){5}\\\\b)';\nconst MAC_CISCO = '(?:\\\\b[0-9A-Fa-f]{4}(?:\\\\.[0-9A-Fa-f]{4}){2}\\\\b)';\n\nfunction ipv4ToOctets(ip: string): number[] {\n return ip.split('.').map(Number);\n}\n\nfunction isNetmaskShape(octets: number[]): boolean {\n const bin = octets.map((octet) => octet.toString(2).padStart(8, '0')).join('');\n return /^1*0*$/.test(bin);\n}\n\nfunction isReservedIpv4(ip: string): boolean {\n const octets = ipv4ToOctets(ip);\n\n if (octets.length !== 4 || octets.some((octet) => Number.isNaN(octet))) {\n return false;\n }\n\n if (octets[0] === 127) {\n return true;\n }\n\n if (octets[0] === 0) {\n return true;\n }\n\n if (octets[0] === 169 && octets[1] === 254) {\n return true;\n }\n\n if (octets[0] >= 224 && octets[0] <= 239) {\n return true;\n }\n\n return isNetmaskShape(octets);\n}\n\nfunction validateIp(match: string): boolean {\n if (/^\\d{1,3}(?:\\.\\d{1,3}){3}$/.test(match)) {\n return !isReservedIpv4(match);\n }\n\n const withoutZone = match.split('%')[0] ?? match;\n\n if (withoutZone === '::' || withoutZone === '::1') {\n return false;\n }\n\n const mapped = /^::ffff:(\\d{1,3}(?:\\.\\d{1,3}){3})$/.exec(withoutZone);\n\n if (mapped?.[1]) {\n return !isReservedIpv4(mapped[1]);\n }\n\n return true;\n}\n\nexport const ipAddressesRule: SanitizeRule = {\n id: 'ips',\n label: 'Network addresses',\n description:\n 'IPv4/IPv6 addresses, MAC addresses and reverse-DNS (PTR) names become the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'IP',\n patterns: [PTR_V4, PTR_V6, IPV6, IPV4, MAC_COLON, MAC_DASH, MAC_CISCO],\n validate: validateIp,\n jsonKeys: [\n 'ip',\n 'ipAddress',\n 'ip_address',\n 'clientIp',\n 'remoteAddr',\n 'srcIp',\n 'dstIp',\n 'sourceIp',\n 'destinationIp',\n 'xForwardedFor',\n 'mac',\n 'macAddress',\n ],\n};\n","const BLOCK_BYTES = 64;\nconst DIGEST_BYTES = 32;\n\nconst K = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nconst INITIAL_STATE = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\nfunction rotr(value: number, bits: number): number {\n return ((value >>> bits) | (value << (32 - bits))) >>> 0;\n}\n\nfunction padMessage(message: Uint8Array): Uint8Array {\n const bitLength = message.length * 8;\n const paddedLength = Math.ceil((message.length + 9) / BLOCK_BYTES) * BLOCK_BYTES;\n const padded = new Uint8Array(paddedLength);\n\n padded.set(message);\n padded[message.length] = 0x80;\n\n const view = new DataView(padded.buffer);\n view.setUint32(paddedLength - 8, Math.floor(bitLength / 2 ** 32), false);\n view.setUint32(paddedLength - 4, bitLength >>> 0, false);\n\n return padded;\n}\n\nexport function sha256(message: Uint8Array): Uint8Array {\n const padded = padMessage(message);\n const view = new DataView(padded.buffer);\n const state = Uint32Array.from(INITIAL_STATE);\n const w = new Uint32Array(64);\n\n for (let offset = 0; offset < padded.length; offset += BLOCK_BYTES) {\n for (let i = 0; i < 16; i += 1) {\n w[i] = view.getUint32(offset + i * 4, false);\n }\n\n for (let i = 16; i < 64; i += 1) {\n const s0 = rotr(w[i - 15], 7) ^ rotr(w[i - 15], 18) ^ (w[i - 15] >>> 3);\n const s1 = rotr(w[i - 2], 17) ^ rotr(w[i - 2], 19) ^ (w[i - 2] >>> 10);\n w[i] = (w[i - 16] + s0 + w[i - 7] + s1) >>> 0;\n }\n\n let [a, b, c, d, e, f, g, h] = state;\n\n for (let i = 0; i < 64; i += 1) {\n const s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);\n const ch = (e & f) ^ (~e & g);\n const temp1 = (h + s1 + ch + K[i] + w[i]) >>> 0;\n const s0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);\n const maj = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (s0 + maj) >>> 0;\n\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n\n state[0] = (state[0] + a) >>> 0;\n state[1] = (state[1] + b) >>> 0;\n state[2] = (state[2] + c) >>> 0;\n state[3] = (state[3] + d) >>> 0;\n state[4] = (state[4] + e) >>> 0;\n state[5] = (state[5] + f) >>> 0;\n state[6] = (state[6] + g) >>> 0;\n state[7] = (state[7] + h) >>> 0;\n }\n\n const digest = new Uint8Array(DIGEST_BYTES);\n const digestView = new DataView(digest.buffer);\n\n for (let i = 0; i < 8; i += 1) {\n digestView.setUint32(i * 4, state[i], false);\n }\n\n return digest;\n}\n","import { sha256 } from '../shared/hmacSha256';\nimport type { SanitizeRule } from '../../types';\n\nconst BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';\n\nfunction luhnCheck(digits: string): boolean {\n if (!/^\\d{13,19}$/.test(digits) || /^0+$/.test(digits)) {\n return false;\n }\n\n let sum = 0;\n let doubleIt = false;\n\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let digit = Number(digits[i]);\n\n if (doubleIt) {\n digit *= 2;\n if (digit > 9) {\n digit -= 9;\n }\n }\n\n sum += digit;\n doubleIt = !doubleIt;\n }\n\n return sum % 10 === 0;\n}\n\nfunction ibanMod97(iban: string): boolean {\n const compact = iban.replace(/\\s/g, '').toUpperCase();\n\n if (!/^[A-Z]{2}\\d{2}[A-Z0-9]{10,30}$/.test(compact)) {\n return false;\n }\n\n const rearranged = compact.slice(4) + compact.slice(0, 4);\n const numeric = rearranged.replace(/[A-Z]/g, (char) => String(char.charCodeAt(0) - 55));\n let remainder = 0;\n\n for (let i = 0; i < numeric.length; i += 1) {\n remainder = (remainder * 10 + Number(numeric[i])) % 97;\n }\n\n return remainder === 1;\n}\n\nconst IBAN_COUNTRY_CODES = new Set([\n 'AD',\n 'AE',\n 'AL',\n 'AO',\n 'AT',\n 'AZ',\n 'BA',\n 'BE',\n 'BF',\n 'BG',\n 'BH',\n 'BI',\n 'BJ',\n 'BR',\n 'BY',\n 'CF',\n 'CG',\n 'CH',\n 'CI',\n 'CM',\n 'CR',\n 'CV',\n 'CY',\n 'CZ',\n 'DE',\n 'DJ',\n 'DK',\n 'DO',\n 'DZ',\n 'EE',\n 'EG',\n 'ES',\n 'FI',\n 'FO',\n 'FR',\n 'GA',\n 'GB',\n 'GE',\n 'GI',\n 'GL',\n 'GQ',\n 'GR',\n 'GT',\n 'GW',\n 'HN',\n 'HR',\n 'HU',\n 'IE',\n 'IL',\n 'IQ',\n 'IR',\n 'IS',\n 'IT',\n 'JO',\n 'KM',\n 'KW',\n 'KZ',\n 'LB',\n 'LC',\n 'LI',\n 'LT',\n 'LU',\n 'LV',\n 'LY',\n 'MA',\n 'MC',\n 'MD',\n 'ME',\n 'MG',\n 'MK',\n 'ML',\n 'MR',\n 'MT',\n 'MU',\n 'MZ',\n 'NE',\n 'NI',\n 'NL',\n 'NO',\n 'PK',\n 'PL',\n 'PS',\n 'PT',\n 'QA',\n 'RO',\n 'RS',\n 'RU',\n 'SA',\n 'SC',\n 'SD',\n 'SE',\n 'SI',\n 'SK',\n 'SM',\n 'SN',\n 'ST',\n 'SV',\n 'TD',\n 'TG',\n 'TL',\n 'TN',\n 'TR',\n 'UA',\n 'VA',\n 'VG',\n 'XK',\n]);\n\nfunction isIbanCountry(compact: string): boolean {\n return IBAN_COUNTRY_CODES.has(compact.slice(0, 2).toUpperCase());\n}\n\nfunction isHexHashLength(value: string): boolean {\n return /^(?:[A-Fa-f0-9]{32}|[A-Fa-f0-9]{40}|[A-Fa-f0-9]{64})$/.test(value);\n}\n\nfunction isCardSeparatorLayout(match: string): boolean {\n if (!/[ -]/.test(match)) {\n return true;\n }\n\n const groups = match.split(/[ -]/).map((group) => group.length);\n\n if (groups.some((length) => length === 0)) {\n return false;\n }\n\n if (\n groups.length === 3 &&\n groups[0] === 4 &&\n groups[1] === 6 &&\n (groups[2] === 4 || groups[2] === 5)\n ) {\n return true;\n }\n\n const last = groups[groups.length - 1];\n\n return (\n groups.length >= 2 &&\n groups.slice(0, -1).every((length) => length === 4) &&\n last >= 1 &&\n last <= 7\n );\n}\n\nfunction bitcoinBase58Check(address: string): boolean {\n const decoded = decodeBase58(address);\n\n if (!decoded || decoded.length < 5) {\n return false;\n }\n\n const payload = decoded.subarray(0, decoded.length - 4);\n const checksum = decoded.subarray(decoded.length - 4);\n const digest = sha256(sha256(payload));\n\n return (\n digest[0] === checksum[0] &&\n digest[1] === checksum[1] &&\n digest[2] === checksum[2] &&\n digest[3] === checksum[3]\n );\n}\n\nfunction decodeBase58(input: string): Uint8Array | null {\n const bytes: number[] = [0];\n\n for (let i = 0; i < input.length; i += 1) {\n let carry = BASE58_ALPHABET.indexOf(input[i]);\n\n if (carry === -1) {\n return null;\n }\n\n for (let j = 0; j < bytes.length; j += 1) {\n carry += bytes[j] * 58;\n bytes[j] = carry % 256;\n carry = Math.floor(carry / 256);\n }\n\n while (carry > 0) {\n bytes.push(carry % 256);\n carry = Math.floor(carry / 256);\n }\n }\n\n let leadingOnes = 0;\n\n while (leadingOnes < input.length && input[leadingOnes] === '1') {\n leadingOnes += 1;\n }\n\n let end = bytes.length;\n\n while (end > 0 && bytes[end - 1] === 0) {\n end -= 1;\n }\n\n const out = new Uint8Array(leadingOnes + end);\n\n for (let i = 0; i < end; i += 1) {\n out[leadingOnes + end - 1 - i] = bytes[i];\n }\n\n return out;\n}\n\nfunction isKnownCardIin(digits: string): boolean {\n const { length } = digits;\n const d2 = Number(digits.slice(0, 2));\n const d4 = Number(digits.slice(0, 4));\n\n switch (digits[0]) {\n case '4':\n return length === 13 || length === 16 || length === 19;\n case '5':\n return length === 16 && d2 >= 51 && d2 <= 55;\n case '2':\n return length === 16 && d4 >= 2221 && d4 <= 2720;\n case '3':\n if (length === 15) {\n return d2 === 34 || d2 === 37;\n }\n\n if (length === 14) {\n return d2 === 36 || d2 === 38 || d2 === 39 || (d4 >= 3000 && d4 <= 3059) || d4 === 3095;\n }\n\n return length >= 16 && length <= 19 && d4 >= 3528 && d4 <= 3589;\n case '6':\n return (\n length >= 16 &&\n length <= 19 &&\n (digits.startsWith('6011') ||\n digits.startsWith('62') ||\n digits.startsWith('64') ||\n digits.startsWith('65'))\n );\n default:\n return false;\n }\n}\n\nfunction validatePayment(match: string): boolean {\n const compactIban = match.replace(/\\s/g, '');\n\n if (/^[A-Za-z]{2}\\d{2}[A-Za-z0-9]+$/.test(compactIban)) {\n return !isHexHashLength(compactIban) && isIbanCountry(compactIban) && ibanMod97(match);\n }\n\n const compactPan = match.replace(/[ -]/g, '');\n\n if (/^[\\d -]+$/.test(match) && /^\\d{13,19}$/.test(compactPan)) {\n const grouped = /[ -]/.test(match);\n\n if (!grouped && compactPan.length > 16) {\n return false;\n }\n\n return isCardSeparatorLayout(match) && isKnownCardIin(compactPan) && luhnCheck(compactPan);\n }\n\n if (/^[13][A-HJ-NP-Za-km-z1-9]{25,34}$/.test(match)) {\n return bitcoinBase58Check(match);\n }\n\n return true;\n}\n\nconst CVV_KEY = '(?:[Cc][Vv][Vv]2?|[Cc][Vv][Cc]2?|[Cc][Ii][Dd])';\nconst EXP_KEY = '(?:[Ee]xp(?:iry|iration)?|[Ee]xp[_-]?[Dd]ate)';\nconst ROUTING_KEY = '(?:[Rr]outing(?:[_-]?[Nn]umber)?|[Aa][Bb][Aa])';\nconst ACCOUNT_KEY = '(?:[Aa]ccount[_-]?[Nn]umber|[Aa]cct)';\n\nexport const paymentInfoRule: SanitizeRule = {\n id: 'paymentInfo',\n label: 'Payment info',\n description:\n 'IBANs, card numbers (PAN, Luhn-checked), CVV/CVC, expiry dates and crypto addresses are redacted outright.',\n mode: 'mask',\n token: 'PAYMENT',\n patterns: [\n '(?:(?<![.\\\\d])\\\\b\\\\d(?:[ -]?\\\\d){12,18}\\\\b)',\n '(?:\\\\b[A-Z]{2}\\\\d{2}[A-Z0-9]{10,30}\\\\b)',\n '(?:\\\\b[A-Z]{2}\\\\d{2}(?: [A-Z0-9]{4}){2,7}(?: [A-Z0-9]{1,4})?\\\\b)',\n `(?:\\\\b${CVV_KEY}\\\\s*[=:]\\\\s*)(\\\\d{3,4}\\\\b)`,\n `(?:\\\\b${EXP_KEY}\\\\s*[=:]\\\\s*)((?:0[1-9]|1[0-2])[/-](?:\\\\d{2}|\\\\d{4})\\\\b)`,\n '(?:\\\\bbc1[a-z0-9]{25,39}\\\\b)',\n '(?:(?<![A-Za-z0-9])[13][A-HJ-NP-Za-km-z1-9]{25,34}(?![A-Za-z0-9]))',\n '(?:\\\\b0x[A-Fa-f0-9]{40}\\\\b)',\n ],\n aggressivePatterns: [\n '(?:(?<![\\\\\\\\/])\\\\b[A-Z]{6}[A-Z0-9]{2}(?:[A-Z0-9]{3})?\\\\b(?![\\\\\\\\/]))',\n `(?:\\\\b${ROUTING_KEY}\\\\s*[=:]\\\\s*)(\\\\d{9}\\\\b)`,\n `(?:\\\\b${ACCOUNT_KEY}\\\\s*[=:]\\\\s*)(\\\\d{8,12}\\\\b)`,\n ],\n validate: validatePayment,\n jsonKeys: [\n 'iban',\n 'cardNumber',\n 'pan',\n 'cvv',\n 'cvc',\n 'card_number',\n 'creditCard',\n 'cvv2',\n 'accountNumber',\n 'routingNumber',\n 'bic',\n 'swift',\n 'expiryDate',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nfunction validatePhone(match: string): boolean {\n const digits = match.replace(/\\D/g, '');\n const national = digits.startsWith('00') ? digits.slice(2) : digits;\n return national.length >= 7 && national.length <= 15;\n}\n\nconst PHONE_KEY = '(?:telephone|phone|mobile|msisdn|cell|fax|tel)';\n\nexport const phoneNumbersRule: SanitizeRule = {\n id: 'phoneNumbers',\n label: 'Phone numbers',\n description:\n 'Phone numbers become a stable <PHONE:…> token — the same number maps to the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'PHONE',\n patterns: [\n '(?:(?<![A-Za-z0-9])\\\\+[1-9](?:[\\\\s().-]*\\\\d){6,14}(?!\\\\d))',\n '(?:\\\\(\\\\d{3}\\\\)\\\\s?\\\\d{3}-\\\\d{4}(?!\\\\d))',\n '(?:\\\\b\\\\d{3}-\\\\d{3}-\\\\d{4}\\\\b)',\n '(?:\\\\b1-\\\\d{3}-\\\\d{3}-\\\\d{4}\\\\b)',\n '(?:\\\\b0\\\\d{2}-\\\\d{3}-\\\\d{2}-\\\\d{2}\\\\b)',\n '(?:\\\\b0\\\\d{2}\\\\s\\\\d{3}\\\\s\\\\d{2}\\\\s\\\\d{2}\\\\b)',\n '(?:(?<![.\\\\d-])\\\\b00[1-9](?:[\\\\s().-]*\\\\d){7,13}(?!\\\\w)(?!-[\\\\dA-Fa-f]))',\n '(?:\\\\b(?:tel|sms):)(\\\\+?[1-9](?:[\\\\s().-]*\\\\d){6,14})(?!\\\\d)',\n `(?:\\\\b${PHONE_KEY}\\\\s*[=:]\\\\s*)(\\\\+?[0-9](?:[\\\\s().-]*\\\\d){6,14})(?!\\\\d)`,\n ],\n validate: validatePhone,\n jsonKeys: [\n 'phone',\n 'phoneNumber',\n 'phone_number',\n 'mobile',\n 'mobileNumber',\n 'cell',\n 'telephone',\n 'tel',\n 'fax',\n 'msisdn',\n 'contactNumber',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst ENTROPY_THRESHOLD = 3.5;\n\nfunction shannonEntropy(value: string): number {\n const { length } = value;\n\n if (length === 0) {\n return 0;\n }\n\n const freq: Record<string, number> = {};\n\n for (let i = 0; i < length; i += 1) {\n const char = value[i];\n freq[char] = (freq[char] ?? 0) + 1;\n }\n\n return Object.values(freq).reduce((entropy, count) => {\n const p = count / length;\n\n return entropy - p * Math.log2(p);\n }, 0);\n}\n\nfunction isHexBlob(match: string): boolean {\n return match.length >= 32 && /^[A-Fa-f0-9]+$/.test(match);\n}\n\nfunction isBase64Blob(match: string): boolean {\n return match.length >= 40 && /^[A-Za-z0-9+/]+=*$/.test(match);\n}\n\nfunction validateSecret(match: string): boolean {\n if (isHexBlob(match)) {\n return shannonEntropy(match) > ENTROPY_THRESHOLD;\n }\n\n if (isBase64Blob(match)) {\n return (\n shannonEntropy(match) > ENTROPY_THRESHOLD && /[A-Za-z]/.test(match) && /[0-9+/]/.test(match)\n );\n }\n\n return true;\n}\n\nconst CONTEXT_KEYS =\n '(?:api[_-]?key|apikey|access[_-]?token|refresh[_-]?token|id[_-]?token|client[_-]?secret|secret[_-]?key|private[_-]?key|password|passwd|pwd|pass|auth[_-]?token|signing[_-]?key)';\n\nconst CONTEXT_VALUE = '[^\\\\s,;}\"\\']{4,}';\n\nconst CLI_FLAGS = '(?:password|secret|token|api-key|apikey|access-token|client-secret)';\n\nexport const secretsRule: SanitizeRule = {\n id: 'secrets',\n label: 'Tokens & credentials',\n description:\n 'Bearer tokens, JWTs and API keys are redacted outright — they are not meant to be traced.',\n mode: 'mask',\n token: 'SECRET',\n patterns: [\n '(?:(?:Bearer|bearer|BEARER)\\\\s+)([A-Za-z0-9._\\\\-+/=]{8,})',\n '(?:(?:Basic|basic|BASIC)\\\\s+)([A-Za-z0-9+/]{8,}={0,2})',\n '(?:(?<![A-Za-z0-9_-])eyJ[A-Za-z0-9_-]{8,}\\\\.[A-Za-z0-9_-]{8,}(?:\\\\.[A-Za-z0-9_-]{8,})?)',\n '(?:-----BEGIN (?:(?:RSA |EC |DSA |OPENSSH |ENCRYPTED )?PRIVATE KEY|CERTIFICATE)-----[A-Za-z0-9+/=\\\\s\\\\\\\\]+?-----END (?:(?:RSA |EC |DSA |OPENSSH |ENCRYPTED )?PRIVATE KEY|CERTIFICATE)-----)',\n '(?:\\\\b(?:AKIA|ASIA|ABIA|ACCA)[A-Z0-9]{16}\\\\b)',\n '(?:(?:aws_secret_access_key|AWS_SECRET_ACCESS_KEY)\\\\s*[=:]\\\\s*)([A-Za-z0-9/+=]{30,})',\n '(?:github_pat_[A-Za-z0-9_]{22,})',\n '(?:gh[pousr]_[A-Za-z0-9]{36,})',\n '(?:xox[abprs]-[A-Za-z0-9-]{10,})',\n '(?:hooks\\\\.slack\\\\.com/services/[A-Za-z0-9/_-]{16,})',\n '(?:AIza[A-Za-z0-9_-]{35})',\n '(?:(?:sk_live_|sk_test_|rk_live_|rk_test_)[A-Za-z0-9]{16,})',\n '(?:sk-proj-[A-Za-z0-9_-]{16,})',\n '(?:sk-[A-Za-z0-9]{20,})',\n // Kept as a lookbehind: `.{0,60}` asserts a nearby keyword rather than an adjacent prefix, so\n // one `Twilio` has to stay reusable by every identifier that follows it.\n '(?:(?<=(?:[Tt]wilio.{0,60}|\\\\b(?:[Aa]ccount[Ss]id|[Aa]uth[Tt]oken|[Ss]id)\\\\s*[=:]\\\\s*))(?:AC|SK)[0-9A-Fa-f]{32})',\n '(?:SG\\\\.[A-Za-z0-9_-]{10,}\\\\.[A-Za-z0-9_-]{10,})',\n '(?:npm_[A-Za-z0-9]{36,})',\n '(?:[?&][Ss]ig=)([^&\\\\s\"\\']{16,})',\n '(?:[a-zA-Z][a-zA-Z0-9+.-]*://)([^/@\\\\s:]+:[^/@\\\\s]+@)',\n `(?:--${CLI_FLAGS}(?:\\\\s+|=)\"?)([^\\\\s\"']{4,})`,\n `(?:\\\\b${CONTEXT_KEYS}\"?\\\\s*[=:]\\\\s*\"?)(${CONTEXT_VALUE})`,\n ],\n aggressivePatterns: [\n '(?:(?<![A-Za-z0-9+/])[A-Za-z0-9+/]{40,}={0,2}(?![A-Za-z0-9+/=]))',\n '(?:\\\\b[A-Fa-f0-9]{32,}\\\\b)',\n ],\n validate: validateSecret,\n jsonKeys: [\n 'password',\n 'token',\n 'authorization',\n 'apiKey',\n 'secret',\n 'accessToken',\n 'refreshToken',\n 'passwd',\n 'pwd',\n 'pass',\n 'clientSecret',\n 'privateKey',\n 'secretKey',\n 'apiSecret',\n 'credentials',\n 'auth',\n 'xApiKey',\n 'idToken',\n 'awsSecretAccessKey',\n 'signature',\n ],\n};\n","import type { SanitizeRule } from '../../types';\n\nconst COOKIE_VALUE = '[^;\\\\s]{8,}';\n\nexport const sessionCookiesRule: SanitizeRule = {\n id: 'sessionCookies',\n label: 'Session cookies',\n description: 'Session identifiers (sessionid, sid, JSESSIONID, PHPSESSID) are redacted outright.',\n mode: 'mask',\n token: 'SESSION',\n patterns: [\n `(?:(?<![\\\\w-])(?:[Ss]essionid|[Ss]ession_id|sessionId|SESSIONID)=${COOKIE_VALUE})`,\n `(?:(?<![\\\\w-])sid=${COOKIE_VALUE})`,\n `(?:PHPSESSID=${COOKIE_VALUE})`,\n `(?:JSESSIONID=${COOKIE_VALUE})`,\n `(?:ASP\\\\.NET_SessionId=${COOKIE_VALUE})`,\n `(?:ASPSESSIONID[A-Za-z0-9]*=${COOKIE_VALUE})`,\n `(?:connect\\\\.sid=${COOKIE_VALUE})`,\n `(?:laravel_session=${COOKIE_VALUE})`,\n `(?:_session_id=${COOKIE_VALUE})`,\n `(?:(?:csrftoken|csrf_token|XSRF-TOKEN|xsrf-token)=${COOKIE_VALUE})`,\n `(?:remember_token=${COOKIE_VALUE})`,\n `(?:(?:SSESS|SESS)[A-Fa-f0-9]{32}=${COOKIE_VALUE})`,\n `(?:[Ss]et-[Cc]ookie:\\\\s*)([^;=\\\\s]+=${COOKIE_VALUE})`,\n ],\n aggressivePatterns: [\n `(?:(?<![\\\\w-])[\\\\w-]*session[\\\\w-]*=${COOKIE_VALUE})`,\n `(?:(?<![\\\\w-])[\\\\w-]*token=${COOKIE_VALUE})`,\n ],\n jsonKeys: ['sessionId', 'sid', 'cookie', 'cookies', 'setCookie', 'jsessionid', 'csrfToken'],\n};\n","import type { SanitizeRule } from '../../types';\nimport {\n ACCOUNT_SEGMENT,\n BACKSLASH,\n JSON_BACKSLASH,\n NETBIOS_DOMAIN,\n NOT_WINDOWS_FILENAME,\n WELL_KNOWN_DOMAIN,\n} from '../shared/windowsAccounts';\n\nconst EMAIL_LOCAL = '[A-Za-z0-9._%+-]+';\nconst EMAIL_DOMAIN = '[A-Za-z0-9.-]+\\\\.[A-Za-z]{2,}';\nconst EMAIL = `(?:\\\\b${EMAIL_LOCAL}@${EMAIL_DOMAIN})`;\nconst EMAIL_IP_LITERAL = `(?:\\\\b${EMAIL_LOCAL}@\\\\[[0-9a-fA-F.:]+\\\\])`;\n\nconst USER_SEG_SIMPLE = ACCOUNT_SEGMENT;\n\nconst NOT_GUID = '(?![0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-)';\nconst ACCOUNT_END = '(?![A-Za-z0-9_$\\\\\\\\/-])';\n\nfunction domainUserPattern(separator: string): string {\n const winDomainExclude = `${WELL_KNOWN_DOMAIN}${separator}`;\n const pathRoot = `(?:\\\\b(?:HKLM|HKCU|HKU|HKCR|HKEY_[A-Z_]+)|\\\\b[A-Za-z]:)${separator}`;\n const notUnderPathRoot = `(?<!${pathRoot}(?:(?! [-/])[^<>'\"\\\\n])*)`;\n const domain = `(?:^|[^\\\\\\\\.-])\\\\b${NETBIOS_DOMAIN}${separator}`;\n\n return `(?:(?:${domain})(?<!${winDomainExclude})${NOT_WINDOWS_FILENAME}${NOT_GUID}(${USER_SEG_SIMPLE})${ACCOUNT_END}${notUnderPathRoot})`;\n}\n\nconst DOMAIN_USER = domainUserPattern(BACKSLASH);\nconst DOMAIN_USER_JSON = domainUserPattern(JSON_BACKSLASH);\n\nconst SID = '(?:\\\\bS-1-(?:\\\\d+-){1,14}\\\\d+\\\\b)';\n\nconst VALUE_WITH_LETTER = '[\\\\w.@+-]*[A-Za-z][\\\\w.@+-]*';\nconst LDAP_DN_SINGLE = `(?:\\\\b(?:uid|sAMAccountName)=)(${VALUE_WITH_LETTER})`;\nconst CN_VALUE = \"(?:[A-Za-z0-9.'-]+(?: [A-Za-z0-9.'-]+){0,3})\";\nconst LDAP_DN_CN = `(?:\\\\bcn=)(${CN_VALUE})`;\n\nconst ARN_USER = '(?::user/)([\\\\w.@+=,-]+)';\nconst ARN_ASSUMED_ROLE_SESSION = '(?::assumed-role/[\\\\w+=,.@-]+/)([\\\\w.@+=,-]+)';\n\nconst K8S_SERVICE_ACCOUNT = '(?:\\\\bsystem:serviceaccount:[A-Za-z0-9-]+:)([A-Za-z0-9-]+)';\n\nconst SSHD_FOR_USER = '(?:(?:\\\\bfor (?:invalid )?user|\\\\b[Ii]nvalid user)\\\\s+)([A-Za-z0-9._-]+)';\nconst SSHD_RUSER = '(?:\\\\bruser=)([A-Za-z0-9._-]+)';\nconst SSHD_LOGNAME = '(?:\\\\blogname=)([A-Za-z0-9._-]+)';\nconst SUDO_USER = '(?:\\\\bsudo:\\\\s+)([A-Za-z0-9._-]+)(?=\\\\s+:)';\n\nconst GENERIC_KEY =\n '(?:user|username|login|account|owner|actor|principal|requester|createdBy|modifiedBy|assignee|operator)';\nconst GENERIC_CTX = `(?:\\\\b${GENERIC_KEY}\\\\s*[=:]\\\\s*)(${VALUE_WITH_LETTER})`;\n\nconst SLACK_USER_ID_AGGRESSIVE = '(?:\\\\bU[A-Z0-9]{8,10}\\\\b)';\n\nconst SYSTEM_ACCOUNTS = new Set([\n 'root',\n 'system',\n 'daemon',\n 'nobody',\n 'www-data',\n 'nginx',\n 'sshd',\n 'syslog',\n]);\n\nfunction isWellKnownWindowsAccount(match: string): boolean {\n const upper = match.toUpperCase();\n\n if (upper === 'SYSTEM' || upper === 'LOCAL' || upper === 'NETWORK' || upper === 'ANONYMOUS') {\n return true;\n }\n\n return match.endsWith('$');\n}\n\nfunction isWellKnownSid(match: string): boolean {\n if (match === 'S-1-1-0') {\n return true;\n }\n\n if (/^S-1-5-(?:18|19|20)$/.test(match)) {\n return true;\n }\n\n return /^S-1-5-32-\\d+$/.test(match);\n}\n\nfunction validateUser(match: string): boolean {\n if (isWellKnownWindowsAccount(match)) {\n return false;\n }\n\n if (isWellKnownSid(match)) {\n return false;\n }\n\n return !SYSTEM_ACCOUNTS.has(match.toLowerCase());\n}\n\nexport const usersRule: SanitizeRule = {\n id: 'users',\n label: 'Usernames & emails',\n description:\n 'Email addresses and account identifiers (DOMAIN\\\\user, SIDs, ARNs, LDAP DNs, sshd/PAM context) become the same token everywhere within a session.',\n mode: 'pseudo',\n token: 'USER',\n patterns: [\n EMAIL_IP_LITERAL,\n EMAIL,\n DOMAIN_USER,\n DOMAIN_USER_JSON,\n SID,\n LDAP_DN_SINGLE,\n LDAP_DN_CN,\n ARN_USER,\n ARN_ASSUMED_ROLE_SESSION,\n K8S_SERVICE_ACCOUNT,\n SSHD_FOR_USER,\n SSHD_RUSER,\n SSHD_LOGNAME,\n SUDO_USER,\n GENERIC_CTX,\n ],\n aggressivePatterns: [SLACK_USER_ID_AGGRESSIVE],\n validate: validateUser,\n jsonKeys: [\n 'email',\n 'username',\n 'user',\n 'emailAddress',\n 'mail',\n 'userEmail',\n 'user_name',\n 'login',\n 'account',\n 'samAccountName',\n 'userPrincipalName',\n 'upn',\n 'actor',\n 'principal',\n 'owner',\n 'createdBy',\n 'modifiedBy',\n 'firstName',\n 'lastName',\n 'fullName',\n 'displayName',\n 'givenName',\n 'surname',\n 'userId',\n 'uid',\n ],\n jsonKeyContains: ['owner', 'username'],\n};\n","import type { BuiltinRuleId, SanitizeRule } from '../types';\nimport { geoLocationRule } from './definitions/geoLocation';\nimport { govIdentifiersRule } from './definitions/govIdentifiers';\nimport { healthInfoRule } from './definitions/healthInfo';\nimport { homePathsRule } from './definitions/homePaths';\nimport { hostnamesRule } from './definitions/hostnames';\nimport { ipAddressesRule } from './definitions/ipAddresses';\nimport { paymentInfoRule } from './definitions/paymentInfo';\nimport { phoneNumbersRule } from './definitions/phoneNumbers';\nimport { secretsRule } from './definitions/secrets';\nimport { sessionCookiesRule } from './definitions/sessionCookies';\nimport { usersRule } from './definitions/users';\n\n/**\n * Every rule shipped with this package, in default priority order.\n *\n * Order matters: when two rules could match at the same position, the one listed first wins.\n * Credential-shaped rules come first so a token is not partially consumed by a broader\n * identifier rule.\n */\nexport const builtinRules: readonly SanitizeRule[] = [\n secretsRule,\n sessionCookiesRule,\n paymentInfoRule,\n govIdentifiersRule,\n healthInfoRule,\n phoneNumbersRule,\n ipAddressesRule,\n hostnamesRule,\n usersRule,\n geoLocationRule,\n homePathsRule,\n];\n\n/** Identifiers of {@link builtinRules}, in the same order. */\nexport const builtinRuleIds: readonly BuiltinRuleId[] = builtinRules.map(\n (rule) => rule.id as BuiltinRuleId,\n);\n\nconst builtinsById = new Map<string, SanitizeRule>(builtinRules.map((rule) => [rule.id, rule]));\n\n/**\n * Looks up a built-in rule by identifier.\n *\n * @returns The rule, or `undefined` when the identifier is not built in.\n */\nexport function getBuiltinRule(id: string): SanitizeRule | undefined {\n return builtinsById.get(id);\n}\n","export function matchParen(source: string, openIndex: number): number {\n let depth = 0;\n let inClass = false;\n\n for (let index = openIndex; index < source.length; index += 1) {\n const char = source[index];\n\n if (char === '\\\\') {\n index += 1;\n continue;\n }\n\n if (inClass) {\n if (char === ']') {\n inClass = false;\n }\n\n continue;\n }\n\n if (char === '[') {\n inClass = true;\n continue;\n }\n\n if (char === '(') {\n depth += 1;\n } else if (char === ')') {\n depth -= 1;\n\n if (depth === 0) {\n return index;\n }\n }\n }\n\n return -1;\n}\n\nexport function countCapturingGroups(source: string): number {\n let count = 0;\n let inClass = false;\n\n for (let index = 0; index < source.length; index += 1) {\n const char = source[index];\n\n if (char === '\\\\') {\n index += 1;\n continue;\n }\n\n if (inClass) {\n if (char === ']') {\n inClass = false;\n }\n\n continue;\n }\n\n if (char === '[') {\n inClass = true;\n continue;\n }\n\n if (char !== '(') {\n continue;\n }\n\n const next = source.slice(index, index + 4);\n\n if (\n next.startsWith('(?:') ||\n next.startsWith('(?=') ||\n next.startsWith('(?!') ||\n next.startsWith('(?<=') ||\n next.startsWith('(?<!')\n ) {\n continue;\n }\n\n count += 1;\n }\n\n return count;\n}\n\nexport function deriveGateSource(source: string): string {\n let output = '';\n let inClass = false;\n\n for (let index = 0; index < source.length; index += 1) {\n const char = source[index];\n\n if (char === '\\\\') {\n output += source.slice(index, index + 2);\n index += 1;\n continue;\n }\n\n if (inClass) {\n output += char;\n\n if (char === ']') {\n inClass = false;\n }\n\n continue;\n }\n\n if (char === '[') {\n inClass = true;\n output += char;\n continue;\n }\n\n if (char === '(' && source.startsWith('(?<=', index)) {\n const close = matchParen(source, index);\n\n if (close === -1) {\n output += char;\n continue;\n }\n\n output += `(?:${source.slice(index + 4, close)})`;\n index = close;\n continue;\n }\n\n if (\n char === '(' &&\n (source.startsWith('(?<!', index) ||\n source.startsWith('(?=', index) ||\n source.startsWith('(?!', index))\n ) {\n const close = matchParen(source, index);\n\n if (close === -1) {\n output += char;\n continue;\n }\n\n index = close;\n continue;\n }\n\n output += char;\n }\n\n return output;\n}\n\nexport function lineHasAnyChar(line: string, chars: string): boolean {\n for (let index = 0; index < line.length; index += 1) {\n if (chars.includes(line[index]!)) {\n return true;\n }\n }\n\n return false;\n}\n","import { InvalidRuleError } from '../core/errors';\nimport { countCapturingGroups } from '../core/regexSource';\nimport type { SanitizeRule } from '../types';\n\nconst RULE_ID_PATTERN = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\nconst TOKEN_PATTERN = /^[A-Z][A-Z0-9]*$/;\nconst NAMED_GROUP_PATTERN = /\\(\\?<[^=!]/;\n\nfunction requireText(value: unknown, rule: string, field: string): string {\n if (typeof value !== 'string' || value.trim().length === 0) {\n throw new InvalidRuleError(`Rule \"${rule}\": \\`${field}\\` must be a non-empty string.`);\n }\n\n return value;\n}\n\nfunction assertPatterns(patterns: unknown, ruleId: string, field: string): string[] {\n if (patterns === undefined) {\n return [];\n }\n\n if (!Array.isArray(patterns)) {\n throw new InvalidRuleError(`Rule \"${ruleId}\": \\`${field}\\` must be an array of strings.`);\n }\n\n return patterns.map((pattern: unknown, index) => {\n if (typeof pattern !== 'string' || pattern.length === 0) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` must be a non-empty regular expression source.`,\n );\n }\n\n if (NAMED_GROUP_PATTERN.test(pattern)) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` must not declare a named capture group.`,\n );\n }\n\n try {\n new RegExp(pattern, 'u');\n } catch (cause) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` is not a valid Unicode regular expression: ${String(cause)}`,\n );\n }\n\n if (countCapturingGroups(pattern) > 1) {\n throw new InvalidRuleError(\n `Rule \"${ruleId}\": \\`${field}[${index}]\\` must contain at most one capturing group, which marks the value to replace.`,\n );\n }\n\n return pattern;\n });\n}\n\nexport function validateRule(rule: SanitizeRule): SanitizeRule {\n if (typeof rule !== 'object' || rule === null) {\n throw new InvalidRuleError('A rule must be an object.');\n }\n\n const id = requireText(rule.id, String(rule.id), 'id');\n\n if (!RULE_ID_PATTERN.test(id)) {\n throw new InvalidRuleError(\n `Rule \"${id}\": \\`id\\` must be a valid ASCII identifier matching ${RULE_ID_PATTERN.source}.`,\n );\n }\n\n requireText(rule.label, id, 'label');\n requireText(rule.description, id, 'description');\n\n if (rule.mode !== 'pseudo' && rule.mode !== 'mask') {\n throw new InvalidRuleError(`Rule \"${id}\": \\`mode\\` must be either \"pseudo\" or \"mask\".`);\n }\n\n if (rule.token !== undefined && !TOKEN_PATTERN.test(rule.token)) {\n throw new InvalidRuleError(\n `Rule \"${id}\": \\`token\\` must match ${TOKEN_PATTERN.source}, so replacement tokens stay recognizable.`,\n );\n }\n\n const patterns = assertPatterns(rule.patterns, id, 'patterns');\n const aggressivePatterns = assertPatterns(rule.aggressivePatterns, id, 'aggressivePatterns');\n\n if (patterns.length === 0 && aggressivePatterns.length === 0) {\n throw new InvalidRuleError(`Rule \"${id}\": at least one pattern is required.`);\n }\n\n if (rule.jsonKeys !== undefined) {\n if (!Array.isArray(rule.jsonKeys)) {\n throw new InvalidRuleError(`Rule \"${id}\": \\`jsonKeys\\` must be an array of strings.`);\n }\n\n for (const [index, key] of rule.jsonKeys.entries()) {\n requireText(key, id, `jsonKeys[${index}]`);\n }\n }\n\n if (rule.jsonKeyContains !== undefined) {\n if (!Array.isArray(rule.jsonKeyContains)) {\n throw new InvalidRuleError(`Rule \"${id}\": \\`jsonKeyContains\\` must be an array of strings.`);\n }\n\n for (const [index, fragment] of rule.jsonKeyContains.entries()) {\n requireText(fragment, id, `jsonKeyContains[${index}]`);\n }\n }\n\n if (rule.validate !== undefined && typeof rule.validate !== 'function') {\n throw new InvalidRuleError(`Rule \"${id}\": \\`validate\\` must be a function.`);\n }\n\n return rule;\n}\n","import type { SanitizeRule } from '../types';\nimport { validateRule } from './validateRule';\n\n/**\n * Validates a rule and returns it unchanged.\n *\n * Use it instead of a plain object literal: the shape is checked once, at module load, so a typo in\n * a pattern surfaces immediately rather than as a silent miss during a run.\n *\n * @throws {InvalidRuleError} When the rule is malformed.\n *\n * @example\n * ```ts\n * const ticketRule = defineRule({\n * id: 'acme_ticket',\n * label: 'Support ticket IDs',\n * description: 'Internal ticket references such as ACME-123456.',\n * mode: 'pseudo',\n * token: 'TICKET',\n * patterns: ['(?:\\\\bACME-\\\\d{6}\\\\b)'],\n * jsonKeys: ['ticketId'],\n * });\n *\n * const sanitizer = createSanitizer({ extraRules: [ticketRule] });\n * ```\n */\nexport function defineRule(rule: SanitizeRule): SanitizeRule {\n return validateRule(rule);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { InvalidKeyError, InvalidOptionError, builtinRuleIds, SanitizationAbortedError, getBuiltinRule, UnknownRuleError, validateRule, countCapturingGroups, InvalidRuleError, deriveGateSource, lineHasAnyChar } from './chunk-MNU2FHP5.js';
1
+ import { InvalidKeyError, InvalidOptionError, builtinRuleIds, SanitizationAbortedError, getBuiltinRule, UnknownRuleError, validateRule, countCapturingGroups, InvalidRuleError, deriveGateSource, lineHasAnyChar } from './chunk-VMPXBCSL.js';
2
2
 
3
3
  // src/core/constants.ts
4
4
  var DEFAULT_PREVIEW_BYTES = 256 * 1024;
@@ -619,6 +619,9 @@ function looksLikeJson(line) {
619
619
  function normalizeKey2(key) {
620
620
  return key.toLowerCase().replace(/[-_]/g, "");
621
621
  }
622
+ function shouldPreserveJsonValue(value) {
623
+ return value.length === 0 || value === "-";
624
+ }
622
625
  function buildJsonKeyMatcher(rules) {
623
626
  const exact = /* @__PURE__ */ new Map();
624
627
  const contains = [];
@@ -684,6 +687,14 @@ function highlightReplacements(text) {
684
687
  function jsonStringContent(value) {
685
688
  return JSON.stringify(value).slice(1, -1);
686
689
  }
690
+ function locateQuotedJsonValue(text, value, from = 0) {
691
+ const encoded = jsonStringContent(value);
692
+ const quotedAt = text.indexOf(`"${encoded}"`, from);
693
+ if (quotedAt === -1) {
694
+ return null;
695
+ }
696
+ return { index: quotedAt + 1, length: encoded.length };
697
+ }
687
698
  function findOriginal(text, original, from) {
688
699
  const encoded = jsonStringContent(original.value);
689
700
  if (original.wholeValue) {
@@ -769,6 +780,9 @@ function redactJsonLine(line, ctx, options = {}) {
769
780
  };
770
781
  const redactValue = (value, key) => {
771
782
  if (typeof value === "string") {
783
+ if (key !== void 0 && shouldPreserveJsonValue(value)) {
784
+ return value;
785
+ }
772
786
  const fieldRule = key === void 0 ? void 0 : resolveJsonKeyRule(keyMatcher, key);
773
787
  if (fieldRule) {
774
788
  if (isAllowed(ctx.allow, fieldRule.id, value)) {
@@ -780,12 +794,13 @@ function redactJsonLine(line, ctx, options = {}) {
780
794
  originals.push({ value, wholeValue: true });
781
795
  }
782
796
  if (withMatches) {
797
+ const located = locateQuotedJsonValue(content, value);
783
798
  matches.push({
784
799
  ruleId: fieldRule.id,
785
800
  original: value,
786
801
  replacement,
787
- index: Math.max(content.indexOf(jsonStringContent(value)), 0),
788
- ...contextFor(value)
802
+ index: located?.index ?? 0,
803
+ ...located && ctx.contextChars > 0 ? sliceContext(content, located.index, located.length, ctx.contextChars) : ctx.contextChars > 0 ? { contextBefore: "", contextAfter: "" } : {}
789
804
  });
790
805
  }
791
806
  return replacement;
@@ -1289,5 +1304,5 @@ function toNullSink() {
1289
1304
  }
1290
1305
 
1291
1306
  export { createSanitizer, fromBlob, fromString, fromWebStream, generateKey, mergeReports, planLineAlignedRanges, sanitizeStream, sanitizeText, toCallbackSink, toNullSink, toStringSink };
1292
- //# sourceMappingURL=chunk-SZLS55UR.js.map
1293
- //# sourceMappingURL=chunk-SZLS55UR.js.map
1307
+ //# sourceMappingURL=chunk-SGF4CYUV.js.map
1308
+ //# sourceMappingURL=chunk-SGF4CYUV.js.map