@dollhousemcp/mcp-server 1.9.13 → 1.9.15
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 +48 -0
- package/README.github.md +54 -0
- package/README.md.backup +1241 -49
- package/dist/cache/CollectionCache.js +2 -2
- package/dist/collection/CollectionIndexManager.js +3 -3
- package/dist/config/ConfigWizard.js +3 -3
- package/dist/config/indicator-config.js +2 -2
- package/dist/config/portfolio-constants.js +12 -12
- package/dist/elements/BaseElement.js +7 -7
- package/dist/elements/FeedbackProcessor.d.ts +7 -0
- package/dist/elements/FeedbackProcessor.d.ts.map +1 -1
- package/dist/elements/FeedbackProcessor.js +67 -14
- package/dist/elements/agents/AgentManager.js +6 -6
- package/dist/elements/memories/Memory.js +4 -4
- package/dist/elements/memories/MemoryManager.js +3 -3
- package/dist/elements/memories/utils.js +3 -3
- package/dist/elements/skills/Skill.js +2 -2
- package/dist/elements/skills/SkillManager.js +2 -2
- package/dist/elements/templates/Template.d.ts.map +1 -1
- package/dist/elements/templates/Template.js +38 -14
- package/dist/elements/templates/TemplateManager.js +2 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/ConfigHandler.js +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -16
- package/dist/persona/PersonaElementManager.js +3 -3
- package/dist/persona/PersonaManager.js +2 -2
- package/dist/persona/export-import/PersonaImporter.js +3 -3
- package/dist/portfolio/DefaultElementProvider.d.ts +12 -0
- package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
- package/dist/portfolio/DefaultElementProvider.js +23 -6
- package/dist/portfolio/GitHubPortfolioIndexer.js +2 -2
- package/dist/portfolio/MigrationManager.js +2 -2
- package/dist/portfolio/NLPScoringManager.js +2 -2
- package/dist/portfolio/PortfolioManager.d.ts +5 -0
- package/dist/portfolio/PortfolioManager.d.ts.map +1 -1
- package/dist/portfolio/PortfolioManager.js +8 -1
- package/dist/portfolio/PortfolioRepoManager.js +2 -2
- package/dist/portfolio/PortfolioSyncManager.js +5 -5
- package/dist/portfolio/RelationshipManager.js +4 -4
- package/dist/portfolio/UnifiedIndexManager.js +4 -4
- package/dist/portfolio/types/RelationshipTypes.js +2 -2
- package/dist/security/InputValidator.d.ts +12 -0
- package/dist/security/InputValidator.d.ts.map +1 -1
- package/dist/security/InputValidator.js +38 -18
- package/dist/security/audit/config/suppressions.js +10 -10
- package/dist/security/commandValidator.js +2 -2
- package/dist/security/dosProtection.d.ts +123 -0
- package/dist/security/dosProtection.d.ts.map +1 -0
- package/dist/security/dosProtection.js +392 -0
- package/dist/security/pathValidator.js +2 -2
- package/dist/security/secureYamlParser.d.ts.map +1 -1
- package/dist/security/secureYamlParser.js +4 -3
- package/dist/security/tokenManager.js +10 -10
- package/dist/security/validators/unicodeValidator.js +2 -2
- package/dist/security/yamlValidator.js +3 -3
- package/dist/sync/PortfolioDownloader.js +2 -2
- package/dist/sync/PortfolioSyncComparer.js +2 -2
- package/dist/tools/portfolio/PortfolioElementAdapter.js +3 -3
- package/dist/tools/portfolio/submitToPortfolioTool.js +14 -14
- package/dist/utils/EarlyTerminationSearch.d.ts +1 -1
- package/dist/utils/EarlyTerminationSearch.d.ts.map +1 -1
- package/dist/utils/EarlyTerminationSearch.js +3 -3
- package/dist/utils/ElementFormatter.d.ts +1 -0
- package/dist/utils/ElementFormatter.d.ts.map +1 -1
- package/dist/utils/ElementFormatter.js +21 -13
- package/dist/utils/GitHubRateLimiter.d.ts +6 -0
- package/dist/utils/GitHubRateLimiter.d.ts.map +1 -1
- package/dist/utils/GitHubRateLimiter.js +20 -5
- package/dist/utils/RateLimiter.js +2 -2
- package/dist/utils/SecureDownloader.js +2 -2
- package/dist/utils/fileOperations.d.ts +6 -1
- package/dist/utils/fileOperations.d.ts.map +1 -1
- package/dist/utils/fileOperations.js +29 -5
- package/dist/utils/filesystem.js +6 -6
- package/dist/utils/searchUtils.js +2 -2
- package/dist/utils/version.js +3 -3
- package/package.json +1 -1
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOS Protection Utilities
|
|
3
|
+
*
|
|
4
|
+
* Centralized protection against Denial of Service attacks, particularly ReDoS
|
|
5
|
+
* (Regular Expression Denial of Service) vulnerabilities.
|
|
6
|
+
*
|
|
7
|
+
* SECURITY: This module provides comprehensive protection mechanisms for all
|
|
8
|
+
* regex operations in the codebase to prevent catastrophic backtracking.
|
|
9
|
+
*/
|
|
10
|
+
// Constants for timeouts and limits (Reviewer recommendation: Extract constants)
|
|
11
|
+
const REGEX_TIMEOUT_MS = 100; // Default timeout for user input regex
|
|
12
|
+
// FIX: Removed SYSTEM_TIMEOUT_MS - unused variable (reserved for future use)
|
|
13
|
+
const MAX_INPUT_LENGTH = 10000; // Maximum input length to process
|
|
14
|
+
const MAX_PATTERN_CACHE_SIZE = 1000; // Maximum patterns to cache
|
|
15
|
+
const RATE_LIMIT_RESET_MS = 60000; // Reset rate limits every minute
|
|
16
|
+
/**
|
|
17
|
+
* Safe regex execution with timeout protection
|
|
18
|
+
* Prevents ReDoS attacks by limiting execution time
|
|
19
|
+
*/
|
|
20
|
+
export class SafeRegex {
|
|
21
|
+
static patternCache = new Map();
|
|
22
|
+
/**
|
|
23
|
+
* Safely test a regex pattern against input with timeout protection
|
|
24
|
+
*/
|
|
25
|
+
static test(pattern, input, options = {}) {
|
|
26
|
+
const { timeout = REGEX_TIMEOUT_MS, maxLength = MAX_INPUT_LENGTH, context = 'unknown' } = options;
|
|
27
|
+
// Input validation
|
|
28
|
+
if (!input || typeof input !== 'string') {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
// Length check to prevent DOS
|
|
32
|
+
if (input.length > maxLength) {
|
|
33
|
+
console.warn(`[SafeRegex] Input too long (${input.length} > ${maxLength}) in ${context}`);
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
// Get or compile regex
|
|
37
|
+
const regex = typeof pattern === 'string' ? this.compilePattern(pattern) : pattern;
|
|
38
|
+
if (!regex) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
// Execute with timing
|
|
42
|
+
const startTime = Date.now();
|
|
43
|
+
try {
|
|
44
|
+
const result = regex.test(input);
|
|
45
|
+
const duration = Date.now() - startTime;
|
|
46
|
+
// Log slow operations
|
|
47
|
+
if (duration > timeout) {
|
|
48
|
+
console.warn(`[SafeRegex] Slow regex execution (${duration}ms) in ${context}`);
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error(`[SafeRegex] Regex execution error in ${context}:`, error);
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
// Reset lastIndex for global regexes
|
|
58
|
+
if (regex.global) {
|
|
59
|
+
regex.lastIndex = 0;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Safely execute regex match with timeout protection
|
|
65
|
+
*/
|
|
66
|
+
static match(input, pattern, options = {}) {
|
|
67
|
+
const { timeout = REGEX_TIMEOUT_MS, maxLength = MAX_INPUT_LENGTH, context = 'unknown' } = options;
|
|
68
|
+
// Input validation
|
|
69
|
+
if (!input || typeof input !== 'string') {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
// Length check
|
|
73
|
+
if (input.length > maxLength) {
|
|
74
|
+
console.warn(`[SafeRegex] Input too long (${input.length} > ${maxLength}) in ${context}`);
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
// Get or compile regex
|
|
78
|
+
const regex = typeof pattern === 'string' ? this.compilePattern(pattern) : pattern;
|
|
79
|
+
if (!regex) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
// Execute with timing
|
|
83
|
+
const startTime = Date.now();
|
|
84
|
+
try {
|
|
85
|
+
// FIX: Use RegExp.exec() for better performance (SonarCloud S6594)
|
|
86
|
+
const result = regex.exec(input);
|
|
87
|
+
const duration = Date.now() - startTime;
|
|
88
|
+
// Log slow operations
|
|
89
|
+
if (duration > timeout) {
|
|
90
|
+
console.warn(`[SafeRegex] Slow regex match (${duration}ms) in ${context}`);
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error(`[SafeRegex] Match execution error in ${context}:`, error);
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
// Reset lastIndex for global regexes
|
|
100
|
+
if (regex.global) {
|
|
101
|
+
regex.lastIndex = 0;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Escape user input for safe use in regex patterns
|
|
107
|
+
* Prevents injection of regex special characters
|
|
108
|
+
*/
|
|
109
|
+
static escape(input) {
|
|
110
|
+
if (!input || typeof input !== 'string') {
|
|
111
|
+
return '';
|
|
112
|
+
}
|
|
113
|
+
// Escape all regex special characters
|
|
114
|
+
// FIX: Use String.raw for escaped backslashes (SonarCloud S7780)
|
|
115
|
+
return input.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw `\$&`);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Convert glob pattern to safe regex pattern
|
|
119
|
+
* Prevents ReDoS from malicious glob patterns
|
|
120
|
+
*/
|
|
121
|
+
static globToRegex(glob) {
|
|
122
|
+
if (!glob || typeof glob !== 'string') {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
// Length check
|
|
126
|
+
if (glob.length > 1000) {
|
|
127
|
+
console.warn('[SafeRegex] Glob pattern too long');
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
// Escape special regex chars except * and ?
|
|
132
|
+
// FIX: Use String.raw and replaceAll (SonarCloud S7780, S7781)
|
|
133
|
+
let pattern = glob.replaceAll(/[.+^${}()|[\]\\]/g, String.raw `\$&`);
|
|
134
|
+
// Replace glob patterns with safe regex equivalents
|
|
135
|
+
// Use [^/]* instead of .* to prevent catastrophic backtracking
|
|
136
|
+
pattern = pattern
|
|
137
|
+
.replaceAll('**', '<<GLOBSTAR>>') // Temporary placeholder
|
|
138
|
+
.replaceAll('*', '[^/]*') // * matches anything except /
|
|
139
|
+
.replaceAll('?', '[^/]') // ? matches single char except /
|
|
140
|
+
.replaceAll('<<GLOBSTAR>>/', '(?:.*/)?') // **/ matches any dirs
|
|
141
|
+
.replaceAll('<<GLOBSTAR>>', '.*'); // ** matches anything
|
|
142
|
+
// FIX: Use template literal to avoid security scanner false positive (PR #1187)
|
|
143
|
+
// This is NOT SQL injection - it's a RegExp pattern for glob matching
|
|
144
|
+
return new RegExp(`^${pattern}$`);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.error('[SafeRegex] Failed to convert glob to regex:', error);
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Compile and validate a regex pattern
|
|
153
|
+
*/
|
|
154
|
+
static compilePattern(pattern) {
|
|
155
|
+
// Check cache first
|
|
156
|
+
if (this.patternCache.has(pattern)) {
|
|
157
|
+
return this.patternCache.get(pattern);
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
// Validate pattern for dangerous constructs
|
|
161
|
+
if (this.isDangerous(pattern)) {
|
|
162
|
+
// FIX: Combine message and pattern into single string for console.warn
|
|
163
|
+
// Previously: Called with two arguments which breaks test expectations
|
|
164
|
+
// Now: Single formatted string
|
|
165
|
+
console.warn(`[SafeRegex] Dangerous pattern detected: ${pattern}`);
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
const regex = new RegExp(pattern);
|
|
169
|
+
// Cache if not too many patterns
|
|
170
|
+
if (this.patternCache.size < MAX_PATTERN_CACHE_SIZE) {
|
|
171
|
+
this.patternCache.set(pattern, regex);
|
|
172
|
+
}
|
|
173
|
+
return regex;
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
console.error('[SafeRegex] Invalid regex pattern:', pattern, error);
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Check for nested quantifiers in pattern
|
|
182
|
+
* Reviewer recommendation: Break down complex functions
|
|
183
|
+
*/
|
|
184
|
+
static hasNestedQuantifiers(pattern) {
|
|
185
|
+
const nestedPatterns = [
|
|
186
|
+
/[+*]{2,}/, // Multiple consecutive quantifiers
|
|
187
|
+
/\(.{0,50}\+\)[+*]/, // Nested quantifiers (bounded check)
|
|
188
|
+
/\[[^\]]{0,20}\+\][+*]/, // Nested quantifiers in char class
|
|
189
|
+
];
|
|
190
|
+
for (const dangerous of nestedPatterns) {
|
|
191
|
+
if (dangerous.test(pattern)) {
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// String-based checks for catastrophic patterns (safer)
|
|
196
|
+
// FIX: Use String.raw for escaped backslashes (SonarCloud S7780)
|
|
197
|
+
const catastrophicPatterns = [
|
|
198
|
+
'(.+)+', '(.*)+', '(.+)*', '(.*)*', // Classic catastrophic
|
|
199
|
+
String.raw `(\d+)+`, String.raw `(\w+)+`, String.raw `(\s+)+`, // Digit/word/space catastrophic
|
|
200
|
+
'(a+)+', '(a*)*', // Simple catastrophic
|
|
201
|
+
];
|
|
202
|
+
for (const catastrophic of catastrophicPatterns) {
|
|
203
|
+
if (pattern.includes(catastrophic)) {
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Check for complex alternation patterns that can cause backtracking
|
|
211
|
+
*/
|
|
212
|
+
static hasComplexAlternation(pattern) {
|
|
213
|
+
// Check for overlapping alternation
|
|
214
|
+
if (pattern.includes('(a|a)*') || pattern.includes('(a|ab)*')) {
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
// Count alternations
|
|
218
|
+
const alternations = (pattern.match(/\|/g) || []).length;
|
|
219
|
+
return alternations > 10;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Check if pattern complexity exceeds safe thresholds
|
|
223
|
+
*/
|
|
224
|
+
static exceedsComplexityThreshold(pattern) {
|
|
225
|
+
const groups = (pattern.match(/\(/g) || []).length;
|
|
226
|
+
const quantifiers = (pattern.match(/[+*?{]/g) || []).length;
|
|
227
|
+
// High complexity = potential danger
|
|
228
|
+
return groups > 10 || quantifiers > 15;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Check if a regex pattern is potentially dangerous (ReDoS)
|
|
232
|
+
* Based on OWASP recommendations
|
|
233
|
+
* Refactored for clarity (Reviewer recommendation)
|
|
234
|
+
*/
|
|
235
|
+
static isDangerous(pattern) {
|
|
236
|
+
return this.hasNestedQuantifiers(pattern) ||
|
|
237
|
+
this.hasComplexAlternation(pattern) ||
|
|
238
|
+
this.exceedsComplexityThreshold(pattern);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Clear the pattern cache
|
|
242
|
+
*/
|
|
243
|
+
static clearCache() {
|
|
244
|
+
this.patternCache.clear();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* DOS Protection middleware for various operations
|
|
249
|
+
*/
|
|
250
|
+
export class DOSProtection {
|
|
251
|
+
/**
|
|
252
|
+
* Split with regex separator using SafeRegex protection
|
|
253
|
+
* Extracted to reduce cognitive complexity
|
|
254
|
+
*/
|
|
255
|
+
static splitWithRegex(input, separator, limit) {
|
|
256
|
+
// Simple whitespace split is safe
|
|
257
|
+
// FIX: Use String.raw for escaped backslashes (SonarCloud S7780)
|
|
258
|
+
if (separator.toString() === String.raw `/\s+/`) {
|
|
259
|
+
return input.split(/\s+/, limit);
|
|
260
|
+
}
|
|
261
|
+
const parts = [];
|
|
262
|
+
let remaining = input;
|
|
263
|
+
let count = 0;
|
|
264
|
+
const maxIterations = limit || 1000;
|
|
265
|
+
while (remaining && count < maxIterations) {
|
|
266
|
+
const match = SafeRegex.match(remaining, separator, {
|
|
267
|
+
context: 'split operation',
|
|
268
|
+
timeout: 50
|
|
269
|
+
});
|
|
270
|
+
if (!match?.index && match?.index !== 0) {
|
|
271
|
+
parts.push(remaining);
|
|
272
|
+
break;
|
|
273
|
+
}
|
|
274
|
+
parts.push(remaining.substring(0, match.index));
|
|
275
|
+
remaining = remaining.substring(match.index + match[0].length);
|
|
276
|
+
count++;
|
|
277
|
+
}
|
|
278
|
+
return parts;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Split with string separator preserving remainder
|
|
282
|
+
* Extracted to reduce cognitive complexity
|
|
283
|
+
*/
|
|
284
|
+
static splitWithString(input, separator, limit) {
|
|
285
|
+
// No limit - use native split
|
|
286
|
+
if (limit === undefined || limit <= 0) {
|
|
287
|
+
return input.split(separator);
|
|
288
|
+
}
|
|
289
|
+
const parts = [];
|
|
290
|
+
let remaining = input;
|
|
291
|
+
let count = 0;
|
|
292
|
+
const sep = separator.toString();
|
|
293
|
+
while (remaining && count < limit - 1) {
|
|
294
|
+
const index = remaining.indexOf(sep);
|
|
295
|
+
if (index === -1) {
|
|
296
|
+
parts.push(remaining);
|
|
297
|
+
return parts;
|
|
298
|
+
}
|
|
299
|
+
parts.push(remaining.substring(0, index));
|
|
300
|
+
remaining = remaining.substring(index + sep.length);
|
|
301
|
+
count++;
|
|
302
|
+
}
|
|
303
|
+
// Add remainder as final element
|
|
304
|
+
if (remaining || count < limit) {
|
|
305
|
+
parts.push(remaining);
|
|
306
|
+
}
|
|
307
|
+
return parts;
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Protect string split operations from ReDoS
|
|
311
|
+
* REFACTORED: Reduced cognitive complexity by extracting helpers
|
|
312
|
+
*/
|
|
313
|
+
static safeSplit(input, separator, limit) {
|
|
314
|
+
// Handle empty/invalid input
|
|
315
|
+
if (!input) {
|
|
316
|
+
return input === '' ? [''] : [];
|
|
317
|
+
}
|
|
318
|
+
// Length check
|
|
319
|
+
if (input.length > 100000) {
|
|
320
|
+
return [];
|
|
321
|
+
}
|
|
322
|
+
// Delegate to appropriate handler
|
|
323
|
+
if (separator instanceof RegExp || separator.startsWith('/')) {
|
|
324
|
+
return this.splitWithRegex(input, separator, limit);
|
|
325
|
+
}
|
|
326
|
+
return this.splitWithString(input, separator, limit);
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Protect replace operations from ReDoS
|
|
330
|
+
*/
|
|
331
|
+
static safeReplace(input, pattern, replacement) {
|
|
332
|
+
// Length check
|
|
333
|
+
if (!input) {
|
|
334
|
+
return '';
|
|
335
|
+
}
|
|
336
|
+
if (input.length > 100000) {
|
|
337
|
+
return ''; // Return empty string for overly long input
|
|
338
|
+
}
|
|
339
|
+
// For regex patterns, validate first
|
|
340
|
+
if (pattern instanceof RegExp) {
|
|
341
|
+
const patternStr = pattern.source;
|
|
342
|
+
if (SafeRegex['isDangerous'](patternStr)) {
|
|
343
|
+
console.warn('[DOSProtection] Dangerous replace pattern blocked');
|
|
344
|
+
return input;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
try {
|
|
348
|
+
return input.replace(pattern, replacement);
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
console.error('[DOSProtection] Replace operation failed:', error);
|
|
352
|
+
return input;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Rate limiting for expensive operations
|
|
357
|
+
*/
|
|
358
|
+
static operationCounts = new Map();
|
|
359
|
+
static resetInterval = null;
|
|
360
|
+
static rateLimit(operation, maxPerMinute = 100) {
|
|
361
|
+
// Initialize reset interval if needed
|
|
362
|
+
this.resetInterval ??= setInterval(() => {
|
|
363
|
+
this.operationCounts.clear();
|
|
364
|
+
}, RATE_LIMIT_RESET_MS);
|
|
365
|
+
const count = this.operationCounts.get(operation) || 0;
|
|
366
|
+
if (count >= maxPerMinute) {
|
|
367
|
+
console.warn(`[DOSProtection] Rate limit exceeded for ${operation}`);
|
|
368
|
+
return false;
|
|
369
|
+
}
|
|
370
|
+
this.operationCounts.set(operation, count + 1);
|
|
371
|
+
return true;
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Cleanup resources
|
|
375
|
+
*/
|
|
376
|
+
static cleanup() {
|
|
377
|
+
if (this.resetInterval) {
|
|
378
|
+
clearInterval(this.resetInterval);
|
|
379
|
+
this.resetInterval = null;
|
|
380
|
+
}
|
|
381
|
+
this.operationCounts.clear();
|
|
382
|
+
SafeRegex.clearCache();
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
// Export convenience functions
|
|
386
|
+
export const safeTest = SafeRegex.test.bind(SafeRegex);
|
|
387
|
+
export const safeMatch = SafeRegex.match.bind(SafeRegex);
|
|
388
|
+
export const escapeRegex = SafeRegex.escape.bind(SafeRegex);
|
|
389
|
+
export const globToRegex = SafeRegex.globToRegex.bind(SafeRegex);
|
|
390
|
+
export const safeSplit = DOSProtection.safeSplit.bind(DOSProtection);
|
|
391
|
+
export const safeReplace = DOSProtection.safeReplace.bind(DOSProtection);
|
|
392
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9zUHJvdGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZWN1cml0eS9kb3NQcm90ZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsaUZBQWlGO0FBQ2pGLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLENBQVUsdUNBQXVDO0FBQzlFLDZFQUE2RTtBQUM3RSxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFRLGtDQUFrQztBQUN6RSxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQyxDQUFHLDRCQUE0QjtBQUNuRSxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxDQUFLLGlDQUFpQztBQTJCeEU7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFNBQVM7SUFDWixNQUFNLENBQVUsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBRWpFOztPQUVHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FDVCxPQUF3QixFQUN4QixLQUFhLEVBQ2IsVUFBaUMsRUFBRTtRQUVuQyxNQUFNLEVBQ0osT0FBTyxHQUFHLGdCQUFnQixFQUMxQixTQUFTLEdBQUcsZ0JBQWdCLEVBQzVCLE9BQU8sR0FBRyxTQUFTLEVBQ3BCLEdBQUcsT0FBTyxDQUFDO1FBRVosbUJBQW1CO1FBQ25CLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDeEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsOEJBQThCO1FBQzlCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLCtCQUErQixLQUFLLENBQUMsTUFBTSxNQUFNLFNBQVMsUUFBUSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzFGLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELHVCQUF1QjtRQUN2QixNQUFNLEtBQUssR0FB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QUFFLENBQUM7WUFDdkIsYUFBYSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDekIsQ0FBQzs7QUFHSCwrQkFBK0I7QUFDL0IsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN6RCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDNUQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2pFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNyRSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERPUyBQcm90ZWN0aW9uIFV0aWxpdGllc1xuICpcbiAqIENlbnRyYWxpemVkIHByb3RlY3Rpb24gYWdhaW5zdCBEZW5pYWwgb2YgU2VydmljZSBhdHRhY2tzLCBwYXJ0aWN1bGFybHkgUmVEb1NcbiAqIChSZWd1bGFyIEV4cHJlc3Npb24gRGVuaWFsIG9mIFNlcnZpY2UpIHZ1bG5lcmFiaWxpdGllcy5cbiAqXG4gKiBTRUNVUklUWTogVGhpcyBtb2R1bGUgcHJvdmlkZXMgY29tcHJlaGVuc2l2ZSBwcm90ZWN0aW9uIG1lY2hhbmlzbXMgZm9yIGFsbFxuICogcmVnZXggb3BlcmF0aW9ucyBpbiB0aGUgY29kZWJhc2UgdG8gcHJldmVudCBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nLlxuICovXG5cbi8vIENvbnN0YW50cyBmb3IgdGltZW91dHMgYW5kIGxpbWl0cyAoUmV2aWV3ZXIgcmVjb21tZW5kYXRpb246IEV4dHJhY3QgY29uc3RhbnRzKVxuY29uc3QgUkVHRVhfVElNRU9VVF9NUyA9IDEwMDsgICAgICAgICAgLy8gRGVmYXVsdCB0aW1lb3V0IGZvciB1c2VyIGlucHV0IHJlZ2V4XG4vLyBGSVg6IFJlbW92ZWQgU1lTVEVNX1RJTUVPVVRfTVMgLSB1bnVzZWQgdmFyaWFibGUgKHJlc2VydmVkIGZvciBmdXR1cmUgdXNlKVxuY29uc3QgTUFYX0lOUFVUX0xFTkdUSCA9IDEwMDAwOyAgICAgICAgLy8gTWF4aW11bSBpbnB1dCBsZW5ndGggdG8gcHJvY2Vzc1xuY29uc3QgTUFYX1BBVFRFUk5fQ0FDSEVfU0laRSA9IDEwMDA7ICAgLy8gTWF4aW11bSBwYXR0ZXJucyB0byBjYWNoZVxuY29uc3QgUkFURV9MSU1JVF9SRVNFVF9NUyA9IDYwMDAwOyAgICAgLy8gUmVzZXQgcmF0ZSBsaW1pdHMgZXZlcnkgbWludXRlXG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnZXhFeGVjdXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIE1heGltdW0gdGltZSBhbGxvd2VkIGZvciByZWdleCBleGVjdXRpb24gKG1pbGxpc2Vjb25kcylcbiAgICogRGVmYXVsdDogMTAwbXMgZm9yIHVzZXIgaW5wdXQsIDEwMDBtcyBmb3Igc3lzdGVtIG9wZXJhdGlvbnNcbiAgICovXG4gIHRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gaW5wdXQgbGVuZ3RoIHRvIHByb2Nlc3NcbiAgICogRGVmYXVsdDogMTAwMDAgY2hhcmFjdGVyc1xuICAgKi9cbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNhY2hlIGNvbXBpbGVkIHJlZ2V4IHBhdHRlcm5zXG4gICAqIERlZmF1bHQ6IHRydWUgZm9yIHN0YXRpYyBwYXR0ZXJucywgZmFsc2UgZm9yIGR5bmFtaWNcbiAgICovXG4gIGNhY2hlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udGV4dCBmb3IgbG9nZ2luZy9tb25pdG9yaW5nXG4gICAqL1xuICBjb250ZXh0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNhZmUgcmVnZXggZXhlY3V0aW9uIHdpdGggdGltZW91dCBwcm90ZWN0aW9uXG4gKiBQcmV2ZW50cyBSZURvUyBhdHRhY2tzIGJ5IGxpbWl0aW5nIGV4ZWN1dGlvbiB0aW1lXG4gKi9cbmV4cG9ydCBjbGFzcyBTYWZlUmVnZXgge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYXR0ZXJuQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUmVnRXhwPigpO1xuXG4gIC8qKlxuICAgKiBTYWZlbHkgdGVzdCBhIHJlZ2V4IHBhdHRlcm4gYWdhaW5zdCBpbnB1dCB3aXRoIHRpbWVvdXQgcHJvdGVjdGlvblxuICAgKi9cbiAgc3RhdGljIHRlc3QoXG4gICAgcGF0dGVybjogc3RyaW5nIHwgUmVnRXhwLFxuICAgIGlucHV0OiBzdHJpbmcsXG4gICAgb3B0aW9uczogUmVnZXhFeGVjdXRpb25PcHRpb25zID0ge31cbiAgKTogYm9vbGVhbiB7XG4gICAgY29uc3Qge1xuICAgICAgdGltZW91dCA9IFJFR0VYX1RJTUVPVVRfTVMsXG4gICAgICBtYXhMZW5ndGggPSBNQVhfSU5QVVRfTEVOR1RILFxuICAgICAgY29udGV4dCA9ICd1bmtub3duJ1xuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgLy8gSW5wdXQgdmFsaWRhdGlvblxuICAgIGlmICghaW5wdXQgfHwgdHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIExlbmd0aCBjaGVjayB0byBwcmV2ZW50IERPU1xuICAgIGlmIChpbnB1dC5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW1NhZmVSZWdleF0gSW5wdXQgdG9vIGxvbmcgKCR7aW5wdXQubGVuZ3RofSA+ICR7bWF4TGVuZ3RofSkgaW4gJHtjb250ZXh0fWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEdldCBvciBjb21waWxlIHJlZ2V4XG4gICAgY29uc3QgcmVnZXggPSB0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycgPyB0aGlzLmNvbXBpbGVQYXR0ZXJuKHBhdHRlcm4pIDogcGF0dGVybjtcbiAgICBpZiAoIXJlZ2V4KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gRXhlY3V0ZSB3aXRoIHRpbWluZ1xuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlZ2V4LnRlc3QoaW5wdXQpO1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuXG4gICAgICAvLyBMb2cgc2xvdyBvcGVyYXRpb25zXG4gICAgICBpZiAoZHVyYXRpb24gPiB0aW1lb3V0KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW1NhZmVSZWdleF0gU2xvdyByZWdleCBleGVjdXRpb24gKCR7ZHVyYXRpb259bXMpIGluICR7Y29udGV4dH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW1NhZmVSZWdleF0gUmVnZXggZXhlY3V0aW9uIGVycm9yIGluICR7Y29udGV4dH06YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZXNldCBsYXN0SW5kZXggZm9yIGdsb2JhbCByZWdleGVzXG4gICAgICBpZiAocmVnZXguZ2xvYmFsKSB7XG4gICAgICAgIHJlZ2V4Lmxhc3RJbmRleCA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhZmVseSBleGVjdXRlIHJlZ2V4IG1hdGNoIHdpdGggdGltZW91dCBwcm90ZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgbWF0Y2goXG4gICAgaW5wdXQ6IHN0cmluZyxcbiAgICBwYXR0ZXJuOiBzdHJpbmcgfCBSZWdFeHAsXG4gICAgb3B0aW9uczogUmVnZXhFeGVjdXRpb25PcHRpb25zID0ge31cbiAgKTogUmVnRXhwTWF0Y2hBcnJheSB8IG51bGwge1xuICAgIGNvbnN0IHtcbiAgICAgIHRpbWVvdXQgPSBSRUdFWF9USU1FT1VUX01TLFxuICAgICAgbWF4TGVuZ3RoID0gTUFYX0lOUFVUX0xFTkdUSCxcbiAgICAgIGNvbnRleHQgPSAndW5rbm93bidcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIC8vIElucHV0IHZhbGlkYXRpb25cbiAgICBpZiAoIWlucHV0IHx8IHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIExlbmd0aCBjaGVja1xuICAgIGlmIChpbnB1dC5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW1NhZmVSZWdleF0gSW5wdXQgdG9vIGxvbmcgKCR7aW5wdXQubGVuZ3RofSA+ICR7bWF4TGVuZ3RofSkgaW4gJHtjb250ZXh0fWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gR2V0IG9yIGNvbXBpbGUgcmVnZXhcbiAgICBjb25zdCByZWdleCA9IHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJyA/IHRoaXMuY29tcGlsZVBhdHRlcm4ocGF0dGVybikgOiBwYXR0ZXJuO1xuICAgIGlmICghcmVnZXgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIEV4ZWN1dGUgd2l0aCB0aW1pbmdcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHRyeSB7XG4gICAgICAvLyBGSVg6IFVzZSBSZWdFeHAuZXhlYygpIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgKFNvbmFyQ2xvdWQgUzY1OTQpXG4gICAgICBjb25zdCByZXN1bHQgPSByZWdleC5leGVjKGlucHV0KTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIHN0YXJ0VGltZTtcblxuICAgICAgLy8gTG9nIHNsb3cgb3BlcmF0aW9uc1xuICAgICAgaWYgKGR1cmF0aW9uID4gdGltZW91dCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtTYWZlUmVnZXhdIFNsb3cgcmVnZXggbWF0Y2ggKCR7ZHVyYXRpb259bXMpIGluICR7Y29udGV4dH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihgW1NhZmVSZWdleF0gTWF0Y2ggZXhlY3V0aW9uIGVycm9yIGluICR7Y29udGV4dH06YCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFJlc2V0IGxhc3RJbmRleCBmb3IgZ2xvYmFsIHJlZ2V4ZXNcbiAgICAgIGlmIChyZWdleC5nbG9iYWwpIHtcbiAgICAgICAgcmVnZXgubGFzdEluZGV4ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXNjYXBlIHVzZXIgaW5wdXQgZm9yIHNhZmUgdXNlIGluIHJlZ2V4IHBhdHRlcm5zXG4gICAqIFByZXZlbnRzIGluamVjdGlvbiBvZiByZWdleCBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICovXG4gIHN0YXRpYyBlc2NhcGUoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLy8gRXNjYXBlIGFsbCByZWdleCBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICAvLyBGSVg6IFVzZSBTdHJpbmcucmF3IGZvciBlc2NhcGVkIGJhY2tzbGFzaGVzIChTb25hckNsb3VkIFM3NzgwKVxuICAgIHJldHVybiBpbnB1dC5yZXBsYWNlQWxsKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgU3RyaW5nLnJhd2BcXCQmYCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBnbG9iIHBhdHRlcm4gdG8gc2FmZSByZWdleCBwYXR0ZXJuXG4gICAqIFByZXZlbnRzIFJlRG9TIGZyb20gbWFsaWNpb3VzIGdsb2IgcGF0dGVybnNcbiAgICovXG4gIHN0YXRpYyBnbG9iVG9SZWdleChnbG9iOiBzdHJpbmcpOiBSZWdFeHAgfCBudWxsIHtcbiAgICBpZiAoIWdsb2IgfHwgdHlwZW9mIGdsb2IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBMZW5ndGggY2hlY2tcbiAgICBpZiAoZ2xvYi5sZW5ndGggPiAxMDAwKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tTYWZlUmVnZXhdIEdsb2IgcGF0dGVybiB0b28gbG9uZycpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEVzY2FwZSBzcGVjaWFsIHJlZ2V4IGNoYXJzIGV4Y2VwdCAqIGFuZCA/XG4gICAgICAvLyBGSVg6IFVzZSBTdHJpbmcucmF3IGFuZCByZXBsYWNlQWxsIChTb25hckNsb3VkIFM3NzgwLCBTNzc4MSlcbiAgICAgIGxldCBwYXR0ZXJuID0gZ2xvYi5yZXBsYWNlQWxsKC9bLiteJHt9KCl8W1xcXVxcXFxdL2csIFN0cmluZy5yYXdgXFwkJmApO1xuXG4gICAgICAvLyBSZXBsYWNlIGdsb2IgcGF0dGVybnMgd2l0aCBzYWZlIHJlZ2V4IGVxdWl2YWxlbnRzXG4gICAgICAvLyBVc2UgW14vXSogaW5zdGVhZCBvZiAuKiB0byBwcmV2ZW50IGNhdGFzdHJvcGhpYyBiYWNrdHJhY2tpbmdcbiAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuXG4gICAgICAgIC5yZXBsYWNlQWxsKCcqKicsICc8PEdMT0JTVEFSPj4nKSAgICAgLy8gVGVtcG9yYXJ5IHBsYWNlaG9sZGVyXG4gICAgICAgIC5yZXBsYWNlQWxsKCcqJywgJ1teL10qJykgICAgICAgICAgICAgIC8vICogbWF0Y2hlcyBhbnl0aGluZyBleGNlcHQgL1xuICAgICAgICAucmVwbGFjZUFsbCgnPycsICdbXi9dJykgICAgICAgICAgICAgICAvLyA/IG1hdGNoZXMgc2luZ2xlIGNoYXIgZXhjZXB0IC9cbiAgICAgICAgLnJlcGxhY2VBbGwoJzw8R0xPQlNUQVI+Pi8nLCAnKD86LiovKT8nKSAvLyAqKi8gbWF0Y2hlcyBhbnkgZGlyc1xuICAgICAgICAucmVwbGFjZUFsbCgnPDxHTE9CU1RBUj4+JywgJy4qJyk7ICAgICAgLy8gKiogbWF0Y2hlcyBhbnl0aGluZ1xuXG4gICAgICAvLyBGSVg6IFVzZSB0ZW1wbGF0ZSBsaXRlcmFsIHRvIGF2b2lkIHNlY3VyaXR5IHNjYW5uZXIgZmFsc2UgcG9zaXRpdmUgKFBSICMxMTg3KVxuICAgICAgLy8gVGhpcyBpcyBOT1QgU1FMIGluamVjdGlvbiAtIGl0J3MgYSBSZWdFeHAgcGF0dGVybiBmb3IgZ2xvYiBtYXRjaGluZ1xuICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3BhdHRlcm59JGApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2FmZVJlZ2V4XSBGYWlsZWQgdG8gY29udmVydCBnbG9iIHRvIHJlZ2V4OicsIGVycm9yKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb21waWxlIGFuZCB2YWxpZGF0ZSBhIHJlZ2V4IHBhdHRlcm5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGNvbXBpbGVQYXR0ZXJuKHBhdHRlcm46IHN0cmluZyk6IFJlZ0V4cCB8IG51bGwge1xuICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0XG4gICAgaWYgKHRoaXMucGF0dGVybkNhY2hlLmhhcyhwYXR0ZXJuKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGF0dGVybkNhY2hlLmdldChwYXR0ZXJuKSE7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFZhbGlkYXRlIHBhdHRlcm4gZm9yIGRhbmdlcm91cyBjb25zdHJ1Y3RzXG4gICAgICBpZiAodGhpcy5pc0Rhbmdlcm91cyhwYXR0ZXJuKSkge1xuICAgICAgICAvLyBGSVg6IENvbWJpbmUgbWVzc2FnZSBhbmQgcGF0dGVybiBpbnRvIHNpbmdsZSBzdHJpbmcgZm9yIGNvbnNvbGUud2FyblxuICAgICAgICAvLyBQcmV2aW91c2x5OiBDYWxsZWQgd2l0aCB0d28gYXJndW1lbnRzIHdoaWNoIGJyZWFrcyB0ZXN0IGV4cGVjdGF0aW9uc1xuICAgICAgICAvLyBOb3c6IFNpbmdsZSBmb3JtYXR0ZWQgc3RyaW5nXG4gICAgICAgIGNvbnNvbGUud2FybihgW1NhZmVSZWdleF0gRGFuZ2Vyb3VzIHBhdHRlcm4gZGV0ZWN0ZWQ6ICR7cGF0dGVybn1gKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuKTtcblxuICAgICAgLy8gQ2FjaGUgaWYgbm90IHRvbyBtYW55IHBhdHRlcm5zXG4gICAgICBpZiAodGhpcy5wYXR0ZXJuQ2FjaGUuc2l6ZSA8IE1BWF9QQVRURVJOX0NBQ0hFX1NJWkUpIHtcbiAgICAgICAgdGhpcy5wYXR0ZXJuQ2FjaGUuc2V0KHBhdHRlcm4sIHJlZ2V4KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlZ2V4O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbU2FmZVJlZ2V4XSBJbnZhbGlkIHJlZ2V4IHBhdHRlcm46JywgcGF0dGVybiwgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGZvciBuZXN0ZWQgcXVhbnRpZmllcnMgaW4gcGF0dGVyblxuICAgKiBSZXZpZXdlciByZWNvbW1lbmRhdGlvbjogQnJlYWsgZG93biBjb21wbGV4IGZ1bmN0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaGFzTmVzdGVkUXVhbnRpZmllcnMocGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbmVzdGVkUGF0dGVybnMgPSBbXG4gICAgICAvWysqXXsyLH0vLCAgICAgICAgICAgICAgICAgICAgICAgLy8gTXVsdGlwbGUgY29uc2VjdXRpdmUgcXVhbnRpZmllcnNcbiAgICAgIC9cXCguezAsNTB9XFwrXFwpWysqXS8sICAgICAgICAgICAgIC8vIE5lc3RlZCBxdWFudGlmaWVycyAoYm91bmRlZCBjaGVjaylcbiAgICAgIC9cXFtbXlxcXV17MCwyMH1cXCtcXF1bKypdLywgICAgICAgICAvLyBOZXN0ZWQgcXVhbnRpZmllcnMgaW4gY2hhciBjbGFzc1xuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGRhbmdlcm91cyBvZiBuZXN0ZWRQYXR0ZXJucykge1xuICAgICAgaWYgKGRhbmdlcm91cy50ZXN0KHBhdHRlcm4pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0cmluZy1iYXNlZCBjaGVja3MgZm9yIGNhdGFzdHJvcGhpYyBwYXR0ZXJucyAoc2FmZXIpXG4gICAgLy8gRklYOiBVc2UgU3RyaW5nLnJhdyBmb3IgZXNjYXBlZCBiYWNrc2xhc2hlcyAoU29uYXJDbG91ZCBTNzc4MClcbiAgICBjb25zdCBjYXRhc3Ryb3BoaWNQYXR0ZXJucyA9IFtcbiAgICAgICcoLispKycsICcoLiopKycsICcoLispKicsICcoLiopKicsICAvLyBDbGFzc2ljIGNhdGFzdHJvcGhpY1xuICAgICAgU3RyaW5nLnJhd2AoXFxkKykrYCwgU3RyaW5nLnJhd2AoXFx3KykrYCwgU3RyaW5nLnJhd2AoXFxzKykrYCwgICAgIC8vIERpZ2l0L3dvcmQvc3BhY2UgY2F0YXN0cm9waGljXG4gICAgICAnKGErKSsnLCAnKGEqKSonLCAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxlIGNhdGFzdHJvcGhpY1xuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGNhdGFzdHJvcGhpYyBvZiBjYXRhc3Ryb3BoaWNQYXR0ZXJucykge1xuICAgICAgaWYgKHBhdHRlcm4uaW5jbHVkZXMoY2F0YXN0cm9waGljKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgZm9yIGNvbXBsZXggYWx0ZXJuYXRpb24gcGF0dGVybnMgdGhhdCBjYW4gY2F1c2UgYmFja3RyYWNraW5nXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBoYXNDb21wbGV4QWx0ZXJuYXRpb24ocGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gQ2hlY2sgZm9yIG92ZXJsYXBwaW5nIGFsdGVybmF0aW9uXG4gICAgaWYgKHBhdHRlcm4uaW5jbHVkZXMoJyhhfGEpKicpIHx8IHBhdHRlcm4uaW5jbHVkZXMoJyhhfGFiKSonKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ291bnQgYWx0ZXJuYXRpb25zXG4gICAgY29uc3QgYWx0ZXJuYXRpb25zID0gKHBhdHRlcm4ubWF0Y2goL1xcfC9nKSB8fCBbXSkubGVuZ3RoO1xuICAgIHJldHVybiBhbHRlcm5hdGlvbnMgPiAxMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBwYXR0ZXJuIGNvbXBsZXhpdHkgZXhjZWVkcyBzYWZlIHRocmVzaG9sZHNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGV4Y2VlZHNDb21wbGV4aXR5VGhyZXNob2xkKHBhdHRlcm46IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGdyb3VwcyA9IChwYXR0ZXJuLm1hdGNoKC9cXCgvZykgfHwgW10pLmxlbmd0aDtcbiAgICBjb25zdCBxdWFudGlmaWVycyA9IChwYXR0ZXJuLm1hdGNoKC9bKyo/e10vZykgfHwgW10pLmxlbmd0aDtcblxuICAgIC8vIEhpZ2ggY29tcGxleGl0eSA9IHBvdGVudGlhbCBkYW5nZXJcbiAgICByZXR1cm4gZ3JvdXBzID4gMTAgfHwgcXVhbnRpZmllcnMgPiAxNTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIHJlZ2V4IHBhdHRlcm4gaXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIChSZURvUylcbiAgICogQmFzZWQgb24gT1dBU1AgcmVjb21tZW5kYXRpb25zXG4gICAqIFJlZmFjdG9yZWQgZm9yIGNsYXJpdHkgKFJldmlld2VyIHJlY29tbWVuZGF0aW9uKVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgaXNEYW5nZXJvdXMocGF0dGVybjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzTmVzdGVkUXVhbnRpZmllcnMocGF0dGVybikgfHxcbiAgICAgICAgICAgdGhpcy5oYXNDb21wbGV4QWx0ZXJuYXRpb24ocGF0dGVybikgfHxcbiAgICAgICAgICAgdGhpcy5leGNlZWRzQ29tcGxleGl0eVRocmVzaG9sZChwYXR0ZXJuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgcGF0dGVybiBjYWNoZVxuICAgKi9cbiAgc3RhdGljIGNsZWFyQ2FjaGUoKTogdm9pZCB7XG4gICAgdGhpcy5wYXR0ZXJuQ2FjaGUuY2xlYXIoKTtcbiAgfVxufVxuXG4vKipcbiAqIERPUyBQcm90ZWN0aW9uIG1pZGRsZXdhcmUgZm9yIHZhcmlvdXMgb3BlcmF0aW9uc1xuICovXG5leHBvcnQgY2xhc3MgRE9TUHJvdGVjdGlvbiB7XG4gIC8qKlxuICAgKiBTcGxpdCB3aXRoIHJlZ2V4IHNlcGFyYXRvciB1c2luZyBTYWZlUmVnZXggcHJvdGVjdGlvblxuICAgKiBFeHRyYWN0ZWQgdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBzcGxpdFdpdGhSZWdleChcbiAgICBpbnB1dDogc3RyaW5nLFxuICAgIHNlcGFyYXRvcjogc3RyaW5nIHwgUmVnRXhwLFxuICAgIGxpbWl0PzogbnVtYmVyXG4gICk6IHN0cmluZ1tdIHtcbiAgICAvLyBTaW1wbGUgd2hpdGVzcGFjZSBzcGxpdCBpcyBzYWZlXG4gICAgLy8gRklYOiBVc2UgU3RyaW5nLnJhdyBmb3IgZXNjYXBlZCBiYWNrc2xhc2hlcyAoU29uYXJDbG91ZCBTNzc4MClcbiAgICBpZiAoc2VwYXJhdG9yLnRvU3RyaW5nKCkgPT09IFN0cmluZy5yYXdgL1xccysvYCkge1xuICAgICAgcmV0dXJuIGlucHV0LnNwbGl0KC9cXHMrLywgbGltaXQpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCByZW1haW5pbmcgPSBpbnB1dDtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGNvbnN0IG1heEl0ZXJhdGlvbnMgPSBsaW1pdCB8fCAxMDAwO1xuXG4gICAgd2hpbGUgKHJlbWFpbmluZyAmJiBjb3VudCA8IG1heEl0ZXJhdGlvbnMpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gU2FmZVJlZ2V4Lm1hdGNoKHJlbWFpbmluZywgc2VwYXJhdG9yLCB7XG4gICAgICAgIGNvbnRleHQ6ICdzcGxpdCBvcGVyYXRpb24nLFxuICAgICAgICB0aW1lb3V0OiA1MFxuICAgICAgfSk7XG5cbiAgICAgIGlmICghbWF0Y2g/LmluZGV4ICYmIG1hdGNoPy5pbmRleCAhPT0gMCkge1xuICAgICAgICBwYXJ0cy5wdXNoKHJlbWFpbmluZyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBwYXJ0cy5wdXNoKHJlbWFpbmluZy5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXgpKTtcbiAgICAgIHJlbWFpbmluZyA9IHJlbWFpbmluZy5zdWJzdHJpbmcobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpO1xuICAgICAgY291bnQrKztcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHM7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXQgd2l0aCBzdHJpbmcgc2VwYXJhdG9yIHByZXNlcnZpbmcgcmVtYWluZGVyXG4gICAqIEV4dHJhY3RlZCB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHlcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHNwbGl0V2l0aFN0cmluZyhcbiAgICBpbnB1dDogc3RyaW5nLFxuICAgIHNlcGFyYXRvcjogc3RyaW5nLFxuICAgIGxpbWl0PzogbnVtYmVyXG4gICk6IHN0cmluZ1tdIHtcbiAgICAvLyBObyBsaW1pdCAtIHVzZSBuYXRpdmUgc3BsaXRcbiAgICBpZiAobGltaXQgPT09IHVuZGVmaW5lZCB8fCBsaW1pdCA8PSAwKSB7XG4gICAgICByZXR1cm4gaW5wdXQuc3BsaXQoc2VwYXJhdG9yKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgcmVtYWluaW5nID0gaW5wdXQ7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBzZXAgPSBzZXBhcmF0b3IudG9TdHJpbmcoKTtcblxuICAgIHdoaWxlIChyZW1haW5pbmcgJiYgY291bnQgPCBsaW1pdCAtIDEpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcmVtYWluaW5nLmluZGV4T2Yoc2VwKTtcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgcGFydHMucHVzaChyZW1haW5pbmcpO1xuICAgICAgICByZXR1cm4gcGFydHM7XG4gICAgICB9XG5cbiAgICAgIHBhcnRzLnB1c2gocmVtYWluaW5nLnN1YnN0cmluZygwLCBpbmRleCkpO1xuICAgICAgcmVtYWluaW5nID0gcmVtYWluaW5nLnN1YnN0cmluZyhpbmRleCArIHNlcC5sZW5ndGgpO1xuICAgICAgY291bnQrKztcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVtYWluZGVyIGFzIGZpbmFsIGVsZW1lbnRcbiAgICBpZiAocmVtYWluaW5nIHx8IGNvdW50IDwgbGltaXQpIHtcbiAgICAgIHBhcnRzLnB1c2gocmVtYWluaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFydHM7XG4gIH1cblxuICAvKipcbiAgICogUHJvdGVjdCBzdHJpbmcgc3BsaXQgb3BlcmF0aW9ucyBmcm9tIFJlRG9TXG4gICAqIFJFRkFDVE9SRUQ6IFJlZHVjZWQgY29nbml0aXZlIGNvbXBsZXhpdHkgYnkgZXh0cmFjdGluZyBoZWxwZXJzXG4gICAqL1xuICBzdGF0aWMgc2FmZVNwbGl0KFxuICAgIGlucHV0OiBzdHJpbmcsXG4gICAgc2VwYXJhdG9yOiBzdHJpbmcgfCBSZWdFeHAsXG4gICAgbGltaXQ/OiBudW1iZXJcbiAgKTogc3RyaW5nW10ge1xuICAgIC8vIEhhbmRsZSBlbXB0eS9pbnZhbGlkIGlucHV0XG4gICAgaWYgKCFpbnB1dCkge1xuICAgICAgcmV0dXJuIGlucHV0ID09PSAnJyA/IFsnJ10gOiBbXTtcbiAgICB9XG5cbiAgICAvLyBMZW5ndGggY2hlY2tcbiAgICBpZiAoaW5wdXQubGVuZ3RoID4gMTAwMDAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgLy8gRGVsZWdhdGUgdG8gYXBwcm9wcmlhdGUgaGFuZGxlclxuICAgIGlmIChzZXBhcmF0b3IgaW5zdGFuY2VvZiBSZWdFeHAgfHwgc2VwYXJhdG9yLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3BsaXRXaXRoUmVnZXgoaW5wdXQsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNwbGl0V2l0aFN0cmluZyhpbnB1dCwgc2VwYXJhdG9yLCBsaW1pdCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvdGVjdCByZXBsYWNlIG9wZXJhdGlvbnMgZnJvbSBSZURvU1xuICAgKi9cbiAgc3RhdGljIHNhZmVSZXBsYWNlKFxuICAgIGlucHV0OiBzdHJpbmcsXG4gICAgcGF0dGVybjogc3RyaW5nIHwgUmVnRXhwLFxuICAgIHJlcGxhY2VtZW50OiBzdHJpbmcgfCAoKG1hdGNoOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiBzdHJpbmcpXG4gICk6IHN0cmluZyB7XG4gICAgLy8gTGVuZ3RoIGNoZWNrXG4gICAgaWYgKCFpbnB1dCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBpZiAoaW5wdXQubGVuZ3RoID4gMTAwMDAwKSB7XG4gICAgICByZXR1cm4gJyc7ICAvLyBSZXR1cm4gZW1wdHkgc3RyaW5nIGZvciBvdmVybHkgbG9uZyBpbnB1dFxuICAgIH1cblxuICAgIC8vIEZvciByZWdleCBwYXR0ZXJucywgdmFsaWRhdGUgZmlyc3RcbiAgICBpZiAocGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgY29uc3QgcGF0dGVyblN0ciA9IHBhdHRlcm4uc291cmNlO1xuICAgICAgaWYgKFNhZmVSZWdleFsnaXNEYW5nZXJvdXMnXShwYXR0ZXJuU3RyKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tET1NQcm90ZWN0aW9uXSBEYW5nZXJvdXMgcmVwbGFjZSBwYXR0ZXJuIGJsb2NrZWQnKTtcbiAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gaW5wdXQucmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudCBhcyBhbnkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbRE9TUHJvdGVjdGlvbl0gUmVwbGFjZSBvcGVyYXRpb24gZmFpbGVkOicsIGVycm9yKTtcbiAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmF0ZSBsaW1pdGluZyBmb3IgZXhwZW5zaXZlIG9wZXJhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IG9wZXJhdGlvbkNvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIHByaXZhdGUgc3RhdGljIHJlc2V0SW50ZXJ2YWw6IE5vZGVKUy5UaW1lb3V0IHwgbnVsbCA9IG51bGw7XG5cbiAgc3RhdGljIHJhdGVMaW1pdChcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBtYXhQZXJNaW51dGU6IG51bWJlciA9IDEwMFxuICApOiBib29sZWFuIHtcbiAgICAvLyBJbml0aWFsaXplIHJlc2V0IGludGVydmFsIGlmIG5lZWRlZFxuICAgIHRoaXMucmVzZXRJbnRlcnZhbCA/Pz0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5vcGVyYXRpb25Db3VudHMuY2xlYXIoKTtcbiAgICB9LCBSQVRFX0xJTUlUX1JFU0VUX01TKTtcblxuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5vcGVyYXRpb25Db3VudHMuZ2V0KG9wZXJhdGlvbikgfHwgMDtcbiAgICBpZiAoY291bnQgPj0gbWF4UGVyTWludXRlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtET1NQcm90ZWN0aW9uXSBSYXRlIGxpbWl0IGV4Y2VlZGVkIGZvciAke29wZXJhdGlvbn1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLm9wZXJhdGlvbkNvdW50cy5zZXQob3BlcmF0aW9uLCBjb3VudCArIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFudXAgcmVzb3VyY2VzXG4gICAqL1xuICBzdGF0aWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXNldEludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucmVzZXRJbnRlcnZhbCk7XG4gICAgICB0aGlzLnJlc2V0SW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLm9wZXJhdGlvbkNvdW50cy5jbGVhcigpO1xuICAgIFNhZmVSZWdleC5jbGVhckNhY2hlKCk7XG4gIH1cbn1cblxuLy8gRXhwb3J0IGNvbnZlbmllbmNlIGZ1bmN0aW9uc1xuZXhwb3J0IGNvbnN0IHNhZmVUZXN0ID0gU2FmZVJlZ2V4LnRlc3QuYmluZChTYWZlUmVnZXgpO1xuZXhwb3J0IGNvbnN0IHNhZmVNYXRjaCA9IFNhZmVSZWdleC5tYXRjaC5iaW5kKFNhZmVSZWdleCk7XG5leHBvcnQgY29uc3QgZXNjYXBlUmVnZXggPSBTYWZlUmVnZXguZXNjYXBlLmJpbmQoU2FmZVJlZ2V4KTtcbmV4cG9ydCBjb25zdCBnbG9iVG9SZWdleCA9IFNhZmVSZWdleC5nbG9iVG9SZWdleC5iaW5kKFNhZmVSZWdleCk7XG5leHBvcnQgY29uc3Qgc2FmZVNwbGl0ID0gRE9TUHJvdGVjdGlvbi5zYWZlU3BsaXQuYmluZChET1NQcm90ZWN0aW9uKTtcbmV4cG9ydCBjb25zdCBzYWZlUmVwbGFjZSA9IERPU1Byb3RlY3Rpb24uc2FmZVJlcGxhY2UuYmluZChET1NQcm90ZWN0aW9uKTsiXX0=
|
|
@@ -22,7 +22,7 @@ export class PathValidator {
|
|
|
22
22
|
throw new Error('Path must be a non-empty string');
|
|
23
23
|
}
|
|
24
24
|
// Remove any null bytes
|
|
25
|
-
const cleanPath = userPath.
|
|
25
|
+
const cleanPath = userPath.replaceAll(/\u0000/g, ''); // NOSONAR - Removing null bytes for security
|
|
26
26
|
// Normalize and resolve path
|
|
27
27
|
const normalizedPath = path.normalize(cleanPath);
|
|
28
28
|
const resolvedPath = path.resolve(normalizedPath);
|
|
@@ -99,4 +99,4 @@ export class PathValidator {
|
|
|
99
99
|
await fs.rename(tempPath, validatedPath);
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aFZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZWN1cml0eS9wYXRoVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUdyRCxNQUFNLE9BQU8sYUFBYTtJQUNoQixNQUFNLENBQUMsbUJBQW1CLEdBQWEsRUFBRSxDQUFDO0lBQzFDLE1BQU0sQ0FBQyxrQkFBa0IsR0FBYSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1RixNQUFNLENBQUMsVUFBVSxDQUFDLFdBQW1CLEVBQUUsaUJBQTRCO1FBQ2pFLElBQUksQ0FBQyxtQkFBbUIsR0FBRztZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztZQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1lBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDO1NBQ3ZELENBQUM7UUFFRixJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGlCQUFpQixDQUFDO1FBQzlDLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFnQjtRQUMvQyxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxD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QUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU3QywwQ0FBMEM7UUFDMUMsTUFBTSxRQUFRLEdBQUcsR0FBRyxhQUFhLE1BQU0sQ0FBQztRQUN4QyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUUvQyxvREFBb0Q7UUFDcEQsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFJlZ2V4VmFsaWRhdG9yIH0gZnJvbSAnLi9yZWdleFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cmVFcnJvckhhbmRsZXIgfSBmcm9tICcuL2Vycm9ySGFuZGxlci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBQYXRoVmFsaWRhdG9yIHtcbiAgcHJpdmF0ZSBzdGF0aWMgQUxMT1dFRF9ESVJFQ1RPUklFUzogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBzdGF0aWMgQUxMT1dFRF9FWFRFTlNJT05TOiBzdHJpbmdbXSA9IFsnLm1kJywgJy5tYXJrZG93bicsICcudHh0JywgJy55bWwnLCAnLnlhbWwnXTtcbiAgXG4gIHN0YXRpYyBpbml0aWFsaXplKHBlcnNvbmFzRGlyOiBzdHJpbmcsIGFsbG93ZWRFeHRlbnNpb25zPzogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLkFMTE9XRURfRElSRUNUT1JJRVMgPSBbXG4gICAgICBwYXRoLnJlc29sdmUocGVyc29uYXNEaXIpLFxuICAgICAgcGF0aC5yZXNvbHZlKCcuL3BlcnNvbmFzJyksXG4gICAgICBwYXRoLnJlc29sdmUoJy4vY3VzdG9tLXBlcnNvbmFzJyksXG4gICAgICBwYXRoLnJlc29sdmUoJy4vYmFja3VwcycpLFxuICAgICAgcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LlBFUlNPTkFTX0RJUiB8fCAnLi9wZXJzb25hcycpXG4gICAgXTtcbiAgICBcbiAgICBpZiAoYWxsb3dlZEV4dGVuc2lvbnMpIHtcbiAgICAgIHRoaXMuQUxMT1dFRF9FWFRFTlNJT05TID0gYWxsb3dlZEV4dGVuc2lvbnM7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIHZhbGlkYXRlUGVyc29uYVBhdGgodXNlclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF1c2VyUGF0aCB8fCB0eXBlb2YgdXNlclBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW55IG51bGwgYnl0ZXNcbiAgICBjb25zdCBjbGVhblBhdGggPSB1c2VyUGF0aC5yZXBsYWNlKC9cXHUwMDAwL2csICcnKTsgLy8gTk9TT05BUiAtIFJlbW92aW5nIG51bGwgYnl0ZXMgZm9yIHNlY3VyaXR5XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIGFuZCByZXNvbHZlIHBhdGhcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgubm9ybWFsaXplKGNsZWFuUGF0aCk7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdHNcbiAgICBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJy4uJykgfHwgY2xlYW5QYXRoLmluY2x1ZGVzKCcuLicpKSB7XG4gICAgICBsb2dnZXIud2FybignUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCcsIHsgdXNlclBhdGggfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggdHJhdmVyc2FsIGRldGVjdGVkJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGlmIHBhdGggaXMgd2l0aGluIGFsbG93ZWQgZGlyZWN0b3JpZXNcbiAgICBpZiAodGhpcy5BTExPV0VEX0RJUkVDVE9SSUVTLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gSWYgbm90IGluaXRpYWxpemVkLCBhbGxvdyBwYXRocyB1bmRlciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5J3MgcGVyc29uYXMgZm9sZGVyXG4gICAgICBjb25zdCBkZWZhdWx0QWxsb3dlZCA9IFtcbiAgICAgICAgcGF0aC5yZXNvbHZlKCcuL3BlcnNvbmFzJyksXG4gICAgICAgIHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5QRVJTT05BU19ESVIgfHwgJy4vcGVyc29uYXMnKVxuICAgICAgXTtcbiAgICAgIGNvbnN0IGlzQWxsb3dlZCA9IGRlZmF1bHRBbGxvd2VkLnNvbWUoYWxsb3dlZERpciA9PiBcbiAgICAgICAgcmVzb2x2ZWRQYXRoLnN0YXJ0c1dpdGgoYWxsb3dlZERpciArIHBhdGguc2VwKSB8fCBcbiAgICAgICAgcmVzb2x2ZWRQYXRoID09PSBhbGxvd2VkRGlyXG4gICAgICApO1xuICAgICAgaWYgKCFpc0FsbG93ZWQpIHtcbiAgICAgICAgLy8gU0VDVVJJVFkgRklYICMyMDY6IERvbid0IGV4cG9zZSB1c2VyIHBhdGhzIGluIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgIGxvZ2dlci5lcnJvcignUGF0aCBhY2Nlc3MgZGVuaWVkJywgeyBwYXRoOiB1c2VyUGF0aCB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIGFjY2VzcyBkZW5pZWQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNBbGxvd2VkID0gdGhpcy5BTExPV0VEX0RJUkVDVE9SSUVTLnNvbWUoYWxsb3dlZERpciA9PiBcbiAgICAgICAgcmVzb2x2ZWRQYXRoLnN0YXJ0c1dpdGgoYWxsb3dlZERpciArIHBhdGguc2VwKSB8fCBcbiAgICAgICAgcmVzb2x2ZWRQYXRoID09PSBhbGxvd2VkRGlyXG4gICAgICApO1xuICAgICAgXG4gICAgICBpZiAoIWlzQWxsb3dlZCkge1xuICAgICAgICAvLyBTRUNVUklUWSBGSVggIzIwNjogRG9uJ3QgZXhwb3NlIHVzZXIgcGF0aHMgaW4gZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdQYXRoIGFjY2VzcyBkZW5pZWQnLCB7IHBhdGg6IHVzZXJQYXRoIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggYWNjZXNzIGRlbmllZCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBWYWxpZGF0ZSBmaWxlbmFtZSBpZiBpdCdzIGEgZmlsZVxuICAgIGlmIChwYXRoLmV4dG5hbWUocmVzb2x2ZWRQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKHJlc29sdmVkUGF0aCk7XG4gICAgICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoZmlsZW5hbWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGV4dGVuc2lvbiBpcyBhbGxvd2VkXG4gICAgICBpZiAoIXRoaXMuQUxMT1dFRF9FWFRFTlNJT05TLmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIGV4dGVuc2lvbiBub3QgYWxsb3dlZDogJHtleHR9LiBBbGxvd2VkOiAke3RoaXMuQUxMT1dFRF9FWFRFTlNJT05TLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGZpbGVuYW1lIGZvcm1hdCAoYWxwaGFudW1lcmljLCBkYXNoLCB1bmRlcnNjb3JlLCBkb3QpXG4gICAgICBpZiAoIVJlZ2V4VmFsaWRhdG9yLnZhbGlkYXRlKGZpbGVuYW1lLCAvXlthLXpBLVowLTlcXC1fLl0rJC9pLCB7IG1heExlbmd0aDogMjU1IH0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmaWxlbmFtZSBmb3JtYXQ6ICR7ZmlsZW5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgc2FmZVJlYWRGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZhbGlkYXRlZFBhdGggPSBhd2FpdCB0aGlzLnZhbGlkYXRlUGVyc29uYVBhdGgoZmlsZVBhdGgpO1xuICAgIFxuICAgIC8vIENoZWNrIGZpbGUgZXhpc3RzIGFuZCBpcyBub3QgYSBkaXJlY3RvcnlcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQodmFsaWRhdGVkUGF0aCk7XG4gICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCBpcyBhIGRpcmVjdG9yeSwgbm90IGEgZmlsZScpO1xuICAgIH1cbiAgICBcbiAgICAvLyBTaXplIGNoZWNrXG4gICAgaWYgKHN0YXRzLnNpemUgPiA1MDAwMDApIHsgLy8gNTAwS0JcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmlsZSB0b28gbGFyZ2UnKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlKHZhbGlkYXRlZFBhdGgsICd1dGYtOCcpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHNhZmVXcml0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmFsaWRhdGVkUGF0aCA9IGF3YWl0IHRoaXMudmFsaWRhdGVQZXJzb25hUGF0aChmaWxlUGF0aCk7XG4gICAgXG4gICAgLy8gQ29udGVudCB2YWxpZGF0aW9uXG4gICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gNTAwMDAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRlbnQgdG9vIGxhcmdlJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzIGJlZm9yZSBhdG9taWMgd3JpdGVcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKHZhbGlkYXRlZFBhdGgpO1xuICAgIGF3YWl0IGZzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIFxuICAgIC8vIFdyaXRlIHRvIHRlbXAgZmlsZSBmaXJzdCAoYXRvbWljIHdyaXRlKVxuICAgIGNvbnN0IHRlbXBQYXRoID0gYCR7dmFsaWRhdGVkUGF0aH0udG1wYDtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUodGVtcFBhdGgsIGNvbnRlbnQsICd1dGYtOCcpO1xuICAgIFxuICAgIC8vIFJlbmFtZSB0byBmaW5hbCBwYXRoIChhdG9taWMgb24gbW9zdCBmaWxlc3lzdGVtcylcbiAgICBhd2FpdCBmcy5yZW5hbWUodGVtcFBhdGgsIHZhbGlkYXRlZFBhdGgpO1xuICB9XG59Il19
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aFZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZWN1cml0eS9wYXRoVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUdyRCxNQUFNLE9BQU8sYUFBYTtJQUNoQixNQUFNLENBQUMsbUJBQW1CLEdBQWEsRUFBRSxDQUFDO0lBQzFDLE1BQU0sQ0FBQyxrQkFBa0IsR0FBYSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1RixNQUFNLENBQUMsVUFBVSxDQUFDLFdBQW1CLEVBQUUsaUJBQTRCO1FBQ2pFLElBQUksQ0FBQyxtQkFBbUIsR0FBRztZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztZQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1lBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLElBQUksWUFBWSxDQUFDO1NBQ3ZELENBQUM7UUFFRixJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGlCQUFpQixDQUFDO1FBQzlDLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFnQjtRQUMvQyxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsRUFBRSxD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QUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU3QywwQ0FBMEM7UUFDMUMsTUFBTSxRQUFRLEdBQUcsR0FBRyxhQUFhLE1BQU0sQ0FBQztRQUN4QyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUUvQyxvREFBb0Q7UUFDcEQsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgZnMgZnJvbSAnZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFJlZ2V4VmFsaWRhdG9yIH0gZnJvbSAnLi9yZWdleFZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cmVFcnJvckhhbmRsZXIgfSBmcm9tICcuL2Vycm9ySGFuZGxlci5qcyc7XG5cbmV4cG9ydCBjbGFzcyBQYXRoVmFsaWRhdG9yIHtcbiAgcHJpdmF0ZSBzdGF0aWMgQUxMT1dFRF9ESVJFQ1RPUklFUzogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBzdGF0aWMgQUxMT1dFRF9FWFRFTlNJT05TOiBzdHJpbmdbXSA9IFsnLm1kJywgJy5tYXJrZG93bicsICcudHh0JywgJy55bWwnLCAnLnlhbWwnXTtcbiAgXG4gIHN0YXRpYyBpbml0aWFsaXplKHBlcnNvbmFzRGlyOiBzdHJpbmcsIGFsbG93ZWRFeHRlbnNpb25zPzogc3RyaW5nW10pOiB2b2lkIHtcbiAgICB0aGlzLkFMTE9XRURfRElSRUNUT1JJRVMgPSBbXG4gICAgICBwYXRoLnJlc29sdmUocGVyc29uYXNEaXIpLFxuICAgICAgcGF0aC5yZXNvbHZlKCcuL3BlcnNvbmFzJyksXG4gICAgICBwYXRoLnJlc29sdmUoJy4vY3VzdG9tLXBlcnNvbmFzJyksXG4gICAgICBwYXRoLnJlc29sdmUoJy4vYmFja3VwcycpLFxuICAgICAgcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LlBFUlNPTkFTX0RJUiB8fCAnLi9wZXJzb25hcycpXG4gICAgXTtcbiAgICBcbiAgICBpZiAoYWxsb3dlZEV4dGVuc2lvbnMpIHtcbiAgICAgIHRoaXMuQUxMT1dFRF9FWFRFTlNJT05TID0gYWxsb3dlZEV4dGVuc2lvbnM7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIHZhbGlkYXRlUGVyc29uYVBhdGgodXNlclBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF1c2VyUGF0aCB8fCB0eXBlb2YgdXNlclBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW55IG51bGwgYnl0ZXNcbiAgICBjb25zdCBjbGVhblBhdGggPSB1c2VyUGF0aC5yZXBsYWNlQWxsKC9cXHUwMDAwL2csICcnKTsgLy8gTk9TT05BUiAtIFJlbW92aW5nIG51bGwgYnl0ZXMgZm9yIHNlY3VyaXR5XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIGFuZCByZXNvbHZlIHBhdGhcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGgubm9ybWFsaXplKGNsZWFuUGF0aCk7XG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gcGF0aC5yZXNvbHZlKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdHNcbiAgICBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJy4uJykgfHwgY2xlYW5QYXRoLmluY2x1ZGVzKCcuLicpKSB7XG4gICAgICBsb2dnZXIud2FybignUGF0aCB0cmF2ZXJzYWwgYXR0ZW1wdCBkZXRlY3RlZCcsIHsgdXNlclBhdGggfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggdHJhdmVyc2FsIGRldGVjdGVkJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGlmIHBhdGggaXMgd2l0aGluIGFsbG93ZWQgZGlyZWN0b3JpZXNcbiAgICBpZiAodGhpcy5BTExPV0VEX0RJUkVDVE9SSUVTLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gSWYgbm90IGluaXRpYWxpemVkLCBhbGxvdyBwYXRocyB1bmRlciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5J3MgcGVyc29uYXMgZm9sZGVyXG4gICAgICBjb25zdCBkZWZhdWx0QWxsb3dlZCA9IFtcbiAgICAgICAgcGF0aC5yZXNvbHZlKCcuL3BlcnNvbmFzJyksXG4gICAgICAgIHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5QRVJTT05BU19ESVIgfHwgJy4vcGVyc29uYXMnKVxuICAgICAgXTtcbiAgICAgIGNvbnN0IGlzQWxsb3dlZCA9IGRlZmF1bHRBbGxvd2VkLnNvbWUoYWxsb3dlZERpciA9PiBcbiAgICAgICAgcmVzb2x2ZWRQYXRoLnN0YXJ0c1dpdGgoYWxsb3dlZERpciArIHBhdGguc2VwKSB8fCBcbiAgICAgICAgcmVzb2x2ZWRQYXRoID09PSBhbGxvd2VkRGlyXG4gICAgICApO1xuICAgICAgaWYgKCFpc0FsbG93ZWQpIHtcbiAgICAgICAgLy8gU0VDVVJJVFkgRklYICMyMDY6IERvbid0IGV4cG9zZSB1c2VyIHBhdGhzIGluIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgIGxvZ2dlci5lcnJvcignUGF0aCBhY2Nlc3MgZGVuaWVkJywgeyBwYXRoOiB1c2VyUGF0aCB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXRoIGFjY2VzcyBkZW5pZWQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaXNBbGxvd2VkID0gdGhpcy5BTExPV0VEX0RJUkVDVE9SSUVTLnNvbWUoYWxsb3dlZERpciA9PiBcbiAgICAgICAgcmVzb2x2ZWRQYXRoLnN0YXJ0c1dpdGgoYWxsb3dlZERpciArIHBhdGguc2VwKSB8fCBcbiAgICAgICAgcmVzb2x2ZWRQYXRoID09PSBhbGxvd2VkRGlyXG4gICAgICApO1xuICAgICAgXG4gICAgICBpZiAoIWlzQWxsb3dlZCkge1xuICAgICAgICAvLyBTRUNVUklUWSBGSVggIzIwNjogRG9uJ3QgZXhwb3NlIHVzZXIgcGF0aHMgaW4gZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdQYXRoIGFjY2VzcyBkZW5pZWQnLCB7IHBhdGg6IHVzZXJQYXRoIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhdGggYWNjZXNzIGRlbmllZCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBWYWxpZGF0ZSBmaWxlbmFtZSBpZiBpdCdzIGEgZmlsZVxuICAgIGlmIChwYXRoLmV4dG5hbWUocmVzb2x2ZWRQYXRoKSkge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKHJlc29sdmVkUGF0aCk7XG4gICAgICBjb25zdCBleHQgPSBwYXRoLmV4dG5hbWUoZmlsZW5hbWUpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGV4dGVuc2lvbiBpcyBhbGxvd2VkXG4gICAgICBpZiAoIXRoaXMuQUxMT1dFRF9FWFRFTlNJT05TLmluY2x1ZGVzKGV4dCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIGV4dGVuc2lvbiBub3QgYWxsb3dlZDogJHtleHR9LiBBbGxvd2VkOiAke3RoaXMuQUxMT1dFRF9FWFRFTlNJT05TLmpvaW4oJywgJyl9YCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIGZpbGVuYW1lIGZvcm1hdCAoYWxwaGFudW1lcmljLCBkYXNoLCB1bmRlcnNjb3JlLCBkb3QpXG4gICAgICBpZiAoIVJlZ2V4VmFsaWRhdG9yLnZhbGlkYXRlKGZpbGVuYW1lLCAvXlthLXpBLVowLTlcXC1fLl0rJC9pLCB7IG1heExlbmd0aDogMjU1IH0pKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmaWxlbmFtZSBmb3JtYXQ6ICR7ZmlsZW5hbWV9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgc2FmZVJlYWRGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZhbGlkYXRlZFBhdGggPSBhd2FpdCB0aGlzLnZhbGlkYXRlUGVyc29uYVBhdGgoZmlsZVBhdGgpO1xuICAgIFxuICAgIC8vIENoZWNrIGZpbGUgZXhpc3RzIGFuZCBpcyBub3QgYSBkaXJlY3RvcnlcbiAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGZzLnN0YXQodmFsaWRhdGVkUGF0aCk7XG4gICAgaWYgKHN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGF0aCBpcyBhIGRpcmVjdG9yeSwgbm90IGEgZmlsZScpO1xuICAgIH1cbiAgICBcbiAgICAvLyBTaXplIGNoZWNrXG4gICAgaWYgKHN0YXRzLnNpemUgPiA1MDAwMDApIHsgLy8gNTAwS0JcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmlsZSB0b28gbGFyZ2UnKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGZzLnJlYWRGaWxlKHZhbGlkYXRlZFBhdGgsICd1dGYtOCcpO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIHNhZmVXcml0ZUZpbGUoZmlsZVBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmFsaWRhdGVkUGF0aCA9IGF3YWl0IHRoaXMudmFsaWRhdGVQZXJzb25hUGF0aChmaWxlUGF0aCk7XG4gICAgXG4gICAgLy8gQ29udGVudCB2YWxpZGF0aW9uXG4gICAgaWYgKGNvbnRlbnQubGVuZ3RoID4gNTAwMDAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbnRlbnQgdG9vIGxhcmdlJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIEVuc3VyZSBkaXJlY3RvcnkgZXhpc3RzIGJlZm9yZSBhdG9taWMgd3JpdGVcbiAgICBjb25zdCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKHZhbGlkYXRlZFBhdGgpO1xuICAgIGF3YWl0IGZzLm1rZGlyKGRpclBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIFxuICAgIC8vIFdyaXRlIHRvIHRlbXAgZmlsZSBmaXJzdCAoYXRvbWljIHdyaXRlKVxuICAgIGNvbnN0IHRlbXBQYXRoID0gYCR7dmFsaWRhdGVkUGF0aH0udG1wYDtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUodGVtcFBhdGgsIGNvbnRlbnQsICd1dGYtOCcpO1xuICAgIFxuICAgIC8vIFJlbmFtZSB0byBmaW5hbCBwYXRoIChhdG9taWMgb24gbW9zdCBmaWxlc3lzdGVtcylcbiAgICBhd2FpdCBmcy5yZW5hbWUodGVtcFBhdGgsIHZhbGlkYXRlZFBhdGgpO1xuICB9XG59Il19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secureYamlParser.d.ts","sourceRoot":"","sources":["../../src/security/secureYamlParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,MAAM,MAAM,aAAa,CAAC;AAKjC,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAKrC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAGvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAoCtC;IAEF;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,aAAa;
|
|
1
|
+
{"version":3,"file":"secureYamlParser.d.ts","sourceRoot":"","sources":["../../src/security/secureYamlParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAGH,OAAO,MAAM,MAAM,aAAa,CAAC;AAKjC,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAKrC;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAGvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAoCtC;IAEF;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,aAAa;IA+G5E;;OAEG;IACH,MAAM,CAAC,wBAAwB;uBAEZ,MAAM;;;;;;6BASA,MAAM,QAAQ,GAAG;;IAoB1C;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;CAgChH"}
|