@memberjunction/global 5.0.0 → 5.2.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/README.md +19 -3
- package/dist/DynamicPackageLoader.d.ts +61 -0
- package/dist/DynamicPackageLoader.d.ts.map +1 -0
- package/dist/DynamicPackageLoader.js +56 -0
- package/dist/DynamicPackageLoader.js.map +1 -0
- package/dist/SQLExpressionValidator.d.ts +31 -4
- package/dist/SQLExpressionValidator.d.ts.map +1 -1
- package/dist/SQLExpressionValidator.js +107 -22
- package/dist/SQLExpressionValidator.js.map +1 -1
- package/dist/__tests__/SQLExpressionValidator.security.test.d.ts +2 -0
- package/dist/__tests__/SQLExpressionValidator.security.test.d.ts.map +1 -0
- package/dist/__tests__/SQLExpressionValidator.security.test.js +328 -0
- package/dist/__tests__/SQLExpressionValidator.security.test.js.map +1 -0
- package/dist/__tests__/SQLExpressionValidator.test.d.ts +2 -0
- package/dist/__tests__/SQLExpressionValidator.test.d.ts.map +1 -0
- package/dist/__tests__/SQLExpressionValidator.test.js +350 -0
- package/dist/__tests__/SQLExpressionValidator.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/Core.d.ts +0 -29
- package/dist/Core.d.ts.map +0 -1
- package/dist/Core.js +0 -58
- package/dist/Core.js.map +0 -1
- package/dist/generic/QueryCache.d.ts +0 -85
- package/dist/generic/QueryCache.d.ts.map +0 -1
- package/dist/generic/QueryCache.js +0 -198
- package/dist/generic/QueryCache.js.map +0 -1
- package/dist/generic/QueryCacheConfig.d.ts +0 -72
- package/dist/generic/QueryCacheConfig.d.ts.map +0 -1
- package/dist/generic/QueryCacheConfig.js +0 -3
- package/dist/generic/QueryCacheConfig.js.map +0 -1
- package/dist/generic/applicationInfo.d.ts +0 -138
- package/dist/generic/applicationInfo.d.ts.map +0 -1
- package/dist/generic/applicationInfo.js +0 -177
- package/dist/generic/applicationInfo.js.map +0 -1
- package/dist/generic/authEvaluator.d.ts +0 -25
- package/dist/generic/authEvaluator.d.ts.map +0 -1
- package/dist/generic/authEvaluator.js +0 -49
- package/dist/generic/authEvaluator.js.map +0 -1
- package/dist/generic/authTypes.d.ts +0 -193
- package/dist/generic/authTypes.d.ts.map +0 -1
- package/dist/generic/authTypes.js +0 -19
- package/dist/generic/authTypes.js.map +0 -1
- package/dist/generic/baseEngine.d.ts +0 -260
- package/dist/generic/baseEngine.d.ts.map +0 -1
- package/dist/generic/baseEngine.js +0 -510
- package/dist/generic/baseEngine.js.map +0 -1
- package/dist/generic/baseEntity.d.ts +0 -691
- package/dist/generic/baseEntity.d.ts.map +0 -1
- package/dist/generic/baseEntity.js +0 -1688
- package/dist/generic/baseEntity.js.map +0 -1
- package/dist/generic/baseInfo.d.ts +0 -24
- package/dist/generic/baseInfo.d.ts.map +0 -1
- package/dist/generic/baseInfo.js +0 -53
- package/dist/generic/baseInfo.js.map +0 -1
- package/dist/generic/compositeKey.d.ts +0 -206
- package/dist/generic/compositeKey.d.ts.map +0 -1
- package/dist/generic/compositeKey.js +0 -412
- package/dist/generic/compositeKey.js.map +0 -1
- package/dist/generic/databaseProviderBase.d.ts +0 -46
- package/dist/generic/databaseProviderBase.d.ts.map +0 -1
- package/dist/generic/databaseProviderBase.js +0 -14
- package/dist/generic/databaseProviderBase.js.map +0 -1
- package/dist/generic/entityInfo.d.ts +0 -983
- package/dist/generic/entityInfo.d.ts.map +0 -1
- package/dist/generic/entityInfo.js +0 -1401
- package/dist/generic/entityInfo.js.map +0 -1
- package/dist/generic/explorerNavigationItem.d.ts +0 -20
- package/dist/generic/explorerNavigationItem.d.ts.map +0 -1
- package/dist/generic/explorerNavigationItem.js +0 -29
- package/dist/generic/explorerNavigationItem.js.map +0 -1
- package/dist/generic/interfaces.d.ts +0 -610
- package/dist/generic/interfaces.d.ts.map +0 -1
- package/dist/generic/interfaces.js +0 -211
- package/dist/generic/interfaces.js.map +0 -1
- package/dist/generic/libraryInfo.d.ts +0 -40
- package/dist/generic/libraryInfo.d.ts.map +0 -1
- package/dist/generic/libraryInfo.js +0 -56
- package/dist/generic/libraryInfo.js.map +0 -1
- package/dist/generic/logging.d.ts +0 -179
- package/dist/generic/logging.d.ts.map +0 -1
- package/dist/generic/logging.js +0 -382
- package/dist/generic/logging.js.map +0 -1
- package/dist/generic/metadata.d.ts +0 -305
- package/dist/generic/metadata.d.ts.map +0 -1
- package/dist/generic/metadata.js +0 -454
- package/dist/generic/metadata.js.map +0 -1
- package/dist/generic/metadataUtil.d.ts +0 -8
- package/dist/generic/metadataUtil.d.ts.map +0 -1
- package/dist/generic/metadataUtil.js +0 -36
- package/dist/generic/metadataUtil.js.map +0 -1
- package/dist/generic/providerBase.d.ts +0 -546
- package/dist/generic/providerBase.d.ts.map +0 -1
- package/dist/generic/providerBase.js +0 -999
- package/dist/generic/providerBase.js.map +0 -1
- package/dist/generic/queryInfo.d.ts +0 -460
- package/dist/generic/queryInfo.d.ts.map +0 -1
- package/dist/generic/queryInfo.js +0 -633
- package/dist/generic/queryInfo.js.map +0 -1
- package/dist/generic/querySQLFilters.d.ts +0 -54
- package/dist/generic/querySQLFilters.d.ts.map +0 -1
- package/dist/generic/querySQLFilters.js +0 -84
- package/dist/generic/querySQLFilters.js.map +0 -1
- package/dist/generic/runQuery.d.ts +0 -96
- package/dist/generic/runQuery.d.ts.map +0 -1
- package/dist/generic/runQuery.js +0 -66
- package/dist/generic/runQuery.js.map +0 -1
- package/dist/generic/runQuerySQLFilterImplementations.d.ts +0 -51
- package/dist/generic/runQuerySQLFilterImplementations.d.ts.map +0 -1
- package/dist/generic/runQuerySQLFilterImplementations.js +0 -238
- package/dist/generic/runQuerySQLFilterImplementations.js.map +0 -1
- package/dist/generic/runReport.d.ts +0 -25
- package/dist/generic/runReport.d.ts.map +0 -1
- package/dist/generic/runReport.js +0 -42
- package/dist/generic/runReport.js.map +0 -1
- package/dist/generic/securityInfo.d.ts +0 -355
- package/dist/generic/securityInfo.d.ts.map +0 -1
- package/dist/generic/securityInfo.js +0 -425
- package/dist/generic/securityInfo.js.map +0 -1
- package/dist/generic/transactionGroup.d.ts +0 -184
- package/dist/generic/transactionGroup.d.ts.map +0 -1
- package/dist/generic/transactionGroup.js +0 -357
- package/dist/generic/transactionGroup.js.map +0 -1
- package/dist/generic/util.d.ts +0 -81
- package/dist/generic/util.d.ts.map +0 -1
- package/dist/generic/util.js +0 -301
- package/dist/generic/util.js.map +0 -1
- package/dist/views/runView.d.ts +0 -150
- package/dist/views/runView.d.ts.map +0 -1
- package/dist/views/runView.js +0 -100
- package/dist/views/runView.js.map +0 -1
- package/dist/views/viewInfo.d.ts +0 -121
- package/dist/views/viewInfo.d.ts.map +0 -1
- package/dist/views/viewInfo.js +0 -182
- package/dist/views/viewInfo.js.map +0 -1
package/README.md
CHANGED
|
@@ -324,7 +324,9 @@ Supports comparisons (`==`, `!=`, `<`, `>`, `<=`, `>=`), logical operators (`&&`
|
|
|
324
324
|
|
|
325
325
|
### SQLExpressionValidator
|
|
326
326
|
|
|
327
|
-
Validates user-provided SQL expressions against injection attacks. Provides context-aware validation (WHERE clauses, ORDER BY, aggregates, field references) with an allowlist of safe SQL functions.
|
|
327
|
+
Validates user-provided SQL expressions and full queries against injection attacks. Provides context-aware validation (WHERE clauses, ORDER BY, aggregates, field references, full queries) with an allowlist of safe SQL functions.
|
|
328
|
+
|
|
329
|
+
**Expression validation** (WHERE clauses, aggregates, ORDER BY):
|
|
328
330
|
|
|
329
331
|
```typescript
|
|
330
332
|
import { SQLExpressionValidator } from '@memberjunction/global';
|
|
@@ -342,9 +344,22 @@ const bad = validator.validate("Name = 'test'; 1=1", {
|
|
|
342
344
|
context: 'where_clause'
|
|
343
345
|
});
|
|
344
346
|
// bad.valid === false
|
|
345
|
-
// bad.error === "Semicolons are not allowed in SQL expressions"
|
|
346
347
|
```
|
|
347
348
|
|
|
349
|
+
**Full query validation** (ad-hoc SELECT/WITH statements):
|
|
350
|
+
|
|
351
|
+
```typescript
|
|
352
|
+
// Validate a complete SQL query — allows SELECT, JOINs, subqueries, set operations, comments
|
|
353
|
+
const result = validator.validateFullQuery('SELECT TOP 10 * FROM __mj.vwUsers WHERE IsActive = 1');
|
|
354
|
+
// result.valid === true
|
|
355
|
+
|
|
356
|
+
// Mutations and dangerous operations are blocked
|
|
357
|
+
const bad = validator.validateFullQuery("INSERT INTO Users (Name) VALUES ('hacked')");
|
|
358
|
+
// bad.valid === false, bad.trigger === 'INSERT'
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
The `full_query` context allows keywords that are legitimate in SELECT statements (EXISTS, ANY, ALL, UNION, INTERSECT, EXCEPT, IF) while still blocking all mutations (INSERT, UPDATE, DELETE, DROP, etc.), dangerous operations (EXEC, OPENROWSET, WAITFOR), and multi-statement injection (semicolons).
|
|
362
|
+
|
|
348
363
|
### ClassUtils -- Reflection Helpers
|
|
349
364
|
|
|
350
365
|
Functions for introspecting class hierarchies at runtime.
|
|
@@ -589,7 +604,8 @@ function RegisterClass(
|
|
|
589
604
|
| Method | Returns | Description |
|
|
590
605
|
|---|---|---|
|
|
591
606
|
| `Instance` (static) | `SQLExpressionValidator` | Singleton accessor |
|
|
592
|
-
| `validate(expression, options)` | `SQLValidationResult` | Validate a SQL expression |
|
|
607
|
+
| `validate(expression, options)` | `SQLValidationResult` | Validate a SQL expression with context-specific rules |
|
|
608
|
+
| `validateFullQuery(sql)` | `SQLValidationResult` | Validate a full SELECT/WITH query (convenience for `validate(sql, { context: 'full_query' })`) |
|
|
593
609
|
|
|
594
610
|
### WarningManager
|
|
595
611
|
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic Package Loading
|
|
3
|
+
*
|
|
4
|
+
* Provides runtime dynamic import capabilities for MJ Open App packages.
|
|
5
|
+
* Used by MJAPI startup to load server-side app bootstrap packages that
|
|
6
|
+
* register their classes with the ClassFactory via @RegisterClass decorators.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Describes a package to be dynamically imported at runtime.
|
|
10
|
+
* Typically read from the `dynamicPackages.server` section of mj.config.cjs.
|
|
11
|
+
*/
|
|
12
|
+
export interface DynamicPackageLoad {
|
|
13
|
+
/** npm package name to dynamically import */
|
|
14
|
+
PackageName: string;
|
|
15
|
+
/** Named export to call after import (e.g., 'LoadAcmeCRMServer') */
|
|
16
|
+
StartupExport: string;
|
|
17
|
+
/** Open App name this package belongs to (for tracking) */
|
|
18
|
+
AppName: string;
|
|
19
|
+
/** Whether this package should be loaded. Allows disabling without removing. */
|
|
20
|
+
Enabled: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Result of attempting to dynamically load a single package.
|
|
24
|
+
*/
|
|
25
|
+
export interface DynamicLoadResult {
|
|
26
|
+
/** The package that was loaded (or failed to load) */
|
|
27
|
+
PackageName: string;
|
|
28
|
+
/** Whether the package was loaded and its startup export called successfully */
|
|
29
|
+
Success: boolean;
|
|
30
|
+
/** Error message if the load failed */
|
|
31
|
+
Error?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Utility class for dynamically loading npm packages at runtime.
|
|
35
|
+
*
|
|
36
|
+
* Used during MJAPI startup to load Open App server-side bootstrap packages.
|
|
37
|
+
* Each package is loaded in isolation — a failure in one package does not
|
|
38
|
+
* prevent others from loading.
|
|
39
|
+
*/
|
|
40
|
+
export declare class DynamicPackageLoader {
|
|
41
|
+
/**
|
|
42
|
+
* Loads all enabled dynamic packages in parallel for better performance.
|
|
43
|
+
* For each package:
|
|
44
|
+
* 1. Skips if `Enabled` is false
|
|
45
|
+
* 2. Dynamically imports the package via `await import()`
|
|
46
|
+
* 3. Calls the named `StartupExport` function if it exists
|
|
47
|
+
* 4. Records success or failure
|
|
48
|
+
*
|
|
49
|
+
* Errors are isolated per-package — a broken package does not crash the server.
|
|
50
|
+
* All enabled packages are loaded concurrently using Promise.all().
|
|
51
|
+
*
|
|
52
|
+
* @param packages - Array of packages to load
|
|
53
|
+
* @returns Array of results indicating success/failure for each package
|
|
54
|
+
*/
|
|
55
|
+
static LoadPackages(packages: DynamicPackageLoad[]): Promise<DynamicLoadResult[]>;
|
|
56
|
+
/**
|
|
57
|
+
* Attempts to dynamically import a single package and call its startup export.
|
|
58
|
+
*/
|
|
59
|
+
private static LoadSinglePackage;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=DynamicPackageLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicPackageLoader.d.ts","sourceRoot":"","sources":["../src/DynamicPackageLoader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAC/B,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IAEpB,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAC;IAEtB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAEhB,gFAAgF;IAChF,OAAO,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IAEpB,gFAAgF;IAChF,OAAO,EAAE,OAAO,CAAC;IAEjB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,qBAAa,oBAAoB;IAC7B;;;;;;;;;;;;;OAaG;WACU,YAAY,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAKvF;;OAEG;mBACkB,iBAAiB;CAqBzC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic Package Loading
|
|
3
|
+
*
|
|
4
|
+
* Provides runtime dynamic import capabilities for MJ Open App packages.
|
|
5
|
+
* Used by MJAPI startup to load server-side app bootstrap packages that
|
|
6
|
+
* register their classes with the ClassFactory via @RegisterClass decorators.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Utility class for dynamically loading npm packages at runtime.
|
|
10
|
+
*
|
|
11
|
+
* Used during MJAPI startup to load Open App server-side bootstrap packages.
|
|
12
|
+
* Each package is loaded in isolation — a failure in one package does not
|
|
13
|
+
* prevent others from loading.
|
|
14
|
+
*/
|
|
15
|
+
export class DynamicPackageLoader {
|
|
16
|
+
/**
|
|
17
|
+
* Loads all enabled dynamic packages in parallel for better performance.
|
|
18
|
+
* For each package:
|
|
19
|
+
* 1. Skips if `Enabled` is false
|
|
20
|
+
* 2. Dynamically imports the package via `await import()`
|
|
21
|
+
* 3. Calls the named `StartupExport` function if it exists
|
|
22
|
+
* 4. Records success or failure
|
|
23
|
+
*
|
|
24
|
+
* Errors are isolated per-package — a broken package does not crash the server.
|
|
25
|
+
* All enabled packages are loaded concurrently using Promise.all().
|
|
26
|
+
*
|
|
27
|
+
* @param packages - Array of packages to load
|
|
28
|
+
* @returns Array of results indicating success/failure for each package
|
|
29
|
+
*/
|
|
30
|
+
static async LoadPackages(packages) {
|
|
31
|
+
const enabledPackages = packages.filter(p => p.Enabled);
|
|
32
|
+
return Promise.all(enabledPackages.map(pkg => DynamicPackageLoader.LoadSinglePackage(pkg)));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Attempts to dynamically import a single package and call its startup export.
|
|
36
|
+
*/
|
|
37
|
+
static async LoadSinglePackage(pkg) {
|
|
38
|
+
try {
|
|
39
|
+
const module = await import(pkg.PackageName);
|
|
40
|
+
if (pkg.StartupExport && typeof module[pkg.StartupExport] === 'function') {
|
|
41
|
+
module[pkg.StartupExport]();
|
|
42
|
+
}
|
|
43
|
+
return { PackageName: pkg.PackageName, Success: true };
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
47
|
+
console.error(`Failed to load dynamic package ${pkg.PackageName}: ${errorMessage}`);
|
|
48
|
+
return {
|
|
49
|
+
PackageName: pkg.PackageName,
|
|
50
|
+
Success: false,
|
|
51
|
+
Error: errorMessage
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=DynamicPackageLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DynamicPackageLoader.js","sourceRoot":"","sources":["../src/DynamicPackageLoader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkCH;;;;;;GAMG;AACH,MAAM,OAAO,oBAAoB;IAC7B;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,QAA8B;QACpD,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACxD,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChG,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAuB;QAC1D,IAAI,CAAC;YACD,MAAM,MAAM,GAA4B,MAAM,MAAM,CAAC,GAAG,CAAC,WAAW,CAA4B,CAAC;YAEjG,IAAI,GAAG,CAAC,aAAa,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,UAAU,EAAE,CAAC;gBACtE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAgB,EAAE,CAAC;YAChD,CAAC;YAED,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,KAAc,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5E,OAAO,CAAC,KAAK,CAAC,kCAAkC,GAAG,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC,CAAC;YAEpF,OAAO;gBACH,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,YAAY;aACtB,CAAC;QACN,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview Unified SQL Expression Validation
|
|
2
|
+
* @fileoverview Unified SQL Expression and Query Validation
|
|
3
3
|
*
|
|
4
|
-
* Central utility for validating user-provided SQL expressions
|
|
5
|
-
* Used by RunView, aggregates, smart filters,
|
|
4
|
+
* Central utility for validating user-provided SQL expressions and full queries
|
|
5
|
+
* against injection attacks. Used by RunView, aggregates, smart filters, ad-hoc
|
|
6
|
+
* query execution, and any other feature accepting SQL input.
|
|
6
7
|
*
|
|
7
8
|
* Located in MJGlobal (lowest-level package) so all packages can use it.
|
|
8
9
|
*
|
|
@@ -12,6 +13,11 @@
|
|
|
12
13
|
* Dangerous SQL keywords that are never allowed in user-provided expressions
|
|
13
14
|
*/
|
|
14
15
|
export declare const DANGEROUS_SQL_KEYWORDS: readonly ["DROP", "CREATE", "ALTER", "TRUNCATE", "RENAME", "INSERT", "UPDATE", "DELETE", "MERGE", "REPLACE", "GRANT", "REVOKE", "DENY", "EXEC", "EXECUTE", "CALL", "PROCEDURE", "FUNCTION", "BEGIN", "COMMIT", "ROLLBACK", "SAVEPOINT", "USE", "DATABASE", "SCHEMA", "IF", "WHILE", "LOOP", "FOR", "GOTO", "UNION", "INTERSECT", "EXCEPT", "EXISTS", "ANY", "ALL", "SOME", "BULK", "OPENROWSET", "OPENDATASOURCE", "OPENQUERY", "XP_", "SP_", "DYNAMIC", "PREPARE", "DEALLOCATE", "WAITFOR", "DELAY", "SLEEP", "SHUTDOWN", "RECONFIGURE"];
|
|
16
|
+
/**
|
|
17
|
+
* Keywords from DANGEROUS_SQL_KEYWORDS that are legitimate in full SELECT queries.
|
|
18
|
+
* These are only unblocked when context is 'full_query'.
|
|
19
|
+
*/
|
|
20
|
+
export declare const FULL_QUERY_ALLOWED_KEYWORDS: readonly ["EXISTS", "ANY", "ALL", "SOME", "UNION", "INTERSECT", "EXCEPT", "IF"];
|
|
15
21
|
/**
|
|
16
22
|
* Safe SQL functions allowed in expressions, organized by category
|
|
17
23
|
*/
|
|
@@ -29,7 +35,7 @@ export declare const ALLOWED_SQL_FUNCTIONS: {
|
|
|
29
35
|
/**
|
|
30
36
|
* Validation context - affects what's allowed
|
|
31
37
|
*/
|
|
32
|
-
export type SQLValidationContext = 'where_clause' | 'order_by' | 'aggregate' | 'field_reference';
|
|
38
|
+
export type SQLValidationContext = 'where_clause' | 'order_by' | 'aggregate' | 'field_reference' | 'full_query';
|
|
33
39
|
/**
|
|
34
40
|
* Validation result with detailed error information
|
|
35
41
|
*/
|
|
@@ -117,9 +123,30 @@ export declare class SQLExpressionValidator {
|
|
|
117
123
|
* Validate field references exist in entity (lenient mode - just for logging)
|
|
118
124
|
*/
|
|
119
125
|
private checkFieldReferences;
|
|
126
|
+
/**
|
|
127
|
+
* Strip SQL comments (single-line -- and multi-line block comments) from a query.
|
|
128
|
+
* Used by full_query context to allow agent-generated header comments
|
|
129
|
+
* without triggering the comment injection check.
|
|
130
|
+
*/
|
|
131
|
+
private stripSQLComments;
|
|
120
132
|
/**
|
|
121
133
|
* Escape special regex characters in a string
|
|
122
134
|
*/
|
|
123
135
|
private escapeRegex;
|
|
136
|
+
/**
|
|
137
|
+
* Normalize literal escape sequences in SQL strings.
|
|
138
|
+
* Agent-generated SQL sometimes arrives with literal \n, \r, \t sequences
|
|
139
|
+
* (backslash + letter) instead of actual whitespace characters. This happens
|
|
140
|
+
* when JSON is double-escaped or the SQL passes through a transport layer
|
|
141
|
+
* that doesn't interpret escape sequences. Without normalization, comment
|
|
142
|
+
* stripping fails because the regex expects real newlines.
|
|
143
|
+
*/
|
|
144
|
+
private normalizeSQLWhitespace;
|
|
145
|
+
/**
|
|
146
|
+
* Validate a full SQL query (SELECT or WITH/CTE statement).
|
|
147
|
+
* Blocks mutations, dangerous operations, and multi-statement injection.
|
|
148
|
+
* Allows SELECT, subqueries, set operations, and SQL comments.
|
|
149
|
+
*/
|
|
150
|
+
validateFullQuery(sql: string): SQLValidationResult;
|
|
124
151
|
}
|
|
125
152
|
//# sourceMappingURL=SQLExpressionValidator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQLExpressionValidator.d.ts","sourceRoot":"","sources":["../src/SQLExpressionValidator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"SQLExpressionValidator.d.ts","sourceRoot":"","sources":["../src/SQLExpressionValidator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;GAEG;AACH,eAAO,MAAM,sBAAsB,2gBA0CzB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,2BAA2B,iFAS9B,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;CA2BxB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAC5B,cAAc,GACd,UAAU,GACV,WAAW,GACX,iBAAiB,GACjB,YAAY,CAAC;AAEjB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,KAAK,EAAE,OAAO,CAAC;IACf,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,gDAAgD;IAChD,OAAO,EAAE,oBAAoB,CAAC;IAE9B,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB,wHAAwH;IACxH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,iFAAiF;IACjF,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B,qCAAqC;IACrC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAyB;IAEjD,OAAO;IAEP;;OAEG;IACH,WAAkB,QAAQ,IAAI,sBAAsB,CAKnD;IAED;;;;;;OAMG;IACI,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,mBAAmB;IAoCvF;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoE9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2B1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiCzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA4B5B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,WAAW;IAInB;;;;;;;OAOG;IACH,OAAO,CAAC,sBAAsB;IAQ9B;;;;OAIG;IACI,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB;CAO3D"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview Unified SQL Expression Validation
|
|
2
|
+
* @fileoverview Unified SQL Expression and Query Validation
|
|
3
3
|
*
|
|
4
|
-
* Central utility for validating user-provided SQL expressions
|
|
5
|
-
* Used by RunView, aggregates, smart filters,
|
|
4
|
+
* Central utility for validating user-provided SQL expressions and full queries
|
|
5
|
+
* against injection attacks. Used by RunView, aggregates, smart filters, ad-hoc
|
|
6
|
+
* query execution, and any other feature accepting SQL input.
|
|
6
7
|
*
|
|
7
8
|
* Located in MJGlobal (lowest-level package) so all packages can use it.
|
|
8
9
|
*
|
|
@@ -41,6 +42,18 @@ export const DANGEROUS_SQL_KEYWORDS = [
|
|
|
41
42
|
// System operations
|
|
42
43
|
'SHUTDOWN', 'RECONFIGURE'
|
|
43
44
|
];
|
|
45
|
+
/**
|
|
46
|
+
* Keywords from DANGEROUS_SQL_KEYWORDS that are legitimate in full SELECT queries.
|
|
47
|
+
* These are only unblocked when context is 'full_query'.
|
|
48
|
+
*/
|
|
49
|
+
export const FULL_QUERY_ALLOWED_KEYWORDS = [
|
|
50
|
+
// Subquery operators — valid in WHERE EXISTS(...), x > ANY(...)
|
|
51
|
+
'EXISTS', 'ANY', 'ALL', 'SOME',
|
|
52
|
+
// Set operations — valid for UNION/INTERSECT/EXCEPT queries
|
|
53
|
+
'UNION', 'INTERSECT', 'EXCEPT',
|
|
54
|
+
// IIF() uses IF internally, CASE WHEN patterns are common
|
|
55
|
+
'IF',
|
|
56
|
+
];
|
|
44
57
|
/**
|
|
45
58
|
* Safe SQL functions allowed in expressions, organized by category
|
|
46
59
|
*/
|
|
@@ -117,10 +130,13 @@ export class SQLExpressionValidator {
|
|
|
117
130
|
const dangerCheck = this.checkDangerousPatterns(withoutStrings, options);
|
|
118
131
|
if (!dangerCheck.valid)
|
|
119
132
|
return dangerCheck;
|
|
120
|
-
// Step 3: Validate function names are in allowlist
|
|
121
|
-
|
|
122
|
-
if (
|
|
123
|
-
|
|
133
|
+
// Step 3: Validate function names are in allowlist (skip for full queries —
|
|
134
|
+
// the function allowlist is designed for expression fragments, not full SQL statements)
|
|
135
|
+
if (options.context !== 'full_query') {
|
|
136
|
+
const functionCheck = this.checkFunctionNames(withoutStrings, options);
|
|
137
|
+
if (!functionCheck.valid)
|
|
138
|
+
return functionCheck;
|
|
139
|
+
}
|
|
124
140
|
// Step 4: Context-specific validation
|
|
125
141
|
const contextCheck = this.checkContextRules(withoutStrings, options);
|
|
126
142
|
if (!contextCheck.valid)
|
|
@@ -144,20 +160,42 @@ export class SQLExpressionValidator {
|
|
|
144
160
|
* Check for dangerous SQL patterns that indicate injection attempts
|
|
145
161
|
*/
|
|
146
162
|
checkDangerousPatterns(expression, options) {
|
|
147
|
-
const
|
|
163
|
+
const isFullQuery = options.context === 'full_query';
|
|
148
164
|
// Build blocked list - explicitly typed as string[] for mutability
|
|
149
|
-
|
|
165
|
+
let blocked = [...DANGEROUS_SQL_KEYWORDS];
|
|
150
166
|
if (options.additionalBlocked) {
|
|
151
167
|
blocked.push(...options.additionalBlocked);
|
|
152
168
|
}
|
|
153
|
-
//
|
|
154
|
-
if (
|
|
169
|
+
// For full_query context, remove keywords that are legitimate in SELECT statements
|
|
170
|
+
if (isFullQuery) {
|
|
171
|
+
const allowedSet = new Set(FULL_QUERY_ALLOWED_KEYWORDS.map(k => k.toUpperCase()));
|
|
172
|
+
blocked = blocked.filter(kw => !allowedSet.has(kw.toUpperCase()));
|
|
173
|
+
}
|
|
174
|
+
// Add SELECT to blocked unless context allows it (prevents subqueries in expressions)
|
|
175
|
+
if (!isFullQuery && !options.allowSubqueries && !blocked.includes('SELECT')) {
|
|
155
176
|
blocked.push('SELECT');
|
|
156
177
|
}
|
|
178
|
+
// For full_query, strip comments before keyword checking (agent SQL has header comment blocks).
|
|
179
|
+
// For expressions, comments are still rejected outright as injection vectors.
|
|
180
|
+
let textToCheck;
|
|
181
|
+
if (isFullQuery) {
|
|
182
|
+
textToCheck = this.stripSQLComments(expression).toUpperCase();
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
const upper = expression.toUpperCase();
|
|
186
|
+
if (upper.includes('--') || upper.includes('/*') || upper.includes('*/')) {
|
|
187
|
+
return {
|
|
188
|
+
valid: false,
|
|
189
|
+
error: 'Comments are not allowed in SQL expressions',
|
|
190
|
+
trigger: 'comment'
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
textToCheck = upper;
|
|
194
|
+
}
|
|
157
195
|
for (const keyword of blocked) {
|
|
158
196
|
// Use word boundaries to avoid false positives (e.g., "DESCRIPTION" containing "EXEC")
|
|
159
197
|
const pattern = new RegExp(`\\b${this.escapeRegex(keyword)}\\b`, 'i');
|
|
160
|
-
if (pattern.test(
|
|
198
|
+
if (pattern.test(textToCheck)) {
|
|
161
199
|
return {
|
|
162
200
|
valid: false,
|
|
163
201
|
error: `Dangerous SQL keyword detected: ${keyword}`,
|
|
@@ -166,16 +204,14 @@ export class SQLExpressionValidator {
|
|
|
166
204
|
};
|
|
167
205
|
}
|
|
168
206
|
}
|
|
169
|
-
// Check
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
// Check statement terminator (prevents multi-statement injection)
|
|
178
|
-
if (expression.includes(';')) {
|
|
207
|
+
// Check statement terminator (prevents multi-statement injection).
|
|
208
|
+
// For full_query context, strip comments first (a trailing semicolon may be followed by
|
|
209
|
+
// an inline comment like `ORDER BY x DESC; -- highest first`), then strip the trailing
|
|
210
|
+
// semicolon. Only reject if semicolons remain mid-statement, indicating injection.
|
|
211
|
+
const textForSemicolonCheck = isFullQuery
|
|
212
|
+
? this.stripSQLComments(expression).replace(/;\s*$/, '') // strip comments then trailing semicolon
|
|
213
|
+
: expression;
|
|
214
|
+
if (textForSemicolonCheck.includes(';')) {
|
|
179
215
|
return {
|
|
180
216
|
valid: false,
|
|
181
217
|
error: 'Semicolons are not allowed in SQL expressions',
|
|
@@ -228,6 +264,18 @@ export class SQLExpressionValidator {
|
|
|
228
264
|
};
|
|
229
265
|
}
|
|
230
266
|
}
|
|
267
|
+
// For full_query context, the query must start with SELECT or WITH (CTE)
|
|
268
|
+
if (options.context === 'full_query') {
|
|
269
|
+
const stripped = this.stripSQLComments(expression).trim();
|
|
270
|
+
const upper = stripped.toUpperCase();
|
|
271
|
+
if (!upper.startsWith('SELECT') && !upper.startsWith('WITH')) {
|
|
272
|
+
return {
|
|
273
|
+
valid: false,
|
|
274
|
+
error: 'Ad-hoc query must start with SELECT or WITH',
|
|
275
|
+
suggestion: 'Only SELECT statements and CTEs (WITH ... AS) are allowed'
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
}
|
|
231
279
|
return { valid: true };
|
|
232
280
|
}
|
|
233
281
|
/**
|
|
@@ -256,11 +304,48 @@ export class SQLExpressionValidator {
|
|
|
256
304
|
// For now, we allow it to pass
|
|
257
305
|
}
|
|
258
306
|
}
|
|
307
|
+
/**
|
|
308
|
+
* Strip SQL comments (single-line -- and multi-line block comments) from a query.
|
|
309
|
+
* Used by full_query context to allow agent-generated header comments
|
|
310
|
+
* without triggering the comment injection check.
|
|
311
|
+
*/
|
|
312
|
+
stripSQLComments(sql) {
|
|
313
|
+
return sql
|
|
314
|
+
.replace(/--[^\n]*/g, '') // Single-line comments
|
|
315
|
+
.replace(/\/\*[\s\S]*?\*\//g, ''); // Block comments
|
|
316
|
+
}
|
|
259
317
|
/**
|
|
260
318
|
* Escape special regex characters in a string
|
|
261
319
|
*/
|
|
262
320
|
escapeRegex(str) {
|
|
263
321
|
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
264
322
|
}
|
|
323
|
+
/**
|
|
324
|
+
* Normalize literal escape sequences in SQL strings.
|
|
325
|
+
* Agent-generated SQL sometimes arrives with literal \n, \r, \t sequences
|
|
326
|
+
* (backslash + letter) instead of actual whitespace characters. This happens
|
|
327
|
+
* when JSON is double-escaped or the SQL passes through a transport layer
|
|
328
|
+
* that doesn't interpret escape sequences. Without normalization, comment
|
|
329
|
+
* stripping fails because the regex expects real newlines.
|
|
330
|
+
*/
|
|
331
|
+
normalizeSQLWhitespace(sql) {
|
|
332
|
+
return sql
|
|
333
|
+
.replace(/\\r\\n/g, '\n') // Literal \r\n → newline
|
|
334
|
+
.replace(/\\n/g, '\n') // Literal \n → newline
|
|
335
|
+
.replace(/\\r/g, '\r') // Literal \r → carriage return
|
|
336
|
+
.replace(/\\t/g, '\t'); // Literal \t → tab
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Validate a full SQL query (SELECT or WITH/CTE statement).
|
|
340
|
+
* Blocks mutations, dangerous operations, and multi-statement injection.
|
|
341
|
+
* Allows SELECT, subqueries, set operations, and SQL comments.
|
|
342
|
+
*/
|
|
343
|
+
validateFullQuery(sql) {
|
|
344
|
+
// Normalize literal escape sequences before validation — agent-generated
|
|
345
|
+
// SQL may arrive with literal \n instead of real newlines, which breaks
|
|
346
|
+
// comment stripping and the "must start with SELECT" check.
|
|
347
|
+
const normalized = this.normalizeSQLWhitespace(sql);
|
|
348
|
+
return this.validate(normalized, { context: 'full_query' });
|
|
349
|
+
}
|
|
265
350
|
}
|
|
266
351
|
//# sourceMappingURL=SQLExpressionValidator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQLExpressionValidator.js","sourceRoot":"","sources":["../src/SQLExpressionValidator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"SQLExpressionValidator.js","sourceRoot":"","sources":["../src/SQLExpressionValidator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SQLExpressionValidator.security.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/SQLExpressionValidator.security.test.ts"],"names":[],"mappings":""}
|