@path58/n8n-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENT_INSTALL.md +223 -0
- package/CHANGELOG.md +38 -0
- package/LICENSE +21 -0
- package/README.md +187 -0
- package/dist/autofix/suggestion-fixers/deprecated-node-fixer.js +465 -0
- package/dist/autofix/suggestion-fixers/deprecated-node-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/fixer-registry.js +495 -0
- package/dist/autofix/suggestion-fixers/fixer-registry.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l1-structure-fixer.js +639 -0
- package/dist/autofix/suggestion-fixers/l1-structure-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l4-connection-fixer.js +449 -0
- package/dist/autofix/suggestion-fixers/l4-connection-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l5-parameter-fixer.js +575 -0
- package/dist/autofix/suggestion-fixers/l5-parameter-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l5-typeversion-fixer.js +431 -0
- package/dist/autofix/suggestion-fixers/l5-typeversion-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l5-webhook-path-fixer.js +356 -0
- package/dist/autofix/suggestion-fixers/l5-webhook-path-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l6-ai-tool-variant-fixer.js +618 -0
- package/dist/autofix/suggestion-fixers/l6-ai-tool-variant-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/l6-pattern-fixer.js +1475 -0
- package/dist/autofix/suggestion-fixers/l6-pattern-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/llm-fixer.js +716 -0
- package/dist/autofix/suggestion-fixers/llm-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/missing-credential-fixer.js +336 -0
- package/dist/autofix/suggestion-fixers/missing-credential-fixer.js.map +1 -0
- package/dist/autofix/suggestion-fixers/types.js +29 -0
- package/dist/autofix/suggestion-fixers/types.js.map +1 -0
- package/dist/autofix/suggestion-fixers/typo-fixer.js +197 -0
- package/dist/autofix/suggestion-fixers/typo-fixer.js.map +1 -0
- package/dist/classification/certification-engine.js +208 -0
- package/dist/classification/certification-engine.js.map +1 -0
- package/dist/classification/feedback-collector.js +516 -0
- package/dist/classification/feedback-collector.js.map +1 -0
- package/dist/classification/l5-parameter-analyzer.js +670 -0
- package/dist/classification/l5-parameter-analyzer.js.map +1 -0
- package/dist/classification/l6-graph-analyzer.js +613 -0
- package/dist/classification/l6-graph-analyzer.js.map +1 -0
- package/dist/classification/severity-classifier.js +237 -0
- package/dist/classification/severity-classifier.js.map +1 -0
- package/dist/config/env.js +280 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/env.schema.js +234 -0
- package/dist/config/env.schema.js.map +1 -0
- package/dist/config/scraperEnv.js +55 -0
- package/dist/config/scraperEnv.js.map +1 -0
- package/dist/db/postgresClient.js +38 -0
- package/dist/db/postgresClient.js.map +1 -0
- package/dist/db/scraperDb.js +6 -0
- package/dist/db/scraperDb.js.map +1 -0
- package/dist/db/scraperPostgresClient.js +118 -0
- package/dist/db/scraperPostgresClient.js.map +1 -0
- package/dist/db/validationRepository.js +55 -0
- package/dist/db/validationRepository.js.map +1 -0
- package/dist/db/validatorPostgresClient.js +248 -0
- package/dist/db/validatorPostgresClient.js.map +1 -0
- package/dist/db/workflowInstanceMappingRepository.js +128 -0
- package/dist/db/workflowInstanceMappingRepository.js.map +1 -0
- package/dist/errors/AppError.js +156 -0
- package/dist/errors/AppError.js.map +1 -0
- package/dist/errors/index.js +7 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/factory/error-to-problem-mappers.js +385 -0
- package/dist/factory/error-to-problem-mappers.js.map +1 -0
- package/dist/factory/gap-recorder.js +260 -0
- package/dist/factory/gap-recorder.js.map +1 -0
- package/dist/factory/problem-recorder.js +94 -0
- package/dist/factory/problem-recorder.js.map +1 -0
- package/dist/factory/warning-to-gap-mappers.js +493 -0
- package/dist/factory/warning-to-gap-mappers.js.map +1 -0
- package/dist/factory/workflow-normalizer.js +247 -0
- package/dist/factory/workflow-normalizer.js.map +1 -0
- package/dist/mcp/adapters/catalog.js +13 -0
- package/dist/mcp/adapters/catalog.js.map +1 -0
- package/dist/mcp/adapters/index.js +36 -0
- package/dist/mcp/adapters/index.js.map +1 -0
- package/dist/mcp/adapters/supabase-catalog.js +467 -0
- package/dist/mcp/adapters/supabase-catalog.js.map +1 -0
- package/dist/mcp/adapters/test-catalog-adapter.js +100 -0
- package/dist/mcp/adapters/test-catalog-adapter.js.map +1 -0
- package/dist/mcp/adapters/validation.js +258 -0
- package/dist/mcp/adapters/validation.js.map +1 -0
- package/dist/mcp/build-email-workflow.js +113 -0
- package/dist/mcp/build-email-workflow.js.map +1 -0
- package/dist/mcp/config.js +22 -0
- package/dist/mcp/config.js.map +1 -0
- package/dist/mcp/formatters/errors.js +217 -0
- package/dist/mcp/formatters/errors.js.map +1 -0
- package/dist/mcp/formatters/index.js +12 -0
- package/dist/mcp/formatters/index.js.map +1 -0
- package/dist/mcp/formatters/response.js +141 -0
- package/dist/mcp/formatters/response.js.map +1 -0
- package/dist/mcp/quick-test.js +33 -0
- package/dist/mcp/quick-test.js.map +1 -0
- package/dist/mcp/server.js +70 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/test-mcp-error.js +81 -0
- package/dist/mcp/test-mcp-error.js.map +1 -0
- package/dist/mcp/test-mcp.js +80 -0
- package/dist/mcp/test-mcp.js.map +1 -0
- package/dist/mcp/tools/fixes/expression-fixes.js +166 -0
- package/dist/mcp/tools/fixes/expression-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/flow-fixes.js +155 -0
- package/dist/mcp/tools/fixes/flow-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/index.js +91 -0
- package/dist/mcp/tools/fixes/index.js.map +1 -0
- package/dist/mcp/tools/fixes/node-fixes.js +233 -0
- package/dist/mcp/tools/fixes/node-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/parameter-fixes.js +277 -0
- package/dist/mcp/tools/fixes/parameter-fixes.js.map +1 -0
- package/dist/mcp/tools/fixes/types.js +10 -0
- package/dist/mcp/tools/fixes/types.js.map +1 -0
- package/dist/mcp/tools/handlers/check-parameter.js +300 -0
- package/dist/mcp/tools/handlers/check-parameter.js.map +1 -0
- package/dist/mcp/tools/handlers/find-similar-pattern.js +121 -0
- package/dist/mcp/tools/handlers/find-similar-pattern.js.map +1 -0
- package/dist/mcp/tools/handlers/get-node-info.js +131 -0
- package/dist/mcp/tools/handlers/get-node-info.js.map +1 -0
- package/dist/mcp/tools/handlers/get-operation-schema.js +141 -0
- package/dist/mcp/tools/handlers/get-operation-schema.js.map +1 -0
- package/dist/mcp/tools/handlers/list-nodes.js +126 -0
- package/dist/mcp/tools/handlers/list-nodes.js.map +1 -0
- package/dist/mcp/tools/handlers/list-operations.js +138 -0
- package/dist/mcp/tools/handlers/list-operations.js.map +1 -0
- package/dist/mcp/tools/handlers/suggest-fix.js +120 -0
- package/dist/mcp/tools/handlers/suggest-fix.js.map +1 -0
- package/dist/mcp/tools/handlers/validate-workflow.js +92 -0
- package/dist/mcp/tools/handlers/validate-workflow.js.map +1 -0
- package/dist/mcp/tools/index.js +190 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/schemas.js +195 -0
- package/dist/mcp/tools/schemas.js.map +1 -0
- package/dist/mcp/tools/validate.js +95 -0
- package/dist/mcp/tools/validate.js.map +1 -0
- package/dist/mcp/types/mcp.js +7 -0
- package/dist/mcp/types/mcp.js.map +1 -0
- package/dist/mcp/utils/timeout.js +78 -0
- package/dist/mcp/utils/timeout.js.map +1 -0
- package/dist/services/BatchProcessor.js +433 -0
- package/dist/services/BatchProcessor.js.map +1 -0
- package/dist/services/CheckpointManager.js +281 -0
- package/dist/services/CheckpointManager.js.map +1 -0
- package/dist/services/CostCalculator.js +211 -0
- package/dist/services/CostCalculator.js.map +1 -0
- package/dist/services/EmbeddingCache.js +68 -0
- package/dist/services/EmbeddingCache.js.map +1 -0
- package/dist/services/EmbeddingService.js +143 -0
- package/dist/services/EmbeddingService.js.map +1 -0
- package/dist/services/RankingService.js +81 -0
- package/dist/services/RankingService.js.map +1 -0
- package/dist/services/RedisCache.js +376 -0
- package/dist/services/RedisCache.js.map +1 -0
- package/dist/services/RedisCatalogCache.js +680 -0
- package/dist/services/RedisCatalogCache.js.map +1 -0
- package/dist/services/ResumeManager.js +252 -0
- package/dist/services/ResumeManager.js.map +1 -0
- package/dist/services/SearchService.js +282 -0
- package/dist/services/SearchService.js.map +1 -0
- package/dist/services/SemanticCatalogSearch.js +405 -0
- package/dist/services/SemanticCatalogSearch.js.map +1 -0
- package/dist/services/ValidationCache.js +157 -0
- package/dist/services/ValidationCache.js.map +1 -0
- package/dist/services/WorkflowPipelineService.js +1997 -0
- package/dist/services/WorkflowPipelineService.js.map +1 -0
- package/dist/services/catalog/index.js +34 -0
- package/dist/services/catalog/index.js.map +1 -0
- package/dist/services/catalog/interfaces.js +17 -0
- package/dist/services/catalog/interfaces.js.map +1 -0
- package/dist/services/catalog/loaders.js +169 -0
- package/dist/services/catalog/loaders.js.map +1 -0
- package/dist/services/catalog/types.js +138 -0
- package/dist/services/catalog/types.js.map +1 -0
- package/dist/services/documentation-normalization/docUrlUtils.js +88 -0
- package/dist/services/documentation-normalization/docUrlUtils.js.map +1 -0
- package/dist/services/error-quality/ErrorQualityService.js +262 -0
- package/dist/services/error-quality/ErrorQualityService.js.map +1 -0
- package/dist/services/error-quality/analyzers/CredentialAnalyzer.js +260 -0
- package/dist/services/error-quality/analyzers/CredentialAnalyzer.js.map +1 -0
- package/dist/services/error-quality/analyzers/IssuePredictor.js +380 -0
- package/dist/services/error-quality/analyzers/IssuePredictor.js.map +1 -0
- package/dist/services/error-quality/analyzers/MockCoverageAnalyzer.js +267 -0
- package/dist/services/error-quality/analyzers/MockCoverageAnalyzer.js.map +1 -0
- package/dist/services/error-quality/data/ErrorPatternSeeder.js +963 -0
- package/dist/services/error-quality/data/ErrorPatternSeeder.js.map +1 -0
- package/dist/services/error-quality/index.js +25 -0
- package/dist/services/error-quality/index.js.map +1 -0
- package/dist/services/error-quality/reports/ReportGenerator.js +343 -0
- package/dist/services/error-quality/reports/ReportGenerator.js.map +1 -0
- package/dist/services/error-quality/taxonomy/ErrorTaxonomy.js +698 -0
- package/dist/services/error-quality/taxonomy/ErrorTaxonomy.js.map +1 -0
- package/dist/services/error-quality/types.js +11 -0
- package/dist/services/error-quality/types.js.map +1 -0
- package/dist/services/progress/ProgressTracker.js +288 -0
- package/dist/services/progress/ProgressTracker.js.map +1 -0
- package/dist/services/progress/formatters.js +122 -0
- package/dist/services/progress/formatters.js.map +1 -0
- package/dist/services/progress/index.js +36 -0
- package/dist/services/progress/index.js.map +1 -0
- package/dist/services/progress/types.js +7 -0
- package/dist/services/progress/types.js.map +1 -0
- package/dist/services/search/embeddingGenerator.js +112 -0
- package/dist/services/search/embeddingGenerator.js.map +1 -0
- package/dist/types/aiCapabilities.js +7 -0
- package/dist/types/aiCapabilities.js.map +1 -0
- package/dist/types/aiConfigSchema.js +7 -0
- package/dist/types/aiConfigSchema.js.map +1 -0
- package/dist/utils/bannerLogger.js +186 -0
- package/dist/utils/bannerLogger.js.map +1 -0
- package/dist/utils/bannerService.js +23 -0
- package/dist/utils/bannerService.js.map +1 -0
- package/dist/utils/bannerServiceAdapter.js +54 -0
- package/dist/utils/bannerServiceAdapter.js.map +1 -0
- package/dist/utils/batchLogger.js +171 -0
- package/dist/utils/batchLogger.js.map +1 -0
- package/dist/utils/bottomStickyBanner.js +239 -0
- package/dist/utils/bottomStickyBanner.js.map +1 -0
- package/dist/utils/credentialMatcher.js +206 -0
- package/dist/utils/credentialMatcher.js.map +1 -0
- package/dist/utils/credentialNormalizer.js +442 -0
- package/dist/utils/credentialNormalizer.js.map +1 -0
- package/dist/utils/integratedBannerLogger.js +59 -0
- package/dist/utils/integratedBannerLogger.js.map +1 -0
- package/dist/utils/n8nSourceGit.js +195 -0
- package/dist/utils/n8nSourceGit.js.map +1 -0
- package/dist/utils/nodeTypeNormalizer.js +131 -0
- package/dist/utils/nodeTypeNormalizer.js.map +1 -0
- package/dist/utils/openaiClient.js +397 -0
- package/dist/utils/openaiClient.js.map +1 -0
- package/dist/utils/productionLogger.js +16 -0
- package/dist/utils/productionLogger.js.map +1 -0
- package/dist/utils/progressBarBanner.js +132 -0
- package/dist/utils/progressBarBanner.js.map +1 -0
- package/dist/utils/scriptHeartbeat.js +117 -0
- package/dist/utils/scriptHeartbeat.js.map +1 -0
- package/dist/utils/scriptLogger.js +125 -0
- package/dist/utils/scriptLogger.js.map +1 -0
- package/dist/utils/scriptRunner.js +95 -0
- package/dist/utils/scriptRunner.js.map +1 -0
- package/dist/utils/scriptTimeout.js +128 -0
- package/dist/utils/scriptTimeout.js.map +1 -0
- package/dist/utils/scriptWrapper.js +219 -0
- package/dist/utils/scriptWrapper.js.map +1 -0
- package/dist/utils/stickyBanner.js +226 -0
- package/dist/utils/stickyBanner.js.map +1 -0
- package/dist/utils/terminalSpinner.js +97 -0
- package/dist/utils/terminalSpinner.js.map +1 -0
- package/dist/utils/threeLineBanner.js +427 -0
- package/dist/utils/threeLineBanner.js.map +1 -0
- package/dist/utils/validatorCheckpointManager.js +170 -0
- package/dist/utils/validatorCheckpointManager.js.map +1 -0
- package/dist/utils/validatorConnectionManager.js +124 -0
- package/dist/utils/validatorConnectionManager.js.map +1 -0
- package/dist/validation/catalog.js +56 -0
- package/dist/validation/catalog.js.map +1 -0
- package/dist/validation/config/deprecated-nodes.js +234 -0
- package/dist/validation/config/deprecated-nodes.js.map +1 -0
- package/dist/validation/config/l6-severity.js +227 -0
- package/dist/validation/config/l6-severity.js.map +1 -0
- package/dist/validation/config/terminal-nodes.js +132 -0
- package/dist/validation/config/terminal-nodes.js.map +1 -0
- package/dist/validation/config/unreachable-nodes.js +67 -0
- package/dist/validation/config/unreachable-nodes.js.map +1 -0
- package/dist/validation/core.js +47 -0
- package/dist/validation/core.js.map +1 -0
- package/dist/validation/docExtraction.js +12 -0
- package/dist/validation/docExtraction.js.map +1 -0
- package/dist/validation/dryRunMockRunner.js +128 -0
- package/dist/validation/dryRunMockRunner.js.map +1 -0
- package/dist/validation/fixtureEngine.js +61 -0
- package/dist/validation/fixtureEngine.js.map +1 -0
- package/dist/validation/index.js +15 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/k-levels/k2-blockers.js +222 -0
- package/dist/validation/k-levels/k2-blockers.js.map +1 -0
- package/dist/validation/l1-structure.js +296 -0
- package/dist/validation/l1-structure.js.map +1 -0
- package/dist/validation/l2-nodes.js +282 -0
- package/dist/validation/l2-nodes.js.map +1 -0
- package/dist/validation/l3-credentials.js +322 -0
- package/dist/validation/l3-credentials.js.map +1 -0
- package/dist/validation/l4-connections.js +698 -0
- package/dist/validation/l4-connections.js.map +1 -0
- package/dist/validation/l5-parameters.js +803 -0
- package/dist/validation/l5-parameters.js.map +1 -0
- package/dist/validation/l6-checks/ai-tool-variants.js +407 -0
- package/dist/validation/l6-checks/ai-tool-variants.js.map +1 -0
- package/dist/validation/l6-checks/catalog-checks.js +260 -0
- package/dist/validation/l6-checks/catalog-checks.js.map +1 -0
- package/dist/validation/l6-checks/data-contracts.js +197 -0
- package/dist/validation/l6-checks/data-contracts.js.map +1 -0
- package/dist/validation/l6-checks/deprecation.js +133 -0
- package/dist/validation/l6-checks/deprecation.js.map +1 -0
- package/dist/validation/l6-checks/error-handling.js +193 -0
- package/dist/validation/l6-checks/error-handling.js.map +1 -0
- package/dist/validation/l6-checks/expression-syntax.js +387 -0
- package/dist/validation/l6-checks/expression-syntax.js.map +1 -0
- package/dist/validation/l6-checks/flow-integrity.js +504 -0
- package/dist/validation/l6-checks/flow-integrity.js.map +1 -0
- package/dist/validation/l6-checks/index.js +106 -0
- package/dist/validation/l6-checks/index.js.map +1 -0
- package/dist/validation/l6-checks/loops.js +370 -0
- package/dist/validation/l6-checks/loops.js.map +1 -0
- package/dist/validation/l6-checks/performance.js +182 -0
- package/dist/validation/l6-checks/performance.js.map +1 -0
- package/dist/validation/l6-checks/security.js +273 -0
- package/dist/validation/l6-checks/security.js.map +1 -0
- package/dist/validation/l6-patterns.js +472 -0
- package/dist/validation/l6-patterns.js.map +1 -0
- package/dist/validation/mockLevelResolver.js +95 -0
- package/dist/validation/mockLevelResolver.js.map +1 -0
- package/dist/validation/n8nApiClient.js +21 -0
- package/dist/validation/n8nApiClient.js.map +1 -0
- package/dist/validation/n8nCli.js +87 -0
- package/dist/validation/n8nCli.js.map +1 -0
- package/dist/validation/types.js +8 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation/usageStats.js +82 -0
- package/dist/validation/usageStats.js.map +1 -0
- package/package.json +274 -0
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* L6 Security Checks
|
|
3
|
+
*
|
|
4
|
+
* RAG-2.2.40: L6 Pattern Validation
|
|
5
|
+
* Created: January 5, 2026
|
|
6
|
+
*
|
|
7
|
+
* Validates security best practices:
|
|
8
|
+
* - HARDCODED_SECRET: API keys, passwords, tokens in plaintext
|
|
9
|
+
* - HARDCODED_URL: Production URLs hardcoded (should use environment variables)
|
|
10
|
+
*
|
|
11
|
+
* Note: Security issues are flagged but NOT auto-fixable (per PM requirement)
|
|
12
|
+
*/
|
|
13
|
+
import { getL6Severity, blocksCertification } from '../config/l6-severity.js';
|
|
14
|
+
/**
|
|
15
|
+
* Patterns that indicate hardcoded secrets
|
|
16
|
+
*/
|
|
17
|
+
const SECRET_PATTERNS = [
|
|
18
|
+
// API keys
|
|
19
|
+
/api[_-]?key/i,
|
|
20
|
+
/apikey/i,
|
|
21
|
+
/access[_-]?key/i,
|
|
22
|
+
/secret[_-]?key/i,
|
|
23
|
+
// Tokens
|
|
24
|
+
/bearer[_-]?token/i,
|
|
25
|
+
/auth[_-]?token/i,
|
|
26
|
+
/access[_-]?token/i,
|
|
27
|
+
/refresh[_-]?token/i,
|
|
28
|
+
// Passwords
|
|
29
|
+
/password/i,
|
|
30
|
+
/passwd/i,
|
|
31
|
+
/pwd/i,
|
|
32
|
+
// Credentials
|
|
33
|
+
/credentials/i,
|
|
34
|
+
/client[_-]?secret/i,
|
|
35
|
+
/private[_-]?key/i,
|
|
36
|
+
// Common formats
|
|
37
|
+
/[a-f0-9]{32,}/i, // Long hex strings (API keys often use this format)
|
|
38
|
+
/sk_live_[a-zA-Z0-9]{24,}/i, // Stripe secret keys
|
|
39
|
+
/ghp_[a-zA-Z0-9]{36,}/i, // GitHub personal access tokens
|
|
40
|
+
];
|
|
41
|
+
/**
|
|
42
|
+
* Patterns that indicate production URLs
|
|
43
|
+
*/
|
|
44
|
+
const URL_PATTERNS = [
|
|
45
|
+
/https?:\/\/api\./i,
|
|
46
|
+
/https?:\/\/.*\.com/i,
|
|
47
|
+
/https?:\/\/.*\.net/i,
|
|
48
|
+
/https?:\/\/.*\.org/i,
|
|
49
|
+
/https?:\/\/.*\.io/i,
|
|
50
|
+
/https?:\/\/production\./i,
|
|
51
|
+
/https?:\/\/prod\./i,
|
|
52
|
+
];
|
|
53
|
+
/**
|
|
54
|
+
* Check if a value looks like a hardcoded secret
|
|
55
|
+
*/
|
|
56
|
+
function looksLikeSecret(key, value) {
|
|
57
|
+
if (typeof value !== 'string') {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
// Check if key name matches secret patterns
|
|
61
|
+
const keyMatchesPattern = SECRET_PATTERNS.some((pattern) => pattern.test(key));
|
|
62
|
+
// Check if value looks like a secret (long alphanumeric string)
|
|
63
|
+
const valueIsLongString = value.length > 20 && /^[a-zA-Z0-9_-]+$/.test(value);
|
|
64
|
+
// Check if value matches specific secret formats
|
|
65
|
+
const valueMatchesPattern = SECRET_PATTERNS.slice(-3).some((pattern) => pattern.test(value));
|
|
66
|
+
return keyMatchesPattern && (valueIsLongString || valueMatchesPattern);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if a value looks like a production URL
|
|
70
|
+
*/
|
|
71
|
+
function looksLikeProductionUrl(value) {
|
|
72
|
+
if (typeof value !== 'string') {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return URL_PATTERNS.some((pattern) => pattern.test(value));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Scan object for potential secrets and URLs
|
|
79
|
+
* Returns both errors (HARDCODED_SECRET) and warnings (HARDCODED_URL)
|
|
80
|
+
*/
|
|
81
|
+
function scanForSecrets(obj, path, nodeName, nodeType) {
|
|
82
|
+
const errors = [];
|
|
83
|
+
const warnings = [];
|
|
84
|
+
if (!obj || typeof obj !== 'object') {
|
|
85
|
+
return { errors, warnings };
|
|
86
|
+
}
|
|
87
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
88
|
+
const fullPath = path ? `${path}.${key}` : key;
|
|
89
|
+
// Check for hardcoded secrets (ERROR - critical security issue)
|
|
90
|
+
if (looksLikeSecret(key, value)) {
|
|
91
|
+
const code = 'HARDCODED_SECRET';
|
|
92
|
+
errors.push({
|
|
93
|
+
code: 'HARDCODED_SECRET',
|
|
94
|
+
message: `Possible hardcoded secret detected in "${fullPath}". Secrets should be stored in environment variables or credentials.`,
|
|
95
|
+
path: fullPath,
|
|
96
|
+
node_name: nodeName,
|
|
97
|
+
node_type: nodeType,
|
|
98
|
+
severity: getL6Severity(code),
|
|
99
|
+
blocks_certification: blocksCertification(code),
|
|
100
|
+
details: {
|
|
101
|
+
field_name: key,
|
|
102
|
+
value_length: typeof value === 'string' ? value.length : 0,
|
|
103
|
+
},
|
|
104
|
+
suggested_fix: {
|
|
105
|
+
id: `fix-secret-${nodeName}-${fullPath}`,
|
|
106
|
+
fix_type: 'add_error_handling', // Repurposed for security
|
|
107
|
+
confidence: 0.0, // Zero confidence - manual review required
|
|
108
|
+
auto_applicable: false,
|
|
109
|
+
description: `Move secret from "${fullPath}" to environment variable or credential`,
|
|
110
|
+
target_node: nodeName,
|
|
111
|
+
patch: {},
|
|
112
|
+
context: {
|
|
113
|
+
security_issue: 'hardcoded_secret',
|
|
114
|
+
recommendation: 'Use {{ $env.API_KEY }} or configure in credentials',
|
|
115
|
+
field: fullPath,
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
// Check for hardcoded production URLs (treated as error for checkHardcodedSecrets)
|
|
121
|
+
if (looksLikeProductionUrl(value)) {
|
|
122
|
+
const code = 'HARDCODED_URL';
|
|
123
|
+
errors.push({
|
|
124
|
+
code: 'HARDCODED_URL',
|
|
125
|
+
message: `Production URL hardcoded in "${fullPath}". URLs should be stored in environment variables.`,
|
|
126
|
+
path: fullPath,
|
|
127
|
+
node_name: nodeName,
|
|
128
|
+
node_type: nodeType,
|
|
129
|
+
severity: getL6Severity(code),
|
|
130
|
+
blocks_certification: blocksCertification(code),
|
|
131
|
+
details: {
|
|
132
|
+
url: typeof value === 'string' ? value.substring(0, 50) : '',
|
|
133
|
+
},
|
|
134
|
+
suggested_fix: {
|
|
135
|
+
id: `fix-url-${nodeName}-${fullPath}`,
|
|
136
|
+
fix_type: 'add_error_handling', // Repurposed for security
|
|
137
|
+
confidence: 0.0, // Zero confidence - manual review required
|
|
138
|
+
auto_applicable: false,
|
|
139
|
+
description: `Move URL from "${fullPath}" to environment variable`,
|
|
140
|
+
target_node: nodeName,
|
|
141
|
+
patch: {},
|
|
142
|
+
context: {
|
|
143
|
+
security_issue: 'hardcoded_url',
|
|
144
|
+
recommendation: 'Use {{ $env.API_URL }} instead of hardcoded URL',
|
|
145
|
+
field: fullPath,
|
|
146
|
+
current_url: typeof value === 'string' ? value.substring(0, 100) : '',
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Recursively check nested objects
|
|
152
|
+
if (typeof value === 'object' && value !== null) {
|
|
153
|
+
const nested = scanForSecrets(value, fullPath, nodeName, nodeType);
|
|
154
|
+
errors.push(...nested.errors);
|
|
155
|
+
warnings.push(...nested.warnings);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return { errors, warnings };
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Check 1: HARDCODED_SECRET (ERROR) and HARDCODED_URL (ERROR)
|
|
162
|
+
* Detect potential API keys, passwords, tokens in plaintext
|
|
163
|
+
*/
|
|
164
|
+
export function checkHardcodedSecrets(context) {
|
|
165
|
+
const { workflow } = context;
|
|
166
|
+
const errors = [];
|
|
167
|
+
// Guard: malformed workflow JSON should not crash L6.
|
|
168
|
+
if (!workflow.nodes || !Array.isArray(workflow.nodes)) {
|
|
169
|
+
return errors;
|
|
170
|
+
}
|
|
171
|
+
for (const node of workflow.nodes) {
|
|
172
|
+
const result = scanForSecrets(node.parameters, `nodes.${node.name}.parameters`, node.name, node.type);
|
|
173
|
+
errors.push(...result.errors);
|
|
174
|
+
}
|
|
175
|
+
return errors;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Check 2: HARDCODED_URL
|
|
179
|
+
* Detect production URLs that should be in environment variables
|
|
180
|
+
*
|
|
181
|
+
* Note: HARDCODED_URL is now detected as an error in checkHardcodedSecrets().
|
|
182
|
+
* This function is kept for backward compatibility but returns empty.
|
|
183
|
+
*/
|
|
184
|
+
export function checkHardcodedUrls(_context) {
|
|
185
|
+
// HARDCODED_URL is now returned as an error from checkHardcodedSecrets()
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Check 3: MISSING_WEBHOOK_AUTH
|
|
190
|
+
* Detect webhook triggers that accept mutating requests without authentication
|
|
191
|
+
*
|
|
192
|
+
* RAG-2.2.77: New pattern check
|
|
193
|
+
*
|
|
194
|
+
* Only warns for POST, PUT, DELETE, PATCH methods - GET is allowed without auth
|
|
195
|
+
*/
|
|
196
|
+
export function checkMissingWebhookAuth(context) {
|
|
197
|
+
const { workflow } = context;
|
|
198
|
+
const warnings = [];
|
|
199
|
+
// Guard: Ensure workflow.nodes exists
|
|
200
|
+
if (!workflow.nodes || !Array.isArray(workflow.nodes)) {
|
|
201
|
+
return warnings;
|
|
202
|
+
}
|
|
203
|
+
// Find webhook nodes
|
|
204
|
+
const webhooks = workflow.nodes.filter(n => n.type === 'n8n-nodes-base.webhook');
|
|
205
|
+
for (const webhook of webhooks) {
|
|
206
|
+
const auth = webhook.parameters?.authentication;
|
|
207
|
+
const rawHttpMethod = webhook.parameters?.httpMethod;
|
|
208
|
+
// httpMethod can be a string, array of strings, or undefined
|
|
209
|
+
// Normalize to array for consistent handling
|
|
210
|
+
const httpMethods = Array.isArray(rawHttpMethod)
|
|
211
|
+
? rawHttpMethod.filter((m) => typeof m === 'string')
|
|
212
|
+
: typeof rawHttpMethod === 'string'
|
|
213
|
+
? [rawHttpMethod]
|
|
214
|
+
: ['GET']; // Default to GET if not specified
|
|
215
|
+
// Only warn for mutating methods without auth
|
|
216
|
+
const mutatingMethods = ['POST', 'PUT', 'DELETE', 'PATCH'];
|
|
217
|
+
const hasMutatingMethod = httpMethods.some(m => mutatingMethods.includes(m.toUpperCase()));
|
|
218
|
+
if (hasMutatingMethod && (!auth || auth === 'none')) {
|
|
219
|
+
const mutatingMethodsUsed = httpMethods.filter(m => mutatingMethods.includes(m.toUpperCase()));
|
|
220
|
+
const methodDisplay = mutatingMethodsUsed.join(', ');
|
|
221
|
+
const code = 'MISSING_WEBHOOK_AUTH';
|
|
222
|
+
warnings.push({
|
|
223
|
+
code: 'MISSING_WEBHOOK_AUTH',
|
|
224
|
+
message: `Webhook "${webhook.name}" accepts ${methodDisplay} requests without authentication - potential security risk`,
|
|
225
|
+
node_name: webhook.name,
|
|
226
|
+
node_type: webhook.type,
|
|
227
|
+
severity: getL6Severity(code),
|
|
228
|
+
blocks_certification: blocksCertification(code),
|
|
229
|
+
details: {
|
|
230
|
+
http_method: methodDisplay,
|
|
231
|
+
http_methods: mutatingMethodsUsed,
|
|
232
|
+
current_auth: auth || 'none',
|
|
233
|
+
},
|
|
234
|
+
suggested_fix: {
|
|
235
|
+
id: `fix-webhook-auth-${webhook.name}-${Date.now()}`,
|
|
236
|
+
fix_type: 'add_auth',
|
|
237
|
+
confidence: 0.7,
|
|
238
|
+
auto_applicable: false,
|
|
239
|
+
description: 'Add authentication (Basic Auth, Header Auth, or JWT)',
|
|
240
|
+
target_node: webhook.name,
|
|
241
|
+
patch: {},
|
|
242
|
+
context: {
|
|
243
|
+
http_method: methodDisplay,
|
|
244
|
+
suggested_auth_options: ['basicAuth', 'headerAuth', 'jwt'],
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return warnings;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Run all security checks in parallel
|
|
254
|
+
*
|
|
255
|
+
* RAG-2.2.77: Added MISSING_WEBHOOK_AUTH check
|
|
256
|
+
*/
|
|
257
|
+
export async function checkSecurity(context) {
|
|
258
|
+
if (context.options?.skipSecurityCheck) {
|
|
259
|
+
return { errors: [], warnings: [] };
|
|
260
|
+
}
|
|
261
|
+
const startTime = performance.now();
|
|
262
|
+
// Security checks scan the same data, but split into errors vs warnings for gating policy.
|
|
263
|
+
// RAG-2.2.77: Added webhookAuthWarnings
|
|
264
|
+
const errors = checkHardcodedSecrets(context);
|
|
265
|
+
const urlWarnings = checkHardcodedUrls(context);
|
|
266
|
+
const webhookAuthWarnings = checkMissingWebhookAuth(context);
|
|
267
|
+
const duration = performance.now() - startTime;
|
|
268
|
+
return {
|
|
269
|
+
errors,
|
|
270
|
+
warnings: [...urlWarnings, ...webhookAuthWarnings],
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/validation/l6-checks/security.ts"],"names":[],"mappings":"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"}
|