mcp-wordpress 2.5.1 → 2.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/package.json +1 -1
  2. package/dist/src/cache/CacheInvalidation.d.ts +0 -120
  3. package/dist/src/cache/CacheInvalidation.d.ts.map +0 -1
  4. package/dist/src/cache/CacheInvalidation.js +0 -355
  5. package/dist/src/cache/CacheInvalidation.js.map +0 -1
  6. package/dist/src/cache/CacheManager.d.ts +0 -149
  7. package/dist/src/cache/CacheManager.d.ts.map +0 -1
  8. package/dist/src/cache/CacheManager.js +0 -326
  9. package/dist/src/cache/CacheManager.js.map +0 -1
  10. package/dist/src/cache/HttpCacheWrapper.d.ts +0 -122
  11. package/dist/src/cache/HttpCacheWrapper.d.ts.map +0 -1
  12. package/dist/src/cache/HttpCacheWrapper.js +0 -283
  13. package/dist/src/cache/HttpCacheWrapper.js.map +0 -1
  14. package/dist/src/cache/index.d.ts +0 -12
  15. package/dist/src/cache/index.d.ts.map +0 -1
  16. package/dist/src/cache/index.js +0 -9
  17. package/dist/src/cache/index.js.map +0 -1
  18. package/dist/src/client/CachedWordPressClient.d.ts +0 -174
  19. package/dist/src/client/CachedWordPressClient.d.ts.map +0 -1
  20. package/dist/src/client/CachedWordPressClient.js +0 -345
  21. package/dist/src/client/CachedWordPressClient.js.map +0 -1
  22. package/dist/src/client/MockWordPressClient.d.ts +0 -56
  23. package/dist/src/client/MockWordPressClient.d.ts.map +0 -1
  24. package/dist/src/client/MockWordPressClient.js +0 -371
  25. package/dist/src/client/MockWordPressClient.js.map +0 -1
  26. package/dist/src/client/api.d.ts +0 -235
  27. package/dist/src/client/api.d.ts.map +0 -1
  28. package/dist/src/client/api.js +0 -896
  29. package/dist/src/client/api.js.map +0 -1
  30. package/dist/src/client/auth.d.ts +0 -121
  31. package/dist/src/client/auth.d.ts.map +0 -1
  32. package/dist/src/client/auth.js +0 -429
  33. package/dist/src/client/auth.js.map +0 -1
  34. package/dist/src/client/managers/AuthenticationManager.d.ts +0 -92
  35. package/dist/src/client/managers/AuthenticationManager.d.ts.map +0 -1
  36. package/dist/src/client/managers/AuthenticationManager.js +0 -369
  37. package/dist/src/client/managers/AuthenticationManager.js.map +0 -1
  38. package/dist/src/client/managers/BaseManager.d.ts +0 -22
  39. package/dist/src/client/managers/BaseManager.d.ts.map +0 -1
  40. package/dist/src/client/managers/BaseManager.js +0 -53
  41. package/dist/src/client/managers/BaseManager.js.map +0 -1
  42. package/dist/src/client/managers/RequestManager.d.ts +0 -47
  43. package/dist/src/client/managers/RequestManager.d.ts.map +0 -1
  44. package/dist/src/client/managers/RequestManager.js +0 -193
  45. package/dist/src/client/managers/RequestManager.js.map +0 -1
  46. package/dist/src/client/managers/index.d.ts +0 -8
  47. package/dist/src/client/managers/index.d.ts.map +0 -1
  48. package/dist/src/client/managers/index.js +0 -8
  49. package/dist/src/client/managers/index.js.map +0 -1
  50. package/dist/src/config/Config.d.ts +0 -155
  51. package/dist/src/config/Config.d.ts.map +0 -1
  52. package/dist/src/config/Config.js +0 -215
  53. package/dist/src/config/Config.js.map +0 -1
  54. package/dist/src/config/ConfigurationSchema.d.ts +0 -281
  55. package/dist/src/config/ConfigurationSchema.d.ts.map +0 -1
  56. package/dist/src/config/ConfigurationSchema.js +0 -205
  57. package/dist/src/config/ConfigurationSchema.js.map +0 -1
  58. package/dist/src/config/ServerConfiguration.d.ts +0 -47
  59. package/dist/src/config/ServerConfiguration.d.ts.map +0 -1
  60. package/dist/src/config/ServerConfiguration.js +0 -255
  61. package/dist/src/config/ServerConfiguration.js.map +0 -1
  62. package/dist/src/docs/DocumentationGenerator.d.ts +0 -185
  63. package/dist/src/docs/DocumentationGenerator.d.ts.map +0 -1
  64. package/dist/src/docs/DocumentationGenerator.js +0 -777
  65. package/dist/src/docs/DocumentationGenerator.js.map +0 -1
  66. package/dist/src/docs/MarkdownFormatter.d.ts +0 -84
  67. package/dist/src/docs/MarkdownFormatter.d.ts.map +0 -1
  68. package/dist/src/docs/MarkdownFormatter.js +0 -458
  69. package/dist/src/docs/MarkdownFormatter.js.map +0 -1
  70. package/dist/src/docs/index.d.ts +0 -8
  71. package/dist/src/docs/index.d.ts.map +0 -1
  72. package/dist/src/docs/index.js +0 -7
  73. package/dist/src/docs/index.js.map +0 -1
  74. package/dist/src/dxt-entry.d.ts +0 -6
  75. package/dist/src/dxt-entry.d.ts.map +0 -1
  76. package/dist/src/dxt-entry.js +0 -39
  77. package/dist/src/dxt-entry.js.map +0 -1
  78. package/dist/src/index.d.ts +0 -18
  79. package/dist/src/index.d.ts.map +0 -1
  80. package/dist/src/index.js +0 -143
  81. package/dist/src/index.js.map +0 -1
  82. package/dist/src/performance/MetricsCollector.d.ts +0 -145
  83. package/dist/src/performance/MetricsCollector.d.ts.map +0 -1
  84. package/dist/src/performance/MetricsCollector.js +0 -368
  85. package/dist/src/performance/MetricsCollector.js.map +0 -1
  86. package/dist/src/performance/PerformanceAnalytics.d.ts +0 -168
  87. package/dist/src/performance/PerformanceAnalytics.d.ts.map +0 -1
  88. package/dist/src/performance/PerformanceAnalytics.js +0 -570
  89. package/dist/src/performance/PerformanceAnalytics.js.map +0 -1
  90. package/dist/src/performance/PerformanceMonitor.d.ts +0 -203
  91. package/dist/src/performance/PerformanceMonitor.d.ts.map +0 -1
  92. package/dist/src/performance/PerformanceMonitor.js +0 -478
  93. package/dist/src/performance/PerformanceMonitor.js.map +0 -1
  94. package/dist/src/performance/index.d.ts +0 -11
  95. package/dist/src/performance/index.d.ts.map +0 -1
  96. package/dist/src/performance/index.js +0 -8
  97. package/dist/src/performance/index.js.map +0 -1
  98. package/dist/src/security/AISecurityScanner.d.ts +0 -176
  99. package/dist/src/security/AISecurityScanner.d.ts.map +0 -1
  100. package/dist/src/security/AISecurityScanner.js +0 -655
  101. package/dist/src/security/AISecurityScanner.js.map +0 -1
  102. package/dist/src/security/AutomatedRemediation.d.ts +0 -146
  103. package/dist/src/security/AutomatedRemediation.d.ts.map +0 -1
  104. package/dist/src/security/AutomatedRemediation.js +0 -566
  105. package/dist/src/security/AutomatedRemediation.js.map +0 -1
  106. package/dist/src/security/InputValidator.d.ts +0 -219
  107. package/dist/src/security/InputValidator.d.ts.map +0 -1
  108. package/dist/src/security/InputValidator.js +0 -295
  109. package/dist/src/security/InputValidator.js.map +0 -1
  110. package/dist/src/security/SecurityCIPipeline.d.ts +0 -213
  111. package/dist/src/security/SecurityCIPipeline.d.ts.map +0 -1
  112. package/dist/src/security/SecurityCIPipeline.js +0 -693
  113. package/dist/src/security/SecurityCIPipeline.js.map +0 -1
  114. package/dist/src/security/SecurityConfig.d.ts +0 -129
  115. package/dist/src/security/SecurityConfig.d.ts.map +0 -1
  116. package/dist/src/security/SecurityConfig.js +0 -266
  117. package/dist/src/security/SecurityConfig.js.map +0 -1
  118. package/dist/src/security/SecurityConfigManager.d.ts +0 -294
  119. package/dist/src/security/SecurityConfigManager.d.ts.map +0 -1
  120. package/dist/src/security/SecurityConfigManager.js +0 -558
  121. package/dist/src/security/SecurityConfigManager.js.map +0 -1
  122. package/dist/src/security/SecurityMonitoring.d.ts +0 -245
  123. package/dist/src/security/SecurityMonitoring.d.ts.map +0 -1
  124. package/dist/src/security/SecurityMonitoring.js +0 -598
  125. package/dist/src/security/SecurityMonitoring.js.map +0 -1
  126. package/dist/src/security/SecurityReviewer.d.ts +0 -168
  127. package/dist/src/security/SecurityReviewer.d.ts.map +0 -1
  128. package/dist/src/security/SecurityReviewer.js +0 -686
  129. package/dist/src/security/SecurityReviewer.js.map +0 -1
  130. package/dist/src/security/index.d.ts +0 -183
  131. package/dist/src/security/index.d.ts.map +0 -1
  132. package/dist/src/security/index.js +0 -218
  133. package/dist/src/security/index.js.map +0 -1
  134. package/dist/src/server/ConnectionTester.d.ts +0 -32
  135. package/dist/src/server/ConnectionTester.d.ts.map +0 -1
  136. package/dist/src/server/ConnectionTester.js +0 -135
  137. package/dist/src/server/ConnectionTester.js.map +0 -1
  138. package/dist/src/server/ToolRegistry.d.ts +0 -50
  139. package/dist/src/server/ToolRegistry.d.ts.map +0 -1
  140. package/dist/src/server/ToolRegistry.js +0 -219
  141. package/dist/src/server/ToolRegistry.js.map +0 -1
  142. package/dist/src/server.d.ts +0 -7
  143. package/dist/src/server.d.ts.map +0 -1
  144. package/dist/src/server.js +0 -7
  145. package/dist/src/server.js.map +0 -1
  146. package/dist/src/tools/BaseToolManager.d.ts +0 -62
  147. package/dist/src/tools/BaseToolManager.d.ts.map +0 -1
  148. package/dist/src/tools/BaseToolManager.js +0 -195
  149. package/dist/src/tools/BaseToolManager.js.map +0 -1
  150. package/dist/src/tools/auth.d.ts +0 -50
  151. package/dist/src/tools/auth.d.ts.map +0 -1
  152. package/dist/src/tools/auth.js +0 -133
  153. package/dist/src/tools/auth.js.map +0 -1
  154. package/dist/src/tools/cache.d.ts +0 -260
  155. package/dist/src/tools/cache.d.ts.map +0 -1
  156. package/dist/src/tools/cache.js +0 -232
  157. package/dist/src/tools/cache.js.map +0 -1
  158. package/dist/src/tools/comments.d.ts +0 -33
  159. package/dist/src/tools/comments.d.ts.map +0 -1
  160. package/dist/src/tools/comments.js +0 -235
  161. package/dist/src/tools/comments.js.map +0 -1
  162. package/dist/src/tools/index.d.ts +0 -11
  163. package/dist/src/tools/index.d.ts.map +0 -1
  164. package/dist/src/tools/index.js +0 -11
  165. package/dist/src/tools/index.js.map +0 -1
  166. package/dist/src/tools/media.d.ts +0 -70
  167. package/dist/src/tools/media.d.ts.map +0 -1
  168. package/dist/src/tools/media.js +0 -248
  169. package/dist/src/tools/media.js.map +0 -1
  170. package/dist/src/tools/pages.d.ts +0 -32
  171. package/dist/src/tools/pages.d.ts.map +0 -1
  172. package/dist/src/tools/pages.js +0 -215
  173. package/dist/src/tools/pages.js.map +0 -1
  174. package/dist/src/tools/performance.d.ts +0 -73
  175. package/dist/src/tools/performance.d.ts.map +0 -1
  176. package/dist/src/tools/performance.js +0 -922
  177. package/dist/src/tools/performance.js.map +0 -1
  178. package/dist/src/tools/posts/PostHandlers.d.ts +0 -46
  179. package/dist/src/tools/posts/PostHandlers.d.ts.map +0 -1
  180. package/dist/src/tools/posts/PostHandlers.js +0 -400
  181. package/dist/src/tools/posts/PostHandlers.js.map +0 -1
  182. package/dist/src/tools/posts/PostToolDefinitions.d.ts +0 -37
  183. package/dist/src/tools/posts/PostToolDefinitions.d.ts.map +0 -1
  184. package/dist/src/tools/posts/PostToolDefinitions.js +0 -236
  185. package/dist/src/tools/posts/PostToolDefinitions.js.map +0 -1
  186. package/dist/src/tools/posts/index.d.ts +0 -138
  187. package/dist/src/tools/posts/index.d.ts.map +0 -1
  188. package/dist/src/tools/posts/index.js +0 -163
  189. package/dist/src/tools/posts/index.js.map +0 -1
  190. package/dist/src/tools/posts.d.ts +0 -15
  191. package/dist/src/tools/posts.d.ts.map +0 -1
  192. package/dist/src/tools/posts.js +0 -16
  193. package/dist/src/tools/posts.js.map +0 -1
  194. package/dist/src/tools/site.d.ts +0 -32
  195. package/dist/src/tools/site.d.ts.map +0 -1
  196. package/dist/src/tools/site.js +0 -234
  197. package/dist/src/tools/site.js.map +0 -1
  198. package/dist/src/tools/taxonomies.d.ts +0 -36
  199. package/dist/src/tools/taxonomies.d.ts.map +0 -1
  200. package/dist/src/tools/taxonomies.js +0 -286
  201. package/dist/src/tools/taxonomies.js.map +0 -1
  202. package/dist/src/tools/users.d.ts +0 -33
  203. package/dist/src/tools/users.d.ts.map +0 -1
  204. package/dist/src/tools/users.js +0 -308
  205. package/dist/src/tools/users.js.map +0 -1
  206. package/dist/src/types/client.d.ts +0 -223
  207. package/dist/src/types/client.d.ts.map +0 -1
  208. package/dist/src/types/client.js +0 -97
  209. package/dist/src/types/client.js.map +0 -1
  210. package/dist/src/types/enhanced.d.ts +0 -237
  211. package/dist/src/types/enhanced.d.ts.map +0 -1
  212. package/dist/src/types/enhanced.js +0 -49
  213. package/dist/src/types/enhanced.js.map +0 -1
  214. package/dist/src/types/index.d.ts +0 -160
  215. package/dist/src/types/index.d.ts.map +0 -1
  216. package/dist/src/types/index.js +0 -14
  217. package/dist/src/types/index.js.map +0 -1
  218. package/dist/src/types/mcp.d.ts +0 -178
  219. package/dist/src/types/mcp.d.ts.map +0 -1
  220. package/dist/src/types/mcp.js +0 -7
  221. package/dist/src/types/mcp.js.map +0 -1
  222. package/dist/src/types/requests.d.ts +0 -322
  223. package/dist/src/types/requests.d.ts.map +0 -1
  224. package/dist/src/types/requests.js +0 -8
  225. package/dist/src/types/requests.js.map +0 -1
  226. package/dist/src/types/tools.d.ts +0 -506
  227. package/dist/src/types/tools.d.ts.map +0 -1
  228. package/dist/src/types/tools.js +0 -8
  229. package/dist/src/types/tools.js.map +0 -1
  230. package/dist/src/types/wordpress.d.ts +0 -471
  231. package/dist/src/types/wordpress.d.ts.map +0 -1
  232. package/dist/src/types/wordpress.js +0 -14
  233. package/dist/src/types/wordpress.js.map +0 -1
  234. package/dist/src/utils/debug.d.ts +0 -71
  235. package/dist/src/utils/debug.d.ts.map +0 -1
  236. package/dist/src/utils/debug.js +0 -235
  237. package/dist/src/utils/debug.js.map +0 -1
  238. package/dist/src/utils/enhancedError.d.ts +0 -61
  239. package/dist/src/utils/enhancedError.d.ts.map +0 -1
  240. package/dist/src/utils/enhancedError.js +0 -221
  241. package/dist/src/utils/enhancedError.js.map +0 -1
  242. package/dist/src/utils/error.d.ts +0 -17
  243. package/dist/src/utils/error.d.ts.map +0 -1
  244. package/dist/src/utils/error.js +0 -108
  245. package/dist/src/utils/error.js.map +0 -1
  246. package/dist/src/utils/logger.d.ts +0 -106
  247. package/dist/src/utils/logger.d.ts.map +0 -1
  248. package/dist/src/utils/logger.js +0 -280
  249. package/dist/src/utils/logger.js.map +0 -1
  250. package/dist/src/utils/streaming.d.ts +0 -104
  251. package/dist/src/utils/streaming.d.ts.map +0 -1
  252. package/dist/src/utils/streaming.js +0 -331
  253. package/dist/src/utils/streaming.js.map +0 -1
  254. package/dist/src/utils/toolWrapper.d.ts +0 -42
  255. package/dist/src/utils/toolWrapper.d.ts.map +0 -1
  256. package/dist/src/utils/toolWrapper.js +0 -101
  257. package/dist/src/utils/toolWrapper.js.map +0 -1
  258. package/dist/src/utils/validation/core.d.ts +0 -21
  259. package/dist/src/utils/validation/core.d.ts.map +0 -1
  260. package/dist/src/utils/validation/core.js +0 -71
  261. package/dist/src/utils/validation/core.js.map +0 -1
  262. package/dist/src/utils/validation/index.d.ts +0 -25
  263. package/dist/src/utils/validation/index.d.ts.map +0 -1
  264. package/dist/src/utils/validation/index.js +0 -29
  265. package/dist/src/utils/validation/index.js.map +0 -1
  266. package/dist/src/utils/validation/network.d.ts +0 -19
  267. package/dist/src/utils/validation/network.d.ts.map +0 -1
  268. package/dist/src/utils/validation/network.js +0 -93
  269. package/dist/src/utils/validation/network.js.map +0 -1
  270. package/dist/src/utils/validation/rateLimit.d.ts +0 -21
  271. package/dist/src/utils/validation/rateLimit.d.ts.map +0 -1
  272. package/dist/src/utils/validation/rateLimit.js +0 -43
  273. package/dist/src/utils/validation/rateLimit.js.map +0 -1
  274. package/dist/src/utils/validation/security.d.ts +0 -29
  275. package/dist/src/utils/validation/security.d.ts.map +0 -1
  276. package/dist/src/utils/validation/security.js +0 -327
  277. package/dist/src/utils/validation/security.js.map +0 -1
  278. package/dist/src/utils/validation/wordpress.d.ts +0 -31
  279. package/dist/src/utils/validation/wordpress.d.ts.map +0 -1
  280. package/dist/src/utils/validation/wordpress.js +0 -146
  281. package/dist/src/utils/validation/wordpress.js.map +0 -1
  282. package/dist/src/utils/validation.d.ts +0 -15
  283. package/dist/src/utils/validation.d.ts.map +0 -1
  284. package/dist/src/utils/validation.js +0 -27
  285. package/dist/src/utils/validation.js.map +0 -1
  286. package/dist/tests/vitest.setup.d.ts +0 -6
  287. package/dist/tests/vitest.setup.d.ts.map +0 -1
  288. package/dist/tests/vitest.setup.js +0 -39
  289. package/dist/tests/vitest.setup.js.map +0 -1
@@ -1,566 +0,0 @@
1
- /**
2
- * Automated Security Remediation System
3
- * Provides intelligent automated fixes for detected vulnerabilities
4
- */
5
- import * as fs from "fs/promises";
6
- import * as path from "path";
7
- import { SecurityUtils } from "./SecurityConfig.js";
8
- import { SecurityValidationError } from "./InputValidator.js";
9
- import { LoggerFactory } from "../utils/logger.js";
10
- /**
11
- * Automated remediation patterns for common vulnerabilities
12
- */
13
- const REMEDIATION_PATTERNS = {
14
- sqlInjection: {
15
- pattern: /(SELECT|INSERT|UPDATE|DELETE).*?[\'\"].*?[\'\"].*?(WHERE|FROM|INTO)/gi,
16
- replacement: "// TODO: Replace with parameterized query",
17
- confidence: 0.7,
18
- },
19
- xssSimple: {
20
- pattern: /innerHTML\s*=\s*[^;]+;?/gi,
21
- replacement: "textContent = $1; // XSS remediation",
22
- confidence: 0.8,
23
- },
24
- pathTraversal: {
25
- pattern: /\.\.[\/\\]/g,
26
- replacement: "",
27
- confidence: 0.9,
28
- },
29
- credentialExposure: {
30
- pattern: /(password|secret|key|token)\s*[:=]\s*['"][^'"]+['"]/gi,
31
- replacement: "$1 = process.env.$1?.toUpperCase() || '[REQUIRED]'",
32
- confidence: 0.85,
33
- },
34
- httpToHttps: {
35
- pattern: /http:\/\//gi,
36
- replacement: "https://",
37
- confidence: 0.95,
38
- },
39
- insecureConfig: {
40
- pattern: /(ssl|secure|verify)\s*[:=]\s*false/gi,
41
- replacement: "$1: true",
42
- confidence: 0.9,
43
- },
44
- };
45
- /**
46
- * Automated Security Remediation Engine
47
- */
48
- export class AutomatedRemediation {
49
- logger = LoggerFactory.security();
50
- remediationHistory = [];
51
- backupDirectory = "security-backups";
52
- /**
53
- * Create remediation plan for scan results
54
- */
55
- async createRemediationPlan(scanResult) {
56
- const planId = SecurityUtils.generateSecureToken(16);
57
- const remediableVulns = scanResult.vulnerabilities.filter((v) => v.remediation.automated);
58
- this.logger.info("Creating remediation plan", {
59
- planId,
60
- remediableVulnerabilities: remediableVulns.length,
61
- totalVulnerabilities: scanResult.vulnerabilities.length,
62
- });
63
- const actions = [];
64
- let estimatedDuration = 0;
65
- let maxRiskLevel = "low";
66
- for (const vulnerability of remediableVulns) {
67
- const action = await this.createRemediationAction(vulnerability);
68
- if (action) {
69
- actions.push(action);
70
- estimatedDuration += 30; // 30 seconds per action estimate
71
- // Update risk level
72
- if (vulnerability.severity === "critical" || vulnerability.severity === "high") {
73
- maxRiskLevel = "high";
74
- }
75
- else if (vulnerability.severity === "medium" && maxRiskLevel === "low") {
76
- maxRiskLevel = "medium";
77
- }
78
- }
79
- }
80
- const requiresApproval = maxRiskLevel === "high" || actions.length > 10;
81
- return {
82
- planId,
83
- vulnerabilities: remediableVulns,
84
- actions,
85
- estimatedDuration,
86
- riskLevel: maxRiskLevel,
87
- requiresApproval,
88
- };
89
- }
90
- /**
91
- * Create remediation action for a specific vulnerability
92
- */
93
- async createRemediationAction(vulnerability) {
94
- const actionId = SecurityUtils.generateSecureToken(12);
95
- switch (vulnerability.type) {
96
- case "SQL Injection":
97
- return this.createSQLInjectionRemediation(actionId, vulnerability);
98
- case "Cross-Site Scripting (XSS)":
99
- return this.createXSSRemediation(actionId, vulnerability);
100
- case "Path Traversal":
101
- return this.createPathTraversalRemediation(actionId, vulnerability);
102
- case "Credential Exposure":
103
- return this.createCredentialExposureRemediation(actionId, vulnerability);
104
- case "Insecure Configuration":
105
- return this.createConfigRemediation(actionId, vulnerability);
106
- case "Information Disclosure":
107
- return this.createInfoDisclosureRemediation(actionId, vulnerability);
108
- default:
109
- return null;
110
- }
111
- }
112
- /**
113
- * Create SQL injection remediation
114
- */
115
- createSQLInjectionRemediation(actionId, vulnerability) {
116
- return {
117
- id: actionId,
118
- type: "replace",
119
- target: {
120
- file: vulnerability.location.file,
121
- line: vulnerability.location.line,
122
- pattern: REMEDIATION_PATTERNS.sqlInjection.pattern,
123
- },
124
- replacement: {
125
- content: "// SECURITY FIX: Replace with parameterized query to prevent SQL injection\n" +
126
- "// Example: db.query('SELECT * FROM users WHERE id = ?', [userId])",
127
- },
128
- backup: {
129
- enabled: true,
130
- },
131
- validation: {
132
- test: 'grep -n "SELECT.*WHERE" $file | wc -l',
133
- expected: 0,
134
- },
135
- };
136
- }
137
- /**
138
- * Create XSS remediation
139
- */
140
- createXSSRemediation(actionId, vulnerability) {
141
- return {
142
- id: actionId,
143
- type: "replace",
144
- target: {
145
- file: vulnerability.location.file,
146
- line: vulnerability.location.line,
147
- pattern: /innerHTML\s*=\s*([^;]+);?/gi,
148
- },
149
- replacement: {
150
- content: "textContent = $1; // XSS remediation: use textContent instead of innerHTML",
151
- },
152
- backup: {
153
- enabled: true,
154
- },
155
- validation: {
156
- test: 'grep -n "innerHTML" $file | wc -l',
157
- expected: 0,
158
- },
159
- };
160
- }
161
- /**
162
- * Create path traversal remediation
163
- */
164
- createPathTraversalRemediation(actionId, vulnerability) {
165
- return {
166
- id: actionId,
167
- type: "replace",
168
- target: {
169
- file: vulnerability.location.file,
170
- line: vulnerability.location.line,
171
- pattern: /\.\.[\/\\]/g,
172
- },
173
- replacement: {
174
- content: "", // Remove path traversal sequences
175
- },
176
- backup: {
177
- enabled: true,
178
- },
179
- validation: {
180
- test: 'grep -n "\\.\\./" $file | wc -l',
181
- expected: 0,
182
- },
183
- };
184
- }
185
- /**
186
- * Create credential exposure remediation
187
- */
188
- createCredentialExposureRemediation(actionId, vulnerability) {
189
- return {
190
- id: actionId,
191
- type: "replace",
192
- target: {
193
- file: vulnerability.location.file,
194
- line: vulnerability.location.line,
195
- pattern: /(password|secret|key|token)\s*[:=]\s*['"][^'"]+['"]/gi,
196
- },
197
- replacement: {
198
- content: "// SECURITY FIX: Credential moved to environment variable\n" +
199
- "// Add to .env: $1=your_actual_value\n" +
200
- "$1: process.env.$1 || (() => { throw new Error('$1 environment variable required'); })()",
201
- },
202
- backup: {
203
- enabled: true,
204
- },
205
- validation: {
206
- test: 'grep -n "password.*=.*[\'\\"]" $file | wc -l',
207
- expected: 0,
208
- },
209
- };
210
- }
211
- /**
212
- * Create configuration remediation
213
- */
214
- createConfigRemediation(actionId, vulnerability) {
215
- return {
216
- id: actionId,
217
- type: "replace",
218
- target: {
219
- file: vulnerability.location.file,
220
- line: vulnerability.location.line,
221
- pattern: /(ssl|secure|verify)\s*[:=]\s*false/gi,
222
- },
223
- replacement: {
224
- content: "$1: true // Security fix: enabled secure configuration",
225
- },
226
- backup: {
227
- enabled: true,
228
- },
229
- validation: {
230
- test: 'grep -n "ssl.*false" $file | wc -l',
231
- expected: 0,
232
- },
233
- };
234
- }
235
- /**
236
- * Create information disclosure remediation
237
- */
238
- createInfoDisclosureRemediation(actionId, vulnerability) {
239
- return {
240
- id: actionId,
241
- type: "replace",
242
- target: {
243
- file: vulnerability.location.file,
244
- line: vulnerability.location.line,
245
- pattern: /(debug|trace|error)\s*[:=]\s*true/gi,
246
- },
247
- replacement: {
248
- content: "$1: process.env.NODE_ENV !== 'production' // Security fix: disable in production",
249
- },
250
- backup: {
251
- enabled: true,
252
- },
253
- validation: {
254
- test: 'grep -n "debug.*true" $file | wc -l',
255
- expected: 0,
256
- },
257
- };
258
- }
259
- /**
260
- * Execute remediation plan
261
- */
262
- async executeRemediationPlan(plan, options = {}) {
263
- this.logger.info("Executing remediation plan", {
264
- planId: plan.planId,
265
- actionCount: plan.actions.length,
266
- dryRun: options.dryRun,
267
- });
268
- if (options.dryRun) {
269
- this.logger.info("Running in dry-run mode - no changes will be made");
270
- return this.simulateRemediationActions(plan.actions);
271
- }
272
- const results = [];
273
- // Ensure backup directory exists
274
- await this.ensureBackupDirectory();
275
- for (const action of plan.actions) {
276
- try {
277
- this.logger.debug("Executing remediation action", {
278
- actionId: action.id,
279
- actionType: action.type,
280
- targetFile: action.target.file,
281
- });
282
- const result = await this.executeRemediationAction(action);
283
- results.push(result);
284
- if (!result.success) {
285
- this.logger.error("Remediation action failed", {
286
- actionId: action.id,
287
- details: result.details,
288
- });
289
- }
290
- }
291
- catch (error) {
292
- this.logger.error("Remediation action threw error", {
293
- actionId: action.id,
294
- error: String(error),
295
- });
296
- results.push({
297
- vulnerabilityId: action.id,
298
- success: false,
299
- action: action.type,
300
- details: `Error: ${error instanceof Error ? error.message : String(error)}`,
301
- timestamp: new Date(),
302
- });
303
- }
304
- }
305
- this.remediationHistory.push(...results);
306
- const successCount = results.filter((r) => r.success).length;
307
- this.logger.info("Remediation plan completed", {
308
- planId: plan.planId,
309
- successCount,
310
- totalActions: results.length,
311
- successRate: `${Math.round((successCount / results.length) * 100)}%`,
312
- });
313
- return results;
314
- }
315
- /**
316
- * Execute a single remediation action
317
- */
318
- async executeRemediationAction(action) {
319
- const startTime = Date.now();
320
- try {
321
- let backupPath;
322
- // Create backup if enabled
323
- if (action.backup.enabled && action.target.file) {
324
- backupPath = await this.createBackup(action.target.file);
325
- }
326
- // Execute the action based on type
327
- switch (action.type) {
328
- case "replace":
329
- await this.executeReplaceAction(action);
330
- break;
331
- case "insert":
332
- await this.executeInsertAction(action);
333
- break;
334
- case "delete":
335
- await this.executeDeleteAction(action);
336
- break;
337
- case "config":
338
- await this.executeConfigAction(action);
339
- break;
340
- case "file":
341
- await this.executeFileAction(action);
342
- break;
343
- default:
344
- throw new Error(`Unknown action type: ${action.type}`);
345
- }
346
- // Validate the fix if validation is provided
347
- let validationResult;
348
- if (action.validation && action.target.file) {
349
- validationResult = await this.validateRemediation(action);
350
- }
351
- return {
352
- vulnerabilityId: action.id,
353
- success: true,
354
- action: action.type,
355
- details: `Remediation completed successfully in ${Date.now() - startTime}ms`,
356
- timestamp: new Date(),
357
- backupPath,
358
- validationResult,
359
- };
360
- }
361
- catch (error) {
362
- return {
363
- vulnerabilityId: action.id,
364
- success: false,
365
- action: action.type,
366
- details: `Remediation failed: ${error instanceof Error ? error.message : String(error)}`,
367
- timestamp: new Date(),
368
- };
369
- }
370
- }
371
- /**
372
- * Execute replace action
373
- */
374
- async executeReplaceAction(action) {
375
- if (!action.target.file || !action.target.pattern || !action.replacement.content) {
376
- throw new Error("Replace action missing required fields");
377
- }
378
- const content = await fs.readFile(action.target.file, "utf-8");
379
- const updatedContent = content.replace(action.target.pattern, action.replacement.content);
380
- if (content === updatedContent) {
381
- throw new Error("No changes made - pattern not found");
382
- }
383
- await fs.writeFile(action.target.file, updatedContent, "utf-8");
384
- }
385
- /**
386
- * Execute insert action
387
- */
388
- async executeInsertAction(action) {
389
- if (!action.target.file || !action.replacement.content) {
390
- throw new Error("Insert action missing required fields");
391
- }
392
- const content = await fs.readFile(action.target.file, "utf-8");
393
- const lines = content.split("\n");
394
- const insertIndex = action.target.line ? Math.max(0, action.target.line - 1) : lines.length;
395
- lines.splice(insertIndex, 0, action.replacement.content);
396
- await fs.writeFile(action.target.file, lines.join("\n"), "utf-8");
397
- }
398
- /**
399
- * Execute delete action
400
- */
401
- async executeDeleteAction(action) {
402
- if (!action.target.file) {
403
- throw new Error("Delete action missing file");
404
- }
405
- if (action.target.line) {
406
- // Delete specific line
407
- const content = await fs.readFile(action.target.file, "utf-8");
408
- const lines = content.split("\n");
409
- if (action.target.line > 0 && action.target.line <= lines.length) {
410
- lines.splice(action.target.line - 1, 1);
411
- await fs.writeFile(action.target.file, lines.join("\n"), "utf-8");
412
- }
413
- }
414
- else if (action.target.pattern) {
415
- // Delete pattern matches
416
- const content = await fs.readFile(action.target.file, "utf-8");
417
- const updatedContent = content.replace(action.target.pattern, "");
418
- await fs.writeFile(action.target.file, updatedContent, "utf-8");
419
- }
420
- else {
421
- throw new Error("Delete action missing target specification");
422
- }
423
- }
424
- /**
425
- * Execute config action
426
- */
427
- async executeConfigAction(action) {
428
- if (!action.target.file || !action.replacement.config) {
429
- throw new Error("Config action missing required fields");
430
- }
431
- const content = await fs.readFile(action.target.file, "utf-8");
432
- const config = JSON.parse(content);
433
- // Merge configuration changes
434
- Object.assign(config, action.replacement.config);
435
- await fs.writeFile(action.target.file, JSON.stringify(config, null, 2), "utf-8");
436
- }
437
- /**
438
- * Execute file action
439
- */
440
- async executeFileAction(action) {
441
- if (!action.replacement.action) {
442
- throw new Error("File action missing action specification");
443
- }
444
- switch (action.replacement.action) {
445
- case "delete":
446
- if (action.target.file) {
447
- await fs.unlink(action.target.file);
448
- }
449
- break;
450
- case "create":
451
- if (action.target.file && action.replacement.content) {
452
- await fs.writeFile(action.target.file, action.replacement.content, "utf-8");
453
- }
454
- break;
455
- default:
456
- throw new Error(`Unknown file action: ${action.replacement.action}`);
457
- }
458
- }
459
- /**
460
- * Create backup of file
461
- */
462
- async createBackup(filePath) {
463
- const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
464
- const backupPath = path.join(this.backupDirectory, `${path.basename(filePath)}.${timestamp}.backup`);
465
- const content = await fs.readFile(filePath, "utf-8");
466
- await fs.writeFile(backupPath, content, "utf-8");
467
- this.logger.debug("Created backup file", { backupPath });
468
- return backupPath;
469
- }
470
- /**
471
- * Ensure backup directory exists
472
- */
473
- async ensureBackupDirectory() {
474
- try {
475
- await fs.access(this.backupDirectory);
476
- }
477
- catch {
478
- await fs.mkdir(this.backupDirectory, { recursive: true });
479
- this.logger.info("Created backup directory", { directory: this.backupDirectory });
480
- }
481
- }
482
- /**
483
- * Validate remediation
484
- */
485
- async validateRemediation(action) {
486
- if (!action.validation?.test || !action.target.file) {
487
- return true; // No validation specified
488
- }
489
- try {
490
- // This is a simplified validation - in practice you'd run the test command
491
- const content = await fs.readFile(action.target.file, "utf-8");
492
- // Simple pattern-based validation
493
- if (action.target.pattern) {
494
- const matches = content.match(action.target.pattern);
495
- return (matches?.length || 0) === (action.validation.expected || 0);
496
- }
497
- return true;
498
- }
499
- catch (error) {
500
- this.logger.warn("Validation failed for action", {
501
- actionId: action.id,
502
- error: String(error),
503
- });
504
- return false;
505
- }
506
- }
507
- /**
508
- * Simulate remediation actions for dry run
509
- */
510
- async simulateRemediationActions(actions) {
511
- const results = [];
512
- for (const action of actions) {
513
- results.push({
514
- vulnerabilityId: action.id,
515
- success: true,
516
- action: `${action.type} (simulated)`,
517
- details: `Would ${action.type} in ${action.target.file || "configuration"}`,
518
- timestamp: new Date(),
519
- });
520
- }
521
- return results;
522
- }
523
- /**
524
- * Get remediation history
525
- */
526
- getRemediationHistory() {
527
- return [...this.remediationHistory];
528
- }
529
- /**
530
- * Rollback remediation using backup
531
- */
532
- async rollbackRemediation(backupPath, targetFile) {
533
- try {
534
- const backupContent = await fs.readFile(backupPath, "utf-8");
535
- await fs.writeFile(targetFile, backupContent, "utf-8");
536
- this.logger.info("Rolled back file from backup", {
537
- targetFile,
538
- backupPath,
539
- });
540
- }
541
- catch (error) {
542
- throw new SecurityValidationError(`Rollback failed: ${error instanceof Error ? error.message : String(error)}`);
543
- }
544
- }
545
- /**
546
- * Clean up old backups
547
- */
548
- async cleanupBackups(maxAge = 7 * 24 * 60 * 60 * 1000) {
549
- try {
550
- const files = await fs.readdir(this.backupDirectory);
551
- const now = Date.now();
552
- for (const file of files) {
553
- const filePath = path.join(this.backupDirectory, file);
554
- const stats = await fs.stat(filePath);
555
- if (now - stats.mtime.getTime() > maxAge) {
556
- await fs.unlink(filePath);
557
- this.logger.debug("Cleaned up old backup", { file });
558
- }
559
- }
560
- }
561
- catch (error) {
562
- this.logger.warn("Backup cleanup failed", { error: String(error) });
563
- }
564
- }
565
- }
566
- //# sourceMappingURL=AutomatedRemediation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AutomatedRemediation.js","sourceRoot":"","sources":["../../../src/security/AutomatedRemediation.ts"],"names":[],"mappings":"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"}