@aifabrix/miso-client 1.3.0 → 1.4.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 +55 -0
- package/dist/examples/custom-sensitive-fields.example.d.ts +48 -0
- package/dist/examples/custom-sensitive-fields.example.d.ts.map +1 -0
- package/dist/examples/custom-sensitive-fields.example.js +31 -0
- package/dist/examples/custom-sensitive-fields.example.js.map +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +20 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/types/config.types.d.ts +1 -0
- package/dist/src/types/config.types.d.ts.map +1 -1
- package/dist/src/types/config.types.js.map +1 -1
- package/dist/src/utils/config-loader.d.ts.map +1 -1
- package/dist/src/utils/config-loader.js +4 -0
- package/dist/src/utils/config-loader.js.map +1 -1
- package/dist/src/utils/data-masker.d.ts +20 -1
- package/dist/src/utils/data-masker.d.ts.map +1 -1
- package/dist/src/utils/data-masker.js +53 -27
- package/dist/src/utils/data-masker.js.map +1 -1
- package/dist/src/utils/http-client.d.ts +16 -21
- package/dist/src/utils/http-client.d.ts.map +1 -1
- package/dist/src/utils/http-client.js +149 -269
- package/dist/src/utils/http-client.js.map +1 -1
- package/dist/src/utils/internal-http-client.d.ts +49 -0
- package/dist/src/utils/internal-http-client.d.ts.map +1 -0
- package/dist/src/utils/internal-http-client.js +333 -0
- package/dist/src/utils/internal-http-client.js.map +1 -0
- package/dist/src/utils/sensitive-fields.config.json +67 -0
- package/dist/src/utils/sensitive-fields.loader.d.ts +29 -0
- package/dist/src/utils/sensitive-fields.loader.d.ts.map +1 -0
- package/dist/src/utils/sensitive-fields.loader.js +246 -0
- package/dist/src/utils/sensitive-fields.loader.js.map +1 -0
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -48,6 +48,14 @@ The **AI Fabrix Miso Client SDK** provides authentication, authorization, and lo
|
|
|
48
48
|
- Forensic analysis support
|
|
49
49
|
- Compliance reporting automation
|
|
50
50
|
|
|
51
|
+
**HTTP Request Audit (ISO 27001 Compliant)**
|
|
52
|
+
- Automatic audit logging for all HTTP requests
|
|
53
|
+
- Sensitive data masking (passwords, tokens, PII, financial data)
|
|
54
|
+
- Configurable sensitive fields via JSON configuration
|
|
55
|
+
- Debug logging with automatic data protection
|
|
56
|
+
- Request/response metadata capture
|
|
57
|
+
- User context extraction from JWT tokens
|
|
58
|
+
|
|
51
59
|
### ⚡ Performance & Scalability
|
|
52
60
|
|
|
53
61
|
**Intelligent Caching**
|
|
@@ -290,6 +298,51 @@ await client.log.audit('access.denied', 'authorization', {
|
|
|
290
298
|
|
|
291
299
|
---
|
|
292
300
|
|
|
301
|
+
### Step 6.5: HTTP Request Audit (ISO 27001)
|
|
302
|
+
|
|
303
|
+
**What happens:** All HTTP requests are automatically audited with sensitive data masking for ISO 27001 compliance.
|
|
304
|
+
|
|
305
|
+
```typescript
|
|
306
|
+
import { MisoClient, loadConfig } from '@aifabrix/miso-client';
|
|
307
|
+
|
|
308
|
+
const client = new MisoClient(loadConfig());
|
|
309
|
+
await client.initialize();
|
|
310
|
+
|
|
311
|
+
// HTTP requests are automatically audited
|
|
312
|
+
// - All requests/responses are logged with masked sensitive data
|
|
313
|
+
// - User context is extracted from JWT tokens
|
|
314
|
+
// - Request/response metadata (duration, size, status codes) is captured
|
|
315
|
+
// - Sensitive fields (passwords, tokens, PII, financial data) are automatically masked
|
|
316
|
+
|
|
317
|
+
// No additional code needed - works automatically!
|
|
318
|
+
const user = await client.getUser(token);
|
|
319
|
+
// This HTTP request is automatically audited with ISO 27001 compliance
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**Configuration (Optional):**
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
# Add to .env for custom sensitive fields configuration
|
|
326
|
+
MISO_SENSITIVE_FIELDS_CONFIG=/path/to/sensitive-fields.config.json
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
**What gets audited:**
|
|
330
|
+
- All HTTP requests to the controller
|
|
331
|
+
- Request/response metadata (method, URL, status, duration, size)
|
|
332
|
+
- User context (extracted from JWT tokens)
|
|
333
|
+
- Sensitive data is automatically masked (passwords, tokens, PII, credit cards, etc.)
|
|
334
|
+
|
|
335
|
+
**ISO 27001 Compliance:**
|
|
336
|
+
- Automatic sensitive data masking before logging
|
|
337
|
+
- Configurable sensitive field patterns
|
|
338
|
+
- Audit trail for all API communications
|
|
339
|
+
- Data protection controls enforced
|
|
340
|
+
|
|
341
|
+
→ [Custom sensitive fields example](examples/custom-sensitive-fields.example.ts)
|
|
342
|
+
→ [Sensitive fields config example](examples/sensitive-fields-config.example.json)
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
293
346
|
### Step 7: Encryption & Caching
|
|
294
347
|
|
|
295
348
|
**What happens:** Use encryption for sensitive data and generic caching for improved performance.
|
|
@@ -339,6 +392,7 @@ interface MisoClientConfig {
|
|
|
339
392
|
redis?: RedisConfig; // Optional: For caching
|
|
340
393
|
logLevel?: 'debug' | 'info' | 'warn' | 'error';
|
|
341
394
|
encryptionKey?: string; // Optional: Encryption key (or use ENCRYPTION_KEY env var)
|
|
395
|
+
sensitiveFieldsConfig?: string; // Optional: Path to ISO 27001 sensitive fields config JSON
|
|
342
396
|
cache?: {
|
|
343
397
|
roleTTL?: number; // Role cache TTL (default: 900s)
|
|
344
398
|
permissionTTL?: number; // Permission cache TTL (default: 900s)
|
|
@@ -447,6 +501,7 @@ MISO_CONTROLLER_URL=http://localhost:3000
|
|
|
447
501
|
REDIS_HOST=localhost
|
|
448
502
|
REDIS_PORT=6379
|
|
449
503
|
MISO_LOG_LEVEL=info
|
|
504
|
+
MISO_SENSITIVE_FIELDS_CONFIG=/path/to/sensitive-fields.config.json # Optional: ISO 27001 config
|
|
450
505
|
```
|
|
451
506
|
|
|
452
507
|
---
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example: Custom Sensitive Fields Configuration
|
|
3
|
+
*
|
|
4
|
+
* This example shows how to use a custom sensitive fields configuration file
|
|
5
|
+
* to extend the default ISO 27001 compliant sensitive fields.
|
|
6
|
+
*/
|
|
7
|
+
declare function example(): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Custom Sensitive Fields Configuration File Structure
|
|
10
|
+
*
|
|
11
|
+
* Create a JSON file with the following structure:
|
|
12
|
+
*
|
|
13
|
+
* {
|
|
14
|
+
* "version": "1.0.0",
|
|
15
|
+
* "description": "Your custom sensitive fields configuration",
|
|
16
|
+
* "categories": {
|
|
17
|
+
* "authentication": [
|
|
18
|
+
* "password",
|
|
19
|
+
* "token",
|
|
20
|
+
* // ... add your custom authentication fields
|
|
21
|
+
* ],
|
|
22
|
+
* "pii": [
|
|
23
|
+
* "email",
|
|
24
|
+
* "ssn",
|
|
25
|
+
* // ... add your custom PII fields
|
|
26
|
+
* ],
|
|
27
|
+
* "financial": [
|
|
28
|
+
* "creditCard",
|
|
29
|
+
* // ... add your custom financial fields
|
|
30
|
+
* ],
|
|
31
|
+
* "security": [
|
|
32
|
+
* "privateKey",
|
|
33
|
+
* // ... add your custom security fields
|
|
34
|
+
* ]
|
|
35
|
+
* },
|
|
36
|
+
* "fieldPatterns": [
|
|
37
|
+
* "password",
|
|
38
|
+
* "secret",
|
|
39
|
+
* // ... add patterns that match sensitive fields
|
|
40
|
+
* ]
|
|
41
|
+
* }
|
|
42
|
+
*
|
|
43
|
+
* Note: Your custom fields will be merged with the default fields.
|
|
44
|
+
* This means you can extend the default configuration without losing
|
|
45
|
+
* the built-in ISO 27001 compliant fields.
|
|
46
|
+
*/
|
|
47
|
+
export { example };
|
|
48
|
+
//# sourceMappingURL=custom-sensitive-fields.example.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-sensitive-fields.example.d.ts","sourceRoot":"","sources":["../../examples/custom-sensitive-fields.example.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,iBAAe,OAAO,kBA0BrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Example: Custom Sensitive Fields Configuration
|
|
4
|
+
*
|
|
5
|
+
* This example shows how to use a custom sensitive fields configuration file
|
|
6
|
+
* to extend the default ISO 27001 compliant sensitive fields.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.example = example;
|
|
10
|
+
const index_1 = require("../src/index");
|
|
11
|
+
async function example() {
|
|
12
|
+
// Option 1: Use environment variable
|
|
13
|
+
// Set MISO_SENSITIVE_FIELDS_CONFIG=/path/to/custom-sensitive-fields.json in .env
|
|
14
|
+
process.env.MISO_SENSITIVE_FIELDS_CONFIG = './custom-sensitive-fields.json';
|
|
15
|
+
// Option 2: Pass in config directly
|
|
16
|
+
const config = {
|
|
17
|
+
...(0, index_1.loadConfig)(),
|
|
18
|
+
sensitiveFieldsConfig: './custom-sensitive-fields.json' // Path to your custom config
|
|
19
|
+
};
|
|
20
|
+
const client = new index_1.MisoClient(config);
|
|
21
|
+
await client.initialize();
|
|
22
|
+
// Now all HTTP requests will use your custom sensitive fields configuration
|
|
23
|
+
// for masking sensitive data in audit and debug logs
|
|
24
|
+
const token = 'your-jwt-token-here';
|
|
25
|
+
// This request will be automatically audited and debug logged (if logLevel === 'debug')
|
|
26
|
+
// All sensitive data will be masked using your custom configuration
|
|
27
|
+
const user = await client.getUser(token);
|
|
28
|
+
console.log('User:', user);
|
|
29
|
+
await client.disconnect();
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=custom-sensitive-fields.example.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-sensitive-fields.example.js","sourceRoot":"","sources":["../../examples/custom-sensitive-fields.example.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAwEM,0BAAO;AAtEhB,wCAAsD;AAEtD,KAAK,UAAU,OAAO;IACpB,qCAAqC;IACrC,iFAAiF;IACjF,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,gCAAgC,CAAC;IAE5E,oCAAoC;IACpC,MAAM,MAAM,GAAG;QACb,GAAG,IAAA,kBAAU,GAAE;QACf,qBAAqB,EAAE,gCAAgC,CAAC,6BAA6B;KACtF,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,kBAAU,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAE1B,4EAA4E;IAC5E,qDAAqD;IAErD,MAAM,KAAK,GAAG,qBAAqB,CAAC;IAEpC,wFAAwF;IACxF,oEAAoE;IACpE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEzC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE3B,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;AAC5B,CAAC"}
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -26,14 +26,32 @@ const redis_service_1 = require("./services/redis.service");
|
|
|
26
26
|
const encryption_service_1 = require("./services/encryption.service");
|
|
27
27
|
const cache_service_1 = require("./services/cache.service");
|
|
28
28
|
const http_client_1 = require("./utils/http-client");
|
|
29
|
+
const internal_http_client_1 = require("./utils/internal-http-client");
|
|
30
|
+
const data_masker_1 = require("./utils/data-masker");
|
|
29
31
|
class MisoClient {
|
|
30
32
|
constructor(config) {
|
|
31
33
|
this.initialized = false;
|
|
32
34
|
this.config = config;
|
|
33
|
-
|
|
35
|
+
// Initialize DataMasker with custom config path if provided
|
|
36
|
+
if (config.sensitiveFieldsConfig) {
|
|
37
|
+
data_masker_1.DataMasker.setConfigPath(config.sensitiveFieldsConfig);
|
|
38
|
+
}
|
|
39
|
+
// Create InternalHttpClient first (base HTTP functionality)
|
|
40
|
+
const internalClient = new internal_http_client_1.InternalHttpClient(config);
|
|
41
|
+
// Create Redis service
|
|
34
42
|
this.redis = new redis_service_1.RedisService(config.redis);
|
|
43
|
+
// Create LoggerService with InternalHttpClient first (needs httpClient.request() and httpClient.config)
|
|
44
|
+
// InternalHttpClient has these methods, so we can use it directly
|
|
45
|
+
// Type assertion needed because InternalHttpClient has compatible interface with HttpClient
|
|
46
|
+
this.logger = new logger_service_1.LoggerService(internalClient, this.redis);
|
|
47
|
+
// Create public HttpClient that wraps InternalHttpClient with logger
|
|
48
|
+
this.httpClient = new http_client_1.HttpClient(config, this.logger);
|
|
49
|
+
// Update LoggerService to use the new public HttpClient (for logging)
|
|
50
|
+
// Type assertion needed because httpClient property is private in LoggerService but needs to be updated
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
+
this.logger.httpClient = this.httpClient;
|
|
53
|
+
// Create services
|
|
35
54
|
this.auth = new auth_service_1.AuthService(this.httpClient, this.redis);
|
|
36
|
-
this.logger = new logger_service_1.LoggerService(this.httpClient, this.redis);
|
|
37
55
|
// Initialize cache service with Redis support (used by roles and permissions)
|
|
38
56
|
this.cacheService = new cache_service_1.CacheService(this.redis);
|
|
39
57
|
// Initialize services that use cache
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;AAEH,0DAAsD;AACtD,0DAAsD;AACtD,sEAAkE;AAClE,8DAA0D;AAC1D,4DAAwD;AACxD,sEAAkE;AAClE,4DAAwD;AACxD,qDAAiD;AAGjD,MAAa,UAAU;IAYrB,YAAY,MAAwB;QAF5B,gBAAW,GAAG,KAAK,CAAC;QAG1B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../../src/types/config.types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAE/B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IAGrB,KAAK,CAAC,EAAE,WAAW,CAAC;IAGpB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAG/C,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../../src/types/config.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.types.js","sourceRoot":"","sources":["../../../src/types/config.types.ts"],"names":[],"mappings":";AAAA;;GAEG;;
|
|
1
|
+
{"version":3,"file":"config.types.js","sourceRoot":"","sources":["../../../src/types/config.types.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA8GH,0CA4BC;AAhCD;;;GAGG;AACH,SAAgB,eAAe,CAAC,IAAa;IAC3C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,GAAG,GAAG,IAA+B,CAAC;IAE5C,wBAAwB;IACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;QAChF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uDAAuD;IACvD,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,WAAW,CAAC;IACrD,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uBAAuB;IACvB,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAe,MAAM,uBAAuB,CAAC;AAEtE;;GAEG;AACH,wBAAgB,UAAU,IAAI,gBAAgB,
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../src/utils/config-loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAe,MAAM,uBAAuB,CAAC;AAEtE;;GAEG;AACH,wBAAgB,UAAU,IAAI,gBAAgB,CAoD7C"}
|
|
@@ -47,6 +47,10 @@ function loadConfig() {
|
|
|
47
47
|
if (process.env.API_KEY) {
|
|
48
48
|
config.apiKey = process.env.API_KEY;
|
|
49
49
|
}
|
|
50
|
+
// Optional sensitive fields configuration file path
|
|
51
|
+
if (process.env.MISO_SENSITIVE_FIELDS_CONFIG) {
|
|
52
|
+
config.sensitiveFieldsConfig = process.env.MISO_SENSITIVE_FIELDS_CONFIG;
|
|
53
|
+
}
|
|
50
54
|
return config;
|
|
51
55
|
}
|
|
52
56
|
//# sourceMappingURL=config-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../../src/utils/config-loader.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAQH,
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../../src/utils/config-loader.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAQH,gCAoDC;AA1DD,yBAAuB;AAGvB;;GAEG;AACH,SAAgB,UAAU;IACxB,MAAM,MAAM,GAAqB;QAC/B,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,gCAAgC;QAClF,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;QACvE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE;QACnF,QAAQ,EAAG,OAAO,CAAC,GAAG,CAAC,cAAsD,IAAI,OAAO;KACzF,CAAC;IAEF,2BAA2B;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,+BAA+B;IAC/B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACzC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,WAAW,GAAgB;YAC/B,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,MAAM,CAAC;YAChD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;SACrC,CAAC;QAEF,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACzB,WAAW,CAAC,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACjC,WAAW,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACvD,CAAC;QAED,MAAM,CAAC,KAAK,GAAG,WAAW,CAAC;IAC7B,CAAC;IAED,0BAA0B;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAC/B,MAAM,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACpD,CAAC;IAED,gEAAgE;IAChE,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IACtC,CAAC;IAED,oDAAoD;IACpD,IAAI,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,CAAC;QAC7C,MAAM,CAAC,qBAAqB,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;IAC1E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -4,7 +4,26 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export declare class DataMasker {
|
|
6
6
|
private static readonly MASKED_VALUE;
|
|
7
|
-
private static
|
|
7
|
+
private static cachedFields;
|
|
8
|
+
private static cachedFieldPatterns;
|
|
9
|
+
private static configPath;
|
|
10
|
+
/**
|
|
11
|
+
* Initialize sensitive fields from JSON configuration
|
|
12
|
+
* Loads configuration on first use and caches it
|
|
13
|
+
*/
|
|
14
|
+
private static initializeSensitiveFields;
|
|
15
|
+
/**
|
|
16
|
+
* Get sensitive fields set (lazy loaded from JSON config)
|
|
17
|
+
*/
|
|
18
|
+
private static getSensitiveFields;
|
|
19
|
+
/**
|
|
20
|
+
* Get field patterns (lazy loaded from JSON config)
|
|
21
|
+
*/
|
|
22
|
+
private static getFieldPatterns;
|
|
23
|
+
/**
|
|
24
|
+
* Set custom configuration path (call before first use if needed)
|
|
25
|
+
*/
|
|
26
|
+
static setConfigPath(customPath: string): void;
|
|
8
27
|
/**
|
|
9
28
|
* Check if a field name indicates sensitive data
|
|
10
29
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-masker.d.ts","sourceRoot":"","sources":["../../../src/utils/data-masker.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"data-masker.d.ts","sourceRoot":"","sources":["../../../src/utils/data-masker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAkB;IACtD,OAAO,CAAC,MAAM,CAAC,YAAY,CAA4B;IACvD,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAyB;IAC3D,OAAO,CAAC,MAAM,CAAC,UAAU,CAAiC;IAE1D;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAoBxC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAIjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAO/B;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAM9C;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAoB7C;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAkChD;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAU,GAAG,MAAM;IAYpF;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;CAsBrD"}
|
|
@@ -5,19 +5,65 @@
|
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.DataMasker = void 0;
|
|
8
|
+
const sensitive_fields_loader_1 = require("./sensitive-fields.loader");
|
|
8
9
|
class DataMasker {
|
|
10
|
+
/**
|
|
11
|
+
* Initialize sensitive fields from JSON configuration
|
|
12
|
+
* Loads configuration on first use and caches it
|
|
13
|
+
*/
|
|
14
|
+
static initializeSensitiveFields(customPath) {
|
|
15
|
+
// If config path changed, reload
|
|
16
|
+
if (this.configPath !== customPath) {
|
|
17
|
+
this.cachedFields = null;
|
|
18
|
+
this.cachedFieldPatterns = null;
|
|
19
|
+
this.configPath = customPath;
|
|
20
|
+
}
|
|
21
|
+
// Return cached if available
|
|
22
|
+
if (this.cachedFields) {
|
|
23
|
+
return this.cachedFields;
|
|
24
|
+
}
|
|
25
|
+
// Load from JSON config (with fallback to defaults)
|
|
26
|
+
this.cachedFields = (0, sensitive_fields_loader_1.loadSensitiveFieldsConfig)(customPath);
|
|
27
|
+
this.cachedFieldPatterns = (0, sensitive_fields_loader_1.getFieldPatterns)(customPath);
|
|
28
|
+
return this.cachedFields;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get sensitive fields set (lazy loaded from JSON config)
|
|
32
|
+
*/
|
|
33
|
+
static getSensitiveFields() {
|
|
34
|
+
return this.initializeSensitiveFields(this.configPath);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get field patterns (lazy loaded from JSON config)
|
|
38
|
+
*/
|
|
39
|
+
static getFieldPatterns() {
|
|
40
|
+
if (!this.cachedFieldPatterns) {
|
|
41
|
+
this.cachedFieldPatterns = (0, sensitive_fields_loader_1.getFieldPatterns)(this.configPath);
|
|
42
|
+
}
|
|
43
|
+
return this.cachedFieldPatterns;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Set custom configuration path (call before first use if needed)
|
|
47
|
+
*/
|
|
48
|
+
static setConfigPath(customPath) {
|
|
49
|
+
this.configPath = customPath;
|
|
50
|
+
this.cachedFields = null;
|
|
51
|
+
this.cachedFieldPatterns = null;
|
|
52
|
+
}
|
|
9
53
|
/**
|
|
10
54
|
* Check if a field name indicates sensitive data
|
|
11
55
|
*/
|
|
12
56
|
static isSensitiveField(key) {
|
|
57
|
+
const sensitiveFields = this.getSensitiveFields();
|
|
58
|
+
const fieldPatterns = this.getFieldPatterns();
|
|
13
59
|
const lowerKey = key.toLowerCase().replace(/[_-]/g, '');
|
|
14
60
|
// Check exact match
|
|
15
|
-
if (
|
|
61
|
+
if (sensitiveFields.has(lowerKey)) {
|
|
16
62
|
return true;
|
|
17
63
|
}
|
|
18
|
-
// Check if field contains sensitive keywords
|
|
19
|
-
for (const
|
|
20
|
-
if (lowerKey.includes(
|
|
64
|
+
// Check if field contains sensitive keywords (from fieldPatterns)
|
|
65
|
+
for (const pattern of fieldPatterns) {
|
|
66
|
+
if (lowerKey.includes(pattern.toLowerCase())) {
|
|
21
67
|
return true;
|
|
22
68
|
}
|
|
23
69
|
}
|
|
@@ -95,27 +141,7 @@ class DataMasker {
|
|
|
95
141
|
}
|
|
96
142
|
exports.DataMasker = DataMasker;
|
|
97
143
|
DataMasker.MASKED_VALUE = '***MASKED***';
|
|
98
|
-
DataMasker.
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
'pwd',
|
|
102
|
-
'secret',
|
|
103
|
-
'token',
|
|
104
|
-
'key',
|
|
105
|
-
'auth',
|
|
106
|
-
'authorization',
|
|
107
|
-
'cookie',
|
|
108
|
-
'session',
|
|
109
|
-
'ssn',
|
|
110
|
-
'creditcard',
|
|
111
|
-
'cc',
|
|
112
|
-
'cvv',
|
|
113
|
-
'pin',
|
|
114
|
-
'otp',
|
|
115
|
-
'apikey',
|
|
116
|
-
'accesstoken',
|
|
117
|
-
'refreshtoken',
|
|
118
|
-
'privatekey',
|
|
119
|
-
'secretkey'
|
|
120
|
-
]);
|
|
144
|
+
DataMasker.cachedFields = null;
|
|
145
|
+
DataMasker.cachedFieldPatterns = null;
|
|
146
|
+
DataMasker.configPath = undefined;
|
|
121
147
|
//# sourceMappingURL=data-masker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-masker.js","sourceRoot":"","sources":["../../../src/utils/data-masker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,MAAa,UAAU;
|
|
1
|
+
{"version":3,"file":"data-masker.js","sourceRoot":"","sources":["../../../src/utils/data-masker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* HTTP client
|
|
2
|
+
* Public HTTP client with automatic audit and debug logging
|
|
3
|
+
* Wraps InternalHttpClient and adds ISO 27001 compliant logging
|
|
3
4
|
*/
|
|
4
5
|
import { AxiosRequestConfig } from 'axios';
|
|
5
6
|
import { MisoClientConfig } from '../types/config.types';
|
|
7
|
+
import { LoggerService } from '../services/logger.service';
|
|
6
8
|
export declare class HttpClient {
|
|
7
|
-
private
|
|
9
|
+
private internalClient;
|
|
10
|
+
private logger;
|
|
8
11
|
readonly config: MisoClientConfig;
|
|
9
|
-
|
|
10
|
-
private tokenExpiresAt;
|
|
11
|
-
private tokenRefreshPromise;
|
|
12
|
-
constructor(config: MisoClientConfig);
|
|
12
|
+
constructor(config: MisoClientConfig, logger: LoggerService);
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
15
|
-
* Proactively refreshes if token will expire within 60 seconds
|
|
14
|
+
* Setup audit and debug logging interceptors
|
|
16
15
|
*/
|
|
17
|
-
private
|
|
16
|
+
private setupAuditLogging;
|
|
18
17
|
/**
|
|
19
|
-
*
|
|
18
|
+
* Check if request should be audited
|
|
19
|
+
* Excludes certain endpoints to prevent infinite loops
|
|
20
20
|
*/
|
|
21
|
-
private
|
|
21
|
+
private shouldAuditRequest;
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
23
|
+
* Extract user ID from JWT token
|
|
24
24
|
*/
|
|
25
|
-
private
|
|
25
|
+
private extractUserIdFromToken;
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
28
|
-
*
|
|
27
|
+
* Log HTTP request audit event
|
|
28
|
+
* Masks all sensitive data before logging (ISO 27001 compliance)
|
|
29
29
|
*/
|
|
30
|
-
private
|
|
31
|
-
/**
|
|
32
|
-
* Create MisoClientError from AxiosError
|
|
33
|
-
* Parses structured error response if available, falls back to errorBody
|
|
34
|
-
*/
|
|
35
|
-
private createMisoClientError;
|
|
30
|
+
private logHttpRequestAudit;
|
|
36
31
|
get<T>(url: string, config?: AxiosRequestConfig): Promise<T>;
|
|
37
32
|
post<T>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
|
|
38
33
|
put<T>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../../src/utils/http-client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../../src/utils/http-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,EAInB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAe3D,qBAAa,UAAU;IACrB,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,MAAM,CAAgB;IAC9B,SAAgB,MAAM,EAAE,gBAAgB,CAAC;gBAE7B,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa;IAa3D;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA6CzB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAe9B;;;OAGG;YACW,mBAAmB;IAmG3B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAI5D,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAI7E,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAI5E,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAK/D,OAAO,CAAC,CAAC,EACb,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,EACzC,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,CAAC,CAAC;IAQP,oBAAoB,CAAC,CAAC,EAC1B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,EACzC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EAAE,mDAAmD;IAClE,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,CAAC,CAAC;CAGd"}
|