@futdevpro/fsm-dynamo 1.16.1 → 1.16.2
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/build/_collections/utils/secret-mask.util.d.ts +90 -0
- package/build/_collections/utils/secret-mask.util.d.ts.map +1 -0
- package/build/_collections/utils/secret-mask.util.js +219 -0
- package/build/_collections/utils/secret-mask.util.js.map +1 -0
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/package.json +1 -1
- package/src/_collections/utils/secret-mask.util.ts +258 -0
- package/src/index.ts +1 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FR-093 (2026-06-09) — Universal secret/key masking utility (bedrock level).
|
|
3
|
+
*
|
|
4
|
+
* Lehetove teszi az ALL-FDP-systems-szintu secret-szivargas-detection +
|
|
5
|
+
* maszkolas-t egy bedrock-szinten. A korabban Overseer / runner-worker
|
|
6
|
+
* helyi util-jai (FR-092) most ezt importaljak — egy SOR konfiguracio +
|
|
7
|
+
* find-and-replace.
|
|
8
|
+
*
|
|
9
|
+
* User feedback ('az osszes rendszerunknek a lenyege az univerzalizalt,
|
|
10
|
+
* mindenhol hasznalhato, egysegesített megoldások'): every secret-pattern
|
|
11
|
+
* ennek a egyetlen DyFM_SecretMask_Util-nak a felelossege.
|
|
12
|
+
*
|
|
13
|
+
* Strategy — KETTOS:
|
|
14
|
+
* 1. **PATTERN-based**: ismert secret-formatumokra automatikus felismeres.
|
|
15
|
+
* 2. **VALUE-based**: a process.env-jenek secret-erteket overlay-eli minden szovegben.
|
|
16
|
+
*
|
|
17
|
+
* Identifiability config (`DyFM_SecretMask_Settings.partialReveal`):
|
|
18
|
+
* - DEFAULT: `{ prefix: 4, suffix: 4 }` — a kulcsok elso 4 + utolso 4 char-ja
|
|
19
|
+
* megorzodik, kozeppe `[redacted-<KIND>]` keruln, pl.:
|
|
20
|
+
* `ghp_abcdefghij1234567890abcdefghij12345678` → `ghp_abcd...5678 [redacted-github-pat]`
|
|
21
|
+
* - User-extensible: csokkentett vagy 0-os reveal a tobb-biztonsagos
|
|
22
|
+
* deploymentekhez (`{ prefix: 0, suffix: 0 }` → tisztan opaque).
|
|
23
|
+
*
|
|
24
|
+
* Per memory `[[feedback_rich_error_handling]]`: a maszkolt token jelzes ne
|
|
25
|
+
* legyen `***` opaque; legyen `[redacted-<KIND>]` hogy ranezessel lassuk MILYEN
|
|
26
|
+
* tipusu szivargast szuntunk meg.
|
|
27
|
+
*
|
|
28
|
+
* Pattern-mapping per memory `[[feedback_individual_plans]]` — single source of
|
|
29
|
+
* truth: minden uj secret-format hozzaadando a `DyFM_SECRET_PATTERNS` array-hez;
|
|
30
|
+
* a tobbi rendszerben (Overseer/runner/bedrock packages) automatikusan
|
|
31
|
+
* megjelenik a fsm-bump utan.
|
|
32
|
+
*/
|
|
33
|
+
export interface DyFM_SecretMask_PartialReveal_Interface {
|
|
34
|
+
/** Megorzendo elso karakter-szam (0 = teljesen elrejt). */
|
|
35
|
+
prefix: number;
|
|
36
|
+
/** Megorzendo utolso karakter-szam (0 = teljesen elrejt). */
|
|
37
|
+
suffix: number;
|
|
38
|
+
}
|
|
39
|
+
export interface DyFM_SecretMask_Settings_Interface {
|
|
40
|
+
/**
|
|
41
|
+
* Identifiability-controls. Default `{ prefix: 4, suffix: 4 }`. Beallitva
|
|
42
|
+
* pl. `{ prefix: 0, suffix: 0 }` opaque maszkolas-hoz.
|
|
43
|
+
*/
|
|
44
|
+
partialReveal: DyFM_SecretMask_PartialReveal_Interface;
|
|
45
|
+
/**
|
|
46
|
+
* Min karakter-hossz amire az env-overlay alkalmaz. Rovid ertekek false
|
|
47
|
+
* positivot adnak (pl. `KEY=foo` ahol foo a project-name). Default: 8.
|
|
48
|
+
*/
|
|
49
|
+
minEnvValueLength: number;
|
|
50
|
+
/**
|
|
51
|
+
* `process.env`-bol kulcsneveket szuro regex. Default match: minden olyan
|
|
52
|
+
* env-var ahol a NEV titkos-jellegu (TOKEN/SECRET/KEY/PASSWORD/PAT/HMAC stb.).
|
|
53
|
+
*/
|
|
54
|
+
envNameSecretRx: RegExp;
|
|
55
|
+
}
|
|
56
|
+
export declare const DyFM_DEFAULT_SECRET_MASK_SETTINGS: DyFM_SecretMask_Settings_Interface;
|
|
57
|
+
interface SecretPattern_Interface {
|
|
58
|
+
/** Diagnosztikai cimke a `[redacted-<KIND>]` markerben. */
|
|
59
|
+
kind: string;
|
|
60
|
+
/** Detekcios regex (global flag is REQUIRED — a global flow minden match-et kezel). */
|
|
61
|
+
regex: RegExp;
|
|
62
|
+
/**
|
|
63
|
+
* `redactWith` — meghivva minden match-re a "matched" stringgel + settings-szel.
|
|
64
|
+
* Visszaad a csere-string-et. Default: partial-reveal-szel `<prefix>...<suffix> [redacted-<KIND>]`.
|
|
65
|
+
*/
|
|
66
|
+
redactWith?: (matched: string, settings: DyFM_SecretMask_Settings_Interface) => string;
|
|
67
|
+
/**
|
|
68
|
+
* `wrapPrefix` — ha a regex captures (`$1` group-ja stb.) a literal-prefixet jelzi
|
|
69
|
+
* (pl. `Bearer ` a Bearer-token-nel), akkor a redact-result `[$1][reveal][marker]`-rel
|
|
70
|
+
* kerul ossze; a regex group az `wrapPrefix` index-en mutatott group. Default 0 = no wrap.
|
|
71
|
+
*/
|
|
72
|
+
wrapPrefix?: number;
|
|
73
|
+
}
|
|
74
|
+
export declare const DyFM_SECRET_PATTERNS: SecretPattern_Interface[];
|
|
75
|
+
/**
|
|
76
|
+
* `DyFM_maskSecrets` — universal pre-Discord-send + pre-log-persist masking.
|
|
77
|
+
*
|
|
78
|
+
* @param text bemenet (ha nem string, JSON-szerializalaskor maskoljuk)
|
|
79
|
+
* @param settings konfiguracio (default a DyFM_DEFAULT_SECRET_MASK_SETTINGS)
|
|
80
|
+
* @returns maszkolt szoveg
|
|
81
|
+
*/
|
|
82
|
+
export declare function DyFM_maskSecrets(text: unknown, settings?: DyFM_SecretMask_Settings_Interface): string;
|
|
83
|
+
/**
|
|
84
|
+
* Recursive object-masker — JSON-szeru struktura minden string-ertekeben alkalmazza
|
|
85
|
+
* a DyFM_maskSecrets-t. Pl. errors-table additionalContent / logTail tomb / cdpReport
|
|
86
|
+
* objektum elotti masking-hez.
|
|
87
|
+
*/
|
|
88
|
+
export declare function DyFM_maskSecretsDeep<T = unknown>(input: T, settings?: DyFM_SecretMask_Settings_Interface): T;
|
|
89
|
+
export {};
|
|
90
|
+
//# sourceMappingURL=secret-mask.util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-mask.util.d.ts","sourceRoot":"","sources":["../../../src/_collections/utils/secret-mask.util.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,MAAM,WAAW,uCAAuC;IACtD,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kCAAkC;IACjD;;;OAGG;IACH,aAAa,EAAE,uCAAuC,CAAC;IAEvD;;;OAGG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,iCAAiC,EAAE,kCAO/C,CAAC;AAEF,UAAU,uBAAuB;IAC/B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,uFAAuF;IACvF,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,kCAAkC,KAAK,MAAM,CAAC;IACvF;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAsBD,eAAO,MAAM,oBAAoB,EAAE,uBAAuB,EA4DzD,CAAC;AAuBF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,OAAO,EACb,QAAQ,GAAE,kCAAsE,GAC/E,MAAM,CAiCR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,OAAO,EAC9C,KAAK,EAAE,CAAC,EACR,QAAQ,GAAE,kCAAsE,GAC/E,CAAC,CAcH"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* FR-093 (2026-06-09) — Universal secret/key masking utility (bedrock level).
|
|
4
|
+
*
|
|
5
|
+
* Lehetove teszi az ALL-FDP-systems-szintu secret-szivargas-detection +
|
|
6
|
+
* maszkolas-t egy bedrock-szinten. A korabban Overseer / runner-worker
|
|
7
|
+
* helyi util-jai (FR-092) most ezt importaljak — egy SOR konfiguracio +
|
|
8
|
+
* find-and-replace.
|
|
9
|
+
*
|
|
10
|
+
* User feedback ('az osszes rendszerunknek a lenyege az univerzalizalt,
|
|
11
|
+
* mindenhol hasznalhato, egysegesített megoldások'): every secret-pattern
|
|
12
|
+
* ennek a egyetlen DyFM_SecretMask_Util-nak a felelossege.
|
|
13
|
+
*
|
|
14
|
+
* Strategy — KETTOS:
|
|
15
|
+
* 1. **PATTERN-based**: ismert secret-formatumokra automatikus felismeres.
|
|
16
|
+
* 2. **VALUE-based**: a process.env-jenek secret-erteket overlay-eli minden szovegben.
|
|
17
|
+
*
|
|
18
|
+
* Identifiability config (`DyFM_SecretMask_Settings.partialReveal`):
|
|
19
|
+
* - DEFAULT: `{ prefix: 4, suffix: 4 }` — a kulcsok elso 4 + utolso 4 char-ja
|
|
20
|
+
* megorzodik, kozeppe `[redacted-<KIND>]` keruln, pl.:
|
|
21
|
+
* `ghp_abcdefghij1234567890abcdefghij12345678` → `ghp_abcd...5678 [redacted-github-pat]`
|
|
22
|
+
* - User-extensible: csokkentett vagy 0-os reveal a tobb-biztonsagos
|
|
23
|
+
* deploymentekhez (`{ prefix: 0, suffix: 0 }` → tisztan opaque).
|
|
24
|
+
*
|
|
25
|
+
* Per memory `[[feedback_rich_error_handling]]`: a maszkolt token jelzes ne
|
|
26
|
+
* legyen `***` opaque; legyen `[redacted-<KIND>]` hogy ranezessel lassuk MILYEN
|
|
27
|
+
* tipusu szivargast szuntunk meg.
|
|
28
|
+
*
|
|
29
|
+
* Pattern-mapping per memory `[[feedback_individual_plans]]` — single source of
|
|
30
|
+
* truth: minden uj secret-format hozzaadando a `DyFM_SECRET_PATTERNS` array-hez;
|
|
31
|
+
* a tobbi rendszerben (Overseer/runner/bedrock packages) automatikusan
|
|
32
|
+
* megjelenik a fsm-bump utan.
|
|
33
|
+
*/
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.DyFM_SECRET_PATTERNS = exports.DyFM_DEFAULT_SECRET_MASK_SETTINGS = void 0;
|
|
36
|
+
exports.DyFM_maskSecrets = DyFM_maskSecrets;
|
|
37
|
+
exports.DyFM_maskSecretsDeep = DyFM_maskSecretsDeep;
|
|
38
|
+
exports.DyFM_DEFAULT_SECRET_MASK_SETTINGS = {
|
|
39
|
+
partialReveal: {
|
|
40
|
+
prefix: 4,
|
|
41
|
+
suffix: 4,
|
|
42
|
+
},
|
|
43
|
+
minEnvValueLength: 8,
|
|
44
|
+
envNameSecretRx: /(?:TOKEN|SECRET|KEY|PASSWORD|PASSWD|PAT|HMAC|AUTH|PRIVATE|CREDENTIAL|API_KEY|WEBHOOK)/i,
|
|
45
|
+
};
|
|
46
|
+
const defaultRevealReplacement = (matched, kind, settings) => {
|
|
47
|
+
const p = Math.max(0, settings.partialReveal.prefix);
|
|
48
|
+
const s = Math.max(0, settings.partialReveal.suffix);
|
|
49
|
+
// Ha a kulcs tul rovid az osszes reveal-osszeghez kepest, ne reveal-juk
|
|
50
|
+
// (kulonben az egesz secret elerhetonek osszetapadna).
|
|
51
|
+
if (matched.length <= p + s + 4) {
|
|
52
|
+
return `[redacted-${kind}]`;
|
|
53
|
+
}
|
|
54
|
+
if (p === 0 && s === 0) {
|
|
55
|
+
return `[redacted-${kind}]`;
|
|
56
|
+
}
|
|
57
|
+
const head = matched.slice(0, p);
|
|
58
|
+
const tail = matched.slice(matched.length - s);
|
|
59
|
+
return `${head}...${tail} [redacted-${kind}]`;
|
|
60
|
+
};
|
|
61
|
+
exports.DyFM_SECRET_PATTERNS = [
|
|
62
|
+
// URL-embedded basic auth — sajat replace-pattern megorzi a scheme-et + host-ot.
|
|
63
|
+
{
|
|
64
|
+
kind: 'url-cred',
|
|
65
|
+
regex: /\b(https?:\/\/)([^/\s:@]+):([^\s@]+)@/g,
|
|
66
|
+
redactWith: (_m) => '$1[redacted-url-cred]@',
|
|
67
|
+
},
|
|
68
|
+
// GitHub PATs
|
|
69
|
+
{ kind: 'github-pat', regex: /\bgh[ps]_[A-Za-z0-9]{36,}\b/g },
|
|
70
|
+
{ kind: 'github-pat-fine', regex: /\bgithub_pat_[A-Za-z0-9_]{82,}\b/g },
|
|
71
|
+
{ kind: 'github-oauth', regex: /\bgho_[A-Za-z0-9]{36,}\b/g },
|
|
72
|
+
{ kind: 'github-refresh', regex: /\bghr_[A-Za-z0-9]{36,}\b/g },
|
|
73
|
+
// NPM token
|
|
74
|
+
{ kind: 'npm-token', regex: /\bnpm_[A-Za-z0-9]{36,}\b/g },
|
|
75
|
+
// Docker Hub PAT
|
|
76
|
+
{ kind: 'docker-pat', regex: /\bdckr_pat_[A-Za-z0-9_\-]{20,}\b/g },
|
|
77
|
+
// Slack token
|
|
78
|
+
{ kind: 'slack-token', regex: /\bxox[abprs]-[A-Za-z0-9-]{10,}\b/g },
|
|
79
|
+
// Anthropic key (BEFORE OpenAI — `sk-ant-*` more specific than `sk-*`)
|
|
80
|
+
{ kind: 'anthropic-key', regex: /\bsk-ant-[A-Za-z0-9\-_]{32,}\b/g },
|
|
81
|
+
// OpenAI / generic `sk-*` key
|
|
82
|
+
{ kind: 'openai-key', regex: /\bsk-[A-Za-z0-9]{32,}\b/g },
|
|
83
|
+
// Google API key
|
|
84
|
+
{ kind: 'google-api-key', regex: /\bAIza[0-9A-Za-z\-_]{35}\b/g },
|
|
85
|
+
// Discord webhook URL (id + token in URL)
|
|
86
|
+
{
|
|
87
|
+
kind: 'discord-webhook',
|
|
88
|
+
regex: /\bhttps?:\/\/(?:discord(?:app)?\.com|discordapp\.com)\/api\/webhooks\/\d+\/[A-Za-z0-9_\-]+/g,
|
|
89
|
+
redactWith: (_m) => '[redacted-discord-webhook]',
|
|
90
|
+
},
|
|
91
|
+
// Bearer token in HTTP header style — megorizzuk a 'Bearer ' prefixet (literally), a token-t pedig reveal-eljuk.
|
|
92
|
+
{
|
|
93
|
+
kind: 'bearer-token',
|
|
94
|
+
regex: /\b(Bearer)\s+([A-Za-z0-9\-._~+/=]{20,})/gi,
|
|
95
|
+
redactWith: (matched, settings) => {
|
|
96
|
+
const tokenStart = matched.search(/\s+/);
|
|
97
|
+
const prefix = matched.slice(0, tokenStart + 1); // 'Bearer '
|
|
98
|
+
const token = matched.slice(tokenStart + 1);
|
|
99
|
+
return prefix + defaultRevealReplacement(token, 'token', settings);
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
// JWT (eyJ + .* + .*)
|
|
103
|
+
{ kind: 'jwt', regex: /\beyJ[A-Za-z0-9_\-]{10,}\.[A-Za-z0-9_\-]{10,}\.[A-Za-z0-9_\-]{10,}\b/g },
|
|
104
|
+
// AWS Access Key
|
|
105
|
+
{ kind: 'aws-access-key', regex: /\bAKIA[0-9A-Z]{16}\b/g },
|
|
106
|
+
// Env-style secret-name = value
|
|
107
|
+
{
|
|
108
|
+
kind: 'env-style-secret',
|
|
109
|
+
regex: /\b([A-Z][A-Z0-9_]*(?:TOKEN|SECRET|KEY|PASSWORD|PASSWD|PAT|HMAC|AUTH|PRIVATE)[A-Z0-9_]*)\s*[:=]\s*['"]?([^\s'"]+)['"]?/g,
|
|
110
|
+
redactWith: (matched, settings) => {
|
|
111
|
+
// Pull out the key name + value via re-match (avoids capturing groups in redactWith signature)
|
|
112
|
+
const m = matched.match(/\b([A-Z][A-Z0-9_]*(?:TOKEN|SECRET|KEY|PASSWORD|PASSWD|PAT|HMAC|AUTH|PRIVATE)[A-Z0-9_]*)\s*[:=]\s*['"]?([^\s'"]+)/);
|
|
113
|
+
if (!m) {
|
|
114
|
+
return matched;
|
|
115
|
+
}
|
|
116
|
+
const keyName = m[1];
|
|
117
|
+
const value = m[2];
|
|
118
|
+
const sep = matched.includes(': ') ? '=' : '=';
|
|
119
|
+
const revealed = defaultRevealReplacement(value, 'env-value', settings);
|
|
120
|
+
return `${keyName}${sep}${revealed}`;
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
];
|
|
124
|
+
/**
|
|
125
|
+
* `process.env`-bol kigyujti azokat a kulcsokat ahol a NEV titkos-jellegu
|
|
126
|
+
* ÉS a value >= minEnvValueLength. Visszaad egy listat — ezeket szovegben
|
|
127
|
+
* minden elofordulasban partial-reveal-el felulrak-juk.
|
|
128
|
+
*/
|
|
129
|
+
const collectEnvSecretValues = (settings) => {
|
|
130
|
+
const out = [];
|
|
131
|
+
for (const [key, raw] of Object.entries(process.env)) {
|
|
132
|
+
if (!raw || raw.length < settings.minEnvValueLength) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (!settings.envNameSecretRx.test(key)) {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
if (/^(true|false|0|1)$/i.test(raw)) {
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
out.push({ value: raw, key: key });
|
|
142
|
+
}
|
|
143
|
+
// Sort by value length DESC — hosszabb ertekekkel kezdjuk, igy egy rovid
|
|
144
|
+
// prefix nem sealeze el a hosszabb kornyezetet.
|
|
145
|
+
out.sort((a, b) => b.value.length - a.value.length);
|
|
146
|
+
return out;
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* `DyFM_maskSecrets` — universal pre-Discord-send + pre-log-persist masking.
|
|
150
|
+
*
|
|
151
|
+
* @param text bemenet (ha nem string, JSON-szerializalaskor maskoljuk)
|
|
152
|
+
* @param settings konfiguracio (default a DyFM_DEFAULT_SECRET_MASK_SETTINGS)
|
|
153
|
+
* @returns maszkolt szoveg
|
|
154
|
+
*/
|
|
155
|
+
function DyFM_maskSecrets(text, settings = exports.DyFM_DEFAULT_SECRET_MASK_SETTINGS) {
|
|
156
|
+
if (text === null || text === undefined) {
|
|
157
|
+
return '';
|
|
158
|
+
}
|
|
159
|
+
let str;
|
|
160
|
+
if (typeof text === 'string') {
|
|
161
|
+
str = text;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
try {
|
|
165
|
+
str = JSON.stringify(text);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
str = String(text);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// 1. PATTERN-based maszkolas
|
|
172
|
+
for (const p of exports.DyFM_SECRET_PATTERNS) {
|
|
173
|
+
str = str.replace(p.regex, (matched, ...groups) => {
|
|
174
|
+
// Drop the `offset` + `wholeString` args at the end of `groups`
|
|
175
|
+
if (p.redactWith) {
|
|
176
|
+
return p.redactWith(matched, settings)
|
|
177
|
+
.replace(/\$1/g, groups[0] ?? '')
|
|
178
|
+
.replace(/\$2/g, groups[1] ?? '');
|
|
179
|
+
}
|
|
180
|
+
// Default: partial-reveal with kind
|
|
181
|
+
return defaultRevealReplacement(matched, p.kind, settings);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
// 2. ENV-secret value-alapu overlay
|
|
185
|
+
const envSecrets = collectEnvSecretValues(settings);
|
|
186
|
+
for (const { value, key } of envSecrets) {
|
|
187
|
+
if (!str.includes(value)) {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
const revealed = defaultRevealReplacement(value, `env-${key}`, settings);
|
|
191
|
+
str = str.split(value).join(revealed);
|
|
192
|
+
}
|
|
193
|
+
return str;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Recursive object-masker — JSON-szeru struktura minden string-ertekeben alkalmazza
|
|
197
|
+
* a DyFM_maskSecrets-t. Pl. errors-table additionalContent / logTail tomb / cdpReport
|
|
198
|
+
* objektum elotti masking-hez.
|
|
199
|
+
*/
|
|
200
|
+
function DyFM_maskSecretsDeep(input, settings = exports.DyFM_DEFAULT_SECRET_MASK_SETTINGS) {
|
|
201
|
+
if (input === null || input === undefined) {
|
|
202
|
+
return input;
|
|
203
|
+
}
|
|
204
|
+
if (typeof input === 'string') {
|
|
205
|
+
return DyFM_maskSecrets(input, settings);
|
|
206
|
+
}
|
|
207
|
+
if (typeof input !== 'object') {
|
|
208
|
+
return input;
|
|
209
|
+
}
|
|
210
|
+
if (Array.isArray(input)) {
|
|
211
|
+
return input.map((it) => DyFM_maskSecretsDeep(it, settings));
|
|
212
|
+
}
|
|
213
|
+
const out = {};
|
|
214
|
+
for (const [k, v] of Object.entries(input)) {
|
|
215
|
+
out[k] = DyFM_maskSecretsDeep(v, settings);
|
|
216
|
+
}
|
|
217
|
+
return out;
|
|
218
|
+
}
|
|
219
|
+
//# sourceMappingURL=secret-mask.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-mask.util.js","sourceRoot":"","sources":["../../../src/_collections/utils/secret-mask.util.ts"],"names":[],"mappings":"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"}
|
package/build/index.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export * from './_collections/utils/extract-error-message.util';
|
|
|
10
10
|
export * from './_collections/utils/json-error-helper.util';
|
|
11
11
|
export * from './_collections/utils/log.util';
|
|
12
12
|
export * from './_collections/utils/round-list.util';
|
|
13
|
+
export * from './_collections/utils/secret-mask.util';
|
|
13
14
|
export * from './_collections/utils/object.util';
|
|
14
15
|
export * from './_collections/utils/require-env.util';
|
|
15
16
|
export * from './_collections/utils/stack.util';
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,2CAA2C,CAAC;AAC1D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AAGrD,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iDAAiD,CAAC;AAChE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uCAAuC,CAAC;AACtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iDAAiD,CAAC;AAChE,cAAc,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAG/C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,wCAAwC,CAAC;AAGvD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,uCAAuC,CAAC;AACtD,cAAc,gDAAgD,CAAC;AAI/D,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wCAAwC,CAAC;AAGvD,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uCAAuC,CAAC;AAGtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AAKjD,cAAc,0DAA0D,CAAC;AACzE,cAAc,6DAA6D,CAAC;AAC5E,cAAc,8CAA8C,CAAC;AAC7D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,oDAAoD,CAAC;AACnE,cAAc,sDAAsD,CAAC;AACrE,cAAc,uEAAuE,CAAC;AAGtF,cAAc,iEAAiE,CAAC;AAChF,cAAc,0DAA0D,CAAC;AACzE,cAAc,wDAAwD,CAAC;AAGvE,cAAc,yCAAyC,CAAC;AACxD,cAAc,2CAA2C,CAAC;AAG1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,sCAAsC,CAAC;AACrD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,wDAAwD,CAAC;AACvE,cAAc,wCAAwC,CAAC;AAGvD,cAAc,gEAAgE,CAAC;AAC/E,cAAc,4DAA4D,CAAC;AAG3E,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,2CAA2C,CAAC;AAC1D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC;AAGrD,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iDAAiD,CAAC;AAChE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,kCAAkC,CAAC;AACjD,cAAc,uCAAuC,CAAC;AACtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iDAAiD,CAAC;AAChE,cAAc,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAG/C,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,wCAAwC,CAAC;AAGvD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,uCAAuC,CAAC;AACtD,cAAc,gDAAgD,CAAC;AAI/D,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,wCAAwC,CAAC;AAGvD,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC;AACnD,cAAc,uCAAuC,CAAC;AAGtD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kCAAkC,CAAC;AAKjD,cAAc,0DAA0D,CAAC;AACzE,cAAc,6DAA6D,CAAC;AAC5E,cAAc,8CAA8C,CAAC;AAC7D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,oDAAoD,CAAC;AACnE,cAAc,sDAAsD,CAAC;AACrE,cAAc,uEAAuE,CAAC;AAGtF,cAAc,iEAAiE,CAAC;AAChF,cAAc,0DAA0D,CAAC;AACzE,cAAc,wDAAwD,CAAC;AAGvE,cAAc,yCAAyC,CAAC;AACxD,cAAc,2CAA2C,CAAC;AAG1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,sCAAsC,CAAC;AACrD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,wDAAwD,CAAC;AACvE,cAAc,wCAAwC,CAAC;AAGvD,cAAc,gEAAgE,CAAC;AAC/E,cAAc,4DAA4D,CAAC;AAG3E,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC"}
|
package/build/index.js
CHANGED
|
@@ -16,6 +16,7 @@ tslib_1.__exportStar(require("./_collections/utils/extract-error-message.util"),
|
|
|
16
16
|
tslib_1.__exportStar(require("./_collections/utils/json-error-helper.util"), exports);
|
|
17
17
|
tslib_1.__exportStar(require("./_collections/utils/log.util"), exports);
|
|
18
18
|
tslib_1.__exportStar(require("./_collections/utils/round-list.util"), exports);
|
|
19
|
+
tslib_1.__exportStar(require("./_collections/utils/secret-mask.util"), exports);
|
|
19
20
|
tslib_1.__exportStar(require("./_collections/utils/object.util"), exports);
|
|
20
21
|
tslib_1.__exportStar(require("./_collections/utils/require-env.util"), exports);
|
|
21
22
|
tslib_1.__exportStar(require("./_collections/utils/stack.util"), exports);
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,cAAc;AACd,wBAAwB;AACxB,oFAA0D;AAC1D,wFAA8D;AAC9D,yFAA+D;AAC/D,iFAAuD;AACvD,+EAAqD;AAErD,oBAAoB;AACpB,0EAAgD;AAChD,0EAAgD;AAChD,yEAA+C;AAC/C,0FAAgE;AAChE,sFAA4D;AAC5D,wEAA8C;AAC9C,+EAAqD;AACrD,2EAAiD;AACjD,gFAAsD;AACtD,0EAAgD;AAChD,2EAAiD;AACjD,gFAAsD;AACtD,yEAA+C;AAC/C,0FAAgE;AAChE,8EAAoD;AACpD,yEAA+C;AAE/C,yBAAyB;AACzB,oFAA0D;AAC1D,8EAAoD;AACpD,gFAAsD;AACtD,sFAA4D;AAC5D,iFAAuD;AAEvD,2BAA2B;AAC3B,yFAA+D;AAC/D,gFAAsD;AACtD,yFAA+D;AAG/D,QAAQ;AACR,4EAAkD;AAClD,wEAA8C;AAC9C,yEAA+C;AAC/C,oEAA0C;AAC1C,kEAAwC;AACxC,iFAAuD;AAEvD,aAAa;AACb,4EAAkD;AAClD,6EAAmD;AACnD,gFAAsD;AAEtD,aAAa;AACb,yEAA+C;AAC/C,mEAAyC;AACzC,2EAAiD;AAGjD,SAAS;AACT,wBAAwB;AACxB,mGAAyE;AACzE,sGAA4E;AAC5E,uFAA6D;AAC7D,sFAA4D;AAC5D,6FAAmE;AACnE,+FAAqE;AACrE,gHAAsF;AAEtF,6BAA6B;AAC7B,0GAAgF;AAChF,mGAAyE;AACzE,iGAAuE;AAEvE,qBAAqB;AACrB,kFAAwD;AACxD,oFAA0D;AAE1D,oBAAoB;AACpB,oFAA0D;AAC1D,wFAA8D;AAC9D,+EAAqD;AACrD,uFAA6D;AAC7D,wFAA8D;AAC9D,sFAA4D;AAC5D,uFAA6D;AAC7D,iGAAuE;AACvE,iFAAuD;AAEvD,gCAAgC;AAChC,yGAA+E;AAC/E,qGAA2E;AAE3E,eAAe;AACf,yEAA+C;AAC/C,uEAA6C;AAC7C,yEAA+C;AAC/C,uEAA6C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,cAAc;AACd,wBAAwB;AACxB,oFAA0D;AAC1D,wFAA8D;AAC9D,yFAA+D;AAC/D,iFAAuD;AACvD,+EAAqD;AAErD,oBAAoB;AACpB,0EAAgD;AAChD,0EAAgD;AAChD,yEAA+C;AAC/C,0FAAgE;AAChE,sFAA4D;AAC5D,wEAA8C;AAC9C,+EAAqD;AACrD,gFAAsD;AACtD,2EAAiD;AACjD,gFAAsD;AACtD,0EAAgD;AAChD,2EAAiD;AACjD,gFAAsD;AACtD,yEAA+C;AAC/C,0FAAgE;AAChE,8EAAoD;AACpD,yEAA+C;AAE/C,yBAAyB;AACzB,oFAA0D;AAC1D,8EAAoD;AACpD,gFAAsD;AACtD,sFAA4D;AAC5D,iFAAuD;AAEvD,2BAA2B;AAC3B,yFAA+D;AAC/D,gFAAsD;AACtD,yFAA+D;AAG/D,QAAQ;AACR,4EAAkD;AAClD,wEAA8C;AAC9C,yEAA+C;AAC/C,oEAA0C;AAC1C,kEAAwC;AACxC,iFAAuD;AAEvD,aAAa;AACb,4EAAkD;AAClD,6EAAmD;AACnD,gFAAsD;AAEtD,aAAa;AACb,yEAA+C;AAC/C,mEAAyC;AACzC,2EAAiD;AAGjD,SAAS;AACT,wBAAwB;AACxB,mGAAyE;AACzE,sGAA4E;AAC5E,uFAA6D;AAC7D,sFAA4D;AAC5D,6FAAmE;AACnE,+FAAqE;AACrE,gHAAsF;AAEtF,6BAA6B;AAC7B,0GAAgF;AAChF,mGAAyE;AACzE,iGAAuE;AAEvE,qBAAqB;AACrB,kFAAwD;AACxD,oFAA0D;AAE1D,oBAAoB;AACpB,oFAA0D;AAC1D,wFAA8D;AAC9D,+EAAqD;AACrD,uFAA6D;AAC7D,wFAA8D;AAC9D,sFAA4D;AAC5D,uFAA6D;AAC7D,iGAAuE;AACvE,iFAAuD;AAEvD,gCAAgC;AAChC,yGAA+E;AAC/E,qGAA2E;AAE3E,eAAe;AACf,yEAA+C;AAC/C,uEAA6C;AAC7C,yEAA+C;AAC/C,uEAA6C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@futdevpro/fsm-dynamo",
|
|
3
|
-
"version": "01.16.
|
|
3
|
+
"version": "01.16.2",
|
|
4
4
|
"description": "Full Stack Model Collection for Dynamic (NodeJS-Typescript) Framework called Dynamo, by Future Development Ltd.",
|
|
5
5
|
"DyBu_settings": {
|
|
6
6
|
"packageType": "full-stack-package",
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FR-093 (2026-06-09) — Universal secret/key masking utility (bedrock level).
|
|
3
|
+
*
|
|
4
|
+
* Lehetove teszi az ALL-FDP-systems-szintu secret-szivargas-detection +
|
|
5
|
+
* maszkolas-t egy bedrock-szinten. A korabban Overseer / runner-worker
|
|
6
|
+
* helyi util-jai (FR-092) most ezt importaljak — egy SOR konfiguracio +
|
|
7
|
+
* find-and-replace.
|
|
8
|
+
*
|
|
9
|
+
* User feedback ('az osszes rendszerunknek a lenyege az univerzalizalt,
|
|
10
|
+
* mindenhol hasznalhato, egysegesített megoldások'): every secret-pattern
|
|
11
|
+
* ennek a egyetlen DyFM_SecretMask_Util-nak a felelossege.
|
|
12
|
+
*
|
|
13
|
+
* Strategy — KETTOS:
|
|
14
|
+
* 1. **PATTERN-based**: ismert secret-formatumokra automatikus felismeres.
|
|
15
|
+
* 2. **VALUE-based**: a process.env-jenek secret-erteket overlay-eli minden szovegben.
|
|
16
|
+
*
|
|
17
|
+
* Identifiability config (`DyFM_SecretMask_Settings.partialReveal`):
|
|
18
|
+
* - DEFAULT: `{ prefix: 4, suffix: 4 }` — a kulcsok elso 4 + utolso 4 char-ja
|
|
19
|
+
* megorzodik, kozeppe `[redacted-<KIND>]` keruln, pl.:
|
|
20
|
+
* `ghp_abcdefghij1234567890abcdefghij12345678` → `ghp_abcd...5678 [redacted-github-pat]`
|
|
21
|
+
* - User-extensible: csokkentett vagy 0-os reveal a tobb-biztonsagos
|
|
22
|
+
* deploymentekhez (`{ prefix: 0, suffix: 0 }` → tisztan opaque).
|
|
23
|
+
*
|
|
24
|
+
* Per memory `[[feedback_rich_error_handling]]`: a maszkolt token jelzes ne
|
|
25
|
+
* legyen `***` opaque; legyen `[redacted-<KIND>]` hogy ranezessel lassuk MILYEN
|
|
26
|
+
* tipusu szivargast szuntunk meg.
|
|
27
|
+
*
|
|
28
|
+
* Pattern-mapping per memory `[[feedback_individual_plans]]` — single source of
|
|
29
|
+
* truth: minden uj secret-format hozzaadando a `DyFM_SECRET_PATTERNS` array-hez;
|
|
30
|
+
* a tobbi rendszerben (Overseer/runner/bedrock packages) automatikusan
|
|
31
|
+
* megjelenik a fsm-bump utan.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
export interface DyFM_SecretMask_PartialReveal_Interface {
|
|
35
|
+
/** Megorzendo elso karakter-szam (0 = teljesen elrejt). */
|
|
36
|
+
prefix: number;
|
|
37
|
+
/** Megorzendo utolso karakter-szam (0 = teljesen elrejt). */
|
|
38
|
+
suffix: number;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface DyFM_SecretMask_Settings_Interface {
|
|
42
|
+
/**
|
|
43
|
+
* Identifiability-controls. Default `{ prefix: 4, suffix: 4 }`. Beallitva
|
|
44
|
+
* pl. `{ prefix: 0, suffix: 0 }` opaque maszkolas-hoz.
|
|
45
|
+
*/
|
|
46
|
+
partialReveal: DyFM_SecretMask_PartialReveal_Interface;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Min karakter-hossz amire az env-overlay alkalmaz. Rovid ertekek false
|
|
50
|
+
* positivot adnak (pl. `KEY=foo` ahol foo a project-name). Default: 8.
|
|
51
|
+
*/
|
|
52
|
+
minEnvValueLength: number;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* `process.env`-bol kulcsneveket szuro regex. Default match: minden olyan
|
|
56
|
+
* env-var ahol a NEV titkos-jellegu (TOKEN/SECRET/KEY/PASSWORD/PAT/HMAC stb.).
|
|
57
|
+
*/
|
|
58
|
+
envNameSecretRx: RegExp;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export const DyFM_DEFAULT_SECRET_MASK_SETTINGS: DyFM_SecretMask_Settings_Interface = {
|
|
62
|
+
partialReveal: {
|
|
63
|
+
prefix: 4,
|
|
64
|
+
suffix: 4,
|
|
65
|
+
},
|
|
66
|
+
minEnvValueLength: 8,
|
|
67
|
+
envNameSecretRx: /(?:TOKEN|SECRET|KEY|PASSWORD|PASSWD|PAT|HMAC|AUTH|PRIVATE|CREDENTIAL|API_KEY|WEBHOOK)/i,
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
interface SecretPattern_Interface {
|
|
71
|
+
/** Diagnosztikai cimke a `[redacted-<KIND>]` markerben. */
|
|
72
|
+
kind: string;
|
|
73
|
+
/** Detekcios regex (global flag is REQUIRED — a global flow minden match-et kezel). */
|
|
74
|
+
regex: RegExp;
|
|
75
|
+
/**
|
|
76
|
+
* `redactWith` — meghivva minden match-re a "matched" stringgel + settings-szel.
|
|
77
|
+
* Visszaad a csere-string-et. Default: partial-reveal-szel `<prefix>...<suffix> [redacted-<KIND>]`.
|
|
78
|
+
*/
|
|
79
|
+
redactWith?: (matched: string, settings: DyFM_SecretMask_Settings_Interface) => string;
|
|
80
|
+
/**
|
|
81
|
+
* `wrapPrefix` — ha a regex captures (`$1` group-ja stb.) a literal-prefixet jelzi
|
|
82
|
+
* (pl. `Bearer ` a Bearer-token-nel), akkor a redact-result `[$1][reveal][marker]`-rel
|
|
83
|
+
* kerul ossze; a regex group az `wrapPrefix` index-en mutatott group. Default 0 = no wrap.
|
|
84
|
+
*/
|
|
85
|
+
wrapPrefix?: number;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const defaultRevealReplacement = (
|
|
89
|
+
matched: string,
|
|
90
|
+
kind: string,
|
|
91
|
+
settings: DyFM_SecretMask_Settings_Interface,
|
|
92
|
+
): string => {
|
|
93
|
+
const p: number = Math.max(0, settings.partialReveal.prefix);
|
|
94
|
+
const s: number = Math.max(0, settings.partialReveal.suffix);
|
|
95
|
+
// Ha a kulcs tul rovid az osszes reveal-osszeghez kepest, ne reveal-juk
|
|
96
|
+
// (kulonben az egesz secret elerhetonek osszetapadna).
|
|
97
|
+
if (matched.length <= p + s + 4) {
|
|
98
|
+
return `[redacted-${kind}]`;
|
|
99
|
+
}
|
|
100
|
+
if (p === 0 && s === 0) {
|
|
101
|
+
return `[redacted-${kind}]`;
|
|
102
|
+
}
|
|
103
|
+
const head: string = matched.slice(0, p);
|
|
104
|
+
const tail: string = matched.slice(matched.length - s);
|
|
105
|
+
return `${head}...${tail} [redacted-${kind}]`;
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
export const DyFM_SECRET_PATTERNS: SecretPattern_Interface[] = [
|
|
109
|
+
// URL-embedded basic auth — sajat replace-pattern megorzi a scheme-et + host-ot.
|
|
110
|
+
{
|
|
111
|
+
kind: 'url-cred',
|
|
112
|
+
regex: /\b(https?:\/\/)([^/\s:@]+):([^\s@]+)@/g,
|
|
113
|
+
redactWith: (_m: string): string => '$1[redacted-url-cred]@',
|
|
114
|
+
},
|
|
115
|
+
// GitHub PATs
|
|
116
|
+
{ kind: 'github-pat', regex: /\bgh[ps]_[A-Za-z0-9]{36,}\b/g },
|
|
117
|
+
{ kind: 'github-pat-fine', regex: /\bgithub_pat_[A-Za-z0-9_]{82,}\b/g },
|
|
118
|
+
{ kind: 'github-oauth', regex: /\bgho_[A-Za-z0-9]{36,}\b/g },
|
|
119
|
+
{ kind: 'github-refresh', regex: /\bghr_[A-Za-z0-9]{36,}\b/g },
|
|
120
|
+
// NPM token
|
|
121
|
+
{ kind: 'npm-token', regex: /\bnpm_[A-Za-z0-9]{36,}\b/g },
|
|
122
|
+
// Docker Hub PAT
|
|
123
|
+
{ kind: 'docker-pat', regex: /\bdckr_pat_[A-Za-z0-9_\-]{20,}\b/g },
|
|
124
|
+
// Slack token
|
|
125
|
+
{ kind: 'slack-token', regex: /\bxox[abprs]-[A-Za-z0-9-]{10,}\b/g },
|
|
126
|
+
// Anthropic key (BEFORE OpenAI — `sk-ant-*` more specific than `sk-*`)
|
|
127
|
+
{ kind: 'anthropic-key', regex: /\bsk-ant-[A-Za-z0-9\-_]{32,}\b/g },
|
|
128
|
+
// OpenAI / generic `sk-*` key
|
|
129
|
+
{ kind: 'openai-key', regex: /\bsk-[A-Za-z0-9]{32,}\b/g },
|
|
130
|
+
// Google API key
|
|
131
|
+
{ kind: 'google-api-key', regex: /\bAIza[0-9A-Za-z\-_]{35}\b/g },
|
|
132
|
+
// Discord webhook URL (id + token in URL)
|
|
133
|
+
{
|
|
134
|
+
kind: 'discord-webhook',
|
|
135
|
+
regex: /\bhttps?:\/\/(?:discord(?:app)?\.com|discordapp\.com)\/api\/webhooks\/\d+\/[A-Za-z0-9_\-]+/g,
|
|
136
|
+
redactWith: (_m: string): string => '[redacted-discord-webhook]',
|
|
137
|
+
},
|
|
138
|
+
// Bearer token in HTTP header style — megorizzuk a 'Bearer ' prefixet (literally), a token-t pedig reveal-eljuk.
|
|
139
|
+
{
|
|
140
|
+
kind: 'bearer-token',
|
|
141
|
+
regex: /\b(Bearer)\s+([A-Za-z0-9\-._~+/=]{20,})/gi,
|
|
142
|
+
redactWith: (matched: string, settings: DyFM_SecretMask_Settings_Interface): string => {
|
|
143
|
+
const tokenStart: number = matched.search(/\s+/);
|
|
144
|
+
const prefix: string = matched.slice(0, tokenStart + 1); // 'Bearer '
|
|
145
|
+
const token: string = matched.slice(tokenStart + 1);
|
|
146
|
+
return prefix + defaultRevealReplacement(token, 'token', settings);
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
// JWT (eyJ + .* + .*)
|
|
150
|
+
{ kind: 'jwt', regex: /\beyJ[A-Za-z0-9_\-]{10,}\.[A-Za-z0-9_\-]{10,}\.[A-Za-z0-9_\-]{10,}\b/g },
|
|
151
|
+
// AWS Access Key
|
|
152
|
+
{ kind: 'aws-access-key', regex: /\bAKIA[0-9A-Z]{16}\b/g },
|
|
153
|
+
// Env-style secret-name = value
|
|
154
|
+
{
|
|
155
|
+
kind: 'env-style-secret',
|
|
156
|
+
regex: /\b([A-Z][A-Z0-9_]*(?:TOKEN|SECRET|KEY|PASSWORD|PASSWD|PAT|HMAC|AUTH|PRIVATE)[A-Z0-9_]*)\s*[:=]\s*['"]?([^\s'"]+)['"]?/g,
|
|
157
|
+
redactWith: (matched: string, settings: DyFM_SecretMask_Settings_Interface): string => {
|
|
158
|
+
// Pull out the key name + value via re-match (avoids capturing groups in redactWith signature)
|
|
159
|
+
const m: RegExpMatchArray | null = matched.match(/\b([A-Z][A-Z0-9_]*(?:TOKEN|SECRET|KEY|PASSWORD|PASSWD|PAT|HMAC|AUTH|PRIVATE)[A-Z0-9_]*)\s*[:=]\s*['"]?([^\s'"]+)/);
|
|
160
|
+
if (!m) { return matched; }
|
|
161
|
+
const keyName: string = m[1];
|
|
162
|
+
const value: string = m[2];
|
|
163
|
+
const sep: string = matched.includes(': ') ? '=' : '=';
|
|
164
|
+
const revealed: string = defaultRevealReplacement(value, 'env-value', settings);
|
|
165
|
+
return `${keyName}${sep}${revealed}`;
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
];
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* `process.env`-bol kigyujti azokat a kulcsokat ahol a NEV titkos-jellegu
|
|
172
|
+
* ÉS a value >= minEnvValueLength. Visszaad egy listat — ezeket szovegben
|
|
173
|
+
* minden elofordulasban partial-reveal-el felulrak-juk.
|
|
174
|
+
*/
|
|
175
|
+
const collectEnvSecretValues = (
|
|
176
|
+
settings: DyFM_SecretMask_Settings_Interface,
|
|
177
|
+
): { value: string; key: string }[] => {
|
|
178
|
+
const out: { value: string; key: string }[] = [];
|
|
179
|
+
for (const [key, raw] of Object.entries(process.env)) {
|
|
180
|
+
if (!raw || raw.length < settings.minEnvValueLength) { continue; }
|
|
181
|
+
if (!settings.envNameSecretRx.test(key)) { continue; }
|
|
182
|
+
if (/^(true|false|0|1)$/i.test(raw)) { continue; }
|
|
183
|
+
out.push({ value: raw, key: key });
|
|
184
|
+
}
|
|
185
|
+
// Sort by value length DESC — hosszabb ertekekkel kezdjuk, igy egy rovid
|
|
186
|
+
// prefix nem sealeze el a hosszabb kornyezetet.
|
|
187
|
+
out.sort((a, b): number => b.value.length - a.value.length);
|
|
188
|
+
return out;
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* `DyFM_maskSecrets` — universal pre-Discord-send + pre-log-persist masking.
|
|
193
|
+
*
|
|
194
|
+
* @param text bemenet (ha nem string, JSON-szerializalaskor maskoljuk)
|
|
195
|
+
* @param settings konfiguracio (default a DyFM_DEFAULT_SECRET_MASK_SETTINGS)
|
|
196
|
+
* @returns maszkolt szoveg
|
|
197
|
+
*/
|
|
198
|
+
export function DyFM_maskSecrets(
|
|
199
|
+
text: unknown,
|
|
200
|
+
settings: DyFM_SecretMask_Settings_Interface = DyFM_DEFAULT_SECRET_MASK_SETTINGS,
|
|
201
|
+
): string {
|
|
202
|
+
if (text === null || text === undefined) { return ''; }
|
|
203
|
+
let str: string;
|
|
204
|
+
if (typeof text === 'string') {
|
|
205
|
+
str = text;
|
|
206
|
+
} else {
|
|
207
|
+
try { str = JSON.stringify(text); }
|
|
208
|
+
catch { str = String(text); }
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// 1. PATTERN-based maszkolas
|
|
212
|
+
for (const p of DyFM_SECRET_PATTERNS) {
|
|
213
|
+
str = str.replace(p.regex, (matched: string, ...groups: string[]): string => {
|
|
214
|
+
// Drop the `offset` + `wholeString` args at the end of `groups`
|
|
215
|
+
if (p.redactWith) {
|
|
216
|
+
return p.redactWith(matched, settings)
|
|
217
|
+
.replace(/\$1/g, groups[0] ?? '')
|
|
218
|
+
.replace(/\$2/g, groups[1] ?? '');
|
|
219
|
+
}
|
|
220
|
+
// Default: partial-reveal with kind
|
|
221
|
+
return defaultRevealReplacement(matched, p.kind, settings);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// 2. ENV-secret value-alapu overlay
|
|
226
|
+
const envSecrets: { value: string; key: string }[] = collectEnvSecretValues(settings);
|
|
227
|
+
for (const { value, key } of envSecrets) {
|
|
228
|
+
if (!str.includes(value)) { continue; }
|
|
229
|
+
const revealed: string = defaultRevealReplacement(value, `env-${key}`, settings);
|
|
230
|
+
str = str.split(value).join(revealed);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return str;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Recursive object-masker — JSON-szeru struktura minden string-ertekeben alkalmazza
|
|
238
|
+
* a DyFM_maskSecrets-t. Pl. errors-table additionalContent / logTail tomb / cdpReport
|
|
239
|
+
* objektum elotti masking-hez.
|
|
240
|
+
*/
|
|
241
|
+
export function DyFM_maskSecretsDeep<T = unknown>(
|
|
242
|
+
input: T,
|
|
243
|
+
settings: DyFM_SecretMask_Settings_Interface = DyFM_DEFAULT_SECRET_MASK_SETTINGS,
|
|
244
|
+
): T {
|
|
245
|
+
if (input === null || input === undefined) { return input; }
|
|
246
|
+
if (typeof input === 'string') {
|
|
247
|
+
return DyFM_maskSecrets(input, settings) as unknown as T;
|
|
248
|
+
}
|
|
249
|
+
if (typeof input !== 'object') { return input; }
|
|
250
|
+
if (Array.isArray(input)) {
|
|
251
|
+
return (input as unknown[]).map((it: unknown): unknown => DyFM_maskSecretsDeep(it, settings)) as unknown as T;
|
|
252
|
+
}
|
|
253
|
+
const out: Record<string, unknown> = {};
|
|
254
|
+
for (const [k, v] of Object.entries(input as Record<string, unknown>)) {
|
|
255
|
+
out[k] = DyFM_maskSecretsDeep(v, settings);
|
|
256
|
+
}
|
|
257
|
+
return out as unknown as T;
|
|
258
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -15,6 +15,7 @@ export * from './_collections/utils/extract-error-message.util';
|
|
|
15
15
|
export * from './_collections/utils/json-error-helper.util';
|
|
16
16
|
export * from './_collections/utils/log.util';
|
|
17
17
|
export * from './_collections/utils/round-list.util';
|
|
18
|
+
export * from './_collections/utils/secret-mask.util';
|
|
18
19
|
export * from './_collections/utils/object.util';
|
|
19
20
|
export * from './_collections/utils/require-env.util';
|
|
20
21
|
export * from './_collections/utils/stack.util';
|