@ibm/ibmi-mcp-server 0.2.0 → 0.3.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.
Files changed (197) hide show
  1. package/README.md +140 -0
  2. package/dist/config/index.d.ts +2 -0
  3. package/dist/config/index.d.ts.map +1 -1
  4. package/dist/config/index.js +14 -0
  5. package/dist/config/index.js.map +1 -1
  6. package/dist/config/resolver.d.ts.map +1 -1
  7. package/dist/config/resolver.js.map +1 -1
  8. package/dist/ibmi-mcp-server/tools/executeSql.tool.d.ts +80 -0
  9. package/dist/ibmi-mcp-server/tools/executeSql.tool.d.ts.map +1 -0
  10. package/dist/ibmi-mcp-server/tools/executeSql.tool.js +356 -0
  11. package/dist/ibmi-mcp-server/tools/executeSql.tool.js.map +1 -0
  12. package/dist/ibmi-mcp-server/tools/generateSql.tool.d.ts +36 -0
  13. package/dist/ibmi-mcp-server/tools/generateSql.tool.d.ts.map +1 -0
  14. package/dist/ibmi-mcp-server/tools/generateSql.tool.js +281 -0
  15. package/dist/ibmi-mcp-server/tools/generateSql.tool.js.map +1 -0
  16. package/dist/ibmi-mcp-server/tools/index.d.ts +85 -0
  17. package/dist/ibmi-mcp-server/tools/index.d.ts.map +1 -0
  18. package/dist/ibmi-mcp-server/tools/index.js +21 -0
  19. package/dist/ibmi-mcp-server/tools/index.js.map +1 -0
  20. package/dist/ibmi-mcp-server/utils/config/configParser.d.ts +9 -0
  21. package/dist/ibmi-mcp-server/utils/config/configParser.d.ts.map +1 -1
  22. package/dist/ibmi-mcp-server/utils/config/configParser.js +58 -0
  23. package/dist/ibmi-mcp-server/utils/config/configParser.js.map +1 -1
  24. package/dist/ibmi-mcp-server/utils/config/toolDefinitions.d.ts +4 -4
  25. package/dist/ibmi-mcp-server/utils/config/toolDefinitions.d.ts.map +1 -1
  26. package/dist/ibmi-mcp-server/utils/config/toolDefinitions.js +7 -8
  27. package/dist/ibmi-mcp-server/utils/config/toolDefinitions.js.map +1 -1
  28. package/dist/ibmi-mcp-server/utils/config/toolFactory.d.ts +0 -8
  29. package/dist/ibmi-mcp-server/utils/config/toolFactory.d.ts.map +1 -1
  30. package/dist/ibmi-mcp-server/utils/config/toolFactory.js +0 -31
  31. package/dist/ibmi-mcp-server/utils/config/toolFactory.js.map +1 -1
  32. package/dist/ibmi-mcp-server/utils/config/toolsetManager.d.ts +1 -1
  33. package/dist/ibmi-mcp-server/utils/config/toolsetManager.d.ts.map +1 -1
  34. package/dist/ibmi-mcp-server/utils/config/toolsetManager.js +2 -2
  35. package/dist/ibmi-mcp-server/utils/config/toolsetManager.js.map +1 -1
  36. package/dist/ibmi-mcp-server/utils/language/document.d.ts +26 -0
  37. package/dist/ibmi-mcp-server/utils/language/document.d.ts.map +1 -0
  38. package/dist/ibmi-mcp-server/utils/language/document.js +318 -0
  39. package/dist/ibmi-mcp-server/utils/language/document.js.map +1 -0
  40. package/dist/ibmi-mcp-server/utils/language/statement.d.ts +43 -0
  41. package/dist/ibmi-mcp-server/utils/language/statement.d.ts.map +1 -0
  42. package/dist/ibmi-mcp-server/utils/language/statement.js +796 -0
  43. package/dist/ibmi-mcp-server/utils/language/statement.js.map +1 -0
  44. package/dist/ibmi-mcp-server/utils/language/tokens.d.ts +32 -0
  45. package/dist/ibmi-mcp-server/utils/language/tokens.d.ts.map +1 -0
  46. package/dist/ibmi-mcp-server/utils/language/tokens.js +532 -0
  47. package/dist/ibmi-mcp-server/utils/language/tokens.js.map +1 -0
  48. package/dist/ibmi-mcp-server/utils/language/types.d.ts +138 -0
  49. package/dist/ibmi-mcp-server/utils/language/types.d.ts.map +1 -0
  50. package/dist/ibmi-mcp-server/utils/language/types.js +93 -0
  51. package/dist/ibmi-mcp-server/utils/language/types.js.map +1 -0
  52. package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.d.ts +48 -0
  53. package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.d.ts.map +1 -0
  54. package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.js +93 -0
  55. package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.js.map +1 -0
  56. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.d.ts +35 -59
  57. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.d.ts.map +1 -1
  58. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js +108 -288
  59. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js.map +1 -1
  60. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.d.ts +54 -0
  61. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.d.ts.map +1 -0
  62. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.js +91 -0
  63. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.js.map +1 -0
  64. package/dist/mcp-server/tools/index.d.ts +13 -2
  65. package/dist/mcp-server/tools/index.d.ts.map +1 -1
  66. package/dist/mcp-server/tools/index.js +29 -9
  67. package/dist/mcp-server/tools/index.js.map +1 -1
  68. package/dist/mcp-server/tools/utils/index.d.ts +7 -0
  69. package/dist/mcp-server/tools/utils/index.d.ts.map +1 -0
  70. package/dist/mcp-server/tools/utils/index.js +7 -0
  71. package/dist/mcp-server/tools/utils/index.js.map +1 -0
  72. package/dist/mcp-server/tools/utils/tool-factory.d.ts +129 -0
  73. package/dist/mcp-server/tools/utils/tool-factory.d.ts.map +1 -0
  74. package/dist/mcp-server/tools/utils/tool-factory.js +179 -0
  75. package/dist/mcp-server/tools/utils/tool-factory.js.map +1 -0
  76. package/dist/mcp-server/tools/utils/types.d.ts +117 -0
  77. package/dist/mcp-server/tools/utils/types.d.ts.map +1 -0
  78. package/dist/mcp-server/tools/utils/types.js +11 -0
  79. package/dist/mcp-server/tools/utils/types.js.map +1 -0
  80. package/dist/mcp-server/transports/core/cleanupTransformStream.d.ts +26 -0
  81. package/dist/mcp-server/transports/core/cleanupTransformStream.d.ts.map +1 -0
  82. package/dist/mcp-server/transports/core/cleanupTransformStream.js +60 -0
  83. package/dist/mcp-server/transports/core/cleanupTransformStream.js.map +1 -0
  84. package/dist/mcp-server/transports/core/statefulTransportManager.d.ts +1 -1
  85. package/dist/mcp-server/transports/core/statefulTransportManager.d.ts.map +1 -1
  86. package/dist/mcp-server/transports/core/statefulTransportManager.js +50 -40
  87. package/dist/mcp-server/transports/core/statefulTransportManager.js.map +1 -1
  88. package/dist/mcp-server/transports/core/statelessTransportManager.d.ts +2 -13
  89. package/dist/mcp-server/transports/core/statelessTransportManager.d.ts.map +1 -1
  90. package/dist/mcp-server/transports/core/statelessTransportManager.js +35 -62
  91. package/dist/mcp-server/transports/core/statelessTransportManager.js.map +1 -1
  92. package/dist/mcp-server/transports/core/transportRequest.d.ts +1 -2
  93. package/dist/mcp-server/transports/core/transportRequest.d.ts.map +1 -1
  94. package/dist/mcp-server/transports/http/mcpTransportMiddleware.d.ts.map +1 -1
  95. package/dist/mcp-server/transports/http/mcpTransportMiddleware.js +1 -3
  96. package/dist/mcp-server/transports/http/mcpTransportMiddleware.js.map +1 -1
  97. package/package.json +21 -22
  98. package/dist/ibmi-mcp-server/tools/executeSql/index.d.ts +0 -9
  99. package/dist/ibmi-mcp-server/tools/executeSql/index.d.ts.map +0 -1
  100. package/dist/ibmi-mcp-server/tools/executeSql/index.js +0 -9
  101. package/dist/ibmi-mcp-server/tools/executeSql/index.js.map +0 -1
  102. package/dist/ibmi-mcp-server/tools/executeSql/logic.d.ts +0 -51
  103. package/dist/ibmi-mcp-server/tools/executeSql/logic.d.ts.map +0 -1
  104. package/dist/ibmi-mcp-server/tools/executeSql/logic.js +0 -179
  105. package/dist/ibmi-mcp-server/tools/executeSql/logic.js.map +0 -1
  106. package/dist/ibmi-mcp-server/tools/executeSql/registration.d.ts +0 -52
  107. package/dist/ibmi-mcp-server/tools/executeSql/registration.d.ts.map +0 -1
  108. package/dist/ibmi-mcp-server/tools/executeSql/registration.js +0 -161
  109. package/dist/ibmi-mcp-server/tools/executeSql/registration.js.map +0 -1
  110. package/dist/ibmi-mcp-server/tools/generateSql/index.d.ts +0 -13
  111. package/dist/ibmi-mcp-server/tools/generateSql/index.d.ts.map +0 -1
  112. package/dist/ibmi-mcp-server/tools/generateSql/index.js +0 -13
  113. package/dist/ibmi-mcp-server/tools/generateSql/index.js.map +0 -1
  114. package/dist/ibmi-mcp-server/tools/generateSql/logic.d.ts +0 -64
  115. package/dist/ibmi-mcp-server/tools/generateSql/logic.d.ts.map +0 -1
  116. package/dist/ibmi-mcp-server/tools/generateSql/logic.js +0 -190
  117. package/dist/ibmi-mcp-server/tools/generateSql/logic.js.map +0 -1
  118. package/dist/ibmi-mcp-server/tools/generateSql/registration.d.ts +0 -18
  119. package/dist/ibmi-mcp-server/tools/generateSql/registration.d.ts.map +0 -1
  120. package/dist/ibmi-mcp-server/tools/generateSql/registration.js +0 -64
  121. package/dist/ibmi-mcp-server/tools/generateSql/registration.js.map +0 -1
  122. package/dist/mcp-server/tools/catFactFetcher/index.d.ts +0 -8
  123. package/dist/mcp-server/tools/catFactFetcher/index.d.ts.map +0 -1
  124. package/dist/mcp-server/tools/catFactFetcher/index.js +0 -8
  125. package/dist/mcp-server/tools/catFactFetcher/index.js.map +0 -1
  126. package/dist/mcp-server/tools/catFactFetcher/logic.d.ts +0 -52
  127. package/dist/mcp-server/tools/catFactFetcher/logic.d.ts.map +0 -1
  128. package/dist/mcp-server/tools/catFactFetcher/logic.js +0 -95
  129. package/dist/mcp-server/tools/catFactFetcher/logic.js.map +0 -1
  130. package/dist/mcp-server/tools/catFactFetcher/registration.d.ts +0 -9
  131. package/dist/mcp-server/tools/catFactFetcher/registration.d.ts.map +0 -1
  132. package/dist/mcp-server/tools/catFactFetcher/registration.js +0 -43
  133. package/dist/mcp-server/tools/catFactFetcher/registration.js.map +0 -1
  134. package/dist/mcp-server/tools/echoTool/index.d.ts +0 -13
  135. package/dist/mcp-server/tools/echoTool/index.d.ts.map +0 -1
  136. package/dist/mcp-server/tools/echoTool/index.js +0 -13
  137. package/dist/mcp-server/tools/echoTool/index.js.map +0 -1
  138. package/dist/mcp-server/tools/echoTool/logic.d.ts +0 -69
  139. package/dist/mcp-server/tools/echoTool/logic.d.ts.map +0 -1
  140. package/dist/mcp-server/tools/echoTool/logic.js +0 -119
  141. package/dist/mcp-server/tools/echoTool/logic.js.map +0 -1
  142. package/dist/mcp-server/tools/echoTool/registration.d.ts +0 -9
  143. package/dist/mcp-server/tools/echoTool/registration.d.ts.map +0 -1
  144. package/dist/mcp-server/tools/echoTool/registration.js +0 -45
  145. package/dist/mcp-server/tools/echoTool/registration.js.map +0 -1
  146. package/dist/mcp-server/tools/imageTest/index.d.ts +0 -7
  147. package/dist/mcp-server/tools/imageTest/index.d.ts.map +0 -1
  148. package/dist/mcp-server/tools/imageTest/index.js +0 -7
  149. package/dist/mcp-server/tools/imageTest/index.js.map +0 -1
  150. package/dist/mcp-server/tools/imageTest/logic.d.ts +0 -27
  151. package/dist/mcp-server/tools/imageTest/logic.d.ts.map +0 -1
  152. package/dist/mcp-server/tools/imageTest/logic.js +0 -44
  153. package/dist/mcp-server/tools/imageTest/logic.js.map +0 -1
  154. package/dist/mcp-server/tools/imageTest/registration.d.ts +0 -9
  155. package/dist/mcp-server/tools/imageTest/registration.d.ts.map +0 -1
  156. package/dist/mcp-server/tools/imageTest/registration.js +0 -49
  157. package/dist/mcp-server/tools/imageTest/registration.js.map +0 -1
  158. package/dist/mcp-server/tools/utils/tool-utils.d.ts +0 -43
  159. package/dist/mcp-server/tools/utils/tool-utils.d.ts.map +0 -1
  160. package/dist/mcp-server/tools/utils/tool-utils.js +0 -44
  161. package/dist/mcp-server/tools/utils/tool-utils.js.map +0 -1
  162. package/dist/mcp-server/transports/core/headerUtils.d.ts +0 -27
  163. package/dist/mcp-server/transports/core/headerUtils.d.ts.map +0 -1
  164. package/dist/mcp-server/transports/core/headerUtils.js +0 -53
  165. package/dist/mcp-server/transports/core/headerUtils.js.map +0 -1
  166. package/dist/mcp-server/transports/core/honoNodeBridge.d.ts +0 -77
  167. package/dist/mcp-server/transports/core/honoNodeBridge.d.ts.map +0 -1
  168. package/dist/mcp-server/transports/core/honoNodeBridge.js +0 -150
  169. package/dist/mcp-server/transports/core/honoNodeBridge.js.map +0 -1
  170. package/dist/services/duck-db/duckDBConnectionManager.d.ts +0 -55
  171. package/dist/services/duck-db/duckDBConnectionManager.d.ts.map +0 -1
  172. package/dist/services/duck-db/duckDBConnectionManager.js +0 -184
  173. package/dist/services/duck-db/duckDBConnectionManager.js.map +0 -1
  174. package/dist/services/duck-db/duckDBQueryExecutor.d.ts +0 -18
  175. package/dist/services/duck-db/duckDBQueryExecutor.d.ts.map +0 -1
  176. package/dist/services/duck-db/duckDBQueryExecutor.js +0 -115
  177. package/dist/services/duck-db/duckDBQueryExecutor.js.map +0 -1
  178. package/dist/services/duck-db/duckDBService.d.ts +0 -27
  179. package/dist/services/duck-db/duckDBService.d.ts.map +0 -1
  180. package/dist/services/duck-db/duckDBService.js +0 -151
  181. package/dist/services/duck-db/duckDBService.js.map +0 -1
  182. package/dist/services/duck-db/types.d.ts +0 -135
  183. package/dist/services/duck-db/types.d.ts.map +0 -1
  184. package/dist/services/duck-db/types.js +0 -6
  185. package/dist/services/duck-db/types.js.map +0 -1
  186. package/dist/services/llm-providers/openRouterProvider.d.ts +0 -36
  187. package/dist/services/llm-providers/openRouterProvider.d.ts.map +0 -1
  188. package/dist/services/llm-providers/openRouterProvider.js +0 -235
  189. package/dist/services/llm-providers/openRouterProvider.js.map +0 -1
  190. package/dist/services/supabase/supabaseClient.d.ts +0 -25
  191. package/dist/services/supabase/supabaseClient.d.ts.map +0 -1
  192. package/dist/services/supabase/supabaseClient.js +0 -68
  193. package/dist/services/supabase/supabaseClient.js.map +0 -1
  194. package/dist/storage/duckdbExample.d.ts +0 -8
  195. package/dist/storage/duckdbExample.d.ts.map +0 -1
  196. package/dist/storage/duckdbExample.js +0 -197
  197. package/dist/storage/duckdbExample.js.map +0 -1
@@ -1,13 +1,14 @@
1
1
  /**
2
2
  * @fileoverview SQL Security Validator for validating SQL queries against security policies
3
- * Provides both AST-based and regex-based validation with comprehensive security checks
3
+ * Uses vscode-db2i tokenizer for precise validation and regex patterns as fallback
4
4
  *
5
5
  * @module src/utils/security/sqlSecurityValidator
6
6
  */
7
- import pkg from "node-sql-parser";
8
- const { Parser } = pkg;
9
7
  import { logger } from "../../../utils/internal/logger.js";
10
8
  import { JsonRpcErrorCode, McpError } from "../../../types-global/errors.js";
9
+ import { IbmiSqlParser } from "./ibmiSqlParser.js";
10
+ import SQLTokeniser from "../../utils/language/tokens.js";
11
+ import { SqlSecurityValidatorFallback } from "./sqlSecurityValidatorFallback.js";
11
12
  /**
12
13
  * Dangerous SQL operations that should be blocked in read-only mode
13
14
  */
@@ -16,7 +17,6 @@ export const DANGEROUS_OPERATIONS = [
16
17
  "INSERT",
17
18
  "UPDATE",
18
19
  "DELETE",
19
- "REPLACE",
20
20
  "MERGE",
21
21
  "TRUNCATE",
22
22
  // Schema operations
@@ -60,45 +60,79 @@ export const DANGEROUS_OPERATIONS = [
60
60
  "QCMDEXC",
61
61
  "SQL_EXECUTE_IMMEDIATE",
62
62
  ];
63
- /**
64
- * Dangerous SQL functions that should be monitored/blocked
65
- */
66
- export const DANGEROUS_FUNCTIONS = [
67
- "SYSTEM",
68
- "QCMDEXC",
69
- "SQL_EXECUTE_IMMEDIATE",
70
- "SQLCMD",
71
- "LOAD_EXTENSION",
72
- "EXEC",
73
- "EXECUTE_IMMEDIATE",
74
- "EVAL",
75
- "CONCAT",
76
- "CHAR",
77
- "VARCHAR", // Can be used for dynamic SQL construction
78
- ];
79
63
  /**
80
64
  * Dangerous SQL patterns that should be detected
81
65
  */
82
66
  export const DANGEROUS_PATTERNS = [
83
- // Dynamic SQL patterns
84
- /\bCONCAT\s*\(/i,
85
- /\b(CHAR|VARCHAR|CLOB)\s*\(/i,
86
- // System function patterns
87
- /\bSYSTEM\s*\(/i,
88
- /\bLOAD_EXTENSION\s*\(/i,
89
- /\bQCMDEXC\s*\(/i,
90
- // Comment-based bypass attempts
91
- /\/\*.*?(DROP|DELETE|INSERT|UPDATE).*?\*\//i,
92
- // Multiple statement patterns
67
+ // Multiple statement patterns (SQL injection via statement chaining)
93
68
  /;\s*(DROP|DELETE|INSERT|UPDATE|CREATE|ALTER)/i,
94
- // Union-based attacks
69
+ // Union-based attacks (SQL injection via UNION with dangerous operations)
95
70
  /\bUNION\s+(ALL\s+)?\s*\(\s*(DROP|DELETE|INSERT|UPDATE)/i,
71
+ // REPLACE statement (MySQL-specific write operation)
72
+ /\bREPLACE\s+INTO\b/i,
96
73
  ];
97
74
  /**
98
75
  * SQL Security Validator class for comprehensive SQL security validation
76
+ * Uses token-based validation with vscode-db2i tokenizer as primary method
99
77
  */
100
78
  export class SqlSecurityValidator {
101
- static parser = new Parser();
79
+ static tokeniser = new SQLTokeniser();
80
+ /**
81
+ * Truncate query string for error messages and logging
82
+ * @param query - SQL query to truncate
83
+ * @param maxLength - Maximum length before truncation (default: 100)
84
+ * @returns Truncated query with ellipsis if needed
85
+ * @private
86
+ */
87
+ static truncateQuery(query, maxLength = 100) {
88
+ return query.length > maxLength
89
+ ? query.substring(0, maxLength) + "..."
90
+ : query;
91
+ }
92
+ /**
93
+ * Throw validation error with standardized format
94
+ * @param message - Error message
95
+ * @param violations - List of violations
96
+ * @param context - Additional context for error
97
+ * @param query - SQL query being validated
98
+ * @throws McpError with ValidationError code
99
+ * @private
100
+ */
101
+ static throwValidationError(message, violations, context, query) {
102
+ throw new McpError(JsonRpcErrorCode.ValidationError, message, {
103
+ violations,
104
+ ...context,
105
+ query: this.truncateQuery(query),
106
+ });
107
+ }
108
+ /**
109
+ * Validate forbidden keywords using token-based approach
110
+ * This method uses the vscode-db2i tokenizer to precisely identify SQL keywords
111
+ * @param query - SQL query to validate
112
+ * @param forbiddenKeywords - List of forbidden keywords
113
+ * @returns Security validation result
114
+ * @private
115
+ */
116
+ static validateForbiddenKeywordsToken(query, forbiddenKeywords) {
117
+ const tokens = this.tokeniser.tokenise(query);
118
+ const violations = [];
119
+ // Use Set for O(1) lookup performance
120
+ const forbiddenSet = new Set(forbiddenKeywords.map(kw => kw.toUpperCase()));
121
+ for (const token of tokens) {
122
+ // Skip string literals - only check actual SQL keywords
123
+ if (token.type === "string")
124
+ continue;
125
+ const value = token.value?.toUpperCase();
126
+ if (value && forbiddenSet.has(value)) {
127
+ violations.push(`Forbidden keyword: ${value}`);
128
+ }
129
+ }
130
+ return {
131
+ isValid: violations.length === 0,
132
+ violations,
133
+ validationMethod: "combined",
134
+ };
135
+ }
102
136
  /**
103
137
  * Validate SQL query against security configuration
104
138
  * @param query - SQL query to validate
@@ -137,12 +171,12 @@ export class SqlSecurityValidator {
137
171
  throw new McpError(JsonRpcErrorCode.ValidationError, `Query exceeds maximum length of ${maxLength} characters`, {
138
172
  queryLength: query.length,
139
173
  maxLength,
140
- query: query.substring(0, 100) + (query.length > 100 ? "..." : ""),
174
+ query: this.truncateQuery(query),
141
175
  });
142
176
  }
143
177
  }
144
178
  /**
145
- * Validate forbidden keywords using both AST and regex approaches
179
+ * Validate forbidden keywords using token-based approach with regex fallback
146
180
  * @param query - SQL query to validate
147
181
  * @param securityConfig - Security configuration
148
182
  * @param context - Request context for logging
@@ -153,274 +187,60 @@ export class SqlSecurityValidator {
153
187
  securityConfig.forbiddenKeywords.length === 0) {
154
188
  return;
155
189
  }
156
- // Try AST-based validation first
157
- const astResult = this.validateForbiddenKeywordsAST(query, securityConfig.forbiddenKeywords, context);
158
- if (!astResult.isValid) {
159
- throw new McpError(JsonRpcErrorCode.ValidationError, `Forbidden keywords detected: ${astResult.violations.join(", ")}`, {
160
- violations: astResult.violations,
161
- forbiddenKeywords: securityConfig.forbiddenKeywords,
162
- query: query.substring(0, 100) + (query.length > 100 ? "..." : ""),
163
- });
164
- }
165
- // Fallback to regex validation
166
- const regexResult = this.validateForbiddenKeywordsRegex(query, securityConfig.forbiddenKeywords);
167
- if (!regexResult.isValid) {
168
- throw new McpError(JsonRpcErrorCode.ValidationError, `Forbidden keywords detected: ${regexResult.violations.join(", ")}`, {
169
- violations: regexResult.violations,
170
- forbiddenKeywords: securityConfig.forbiddenKeywords,
171
- query: query.substring(0, 100) + (query.length > 100 ? "..." : ""),
172
- });
173
- }
174
- }
175
- /**
176
- * Validate read-only restrictions using comprehensive validation
177
- * @param query - SQL query to validate
178
- * @param context - Request context for logging
179
- * @private
180
- */
181
- static validateReadOnlyRestrictions(query, context) {
182
- // Try AST-based validation first (more reliable)
183
- const astResult = this.validateQueryAST(query, context);
184
- if (!astResult.isValid) {
185
- throw new McpError(JsonRpcErrorCode.ValidationError, `Write operations detected: ${astResult.violations.join(", ")}`, {
186
- violations: astResult.violations,
187
- readOnly: true,
188
- query: query.substring(0, 100) + (query.length > 100 ? "..." : ""),
189
- });
190
- }
191
- // Fallback to regex validation for additional coverage
192
- const regexResult = this.validateQueryRegex(query, context);
193
- if (!regexResult.isValid) {
194
- throw new McpError(JsonRpcErrorCode.ValidationError, `Write operations detected: ${regexResult.violations.join(", ")}`, {
195
- violations: regexResult.violations,
196
- readOnly: true,
197
- query: query.substring(0, 100) + (query.length > 100 ? "..." : ""),
198
- });
199
- }
200
- }
201
- /**
202
- * Validate SQL query using AST parsing
203
- * @param query - SQL query to validate
204
- * @param context - Request context for logging
205
- * @private
206
- */
207
- static validateQueryAST(query, context) {
208
- const violations = [];
209
190
  try {
210
- const ast = this.parser.astify(query, { database: "mysql" });
211
- logger.debug({
212
- ...context,
213
- astType: Array.isArray(ast) ? "multiple" : "single",
214
- statementCount: Array.isArray(ast) ? ast.length : 1,
215
- }, "SQL AST parsed successfully");
216
- const statements = Array.isArray(ast) ? ast : [ast];
217
- for (const statement of statements) {
218
- if (!statement || typeof statement !== "object")
219
- continue;
220
- const objStmt = statement;
221
- const stmtType = String(objStmt.type || "").toUpperCase();
222
- // 1. Check top-level statement type
223
- if (stmtType &&
224
- DANGEROUS_OPERATIONS.includes(stmtType)) {
225
- violations.push(`Dangerous statement type: ${stmtType}`);
226
- }
227
- // 2. Check for dangerous functions anywhere in the AST
228
- const dangerousFunctions = this.findDangerousFunctionsInAST(statement);
229
- if (dangerousFunctions.length > 0) {
230
- violations.push(...dangerousFunctions.map((f) => `Dangerous function: ${f}`));
231
- }
232
- // 3. Check for UNION-based attacks
233
- if (this.hasUnionWithDangerousStatements(statement)) {
234
- violations.push("UNION with dangerous statements detected");
235
- }
236
- }
237
- return {
238
- isValid: violations.length === 0,
239
- violations,
240
- validationMethod: "ast",
241
- };
242
- }
243
- catch (parseError) {
244
- logger.warning({
245
- ...context,
246
- error: parseError instanceof Error
247
- ? parseError.message
248
- : String(parseError),
249
- queryLength: query.length,
250
- }, "SQL AST parsing failed, will use regex validation only");
251
- return {
252
- isValid: true, // Let regex validation handle it
253
- violations: [],
254
- validationMethod: "ast",
255
- };
256
- }
257
- }
258
- /**
259
- * Validate SQL query using regex patterns
260
- * @param query - SQL query to validate
261
- * @param _context - Request context for logging (unused but kept for consistency)
262
- * @private
263
- */
264
- static validateQueryRegex(query, _context) {
265
- const violations = [];
266
- // Check for dangerous operations
267
- for (const operation of DANGEROUS_OPERATIONS) {
268
- const pattern = new RegExp(`\\b${operation}\\b`, "i");
269
- if (pattern.test(query)) {
270
- violations.push(`Write operation '${operation}' detected`);
271
- }
272
- }
273
- // Check for dangerous patterns
274
- for (const pattern of DANGEROUS_PATTERNS) {
275
- if (pattern.test(query)) {
276
- violations.push(`Dangerous pattern detected: ${pattern.source}`);
191
+ // Try token-based validation first (more precise)
192
+ const tokenResult = this.validateForbiddenKeywordsToken(query, securityConfig.forbiddenKeywords);
193
+ if (!tokenResult.isValid) {
194
+ this.throwValidationError(`Forbidden keywords detected: ${tokenResult.violations.join(", ")}`, tokenResult.violations, {
195
+ forbiddenKeywords: securityConfig.forbiddenKeywords,
196
+ validatedBy: "token",
197
+ }, query);
277
198
  }
278
- }
279
- // Check for suspicious function calls
280
- for (const func of DANGEROUS_FUNCTIONS) {
281
- const pattern = new RegExp(`\\b${func}\\s*\\(`, "i");
282
- if (pattern.test(query)) {
283
- violations.push(`Suspicious function '${func}' detected`);
199
+ logger.debug({ ...context, validatedBy: "token" }, "Forbidden keywords validation passed");
200
+ }
201
+ catch (tokenError) {
202
+ // If tokenization fails, fall back to regex validation
203
+ logger.debug({ ...context, error: String(tokenError) }, "Token validation failed, falling back to regex");
204
+ const regexResult = SqlSecurityValidatorFallback.validateForbiddenKeywords(query, securityConfig.forbiddenKeywords, context);
205
+ if (!regexResult.isValid) {
206
+ this.throwValidationError(`Forbidden keywords detected: ${regexResult.violations.join(", ")}`, regexResult.violations, {
207
+ forbiddenKeywords: securityConfig.forbiddenKeywords,
208
+ validatedBy: "regex-fallback",
209
+ }, query);
284
210
  }
285
211
  }
286
- return {
287
- isValid: violations.length === 0,
288
- violations,
289
- validationMethod: "regex",
290
- };
291
212
  }
292
213
  /**
293
- * Validate forbidden keywords using AST parsing
214
+ * Validate read-only restrictions using IBM i parser with regex fallback
294
215
  * @param query - SQL query to validate
295
- * @param forbiddenKeywords - List of forbidden keywords
296
216
  * @param context - Request context for logging
297
217
  * @private
298
218
  */
299
- static validateForbiddenKeywordsAST(query, forbiddenKeywords, context) {
300
- const violations = [];
301
- try {
302
- const ast = this.parser.astify(query, { database: "mysql" });
303
- const statements = Array.isArray(ast) ? ast : [ast];
304
- for (const statement of statements) {
305
- const foundKeywords = this.findForbiddenKeywordsInAST(statement, forbiddenKeywords);
306
- violations.push(...foundKeywords.map((k) => `Forbidden keyword: ${k}`));
219
+ static validateReadOnlyRestrictions(query, context) {
220
+ // Try IBM i parser first (understands IBM i syntax and uses vscode-db2i)
221
+ const ibmiResult = IbmiSqlParser.parseQuery(query, context);
222
+ if (ibmiResult.success) {
223
+ // If IBM i parser successfully validated, use its results
224
+ if (!ibmiResult.isReadOnly) {
225
+ this.throwValidationError(`Write operations detected: ${ibmiResult.violations.join(", ")}`, ibmiResult.violations, {
226
+ readOnly: true,
227
+ validatedBy: "ibmi-vscode",
228
+ }, query);
307
229
  }
308
- }
309
- catch (parseError) {
310
230
  logger.debug({
311
231
  ...context,
312
- error: parseError instanceof Error
313
- ? parseError.message
314
- : String(parseError),
315
- }, "AST parsing failed for forbidden keyword validation");
316
- }
317
- return {
318
- isValid: violations.length === 0,
319
- violations,
320
- validationMethod: "ast",
321
- };
322
- }
323
- /**
324
- * Validate forbidden keywords using regex patterns
325
- * @param query - SQL query to validate
326
- * @param forbiddenKeywords - List of forbidden keywords
327
- * @private
328
- */
329
- static validateForbiddenKeywordsRegex(query, forbiddenKeywords) {
330
- const violations = [];
331
- for (const keyword of forbiddenKeywords) {
332
- const pattern = new RegExp(`\\b${keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`, "i");
333
- if (pattern.test(query)) {
334
- violations.push(`Forbidden keyword: ${keyword}`);
335
- }
336
- }
337
- return {
338
- isValid: violations.length === 0,
339
- violations,
340
- validationMethod: "regex",
341
- };
342
- }
343
- /**
344
- * Find dangerous functions anywhere in the AST
345
- * @param node - AST node to analyze
346
- * @private
347
- */
348
- static findDangerousFunctionsInAST(node) {
349
- const violations = [];
350
- if (!node || typeof node !== "object")
351
- return violations;
352
- const objNode = node;
353
- // Check if this node is a function call
354
- if (objNode.type === "function" && objNode.name) {
355
- const funcName = String(objNode.name).toUpperCase();
356
- if (DANGEROUS_FUNCTIONS.includes(funcName)) {
357
- violations.push(funcName);
358
- }
359
- }
360
- // Recursively check all properties
361
- for (const key in objNode) {
362
- const value = objNode[key];
363
- if (Array.isArray(value)) {
364
- value.forEach((item) => violations.push(...this.findDangerousFunctionsInAST(item)));
365
- }
366
- else if (typeof value === "object") {
367
- violations.push(...this.findDangerousFunctionsInAST(value));
368
- }
369
- }
370
- return violations;
371
- }
372
- /**
373
- * Find forbidden keywords anywhere in the AST
374
- * @param node - AST node to analyze
375
- * @param forbiddenKeywords - List of forbidden keywords
376
- * @private
377
- */
378
- static findForbiddenKeywordsInAST(node, forbiddenKeywords) {
379
- const violations = [];
380
- if (!node || typeof node !== "object")
381
- return violations;
382
- const objNode = node;
383
- // Check string values for forbidden keywords
384
- for (const key in objNode) {
385
- const value = objNode[key];
386
- if (typeof value === "string") {
387
- for (const keyword of forbiddenKeywords) {
388
- const pattern = new RegExp(`\\b${keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`, "i");
389
- if (pattern.test(value)) {
390
- violations.push(keyword);
391
- }
392
- }
393
- }
394
- else if (Array.isArray(value)) {
395
- value.forEach((item) => violations.push(...this.findForbiddenKeywordsInAST(item, forbiddenKeywords)));
396
- }
397
- else if (typeof value === "object") {
398
- violations.push(...this.findForbiddenKeywordsInAST(value, forbiddenKeywords));
399
- }
400
- }
401
- return violations;
402
- }
403
- /**
404
- * Check for UNION with dangerous statements
405
- * @param statement - AST statement to check
406
- * @private
407
- */
408
- static hasUnionWithDangerousStatements(statement) {
409
- if (!statement || typeof statement !== "object")
410
- return false;
411
- const stmt = statement;
412
- // Check if this is a UNION statement
413
- if (stmt.type === "select" && stmt.union) {
414
- // Check each part of the union
415
- const unionParts = Array.isArray(stmt.union) ? stmt.union : [stmt.union];
416
- for (const part of unionParts) {
417
- const partObj = part;
418
- if (partObj.type && String(partObj.type).toUpperCase() !== "SELECT") {
419
- return true;
420
- }
421
- }
232
+ validatedBy: "ibmi-vscode",
233
+ statementTypes: ibmiResult.statementTypes,
234
+ }, "Read-only validation passed using IBM i vscode parser");
235
+ return; // Success - skip regex fallback
236
+ }
237
+ // Fall back to regex validation
238
+ logger.debug({ ...context }, "Falling back to regex validation for read-only check");
239
+ const regexResult = SqlSecurityValidatorFallback.validateReadOnly(query, context);
240
+ if (!regexResult.isValid) {
241
+ this.throwValidationError(`Write operations detected: ${regexResult.violations.join(", ")}`, regexResult.violations, { readOnly: true, validatedBy: "regex-fallback" }, query);
422
242
  }
423
- return false;
243
+ logger.debug({ ...context, validatedBy: "regex-fallback" }, "Read-only validation passed via regex fallback");
424
244
  }
425
245
  }
426
246
  //# sourceMappingURL=sqlSecurityValidator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqlSecurityValidator.js","sourceRoot":"","sources":["../../../../src/ibmi-mcp-server/utils/security/sqlSecurityValidator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,GAAG,MAAM,iBAAiB,CAAC;AAClC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;AACvB,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAetE;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,oBAAoB;IACpB,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,OAAO;IACP,UAAU;IACV,oBAAoB;IACpB,MAAM;IACN,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,oBAAoB;IACpB,MAAM;IACN,MAAM;IACN,SAAS;IACT,KAAK;IACL,SAAS;IACT,sBAAsB;IACtB,OAAO;IACP,QAAQ;IACR,MAAM;IACN,gBAAgB;IAChB,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,MAAM;IACN,iBAAiB;IACjB,UAAU;IACV,SAAS;IACT,MAAM;IACN,MAAM;IACN,OAAO;IACP,iBAAiB;IACjB,QAAQ;IACR,SAAS;IACT,MAAM;IACN,UAAU;IACV,MAAM;IACN,QAAQ;IACR,mDAAmD;IACnD,QAAQ;IACR,UAAU;IACV,WAAW;IACX,iBAAiB;IACjB,SAAS;IACT,uBAAuB;CACf,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,QAAQ;IACR,SAAS;IACT,uBAAuB;IACvB,QAAQ;IACR,gBAAgB;IAChB,MAAM;IACN,mBAAmB;IACnB,MAAM;IACN,QAAQ;IACR,MAAM;IACN,SAAS,EAAE,2CAA2C;CAC9C,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,uBAAuB;IACvB,gBAAgB;IAChB,6BAA6B;IAC7B,2BAA2B;IAC3B,gBAAgB;IAChB,wBAAwB;IACxB,iBAAiB;IACjB,gCAAgC;IAChC,4CAA4C;IAC5C,8BAA8B;IAC9B,+CAA+C;IAC/C,sBAAsB;IACtB,yDAAyD;CACjD,CAAC;AAEX;;GAEG;AACH,MAAM,OAAO,oBAAoB;IACvB,MAAM,CAAC,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;IAErC;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,CAClB,KAAa,EACb,cAAqC,EACrC,OAAuB;QAEvB,MAAM,CAAC,KAAK,CACV;YACE,GAAG,OAAO;YACV,WAAW,EAAE,KAAK,CAAC,MAAM;YACzB,QAAQ,EAAE,cAAc,CAAC,QAAQ;YACjC,cAAc,EAAE,cAAc,CAAC,cAAc;SAC9C,EACD,kCAAkC,CACnC,CAAC;QAEF,8BAA8B;QAC9B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAEhD,0EAA0E;QAC1E,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QAE/D,4EAA4E;QAC5E,IAAI,cAAc,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YACtC,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,CAAC,KAAK,CACV;YACE,GAAG,OAAO;SACX,EACD,gCAAgC,CACjC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,mBAAmB,CAChC,KAAa,EACb,cAAqC;QAErC,MAAM,SAAS,GAAG,cAAc,CAAC,cAAc,IAAI,KAAK,CAAC;QACzD,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,QAAQ,CAChB,gBAAgB,CAAC,eAAe,EAChC,mCAAmC,SAAS,aAAa,EACzD;gBACE,WAAW,EAAE,KAAK,CAAC,MAAM;gBACzB,SAAS;gBACT,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,MAAM,CAAC,yBAAyB,CACtC,KAAa,EACb,cAAqC,EACrC,OAAuB;QAEvB,IACE,CAAC,cAAc,CAAC,iBAAiB;YACjC,cAAc,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAC7C,CAAC;YACD,OAAO;QACT,CAAC;QAED,iCAAiC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,4BAA4B,CACjD,KAAK,EACL,cAAc,CAAC,iBAAiB,EAChC,OAAO,CACR,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACvB,MAAM,IAAI,QAAQ,CAChB,gBAAgB,CAAC,eAAe,EAChC,gCAAgC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACjE;gBACE,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,iBAAiB,EAAE,cAAc,CAAC,iBAAiB;gBACnD,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE,CACF,CAAC;QACJ,CAAC;QAED,+BAA+B;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,8BAA8B,CACrD,KAAK,EACL,cAAc,CAAC,iBAAiB,CACjC,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,QAAQ,CAChB,gBAAgB,CAAC,eAAe,EAChC,gCAAgC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACnE;gBACE,UAAU,EAAE,WAAW,CAAC,UAAU;gBAClC,iBAAiB,EAAE,cAAc,CAAC,iBAAiB;gBACnD,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,4BAA4B,CACzC,KAAa,EACb,OAAuB;QAEvB,iDAAiD;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACvB,MAAM,IAAI,QAAQ,CAChB,gBAAgB,CAAC,eAAe,EAChC,8BAA8B,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC/D;gBACE,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE,CACF,CAAC;QACJ,CAAC;QAED,uDAAuD;QACvD,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,QAAQ,CAChB,gBAAgB,CAAC,eAAe,EAChC,8BAA8B,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACjE;gBACE,UAAU,EAAE,WAAW,CAAC,UAAU;gBAClC,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;aACnE,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,gBAAgB,CAC7B,KAAa,EACb,OAAuB;QAEvB,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAE7D,MAAM,CAAC,KAAK,CACV;gBACE,GAAG,OAAO;gBACV,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ;gBACnD,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;aACpD,EACD,6BAA6B,CAC9B,CAAC;YAEF,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAEpD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;oBAAE,SAAS;gBAE1D,MAAM,OAAO,GAAG,SAA+C,CAAC;gBAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;gBAE1D,oCAAoC;gBACpC,IACE,QAAQ;oBACP,oBAA0C,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC9D,CAAC;oBACD,UAAU,CAAC,IAAI,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;gBAC3D,CAAC;gBAED,uDAAuD;gBACvD,MAAM,kBAAkB,GAAG,IAAI,CAAC,2BAA2B,CAAC,SAAS,CAAC,CAAC;gBACvE,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAClC,UAAU,CAAC,IAAI,CACb,GAAG,kBAAkB,CAAC,GAAG,CACvB,CAAC,CAAS,EAAE,EAAE,CAAC,uBAAuB,CAAC,EAAE,CAC1C,CACF,CAAC;gBACJ,CAAC;gBAED,mCAAmC;gBACnC,IAAI,IAAI,CAAC,+BAA+B,CAAC,SAAS,CAAC,EAAE,CAAC;oBACpD,UAAU,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC;gBAChC,UAAU;gBACV,gBAAgB,EAAE,KAAK;aACxB,CAAC;QACJ,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,MAAM,CAAC,OAAO,CACZ;gBACE,GAAG,OAAO;gBACV,KAAK,EACH,UAAU,YAAY,KAAK;oBACzB,CAAC,CAAC,UAAU,CAAC,OAAO;oBACpB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACxB,WAAW,EAAE,KAAK,CAAC,MAAM;aAC1B,EACD,wDAAwD,CACzD,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,IAAI,EAAE,iCAAiC;gBAChD,UAAU,EAAE,EAAE;gBACd,gBAAgB,EAAE,KAAK;aACxB,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,kBAAkB,CAC/B,KAAa,EACb,QAAwB;QAExB,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,iCAAiC;QACjC,KAAK,MAAM,SAAS,IAAI,oBAAoB,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,MAAM,SAAS,KAAK,EAAE,GAAG,CAAC,CAAC;YACtD,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,UAAU,CAAC,IAAI,CAAC,oBAAoB,SAAS,YAAY,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;YACzC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,UAAU,CAAC,IAAI,CAAC,+BAA+B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,KAAK,MAAM,IAAI,IAAI,mBAAmB,EAAE,CAAC;YACvC,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,UAAU,CAAC,IAAI,CAAC,wBAAwB,IAAI,YAAY,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC;YAChC,UAAU;YACV,gBAAgB,EAAE,OAAO;SAC1B,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACK,MAAM,CAAC,4BAA4B,CACzC,KAAa,EACb,iBAA2B,EAC3B,OAAuB;QAEvB,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAEpD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,MAAM,aAAa,GAAG,IAAI,CAAC,0BAA0B,CACnD,SAAS,EACT,iBAAiB,CAClB,CAAC;gBACF,UAAU,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAAC,OAAO,UAAU,EAAE,CAAC;YACpB,MAAM,CAAC,KAAK,CACV;gBACE,GAAG,OAAO;gBACV,KAAK,EACH,UAAU,YAAY,KAAK;oBACzB,CAAC,CAAC,UAAU,CAAC,OAAO;oBACpB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;aACzB,EACD,qDAAqD,CACtD,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC;YAChC,UAAU;YACV,gBAAgB,EAAE,KAAK;SACxB,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,8BAA8B,CAC3C,KAAa,EACb,iBAA2B;QAE3B,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,MAAM,CACxB,MAAM,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,KAAK,EACzD,GAAG,CACJ,CAAC;YACF,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,UAAU,CAAC,IAAI,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC;YAChC,UAAU;YACV,gBAAgB,EAAE,OAAO;SAC1B,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,2BAA2B,CAAC,IAAa;QACtD,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,UAAU,CAAC;QAEzD,MAAM,OAAO,GAAG,IAA+B,CAAC;QAEhD,wCAAwC;QACxC,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAEpD,IAAK,mBAAyC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,mCAAmC;QACnC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACrB,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAC3D,CAAC;YACJ,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACrC,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;;OAKG;IACK,MAAM,CAAC,0BAA0B,CACvC,IAAa,EACb,iBAA2B;QAE3B,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,UAAU,CAAC;QAEzD,MAAM,OAAO,GAAG,IAA+B,CAAC;QAEhD,6CAA6C;QAC7C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;oBACxC,MAAM,OAAO,GAAG,IAAI,MAAM,CACxB,MAAM,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,KAAK,EACzD,GAAG,CACJ,CAAC;oBACF,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;wBACxB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACrB,UAAU,CAAC,IAAI,CACb,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAC5D,CACF,CAAC;YACJ,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACrC,UAAU,CAAC,IAAI,CACb,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAC7D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,+BAA+B,CAAC,SAAkB;QAC/D,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE9D,MAAM,IAAI,GAAG,SAAoC,CAAC;QAElD,qCAAqC;QACrC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACzC,+BAA+B;YAC/B,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzE,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,MAAM,OAAO,GAAG,IAA+B,CAAC;gBAChD,IAAI,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC;oBACpE,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC"}
1
+ {"version":3,"file":"sqlSecurityValidator.js","sourceRoot":"","sources":["../../../../src/ibmi-mcp-server/utils/security/sqlSecurityValidator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @fileoverview Regex-based SQL Security Validator Fallback
3
+ * Simple regex pattern matching for cases where vscode-db2i parser cannot handle a query
4
+ *
5
+ * @module src/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback
6
+ */
7
+ import { RequestContext } from "../../../utils/internal/requestContext.js";
8
+ import { SecurityValidationResult } from "./sqlSecurityValidator.js";
9
+ /**
10
+ * Regex-based SQL Security Validator Fallback
11
+ * Provides simple pattern-matching validation when primary validators cannot parse the query
12
+ */
13
+ export declare class SqlSecurityValidatorFallback {
14
+ /**
15
+ * Strip string literals from SQL to prevent false positives in regex validation
16
+ * @param sql - Raw SQL query
17
+ * @returns Normalized SQL with strings replaced with empty literals
18
+ * @private
19
+ */
20
+ private static stripSqlLiterals;
21
+ /**
22
+ * Validate query against list of keywords using regex patterns
23
+ * @param query - SQL query to validate
24
+ * @param keywords - Keywords to check for
25
+ * @param patternBuilder - Function to build regex pattern from keyword
26
+ * @param violationFormatter - Function to format violation message
27
+ * @returns Array of violation messages
28
+ * @private
29
+ */
30
+ private static validateWithRegexList;
31
+ /**
32
+ * Create standardized validation result
33
+ * @param violations - List of validation violations
34
+ * @returns Security validation result object
35
+ * @private
36
+ */
37
+ private static createValidationResult;
38
+ /**
39
+ * Validate read-only restrictions using regex patterns
40
+ * @param query - SQL query to validate
41
+ * @param context - Request context for logging
42
+ * @returns Security validation result
43
+ */
44
+ static validateReadOnly(query: string, context: RequestContext): SecurityValidationResult;
45
+ /**
46
+ * Validate forbidden keywords using regex patterns
47
+ * @param query - SQL query to validate
48
+ * @param forbiddenKeywords - List of forbidden keywords
49
+ * @param context - Request context for logging
50
+ * @returns Security validation result
51
+ */
52
+ static validateForbiddenKeywords(query: string, forbiddenKeywords: string[], context: RequestContext): SecurityValidationResult;
53
+ }
54
+ //# sourceMappingURL=sqlSecurityValidatorFallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlSecurityValidatorFallback.d.ts","sourceRoot":"","sources":["../../../../src/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAGL,wBAAwB,EACzB,MAAM,2BAA2B,CAAC;AAEnC;;;GAGG;AACH,qBAAa,4BAA4B;IACvC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAM/B;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAmBpC;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAUrC;;;;;OAKG;IACH,MAAM,CAAC,gBAAgB,CACrB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,GACtB,wBAAwB;IA6B3B;;;;;;OAMG;IACH,MAAM,CAAC,yBAAyB,CAC9B,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,MAAM,EAAE,EAC3B,OAAO,EAAE,cAAc,GACtB,wBAAwB;CAgB5B"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * @fileoverview Regex-based SQL Security Validator Fallback
3
+ * Simple regex pattern matching for cases where vscode-db2i parser cannot handle a query
4
+ *
5
+ * @module src/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback
6
+ */
7
+ import { logger } from "../../../utils/internal/logger.js";
8
+ import { DANGEROUS_OPERATIONS, DANGEROUS_PATTERNS, } from "./sqlSecurityValidator.js";
9
+ /**
10
+ * Regex-based SQL Security Validator Fallback
11
+ * Provides simple pattern-matching validation when primary validators cannot parse the query
12
+ */
13
+ export class SqlSecurityValidatorFallback {
14
+ /**
15
+ * Strip string literals from SQL to prevent false positives in regex validation
16
+ * @param sql - Raw SQL query
17
+ * @returns Normalized SQL with strings replaced with empty literals
18
+ * @private
19
+ */
20
+ static stripSqlLiterals(sql) {
21
+ // Replace single-quoted strings with empty string literals
22
+ // Pattern handles escaped quotes: 'can''t' -> ''
23
+ return sql.replace(/'(?:''|[^'])*'/g, "''");
24
+ }
25
+ /**
26
+ * Validate query against list of keywords using regex patterns
27
+ * @param query - SQL query to validate
28
+ * @param keywords - Keywords to check for
29
+ * @param patternBuilder - Function to build regex pattern from keyword
30
+ * @param violationFormatter - Function to format violation message
31
+ * @returns Array of violation messages
32
+ * @private
33
+ */
34
+ static validateWithRegexList(query, keywords, patternBuilder, violationFormatter) {
35
+ const violations = [];
36
+ const normalizedQuery = this.stripSqlLiterals(query);
37
+ for (const keyword of keywords) {
38
+ const pattern = patternBuilder(keyword);
39
+ if (pattern.test(normalizedQuery)) {
40
+ violations.push(violationFormatter(keyword));
41
+ }
42
+ }
43
+ return violations;
44
+ }
45
+ /**
46
+ * Create standardized validation result
47
+ * @param violations - List of validation violations
48
+ * @returns Security validation result object
49
+ * @private
50
+ */
51
+ static createValidationResult(violations) {
52
+ return {
53
+ isValid: violations.length === 0,
54
+ violations,
55
+ validationMethod: "regex",
56
+ };
57
+ }
58
+ /**
59
+ * Validate read-only restrictions using regex patterns
60
+ * @param query - SQL query to validate
61
+ * @param context - Request context for logging
62
+ * @returns Security validation result
63
+ */
64
+ static validateReadOnly(query, context) {
65
+ const violations = [];
66
+ logger.debug({ ...context }, "Using regex fallback for read-only validation");
67
+ // Check for dangerous operations
68
+ violations.push(...this.validateWithRegexList(query, DANGEROUS_OPERATIONS, (op) => new RegExp(`\\b${op}\\b`, "i"), (op) => `Write operation '${op}' detected`));
69
+ // Check for dangerous patterns
70
+ const normalizedQuery = this.stripSqlLiterals(query);
71
+ for (const pattern of DANGEROUS_PATTERNS) {
72
+ if (pattern.test(normalizedQuery)) {
73
+ violations.push(`Dangerous pattern detected: ${pattern.source}`);
74
+ }
75
+ }
76
+ return this.createValidationResult(violations);
77
+ }
78
+ /**
79
+ * Validate forbidden keywords using regex patterns
80
+ * @param query - SQL query to validate
81
+ * @param forbiddenKeywords - List of forbidden keywords
82
+ * @param context - Request context for logging
83
+ * @returns Security validation result
84
+ */
85
+ static validateForbiddenKeywords(query, forbiddenKeywords, context) {
86
+ logger.debug({ ...context, keywordCount: forbiddenKeywords.length }, "Using regex fallback for forbidden keywords validation");
87
+ const violations = this.validateWithRegexList(query, forbiddenKeywords, (kw) => new RegExp(`\\b${kw.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\b`, "i"), (kw) => `Forbidden keyword: ${kw}`);
88
+ return this.createValidationResult(violations);
89
+ }
90
+ }
91
+ //# sourceMappingURL=sqlSecurityValidatorFallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlSecurityValidatorFallback.js","sourceRoot":"","sources":["../../../../src/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.ts"],"names":[],"mappings":"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"}