@aifabrix/miso-client 1.0.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/LICENSE +21 -0
- package/README.md +147 -0
- package/dist/index.d.ts +111 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +199 -0
- package/dist/index.js.map +1 -0
- package/dist/services/auth.service.d.ts +33 -0
- package/dist/services/auth.service.d.ts.map +1 -0
- package/dist/services/auth.service.js +79 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/logger.service.d.ts +107 -0
- package/dist/services/logger.service.d.ts.map +1 -0
- package/dist/services/logger.service.js +260 -0
- package/dist/services/logger.service.js.map +1 -0
- package/dist/services/permission.service.d.ts +37 -0
- package/dist/services/permission.service.d.ts.map +1 -0
- package/dist/services/permission.service.js +128 -0
- package/dist/services/permission.service.js.map +1 -0
- package/dist/services/redis.service.d.ts +18 -0
- package/dist/services/redis.service.d.ts.map +1 -0
- package/dist/services/redis.service.js +112 -0
- package/dist/services/redis.service.js.map +1 -0
- package/dist/services/role.service.d.ts +33 -0
- package/dist/services/role.service.d.ts.map +1 -0
- package/dist/services/role.service.js +106 -0
- package/dist/services/role.service.js.map +1 -0
- package/dist/types/config.types.d.ts +66 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/config.types.js +6 -0
- package/dist/types/config.types.js.map +1 -0
- package/dist/utils/data-masker.d.ts +26 -0
- package/dist/utils/data-masker.d.ts.map +1 -0
- package/dist/utils/data-masker.js +121 -0
- package/dist/utils/data-masker.js.map +1 -0
- package/dist/utils/http-client.d.ts +16 -0
- package/dist/utils/http-client.d.ts.map +1 -0
- package/dist/utils/http-client.js +79 -0
- package/dist/utils/http-client.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Redis service for caching and log queuing
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.RedisService = void 0;
|
|
10
|
+
const ioredis_1 = __importDefault(require("ioredis"));
|
|
11
|
+
class RedisService {
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.connected = false;
|
|
14
|
+
this.config = config;
|
|
15
|
+
}
|
|
16
|
+
async connect() {
|
|
17
|
+
if (!this.config) {
|
|
18
|
+
// eslint-disable-next-line no-console
|
|
19
|
+
console.log('Redis not configured, using controller fallback');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
this.redis = new ioredis_1.default({
|
|
24
|
+
host: this.config.host,
|
|
25
|
+
port: this.config.port,
|
|
26
|
+
password: this.config.password,
|
|
27
|
+
db: this.config.db || 0,
|
|
28
|
+
keyPrefix: this.config.keyPrefix || 'miso:',
|
|
29
|
+
maxRetriesPerRequest: 3,
|
|
30
|
+
lazyConnect: true
|
|
31
|
+
});
|
|
32
|
+
await this.redis.connect();
|
|
33
|
+
this.connected = true;
|
|
34
|
+
// eslint-disable-next-line no-console
|
|
35
|
+
console.log('Connected to Redis');
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
// eslint-disable-next-line no-console
|
|
39
|
+
console.error('Failed to connect to Redis:', error);
|
|
40
|
+
this.connected = false;
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async disconnect() {
|
|
45
|
+
if (this.redis) {
|
|
46
|
+
await this.redis.disconnect();
|
|
47
|
+
this.connected = false;
|
|
48
|
+
// eslint-disable-next-line no-console
|
|
49
|
+
console.log('Disconnected from Redis');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async get(key) {
|
|
53
|
+
if (!this.redis || !this.connected) {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
return await this.redis.get(key);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
// eslint-disable-next-line no-console
|
|
61
|
+
console.error('Redis get error:', error);
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async set(key, value, ttl) {
|
|
66
|
+
if (!this.redis || !this.connected) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
await this.redis.setex(key, ttl, value);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
// eslint-disable-next-line no-console
|
|
75
|
+
console.error('Redis set error:', error);
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async delete(key) {
|
|
80
|
+
if (!this.redis || !this.connected) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
await this.redis.del(key);
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
// eslint-disable-next-line no-console
|
|
89
|
+
console.error('Redis delete error:', error);
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async rpush(queue, value) {
|
|
94
|
+
if (!this.redis || !this.connected) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
try {
|
|
98
|
+
await this.redis.rpush(queue, value);
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// eslint-disable-next-line no-console
|
|
103
|
+
console.error('Redis rpush error:', error);
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
isConnected() {
|
|
108
|
+
return this.connected;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.RedisService = RedisService;
|
|
112
|
+
//# sourceMappingURL=redis.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis.service.js","sourceRoot":"","sources":["../../src/services/redis.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Role service for user authorization with Redis caching
|
|
3
|
+
*/
|
|
4
|
+
import { RedisService } from './redis.service';
|
|
5
|
+
import { MisoClientConfig } from '../types/config.types';
|
|
6
|
+
export declare class RoleService {
|
|
7
|
+
private httpClient;
|
|
8
|
+
private redis;
|
|
9
|
+
private config;
|
|
10
|
+
private roleTTL;
|
|
11
|
+
constructor(config: MisoClientConfig, redis: RedisService);
|
|
12
|
+
/**
|
|
13
|
+
* Get user roles with Redis caching
|
|
14
|
+
*/
|
|
15
|
+
getRoles(token: string): Promise<string[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Check if user has specific role
|
|
18
|
+
*/
|
|
19
|
+
hasRole(token: string, role: string): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* Check if user has any of the specified roles
|
|
22
|
+
*/
|
|
23
|
+
hasAnyRole(token: string, roles: string[]): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* Check if user has all of the specified roles
|
|
26
|
+
*/
|
|
27
|
+
hasAllRoles(token: string, roles: string[]): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Force refresh roles from controller (bypass cache)
|
|
30
|
+
*/
|
|
31
|
+
refreshRoles(token: string): Promise<string[]>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=role.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role.service.d.ts","sourceRoot":"","sources":["../../src/services/role.service.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAc,MAAM,uBAAuB,CAAC;AAErE,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,YAAY;IAOzD;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAwDhD;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5D;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlE;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAKnE;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAyCrD"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Role service for user authorization with Redis caching
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RoleService = void 0;
|
|
7
|
+
const http_client_1 = require("../utils/http-client");
|
|
8
|
+
class RoleService {
|
|
9
|
+
constructor(config, redis) {
|
|
10
|
+
this.config = config;
|
|
11
|
+
this.redis = redis;
|
|
12
|
+
this.httpClient = new http_client_1.HttpClient(config);
|
|
13
|
+
this.roleTTL = config.cache?.roleTTL || 900; // 15 minutes default
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get user roles with Redis caching
|
|
17
|
+
*/
|
|
18
|
+
async getRoles(token) {
|
|
19
|
+
try {
|
|
20
|
+
// First get user info to extract userId
|
|
21
|
+
const userInfo = await this.httpClient.authenticatedRequest('POST', '/auth/validate', token);
|
|
22
|
+
if (!userInfo.user?.id) {
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
const userId = userInfo.user.id;
|
|
26
|
+
const cacheKey = `roles:${userId}:${this.config.environment}:${this.config.applicationKey}`;
|
|
27
|
+
// Check Redis cache first
|
|
28
|
+
if (this.redis.isConnected()) {
|
|
29
|
+
const cachedRoles = await this.redis.get(cacheKey);
|
|
30
|
+
if (cachedRoles) {
|
|
31
|
+
try {
|
|
32
|
+
const parsed = JSON.parse(cachedRoles);
|
|
33
|
+
return parsed.roles || [];
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
// eslint-disable-next-line no-console
|
|
37
|
+
console.warn('Failed to parse cached roles:', error);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Cache miss - fetch from controller
|
|
42
|
+
const roleResult = await this.httpClient.authenticatedRequest('GET', '/auth/roles', token);
|
|
43
|
+
const roles = roleResult.roles || [];
|
|
44
|
+
// Cache the result in Redis
|
|
45
|
+
if (this.redis.isConnected()) {
|
|
46
|
+
await this.redis.set(cacheKey, JSON.stringify({ roles, timestamp: Date.now() }), this.roleTTL);
|
|
47
|
+
}
|
|
48
|
+
return roles;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
// eslint-disable-next-line no-console
|
|
52
|
+
console.error('Failed to get roles:', error);
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Check if user has specific role
|
|
58
|
+
*/
|
|
59
|
+
async hasRole(token, role) {
|
|
60
|
+
const roles = await this.getRoles(token);
|
|
61
|
+
return roles.includes(role);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check if user has any of the specified roles
|
|
65
|
+
*/
|
|
66
|
+
async hasAnyRole(token, roles) {
|
|
67
|
+
const userRoles = await this.getRoles(token);
|
|
68
|
+
return roles.some((role) => userRoles.includes(role));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check if user has all of the specified roles
|
|
72
|
+
*/
|
|
73
|
+
async hasAllRoles(token, roles) {
|
|
74
|
+
const userRoles = await this.getRoles(token);
|
|
75
|
+
return roles.every((role) => userRoles.includes(role));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Force refresh roles from controller (bypass cache)
|
|
79
|
+
*/
|
|
80
|
+
async refreshRoles(token) {
|
|
81
|
+
try {
|
|
82
|
+
// Get user info to extract userId
|
|
83
|
+
const userInfo = await this.httpClient.authenticatedRequest('POST', '/auth/validate', token);
|
|
84
|
+
if (!userInfo.user?.id) {
|
|
85
|
+
return [];
|
|
86
|
+
}
|
|
87
|
+
const userId = userInfo.user.id;
|
|
88
|
+
const cacheKey = `roles:${userId}:${this.config.environment}:${this.config.applicationKey}`;
|
|
89
|
+
// Fetch fresh roles from controller
|
|
90
|
+
const roleResult = await this.httpClient.authenticatedRequest('GET', '/auth/roles', token);
|
|
91
|
+
const roles = roleResult.roles || [];
|
|
92
|
+
// Update cache with fresh data
|
|
93
|
+
if (this.redis.isConnected()) {
|
|
94
|
+
await this.redis.set(cacheKey, JSON.stringify({ roles, timestamp: Date.now() }), this.roleTTL);
|
|
95
|
+
}
|
|
96
|
+
return roles;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
// eslint-disable-next-line no-console
|
|
100
|
+
console.error('Failed to refresh roles:', error);
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.RoleService = RoleService;
|
|
106
|
+
//# sourceMappingURL=role.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"role.service.js","sourceRoot":"","sources":["../../src/services/role.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration types for MisoClient
|
|
3
|
+
*/
|
|
4
|
+
export interface RedisConfig {
|
|
5
|
+
host: string;
|
|
6
|
+
port: number;
|
|
7
|
+
password?: string;
|
|
8
|
+
db?: number;
|
|
9
|
+
keyPrefix?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface MisoClientConfig {
|
|
12
|
+
controllerUrl: string;
|
|
13
|
+
environment: 'dev' | 'tst' | 'pro';
|
|
14
|
+
applicationKey: string;
|
|
15
|
+
applicationId: string;
|
|
16
|
+
apiKey?: string;
|
|
17
|
+
redis?: RedisConfig;
|
|
18
|
+
logLevel?: 'debug' | 'info' | 'warn' | 'error';
|
|
19
|
+
cache?: {
|
|
20
|
+
roleTTL?: number;
|
|
21
|
+
permissionTTL?: number;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export interface UserInfo {
|
|
25
|
+
id: string;
|
|
26
|
+
username: string;
|
|
27
|
+
email?: string;
|
|
28
|
+
firstName?: string;
|
|
29
|
+
lastName?: string;
|
|
30
|
+
roles?: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface AuthResult {
|
|
33
|
+
authenticated: boolean;
|
|
34
|
+
user?: UserInfo;
|
|
35
|
+
error?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface LogEntry {
|
|
38
|
+
timestamp: string;
|
|
39
|
+
level: 'error' | 'audit' | 'info' | 'debug';
|
|
40
|
+
environment: string;
|
|
41
|
+
application: string;
|
|
42
|
+
applicationId: string;
|
|
43
|
+
userId?: string;
|
|
44
|
+
message: string;
|
|
45
|
+
context?: Record<string, unknown>;
|
|
46
|
+
ipAddress?: string;
|
|
47
|
+
userAgent?: string;
|
|
48
|
+
hostname?: string;
|
|
49
|
+
requestId?: string;
|
|
50
|
+
sessionId?: string;
|
|
51
|
+
correlationId?: string;
|
|
52
|
+
stackTrace?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface RoleResult {
|
|
55
|
+
userId: string;
|
|
56
|
+
roles: string[];
|
|
57
|
+
environment: string;
|
|
58
|
+
application: string;
|
|
59
|
+
}
|
|
60
|
+
export interface PermissionResult {
|
|
61
|
+
userId: string;
|
|
62
|
+
permissions: string[];
|
|
63
|
+
environment: string;
|
|
64
|
+
application: string;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=config.types.d.ts.map
|
|
@@ -0,0 +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;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC/C,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGlC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.types.js","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data masker utility for client-side sensitive data protection
|
|
3
|
+
* Implements ISO 27001 data protection controls
|
|
4
|
+
*/
|
|
5
|
+
export declare class DataMasker {
|
|
6
|
+
private static readonly MASKED_VALUE;
|
|
7
|
+
private static readonly sensitiveFields;
|
|
8
|
+
/**
|
|
9
|
+
* Check if a field name indicates sensitive data
|
|
10
|
+
*/
|
|
11
|
+
static isSensitiveField(key: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Mask sensitive data in objects, arrays, or primitives
|
|
14
|
+
* Returns a masked copy without modifying the original
|
|
15
|
+
*/
|
|
16
|
+
static maskSensitiveData(data: unknown): unknown;
|
|
17
|
+
/**
|
|
18
|
+
* Mask specific value (useful for masking individual strings)
|
|
19
|
+
*/
|
|
20
|
+
static maskValue(value: string, showFirst?: number, showLast?: number): string;
|
|
21
|
+
/**
|
|
22
|
+
* Check if data contains sensitive information
|
|
23
|
+
*/
|
|
24
|
+
static containsSensitiveData(data: unknown): boolean;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=data-masker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-masker.d.ts","sourceRoot":"","sources":["../../src/utils/data-masker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAkB;IAEtD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAsBpC;IAEH;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAkB7C;;;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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Data masker utility for client-side sensitive data protection
|
|
4
|
+
* Implements ISO 27001 data protection controls
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.DataMasker = void 0;
|
|
8
|
+
class DataMasker {
|
|
9
|
+
/**
|
|
10
|
+
* Check if a field name indicates sensitive data
|
|
11
|
+
*/
|
|
12
|
+
static isSensitiveField(key) {
|
|
13
|
+
const lowerKey = key.toLowerCase().replace(/[_-]/g, '');
|
|
14
|
+
// Check exact match
|
|
15
|
+
if (this.sensitiveFields.has(lowerKey)) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
// Check if field contains sensitive keywords
|
|
19
|
+
for (const sensitiveField of this.sensitiveFields) {
|
|
20
|
+
if (lowerKey.includes(sensitiveField)) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Mask sensitive data in objects, arrays, or primitives
|
|
28
|
+
* Returns a masked copy without modifying the original
|
|
29
|
+
*/
|
|
30
|
+
static maskSensitiveData(data) {
|
|
31
|
+
// Handle null and undefined
|
|
32
|
+
if (data === null || data === undefined) {
|
|
33
|
+
return data;
|
|
34
|
+
}
|
|
35
|
+
// Handle primitives (string, number, boolean)
|
|
36
|
+
if (typeof data !== 'object') {
|
|
37
|
+
return data;
|
|
38
|
+
}
|
|
39
|
+
// Handle arrays
|
|
40
|
+
if (Array.isArray(data)) {
|
|
41
|
+
return data.map((item) => this.maskSensitiveData(item));
|
|
42
|
+
}
|
|
43
|
+
// Handle objects
|
|
44
|
+
const masked = {};
|
|
45
|
+
for (const [key, value] of Object.entries(data)) {
|
|
46
|
+
if (this.isSensitiveField(key)) {
|
|
47
|
+
// Mask sensitive field
|
|
48
|
+
masked[key] = this.MASKED_VALUE;
|
|
49
|
+
}
|
|
50
|
+
else if (typeof value === 'object' && value !== null) {
|
|
51
|
+
// Recursively mask nested objects
|
|
52
|
+
masked[key] = this.maskSensitiveData(value);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// Keep non-sensitive value as-is
|
|
56
|
+
masked[key] = value;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return masked;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Mask specific value (useful for masking individual strings)
|
|
63
|
+
*/
|
|
64
|
+
static maskValue(value, showFirst = 0, showLast = 0) {
|
|
65
|
+
if (!value || value.length <= showFirst + showLast) {
|
|
66
|
+
return this.MASKED_VALUE;
|
|
67
|
+
}
|
|
68
|
+
const first = value.substring(0, showFirst);
|
|
69
|
+
const last = value.substring(value.length - showLast);
|
|
70
|
+
const masked = '*'.repeat(Math.min(8, value.length - showFirst - showLast));
|
|
71
|
+
return `${first}${masked}${last}`;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if data contains sensitive information
|
|
75
|
+
*/
|
|
76
|
+
static containsSensitiveData(data) {
|
|
77
|
+
if (data === null || data === undefined || typeof data !== 'object') {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
if (Array.isArray(data)) {
|
|
81
|
+
return data.some((item) => this.containsSensitiveData(item));
|
|
82
|
+
}
|
|
83
|
+
for (const [key, value] of Object.entries(data)) {
|
|
84
|
+
if (this.isSensitiveField(key)) {
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
if (typeof value === 'object' && value !== null) {
|
|
88
|
+
if (this.containsSensitiveData(value)) {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.DataMasker = DataMasker;
|
|
97
|
+
DataMasker.MASKED_VALUE = '***MASKED***';
|
|
98
|
+
DataMasker.sensitiveFields = new Set([
|
|
99
|
+
'password',
|
|
100
|
+
'passwd',
|
|
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
|
+
]);
|
|
121
|
+
//# sourceMappingURL=data-masker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-masker.js","sourceRoot":"","sources":["../../src/utils/data-masker.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,MAAa,UAAU;IA2BrB;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,GAAW;QACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAExD,oBAAoB;QACpB,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,6CAA6C;QAC7C,KAAK,MAAM,cAAc,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAClD,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACtC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,IAAa;QACpC,4BAA4B;QAC5B,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,8CAA8C;QAC9C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,gBAAgB;QAChB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,iBAAiB;QACjB,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,EAAE,CAAC;YAC3E,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,uBAAuB;gBACvB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;YAClC,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACvD,kCAAkC;gBAClC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,iCAAiC;gBACjC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,KAAa,EAAE,YAAoB,CAAC,EAAE,WAAmB,CAAC;QACzE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,GAAG,QAAQ,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC;QAE5E,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,IAAa;QACxC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACpE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/D,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAA+B,CAAC,EAAE,CAAC;YAC3E,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAChD,IAAI,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;oBACtC,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;;AA7HH,gCA8HC;AA7HyB,uBAAY,GAAG,cAAc,CAAC;AAE9B,0BAAe,GAAG,IAAI,GAAG,CAAC;IAChD,UAAU;IACV,QAAQ;IACR,KAAK;IACL,QAAQ;IACR,OAAO;IACP,KAAK;IACL,MAAM;IACN,eAAe;IACf,QAAQ;IACR,SAAS;IACT,KAAK;IACL,YAAY;IACZ,IAAI;IACJ,KAAK;IACL,KAAK;IACL,KAAK;IACL,QAAQ;IACR,aAAa;IACb,cAAc;IACd,YAAY;IACZ,WAAW;CACZ,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client utility for controller communication
|
|
3
|
+
*/
|
|
4
|
+
import { AxiosRequestConfig } from 'axios';
|
|
5
|
+
import { MisoClientConfig } from '../types/config.types';
|
|
6
|
+
export declare class HttpClient {
|
|
7
|
+
private axios;
|
|
8
|
+
private config;
|
|
9
|
+
constructor(config: MisoClientConfig);
|
|
10
|
+
get<T>(url: string, config?: AxiosRequestConfig): Promise<T>;
|
|
11
|
+
post<T>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
|
|
12
|
+
put<T>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
|
|
13
|
+
delete<T>(url: string, config?: AxiosRequestConfig): Promise<T>;
|
|
14
|
+
authenticatedRequest<T>(method: 'GET' | 'POST' | 'PUT' | 'DELETE', url: string, token: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../src/utils/http-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAc,EAEZ,kBAAkB,EAInB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,MAAM,CAAmB;gBAErB,MAAM,EAAE,gBAAgB;IAqC9B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAK5D,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAK7E,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAK5E,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAM/D,oBAAoB,CAAC,CAAC,EAC1B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,EACzC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,CAAC,CAAC;CAsBd"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HTTP client utility for controller communication
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.HttpClient = void 0;
|
|
10
|
+
const axios_1 = __importDefault(require("axios"));
|
|
11
|
+
class HttpClient {
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
this.axios = axios_1.default.create({
|
|
15
|
+
baseURL: config.controllerUrl,
|
|
16
|
+
timeout: 30000,
|
|
17
|
+
headers: {
|
|
18
|
+
'Content-Type': 'application/json',
|
|
19
|
+
'X-Environment': config.environment,
|
|
20
|
+
'X-Application': config.applicationKey
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
// Add request interceptor for automatic headers
|
|
24
|
+
this.axios.interceptors.request.use((config) => {
|
|
25
|
+
config.headers = config.headers || {};
|
|
26
|
+
config.headers['X-Environment'] = this.config.environment;
|
|
27
|
+
config.headers['X-Application'] = this.config.applicationKey;
|
|
28
|
+
return config;
|
|
29
|
+
}, (error) => Promise.reject(error));
|
|
30
|
+
// Add response interceptor for error handling
|
|
31
|
+
this.axios.interceptors.response.use((response) => response, (error) => {
|
|
32
|
+
if (error.response?.status === 401) {
|
|
33
|
+
// Enhance error with authentication context
|
|
34
|
+
error.message = 'Authentication failed - token may be invalid';
|
|
35
|
+
}
|
|
36
|
+
return Promise.reject(error);
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async get(url, config) {
|
|
40
|
+
const response = await this.axios.get(url, config);
|
|
41
|
+
return response.data;
|
|
42
|
+
}
|
|
43
|
+
async post(url, data, config) {
|
|
44
|
+
const response = await this.axios.post(url, data, config);
|
|
45
|
+
return response.data;
|
|
46
|
+
}
|
|
47
|
+
async put(url, data, config) {
|
|
48
|
+
const response = await this.axios.put(url, data, config);
|
|
49
|
+
return response.data;
|
|
50
|
+
}
|
|
51
|
+
async delete(url, config) {
|
|
52
|
+
const response = await this.axios.delete(url, config);
|
|
53
|
+
return response.data;
|
|
54
|
+
}
|
|
55
|
+
// Method for requests that need Authorization header
|
|
56
|
+
async authenticatedRequest(method, url, token, data, config) {
|
|
57
|
+
const requestConfig = {
|
|
58
|
+
...config,
|
|
59
|
+
headers: {
|
|
60
|
+
...config?.headers,
|
|
61
|
+
Authorization: `Bearer ${token}`
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
switch (method) {
|
|
65
|
+
case 'GET':
|
|
66
|
+
return this.get(url, requestConfig);
|
|
67
|
+
case 'POST':
|
|
68
|
+
return this.post(url, data, requestConfig);
|
|
69
|
+
case 'PUT':
|
|
70
|
+
return this.put(url, data, requestConfig);
|
|
71
|
+
case 'DELETE':
|
|
72
|
+
return this.delete(url, requestConfig);
|
|
73
|
+
default:
|
|
74
|
+
throw new Error(`Unsupported HTTP method: ${method}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.HttpClient = HttpClient;
|
|
79
|
+
//# sourceMappingURL=http-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../src/utils/http-client.ts"],"names":[],"mappings":"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"}
|