mirror of
https://github.com/czlonkowski/n8n-mcp.git
synced 2026-01-30 06:22:04 +00:00
126 lines
4.3 KiB
JavaScript
126 lines
4.3 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.TemplateSanitizer = exports.defaultSanitizerConfig = void 0;
|
|
const logger_1 = require("./logger");
|
|
exports.defaultSanitizerConfig = {
|
|
problematicTokens: [],
|
|
tokenPatterns: [
|
|
/apify_api_[A-Za-z0-9]+/g,
|
|
/sk-[A-Za-z0-9]+/g,
|
|
/pat[A-Za-z0-9_]{40,}/g,
|
|
/ghp_[A-Za-z0-9]{36,}/g,
|
|
/gho_[A-Za-z0-9]{36,}/g,
|
|
/Bearer\s+[A-Za-z0-9\-._~+\/]+=*/g
|
|
],
|
|
replacements: new Map([
|
|
['apify_api_', 'apify_api_YOUR_TOKEN_HERE'],
|
|
['sk-', 'sk-YOUR_OPENAI_KEY_HERE'],
|
|
['pat', 'patYOUR_AIRTABLE_TOKEN_HERE'],
|
|
['ghp_', 'ghp_YOUR_GITHUB_TOKEN_HERE'],
|
|
['gho_', 'gho_YOUR_GITHUB_TOKEN_HERE'],
|
|
['Bearer ', 'Bearer YOUR_TOKEN_HERE']
|
|
])
|
|
};
|
|
class TemplateSanitizer {
|
|
constructor(config = exports.defaultSanitizerConfig) {
|
|
this.config = config;
|
|
}
|
|
addProblematicToken(token) {
|
|
if (!this.config.problematicTokens.includes(token)) {
|
|
this.config.problematicTokens.push(token);
|
|
logger_1.logger.info(`Added problematic token to sanitizer: ${token.substring(0, 10)}...`);
|
|
}
|
|
}
|
|
addTokenPattern(pattern, replacement) {
|
|
this.config.tokenPatterns.push(pattern);
|
|
const prefix = pattern.source.match(/^([^[]+)/)?.[1] || '';
|
|
if (prefix) {
|
|
this.config.replacements.set(prefix, replacement);
|
|
}
|
|
}
|
|
sanitizeWorkflow(workflow) {
|
|
if (!workflow) {
|
|
return { sanitized: workflow, wasModified: false };
|
|
}
|
|
const original = JSON.stringify(workflow);
|
|
let sanitized = this.sanitizeObject(workflow);
|
|
if (sanitized && sanitized.pinData) {
|
|
delete sanitized.pinData;
|
|
}
|
|
if (sanitized && sanitized.executionId) {
|
|
delete sanitized.executionId;
|
|
}
|
|
if (sanitized && sanitized.staticData) {
|
|
delete sanitized.staticData;
|
|
}
|
|
const wasModified = JSON.stringify(sanitized) !== original;
|
|
return { sanitized, wasModified };
|
|
}
|
|
needsSanitization(workflow) {
|
|
const workflowStr = JSON.stringify(workflow);
|
|
for (const token of this.config.problematicTokens) {
|
|
if (workflowStr.includes(token)) {
|
|
return true;
|
|
}
|
|
}
|
|
for (const pattern of this.config.tokenPatterns) {
|
|
pattern.lastIndex = 0;
|
|
if (pattern.test(workflowStr)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
detectTokens(workflow) {
|
|
const workflowStr = JSON.stringify(workflow);
|
|
const detectedTokens = [];
|
|
for (const token of this.config.problematicTokens) {
|
|
if (workflowStr.includes(token)) {
|
|
detectedTokens.push(token);
|
|
}
|
|
}
|
|
for (const pattern of this.config.tokenPatterns) {
|
|
pattern.lastIndex = 0;
|
|
const matches = workflowStr.match(pattern);
|
|
if (matches) {
|
|
detectedTokens.push(...matches);
|
|
}
|
|
}
|
|
return [...new Set(detectedTokens)];
|
|
}
|
|
sanitizeObject(obj) {
|
|
if (typeof obj === 'string') {
|
|
return this.replaceTokens(obj);
|
|
}
|
|
else if (Array.isArray(obj)) {
|
|
return obj.map(item => this.sanitizeObject(item));
|
|
}
|
|
else if (obj && typeof obj === 'object') {
|
|
const result = {};
|
|
for (const key in obj) {
|
|
result[key] = this.sanitizeObject(obj[key]);
|
|
}
|
|
return result;
|
|
}
|
|
return obj;
|
|
}
|
|
replaceTokens(str) {
|
|
let result = str;
|
|
this.config.problematicTokens.forEach(token => {
|
|
result = result.replace(new RegExp(token, 'g'), 'YOUR_API_TOKEN_HERE');
|
|
});
|
|
this.config.tokenPatterns.forEach(pattern => {
|
|
result = result.replace(pattern, (match) => {
|
|
for (const [prefix, replacement] of this.config.replacements) {
|
|
if (match.startsWith(prefix)) {
|
|
return replacement;
|
|
}
|
|
}
|
|
return 'YOUR_TOKEN_HERE';
|
|
});
|
|
});
|
|
return result;
|
|
}
|
|
}
|
|
exports.TemplateSanitizer = TemplateSanitizer;
|
|
//# sourceMappingURL=template-sanitizer.js.map
|