hi-secure 1.0.16 → 1.0.17
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/dist/adapters/ArgonAdapter.d.ts.map +1 -1
- package/dist/adapters/ArgonAdapter.js +0 -36
- package/dist/adapters/ArgonAdapter.js.map +1 -1
- package/dist/adapters/BcryptAdapter.d.ts.map +1 -1
- package/dist/adapters/BcryptAdapter.js +0 -36
- package/dist/adapters/BcryptAdapter.js.map +1 -1
- package/dist/adapters/ExpressRLAdapter.d.ts.map +1 -1
- package/dist/adapters/ExpressRLAdapter.js +0 -38
- package/dist/adapters/ExpressRLAdapter.js.map +1 -1
- package/dist/adapters/ExpressValidatorAdapter.d.ts.map +1 -1
- package/dist/adapters/ExpressValidatorAdapter.js +0 -36
- package/dist/adapters/ExpressValidatorAdapter.js.map +1 -1
- package/dist/adapters/GoogleAdapter.d.ts.map +1 -1
- package/dist/adapters/GoogleAdapter.js +0 -63
- package/dist/adapters/GoogleAdapter.js.map +1 -1
- package/dist/adapters/JWTAdapter.d.ts.map +1 -1
- package/dist/adapters/JWTAdapter.js +0 -79
- package/dist/adapters/JWTAdapter.js.map +1 -1
- package/dist/adapters/RLFlexibleAdapter.d.ts.map +1 -1
- package/dist/adapters/RLFlexibleAdapter.js +0 -64
- package/dist/adapters/RLFlexibleAdapter.js.map +1 -1
- package/dist/adapters/SanitizeHtmlAdapter.d.ts.map +1 -1
- package/dist/adapters/SanitizeHtmlAdapter.js +0 -64
- package/dist/adapters/SanitizeHtmlAdapter.js.map +1 -1
- package/dist/adapters/XSSAdapter.d.ts.map +1 -1
- package/dist/adapters/XSSAdapter.js +0 -116
- package/dist/adapters/XSSAdapter.js.map +1 -1
- package/dist/adapters/ZodAdapter.d.ts.map +1 -1
- package/dist/adapters/ZodAdapter.js +0 -3
- package/dist/adapters/ZodAdapter.js.map +1 -1
- package/dist/core/HiSecure.d.ts.map +1 -1
- package/dist/core/HiSecure.js +0 -16
- package/dist/core/HiSecure.js.map +1 -1
- package/dist/logging/index.d.ts.map +1 -1
- package/dist/logging/index.js +0 -2
- package/dist/logging/index.js.map +1 -1
- package/dist/logging/morganSetup.d.ts.map +1 -1
- package/dist/logging/morganSetup.js +0 -14
- package/dist/logging/morganSetup.js.map +1 -1
- package/dist/logging/winstonSetup.d.ts.map +1 -1
- package/dist/logging/winstonSetup.js +2 -46
- package/dist/logging/winstonSetup.js.map +1 -1
- package/dist/managers/AuthManager.d.ts.map +1 -1
- package/dist/managers/AuthManager.js +0 -108
- package/dist/managers/AuthManager.js.map +1 -1
- package/dist/managers/CorsManager.d.ts.map +1 -1
- package/dist/managers/CorsManager.js +0 -28
- package/dist/managers/CorsManager.js.map +1 -1
- package/dist/managers/HashManager.d.ts.map +1 -1
- package/dist/managers/HashManager.js +0 -92
- package/dist/managers/HashManager.js.map +1 -1
- package/dist/managers/JsonManager.d.ts.map +1 -1
- package/dist/managers/JsonManager.js +0 -55
- package/dist/managers/JsonManager.js.map +1 -1
- package/dist/managers/RateLimitManager.d.ts.map +1 -1
- package/dist/managers/RateLimitManager.js +0 -3
- package/dist/managers/RateLimitManager.js.map +1 -1
- package/dist/managers/SanitizerManager.d.ts.map +1 -1
- package/dist/managers/SanitizerManager.js +0 -80
- package/dist/managers/SanitizerManager.js.map +1 -1
- package/dist/managers/ValidatorManager.d.ts.map +1 -1
- package/dist/managers/ValidatorManager.js +0 -59
- package/dist/managers/ValidatorManager.js.map +1 -1
- package/package.json +1 -1
- package/src/adapters/ArgonAdapter.ts +0 -45
- package/src/adapters/BcryptAdapter.ts +0 -49
- package/src/adapters/ExpressRLAdapter.ts +0 -48
- package/src/adapters/ExpressValidatorAdapter.ts +0 -50
- package/src/adapters/GoogleAdapter.ts +0 -82
- package/src/adapters/JWTAdapter.ts +0 -96
- package/src/adapters/RLFlexibleAdapter.ts +0 -82
- package/src/adapters/SanitizeHtmlAdapter.ts +1 -84
- package/src/adapters/XSSAdapter.ts +1 -150
- package/src/adapters/ZodAdapter.ts +0 -46
- package/src/core/HiSecure.ts +1 -369
- package/src/logging/index.ts +0 -6
- package/src/logging/morganSetup.ts +0 -25
- package/src/logging/winstonSetup.ts +2 -64
- package/src/managers/AuthManager.ts +0 -141
- package/src/managers/CorsManager.ts +0 -40
- package/src/managers/HashManager.ts +0 -108
- package/src/managers/JsonManager.ts +0 -62
- package/src/managers/RateLimitManager.ts +0 -113
- package/src/managers/SanitizerManager.ts +0 -103
- package/src/managers/ValidatorManager.ts +0 -75
|
@@ -1,98 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// import { AdapterError } from "../core/errors/AdapterError.js";
|
|
3
|
-
// import { HiSecureConfig } from "../core/types/HiSecureConfig.js";
|
|
4
|
-
// import { logger } from "../logging";
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.HashManager = void 0;
|
|
7
|
-
// interface HashAdapter {
|
|
8
|
-
// hash(value: string): Promise<string>;
|
|
9
|
-
// verify(value: string, hashed: string): Promise<boolean>;
|
|
10
|
-
// }
|
|
11
|
-
// export interface HashResult {
|
|
12
|
-
// hash: string;
|
|
13
|
-
// algorithm: string;
|
|
14
|
-
// usedFallback: boolean;
|
|
15
|
-
// }
|
|
16
|
-
// export class HashManager {
|
|
17
|
-
// private config: HiSecureConfig["hashing"];
|
|
18
|
-
// private primaryAdapter: HashAdapter;
|
|
19
|
-
// private fallbackAdapter: HashAdapter | null;
|
|
20
|
-
// constructor(
|
|
21
|
-
// config: HiSecureConfig["hashing"],
|
|
22
|
-
// primaryAdapter: HashAdapter,
|
|
23
|
-
// fallbackAdapter: HashAdapter | null
|
|
24
|
-
// ) {
|
|
25
|
-
// this.config = config;
|
|
26
|
-
// this.primaryAdapter = primaryAdapter;
|
|
27
|
-
// this.fallbackAdapter = fallbackAdapter;
|
|
28
|
-
// }
|
|
29
|
-
// async hash(value: string, options?: { allowFallback?: boolean }): Promise<HashResult> {
|
|
30
|
-
// try {
|
|
31
|
-
// const hash = await this.primaryAdapter.hash(value);
|
|
32
|
-
// return {
|
|
33
|
-
// hash,
|
|
34
|
-
// algorithm: this.config.primary,
|
|
35
|
-
// usedFallback: false
|
|
36
|
-
// };
|
|
37
|
-
// } catch (err: any) {
|
|
38
|
-
// logger.warn("Primary hashing failed", {
|
|
39
|
-
// error: err.message,
|
|
40
|
-
// algorithm: this.config.primary
|
|
41
|
-
// });
|
|
42
|
-
// if (!options?.allowFallback || !this.fallbackAdapter) {
|
|
43
|
-
// throw new AdapterError(
|
|
44
|
-
// `Primary hashing (${this.config.primary}) failed. Fallback not allowed.`
|
|
45
|
-
// );
|
|
46
|
-
// }
|
|
47
|
-
// try {
|
|
48
|
-
// const hash = await this.fallbackAdapter.hash(value);
|
|
49
|
-
// // Log security downgrade warning
|
|
50
|
-
// logger.warn("SECURITY DOWNGRADE: Using fallback hashing", {
|
|
51
|
-
// from: this.config.primary,
|
|
52
|
-
// to: this.config.fallback
|
|
53
|
-
// });
|
|
54
|
-
// return {
|
|
55
|
-
// hash,
|
|
56
|
-
// algorithm: this.config.fallback || 'bcrypt',
|
|
57
|
-
// usedFallback: true
|
|
58
|
-
// };
|
|
59
|
-
// } catch (fallbackErr: any) {
|
|
60
|
-
// logger.error("Fallback hashing failed", {
|
|
61
|
-
// error: fallbackErr?.message,
|
|
62
|
-
// });
|
|
63
|
-
// throw new AdapterError(
|
|
64
|
-
// "Both primary and fallback hashing failed."
|
|
65
|
-
// );
|
|
66
|
-
// }
|
|
67
|
-
// }
|
|
68
|
-
// }
|
|
69
|
-
// async verify(value: string, hashed: string): Promise<boolean> {
|
|
70
|
-
// // primary adapter - first
|
|
71
|
-
// try {
|
|
72
|
-
// return await this.primaryAdapter.verify(value, hashed);
|
|
73
|
-
// } catch (primaryErr: any) {
|
|
74
|
-
// logger.warn("Primary verify failed", {
|
|
75
|
-
// error: primaryErr?.message,
|
|
76
|
-
// });
|
|
77
|
-
// // fallback exists - try it
|
|
78
|
-
// if (this.fallbackAdapter) {
|
|
79
|
-
// try {
|
|
80
|
-
// return await this.fallbackAdapter.verify(value, hashed);
|
|
81
|
-
// } catch (fallbackErr: any) {
|
|
82
|
-
// logger.error(" Fallback verify failed", {
|
|
83
|
-
// error: fallbackErr?.message,
|
|
84
|
-
// });
|
|
85
|
-
// throw new AdapterError(
|
|
86
|
-
// "Both primary and fallback verify failed."
|
|
87
|
-
// );
|
|
88
|
-
// }
|
|
89
|
-
// }
|
|
90
|
-
// throw new AdapterError(
|
|
91
|
-
// "Primary verify failed and no fallback adapter configured."
|
|
92
|
-
// );
|
|
93
|
-
// }
|
|
94
|
-
// }
|
|
95
|
-
// }
|
|
96
4
|
const AdapterError_1 = require("../core/errors/AdapterError");
|
|
97
5
|
const logging_1 = require("../logging");
|
|
98
6
|
class HashManager {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HashManager.js","sourceRoot":"","sources":["../../src/managers/HashManager.ts"],"names":[],"mappings":"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","sourcesContent":["// import { AdapterError } from \"../core/errors/AdapterError.js\";\r\n// import { HiSecureConfig } from \"../core/types/HiSecureConfig.js\";\r\n// import { logger } from \"../logging\";\r\n\r\n// interface HashAdapter {\r\n// hash(value: string): Promise<string>;\r\n// verify(value: string, hashed: string): Promise<boolean>;\r\n// }\r\n\r\n// export interface HashResult {\r\n// hash: string;\r\n// algorithm: string;\r\n// usedFallback: boolean;\r\n// }\r\n\r\n// export class HashManager {\r\n// private config: HiSecureConfig[\"hashing\"];\r\n// private primaryAdapter: HashAdapter;\r\n// private fallbackAdapter: HashAdapter | null;\r\n\r\n// constructor(\r\n// config: HiSecureConfig[\"hashing\"],\r\n// primaryAdapter: HashAdapter,\r\n// fallbackAdapter: HashAdapter | null\r\n// ) {\r\n// this.config = config;\r\n// this.primaryAdapter = primaryAdapter;\r\n// this.fallbackAdapter = fallbackAdapter;\r\n// }\r\n\r\n// async hash(value: string, options?: { allowFallback?: boolean }): Promise<HashResult> {\r\n// try {\r\n// const hash = await this.primaryAdapter.hash(value);\r\n// return {\r\n// hash,\r\n// algorithm: this.config.primary,\r\n// usedFallback: false\r\n// };\r\n// } catch (err: any) {\r\n// logger.warn(\"Primary hashing failed\", {\r\n// error: err.message,\r\n// algorithm: this.config.primary\r\n// });\r\n\r\n// if (!options?.allowFallback || !this.fallbackAdapter) {\r\n// throw new AdapterError(\r\n// `Primary hashing (${this.config.primary}) failed. Fallback not allowed.`\r\n// );\r\n// }\r\n\r\n// try {\r\n// const hash = await this.fallbackAdapter.hash(value);\r\n \r\n// // Log security downgrade warning\r\n// logger.warn(\"SECURITY DOWNGRADE: Using fallback hashing\", {\r\n// from: this.config.primary,\r\n// to: this.config.fallback\r\n// });\r\n \r\n// return {\r\n// hash,\r\n// algorithm: this.config.fallback || 'bcrypt',\r\n// usedFallback: true\r\n// };\r\n// } catch (fallbackErr: any) {\r\n// logger.error(\"Fallback hashing failed\", {\r\n// error: fallbackErr?.message,\r\n// });\r\n// throw new AdapterError(\r\n// \"Both primary and fallback hashing failed.\"\r\n// );\r\n// }\r\n// }\r\n// }\r\n\r\n// async verify(value: string, hashed: string): Promise<boolean> {\r\n// // primary adapter - first\r\n// try {\r\n// return await this.primaryAdapter.verify(value, hashed);\r\n// } catch (primaryErr: any) {\r\n// logger.warn(\"Primary verify failed\", {\r\n// error: primaryErr?.message,\r\n// });\r\n\r\n// // fallback exists - try it\r\n// if (this.fallbackAdapter) {\r\n// try {\r\n// return await this.fallbackAdapter.verify(value, hashed);\r\n// } catch (fallbackErr: any) {\r\n// logger.error(\" Fallback verify failed\", {\r\n// error: fallbackErr?.message,\r\n// });\r\n// throw new AdapterError(\r\n// \"Both primary and fallback verify failed.\"\r\n// );\r\n// }\r\n// }\r\n \r\n// throw new AdapterError(\r\n// \"Primary verify failed and no fallback adapter configured.\"\r\n// );\r\n// }\r\n// }\r\n// }\r\n\r\n\r\n\r\n\r\nimport { AdapterError } from \"../core/errors/AdapterError\";\r\nimport { HiSecureConfig } from \"../core/types/HiSecureConfig\";\r\nimport { logger } from \"../logging\";\r\n\r\ninterface HashAdapter {\r\n hash(value: string): Promise<string>;\r\n verify(value: string, hashed: string): Promise<boolean>;\r\n}\r\n\r\nexport interface HashResult {\r\n hash: string;\r\n algorithm: string;\r\n usedFallback: boolean;\r\n}\r\n\r\nexport class HashManager {\r\n private config: HiSecureConfig[\"hashing\"];\r\n private primaryAdapter: HashAdapter;\r\n private fallbackAdapter: HashAdapter | null;\r\n\r\n constructor(\r\n config: HiSecureConfig[\"hashing\"],\r\n primaryAdapter: HashAdapter,\r\n fallbackAdapter: HashAdapter | null\r\n ) {\r\n this.config = config;\r\n this.primaryAdapter = primaryAdapter;\r\n this.fallbackAdapter = fallbackAdapter;\r\n\r\n logger.info(\"HashManager initialized\", {\r\n layer: \"hash-manager\",\r\n primary: config.primary,\r\n fallbackEnabled: !!fallbackAdapter\r\n });\r\n }\r\n\r\n async hash(\r\n value: string,\r\n options?: { allowFallback?: boolean }\r\n ): Promise<HashResult> {\r\n try {\r\n const hash = await this.primaryAdapter.hash(value);\r\n\r\n return {\r\n hash,\r\n algorithm: this.config.primary,\r\n usedFallback: false\r\n };\r\n\r\n } catch (err: any) {\r\n logger.warn(\"Primary hashing failed\", {\r\n layer: \"hash-manager\",\r\n operation: \"hash\",\r\n algorithm: this.config.primary,\r\n reason: err?.message\r\n });\r\n\r\n if (!options?.allowFallback || !this.fallbackAdapter) {\r\n throw new AdapterError(\r\n `Primary hashing (${this.config.primary}) failed. Fallback not allowed.`\r\n );\r\n }\r\n\r\n try {\r\n const hash = await this.fallbackAdapter.hash(value);\r\n\r\n // ⚠️ security downgrade log (VERY GOOD PRACTICE)\r\n logger.warn(\"Hashing fallback used (security downgrade)\", {\r\n layer: \"hash-manager\",\r\n operation: \"hash\",\r\n from: this.config.primary,\r\n to: this.config.fallback\r\n });\r\n\r\n return {\r\n hash,\r\n algorithm: this.config.fallback || \"bcrypt\",\r\n usedFallback: true\r\n };\r\n\r\n } catch (fallbackErr: any) {\r\n logger.error(\"Fallback hashing failed\", {\r\n layer: \"hash-manager\",\r\n operation: \"hash\",\r\n from: this.config.primary,\r\n to: this.config.fallback,\r\n reason: fallbackErr?.message\r\n });\r\n\r\n throw new AdapterError(\r\n \"Both primary and fallback hashing failed.\"\r\n );\r\n }\r\n }\r\n }\r\n\r\n async verify(value: string, hashed: string): Promise<boolean> {\r\n try {\r\n return await this.primaryAdapter.verify(value, hashed);\r\n\r\n } catch (primaryErr: any) {\r\n logger.warn(\"Primary hash verification failed\", {\r\n layer: \"hash-manager\",\r\n operation: \"verify\",\r\n algorithm: this.config.primary,\r\n reason: primaryErr?.message\r\n });\r\n\r\n if (this.fallbackAdapter) {\r\n try {\r\n return await this.fallbackAdapter.verify(value, hashed);\r\n\r\n } catch (fallbackErr: any) {\r\n logger.error(\"Fallback hash verification failed\", {\r\n layer: \"hash-manager\",\r\n operation: \"verify\",\r\n from: this.config.primary,\r\n to: this.config.fallback,\r\n reason: fallbackErr?.message\r\n });\r\n\r\n throw new AdapterError(\r\n \"Both primary and fallback verify failed.\"\r\n );\r\n }\r\n }\r\n\r\n throw new AdapterError(\r\n \"Primary verify failed and no fallback adapter configured.\"\r\n );\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"HashManager.js","sourceRoot":"","sources":["../../src/managers/HashManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { AdapterError } from \"../core/errors/AdapterError\";\r\nimport { HiSecureConfig } from \"../core/types/HiSecureConfig\";\r\nimport { logger } from \"../logging\";\r\n\r\ninterface HashAdapter {\r\n hash(value: string): Promise<string>;\r\n verify(value: string, hashed: string): Promise<boolean>;\r\n}\r\n\r\nexport interface HashResult {\r\n hash: string;\r\n algorithm: string;\r\n usedFallback: boolean;\r\n}\r\n\r\nexport class HashManager {\r\n private config: HiSecureConfig[\"hashing\"];\r\n private primaryAdapter: HashAdapter;\r\n private fallbackAdapter: HashAdapter | null;\r\n\r\n constructor(\r\n config: HiSecureConfig[\"hashing\"],\r\n primaryAdapter: HashAdapter,\r\n fallbackAdapter: HashAdapter | null\r\n ) {\r\n this.config = config;\r\n this.primaryAdapter = primaryAdapter;\r\n this.fallbackAdapter = fallbackAdapter;\r\n\r\n logger.info(\"HashManager initialized\", {\r\n layer: \"hash-manager\",\r\n primary: config.primary,\r\n fallbackEnabled: !!fallbackAdapter\r\n });\r\n }\r\n\r\n async hash(\r\n value: string,\r\n options?: { allowFallback?: boolean }\r\n ): Promise<HashResult> {\r\n try {\r\n const hash = await this.primaryAdapter.hash(value);\r\n\r\n return {\r\n hash,\r\n algorithm: this.config.primary,\r\n usedFallback: false\r\n };\r\n\r\n } catch (err: any) {\r\n logger.warn(\"Primary hashing failed\", {\r\n layer: \"hash-manager\",\r\n operation: \"hash\",\r\n algorithm: this.config.primary,\r\n reason: err?.message\r\n });\r\n\r\n if (!options?.allowFallback || !this.fallbackAdapter) {\r\n throw new AdapterError(\r\n `Primary hashing (${this.config.primary}) failed. Fallback not allowed.`\r\n );\r\n }\r\n\r\n try {\r\n const hash = await this.fallbackAdapter.hash(value);\r\n\r\n // ⚠️ security downgrade log (VERY GOOD PRACTICE)\r\n logger.warn(\"Hashing fallback used (security downgrade)\", {\r\n layer: \"hash-manager\",\r\n operation: \"hash\",\r\n from: this.config.primary,\r\n to: this.config.fallback\r\n });\r\n\r\n return {\r\n hash,\r\n algorithm: this.config.fallback || \"bcrypt\",\r\n usedFallback: true\r\n };\r\n\r\n } catch (fallbackErr: any) {\r\n logger.error(\"Fallback hashing failed\", {\r\n layer: \"hash-manager\",\r\n operation: \"hash\",\r\n from: this.config.primary,\r\n to: this.config.fallback,\r\n reason: fallbackErr?.message\r\n });\r\n\r\n throw new AdapterError(\r\n \"Both primary and fallback hashing failed.\"\r\n );\r\n }\r\n }\r\n }\r\n\r\n async verify(value: string, hashed: string): Promise<boolean> {\r\n try {\r\n return await this.primaryAdapter.verify(value, hashed);\r\n\r\n } catch (primaryErr: any) {\r\n logger.warn(\"Primary hash verification failed\", {\r\n layer: \"hash-manager\",\r\n operation: \"verify\",\r\n algorithm: this.config.primary,\r\n reason: primaryErr?.message\r\n });\r\n\r\n if (this.fallbackAdapter) {\r\n try {\r\n return await this.fallbackAdapter.verify(value, hashed);\r\n\r\n } catch (fallbackErr: any) {\r\n logger.error(\"Fallback hash verification failed\", {\r\n layer: \"hash-manager\",\r\n operation: \"verify\",\r\n from: this.config.primary,\r\n to: this.config.fallback,\r\n reason: fallbackErr?.message\r\n });\r\n\r\n throw new AdapterError(\r\n \"Both primary and fallback verify failed.\"\r\n );\r\n }\r\n }\r\n\r\n throw new AdapterError(\r\n \"Primary verify failed and no fallback adapter configured.\"\r\n );\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonManager.d.ts","sourceRoot":"","sources":["../../src/managers/JsonManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"JsonManager.d.ts","sourceRoot":"","sources":["../../src/managers/JsonManager.ts"],"names":[],"mappings":"AAKA,qBAAa,WAAW;IACpB,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG;IA8BxB,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG;IA8BxB,WAAW,CAAC,OAAO,CAAC,EAAE,GAAG,IACb,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE,MAAM,GAAG;CAiC7C"}
|
|
@@ -1,64 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// import express from "express";
|
|
3
|
-
// import qs from "qs";
|
|
4
|
-
// import { logger } from "../logging";
|
|
5
|
-
// import { AdapterError } from "../core/errors/AdapterError.js";
|
|
6
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
4
|
};
|
|
9
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
6
|
exports.JsonManager = void 0;
|
|
11
|
-
// export class JsonManager {
|
|
12
|
-
// middleware(options?: any) {
|
|
13
|
-
// try {
|
|
14
|
-
// const defaultOptions = {
|
|
15
|
-
// limit: '1mb',
|
|
16
|
-
// inflate: true,
|
|
17
|
-
// strict: true
|
|
18
|
-
// };
|
|
19
|
-
// return express.json({ ...defaultOptions, ...(options || {}) });
|
|
20
|
-
// } catch (err: any) {
|
|
21
|
-
// logger.error("JSON Manager: failed to create JSON parser");
|
|
22
|
-
// throw new AdapterError("JSON parser initialization failed.");
|
|
23
|
-
// }
|
|
24
|
-
// }
|
|
25
|
-
// urlencoded(options?: any) {
|
|
26
|
-
// try {
|
|
27
|
-
// const defaultOptions = {
|
|
28
|
-
// extended: true,
|
|
29
|
-
// limit: '1mb',
|
|
30
|
-
// parameterLimit: 1000
|
|
31
|
-
// };
|
|
32
|
-
// const opts = { ...defaultOptions, ...(options || {}) };
|
|
33
|
-
// return express.urlencoded(opts);
|
|
34
|
-
// } catch (err: any) {
|
|
35
|
-
// logger.error("URL-encoded parser failed");
|
|
36
|
-
// throw new AdapterError("URL-encoded parser initialization failed.");
|
|
37
|
-
// }
|
|
38
|
-
// }
|
|
39
|
-
// queryParser(options?: any) {
|
|
40
|
-
// return (req: any, res: any, next: any) => {
|
|
41
|
-
// try {
|
|
42
|
-
// if (!req.parsedQuery && req.url.includes('?')) {
|
|
43
|
-
// const queryString = req.url.split("?")[1] || "";
|
|
44
|
-
// const parsed = qs.parse(queryString, {
|
|
45
|
-
// depth: 5,
|
|
46
|
-
// parameterLimit: 100,
|
|
47
|
-
// ...options
|
|
48
|
-
// });
|
|
49
|
-
// req.parsedQuery = parsed;
|
|
50
|
-
// logger.debug(" Query parsed", {
|
|
51
|
-
// keys: Object.keys(parsed)
|
|
52
|
-
// });
|
|
53
|
-
// }
|
|
54
|
-
// next();
|
|
55
|
-
// } catch (err: any) {
|
|
56
|
-
// logger.error("Failed to parse query", { error: err?.message });
|
|
57
|
-
// next(new AdapterError("Query parsing failed."));
|
|
58
|
-
// }
|
|
59
|
-
// };
|
|
60
|
-
// }
|
|
61
|
-
// }
|
|
62
7
|
const express_1 = __importDefault(require("express"));
|
|
63
8
|
const qs_1 = __importDefault(require("qs"));
|
|
64
9
|
const logging_1 = require("../logging");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JsonManager.js","sourceRoot":"","sources":["../../src/managers/JsonManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"JsonManager.js","sourceRoot":"","sources":["../../src/managers/JsonManager.ts"],"names":[],"mappings":"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","sourcesContent":["import express from \"express\";\r\nimport qs from \"qs\";\r\nimport { logger } from \"../logging\";\r\nimport { AdapterError } from \"../core/errors/AdapterError\";\r\n\r\nexport class JsonManager {\r\n middleware(options?: any) {\r\n try {\r\n const defaultOptions = {\r\n limit: \"1mb\",\r\n inflate: true,\r\n strict: true\r\n };\r\n\r\n const finalOptions = { ...defaultOptions, ...(options || {}) };\r\n\r\n logger.info(\"JSON body parser configured\", {\r\n layer: \"json-manager\",\r\n operation: \"json\",\r\n limit: finalOptions.limit,\r\n strict: finalOptions.strict\r\n });\r\n\r\n return express.json(finalOptions);\r\n\r\n } catch (err: any) {\r\n logger.error(\"JSON body parser initialization failed\", {\r\n layer: \"json-manager\",\r\n operation: \"json\",\r\n reason: err?.message\r\n });\r\n\r\n throw new AdapterError(\"JSON parser initialization failed.\");\r\n }\r\n }\r\n\r\n urlencoded(options?: any) {\r\n try {\r\n const defaultOptions = {\r\n extended: true,\r\n limit: \"1mb\",\r\n parameterLimit: 1000\r\n };\r\n\r\n const finalOptions = { ...defaultOptions, ...(options || {}) };\r\n\r\n logger.info(\"URL-encoded parser configured\", {\r\n layer: \"json-manager\",\r\n operation: \"urlencoded\",\r\n limit: finalOptions.limit,\r\n parameterLimit: finalOptions.parameterLimit\r\n });\r\n\r\n return express.urlencoded(finalOptions);\r\n\r\n } catch (err: any) {\r\n logger.error(\"URL-encoded parser initialization failed\", {\r\n layer: \"json-manager\",\r\n operation: \"urlencoded\",\r\n reason: err?.message\r\n });\r\n\r\n throw new AdapterError(\"URL-encoded parser initialization failed.\");\r\n }\r\n }\r\n\r\n queryParser(options?: any) {\r\n return (req: any, _res: any, next: any) => {\r\n try {\r\n if (!req.parsedQuery && req.url.includes(\"?\")) {\r\n const queryString = req.url.split(\"?\")[1] || \"\";\r\n\r\n const parsed = qs.parse(queryString, {\r\n depth: 5,\r\n parameterLimit: 100,\r\n ...options\r\n });\r\n\r\n req.parsedQuery = parsed;\r\n\r\n // ✅ visible + safe info\r\n logger.info(\"Query parameters parsed\", {\r\n layer: \"json-manager\",\r\n operation: \"query-parse\",\r\n keyCount: Object.keys(parsed).length\r\n });\r\n }\r\n\r\n next();\r\n } catch (err: any) {\r\n logger.error(\"Query parsing failed\", {\r\n layer: \"json-manager\",\r\n operation: \"query-parse\",\r\n reason: err?.message\r\n });\r\n\r\n next(new AdapterError(\"Query parsing failed.\"));\r\n }\r\n };\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RateLimitManager.d.ts","sourceRoot":"","sources":["../../src/managers/RateLimitManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RateLimitManager.d.ts","sourceRoot":"","sources":["../../src/managers/RateLimitManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAI9D,UAAU,kBAAkB;IACxB,aAAa,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC;CACzC;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,eAAe,CAA4B;gBAG/C,MAAM,EAAE,cAAc,CAAC,aAAa,CAAC,EACrC,cAAc,EAAE,kBAAkB,EAClC,eAAe,EAAE,kBAAkB,GAAG,IAAI;IAa9C,UAAU,CAAC,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;QAAC,OAAO,CAAC,EAAE,GAAG,CAAA;KAAE;CA+G3E"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// import { HiSecureConfig } from "../core/types/HiSecureConfig.js";
|
|
3
|
-
// import { AdapterError } from "../core/errors/AdapterError.js";
|
|
4
|
-
// import { logger } from "../logging";
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.RateLimitManager = void 0;
|
|
7
4
|
const AdapterError_1 = require("../core/errors/AdapterError");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RateLimitManager.js","sourceRoot":"","sources":["../../src/managers/RateLimitManager.ts"],"names":[],"mappings":"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","sourcesContent":["// import { HiSecureConfig } from \"../core/types/HiSecureConfig.js\";\r\n// import { AdapterError } from \"../core/errors/AdapterError.js\";\r\n// import { logger } from \"../logging\";\r\n\r\n// interface RateLimiterAdapter {\r\n// getMiddleware: (options?: any) => any;\r\n// }\r\n\r\n// export class RateLimitManager {\r\n// private config: HiSecureConfig[\"rateLimiter\"];\r\n// private primaryAdapter: RateLimiterAdapter;\r\n// private fallbackAdapter: RateLimiterAdapter | null;\r\n\r\n// constructor(\r\n// config: HiSecureConfig[\"rateLimiter\"],\r\n// primaryAdapter: RateLimiterAdapter,\r\n// fallbackAdapter: RateLimiterAdapter | null\r\n// ) {\r\n// this.config = config;\r\n// this.primaryAdapter = primaryAdapter;\r\n// this.fallbackAdapter = fallbackAdapter;\r\n// }\r\n\r\n// middleware(opts?: { mode?: \"strict\" | \"relaxed\" | \"api\"; options?: any }) {\r\n// let finalOptions: any = {};\r\n\r\n// if (opts?.mode === \"strict\") {\r\n// finalOptions = {\r\n// windowMs: 10_000,\r\n// max: 5,\r\n// message: \"Too many requests, please slow down.\"\r\n// };\r\n// } else if (opts?.mode === \"relaxed\") {\r\n// finalOptions = {\r\n// windowMs: 60_000,\r\n// max: 100,\r\n// message: \"Rate limit exceeded.\"\r\n// };\r\n// } else if (opts?.mode === \"api\") {\r\n// finalOptions = {\r\n// windowMs: 15 * 60 * 1000, \r\n// max: 100,\r\n// message: \"API rate limit exceeded.\"\r\n// };\r\n// } else {\r\n// finalOptions = {\r\n// windowMs: this.config.windowMs,\r\n// max: this.config.maxRequests,\r\n// message: this.config.message,\r\n// standardHeaders: true, \r\n// legacyHeaders: false \r\n// };\r\n// }\r\n\r\n// if (opts?.options) {\r\n// const allowedOverrides = ['message', 'skipFailedRequests', 'standardHeaders', 'legacyHeaders'];\r\n// for (const key of allowedOverrides) {\r\n// if (opts.options[key] !== undefined) {\r\n// finalOptions[key] = opts.options[key];\r\n// }\r\n// }\r\n \r\n// const attemptedOverrides = Object.keys(opts.options).filter(\r\n// k => !allowedOverrides.includes(k) && k !== 'mode'\r\n// );\r\n// if (attemptedOverrides.length > 0) {\r\n// logger.warn(\"Rate limit overrides ignored\", {\r\n// preset: opts?.mode || 'default',\r\n// ignoredOptions: attemptedOverrides\r\n// });\r\n// }\r\n// }\r\n\r\n// if (finalOptions.standardHeaders === undefined) {\r\n// finalOptions.standardHeaders = true;\r\n// }\r\n// if (finalOptions.legacyHeaders === undefined) {\r\n// finalOptions.legacyHeaders = false;\r\n// }\r\n\r\n// try {\r\n// logger.info(\"Applying rate limiting\", {\r\n// mode: opts?.mode || 'default',\r\n// windowMs: finalOptions.windowMs,\r\n// max: finalOptions.max\r\n// });\r\n \r\n// return this.primaryAdapter.getMiddleware(finalOptions);\r\n// } catch (err: any) {\r\n// logger.warn(\"Primary rate limiter failed → fallback\", {\r\n// error: err?.message\r\n// });\r\n\r\n// if (!this.fallbackAdapter) {\r\n// throw new AdapterError(\"Rate limiters failed; no fallback adapter.\");\r\n// }\r\n\r\n// try {\r\n// logger.info(\"Using fallback rate limiter\");\r\n// return this.fallbackAdapter.getMiddleware(finalOptions);\r\n// } catch (fallbackErr: any) {\r\n// logger.error(\"Fallback limiter also failed\", {\r\n// error: fallbackErr?.message\r\n// });\r\n// throw new AdapterError(\"Both primary and fallback limiters failed.\");\r\n// }\r\n// }\r\n// }\r\n// }\r\n\r\n\r\n\r\n\r\nimport { HiSecureConfig } from \"../core/types/HiSecureConfig\";\r\nimport { AdapterError } from \"../core/errors/AdapterError\";\r\nimport { logger } from \"../logging\";\r\n\r\ninterface RateLimiterAdapter {\r\n getMiddleware: (options?: any) => any;\r\n}\r\n\r\nexport class RateLimitManager {\r\n private config: HiSecureConfig[\"rateLimiter\"];\r\n private primaryAdapter: RateLimiterAdapter;\r\n private fallbackAdapter: RateLimiterAdapter | null;\r\n\r\n constructor(\r\n config: HiSecureConfig[\"rateLimiter\"],\r\n primaryAdapter: RateLimiterAdapter,\r\n fallbackAdapter: RateLimiterAdapter | null\r\n ) {\r\n this.config = config;\r\n this.primaryAdapter = primaryAdapter;\r\n this.fallbackAdapter = fallbackAdapter;\r\n\r\n logger.info(\"RateLimitManager initialized\", {\r\n layer: \"rate-limit-manager\",\r\n primaryConfigured: true,\r\n fallbackConfigured: !!fallbackAdapter\r\n });\r\n }\r\n\r\n middleware(opts?: { mode?: \"strict\" | \"relaxed\" | \"api\"; options?: any }) {\r\n let finalOptions: any = {};\r\n const mode = opts?.mode || \"default\";\r\n\r\n if (mode === \"strict\") {\r\n finalOptions = {\r\n windowMs: 10_000,\r\n max: 5,\r\n message: \"Too many requests, please slow down.\"\r\n };\r\n } else if (mode === \"relaxed\") {\r\n finalOptions = {\r\n windowMs: 60_000,\r\n max: 100,\r\n message: \"Rate limit exceeded.\"\r\n };\r\n } else if (mode === \"api\") {\r\n finalOptions = {\r\n windowMs: 15 * 60 * 1000,\r\n max: 100,\r\n message: \"API rate limit exceeded.\"\r\n };\r\n } else {\r\n finalOptions = {\r\n windowMs: this.config.windowMs,\r\n max: this.config.maxRequests,\r\n message: this.config.message,\r\n standardHeaders: true,\r\n legacyHeaders: false\r\n };\r\n }\r\n\r\n if (opts?.options) {\r\n const allowedOverrides = [\r\n \"message\",\r\n \"skipFailedRequests\",\r\n \"standardHeaders\",\r\n \"legacyHeaders\"\r\n ];\r\n\r\n for (const key of allowedOverrides) {\r\n if (opts.options[key] !== undefined) {\r\n finalOptions[key] = opts.options[key];\r\n }\r\n }\r\n\r\n const attemptedOverrides = Object.keys(opts.options).filter(\r\n k => !allowedOverrides.includes(k) && k !== \"mode\"\r\n );\r\n\r\n if (attemptedOverrides.length > 0) {\r\n logger.warn(\"Rate limit overrides ignored\", {\r\n layer: \"rate-limit-manager\",\r\n operation: \"configure\",\r\n mode,\r\n ignoredOptions: attemptedOverrides\r\n });\r\n }\r\n }\r\n\r\n finalOptions.standardHeaders ??= true;\r\n finalOptions.legacyHeaders ??= false;\r\n\r\n try {\r\n logger.info(\"Rate limiting applied\", {\r\n layer: \"rate-limit-manager\",\r\n operation: \"apply\",\r\n mode,\r\n windowMs: finalOptions.windowMs,\r\n max: finalOptions.max\r\n });\r\n\r\n return this.primaryAdapter.getMiddleware(finalOptions);\r\n\r\n } catch (err: any) {\r\n logger.warn(\"Primary rate limiter failed\", {\r\n layer: \"rate-limit-manager\",\r\n operation: \"apply\",\r\n mode,\r\n reason: err?.message\r\n });\r\n\r\n if (!this.fallbackAdapter) {\r\n throw new AdapterError(\r\n \"Rate limiters failed; no fallback adapter configured.\"\r\n );\r\n }\r\n\r\n try {\r\n logger.warn(\"Using fallback rate limiter\", {\r\n layer: \"rate-limit-manager\",\r\n operation: \"fallback\",\r\n mode\r\n });\r\n\r\n return this.fallbackAdapter.getMiddleware(finalOptions);\r\n\r\n } catch (fallbackErr: any) {\r\n logger.error(\"Fallback rate limiter failed\", {\r\n layer: \"rate-limit-manager\",\r\n operation: \"fallback\",\r\n mode,\r\n reason: fallbackErr?.message\r\n });\r\n\r\n throw new AdapterError(\r\n \"Both primary and fallback rate limiters failed.\"\r\n );\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"RateLimitManager.js","sourceRoot":"","sources":["../../src/managers/RateLimitManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { HiSecureConfig } from \"../core/types/HiSecureConfig\";\r\nimport { AdapterError } from \"../core/errors/AdapterError\";\r\nimport { logger } from \"../logging\";\r\n\r\ninterface RateLimiterAdapter {\r\n getMiddleware: (options?: any) => any;\r\n}\r\n\r\nexport class RateLimitManager {\r\n private config: HiSecureConfig[\"rateLimiter\"];\r\n private primaryAdapter: RateLimiterAdapter;\r\n private fallbackAdapter: RateLimiterAdapter | null;\r\n\r\n constructor(\r\n config: HiSecureConfig[\"rateLimiter\"],\r\n primaryAdapter: RateLimiterAdapter,\r\n fallbackAdapter: RateLimiterAdapter | null\r\n ) {\r\n this.config = config;\r\n this.primaryAdapter = primaryAdapter;\r\n this.fallbackAdapter = fallbackAdapter;\r\n\r\n logger.info(\"RateLimitManager initialized\", {\r\n layer: \"rate-limit-manager\",\r\n primaryConfigured: true,\r\n fallbackConfigured: !!fallbackAdapter\r\n });\r\n }\r\n\r\n middleware(opts?: { mode?: \"strict\" | \"relaxed\" | \"api\"; options?: any }) {\r\n let finalOptions: any = {};\r\n const mode = opts?.mode || \"default\";\r\n\r\n if (mode === \"strict\") {\r\n finalOptions = {\r\n windowMs: 10_000,\r\n max: 5,\r\n message: \"Too many requests, please slow down.\"\r\n };\r\n } else if (mode === \"relaxed\") {\r\n finalOptions = {\r\n windowMs: 60_000,\r\n max: 100,\r\n message: \"Rate limit exceeded.\"\r\n };\r\n } else if (mode === \"api\") {\r\n finalOptions = {\r\n windowMs: 15 * 60 * 1000,\r\n max: 100,\r\n message: \"API rate limit exceeded.\"\r\n };\r\n } else {\r\n finalOptions = {\r\n windowMs: this.config.windowMs,\r\n max: this.config.maxRequests,\r\n message: this.config.message,\r\n standardHeaders: true,\r\n legacyHeaders: false\r\n };\r\n }\r\n\r\n if (opts?.options) {\r\n const allowedOverrides = [\r\n \"message\",\r\n \"skipFailedRequests\",\r\n \"standardHeaders\",\r\n \"legacyHeaders\"\r\n ];\r\n\r\n for (const key of allowedOverrides) {\r\n if (opts.options[key] !== undefined) {\r\n finalOptions[key] = opts.options[key];\r\n }\r\n }\r\n\r\n const attemptedOverrides = Object.keys(opts.options).filter(\r\n k => !allowedOverrides.includes(k) && k !== \"mode\"\r\n );\r\n\r\n if (attemptedOverrides.length > 0) {\r\n logger.warn(\"Rate limit overrides ignored\", {\r\n layer: \"rate-limit-manager\",\r\n operation: \"configure\",\r\n mode,\r\n ignoredOptions: attemptedOverrides\r\n });\r\n }\r\n }\r\n\r\n finalOptions.standardHeaders ??= true;\r\n finalOptions.legacyHeaders ??= false;\r\n\r\n try {\r\n logger.info(\"Rate limiting applied\", {\r\n layer: \"rate-limit-manager\",\r\n operation: \"apply\",\r\n mode,\r\n windowMs: finalOptions.windowMs,\r\n max: finalOptions.max\r\n });\r\n\r\n return this.primaryAdapter.getMiddleware(finalOptions);\r\n\r\n } catch (err: any) {\r\n logger.warn(\"Primary rate limiter failed\", {\r\n layer: \"rate-limit-manager\",\r\n operation: \"apply\",\r\n mode,\r\n reason: err?.message\r\n });\r\n\r\n if (!this.fallbackAdapter) {\r\n throw new AdapterError(\r\n \"Rate limiters failed; no fallback adapter configured.\"\r\n );\r\n }\r\n\r\n try {\r\n logger.warn(\"Using fallback rate limiter\", {\r\n layer: \"rate-limit-manager\",\r\n operation: \"fallback\",\r\n mode\r\n });\r\n\r\n return this.fallbackAdapter.getMiddleware(finalOptions);\r\n\r\n } catch (fallbackErr: any) {\r\n logger.error(\"Fallback rate limiter failed\", {\r\n layer: \"rate-limit-manager\",\r\n operation: \"fallback\",\r\n mode,\r\n reason: fallbackErr?.message\r\n });\r\n\r\n throw new AdapterError(\r\n \"Both primary and fallback rate limiters failed.\"\r\n );\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SanitizerManager.d.ts","sourceRoot":"","sources":["../../src/managers/SanitizerManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SanitizerManager.d.ts","sourceRoot":"","sources":["../../src/managers/SanitizerManager.ts"],"names":[],"mappings":"AAGA,UAAU,gBAAgB;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,MAAM,CAAC;CACtD;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,QAAQ,CAA0B;gBAE9B,OAAO,EAAE,gBAAgB,EAAE,QAAQ,GAAE,gBAAgB,GAAG,IAAW;IAU/E,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,MAAM;IA6B9C,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,IACZ,KAAK,GAAG,EAAE,MAAM,GAAG,EAAE,MAAM,GAAG;CAsE7C"}
|
|
@@ -1,86 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// import { SanitizerError } from "../core/errors/SanitizerError.js";
|
|
3
|
-
// import { logger } from "../logging";
|
|
4
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
3
|
exports.SanitizerManager = void 0;
|
|
6
|
-
// interface SanitizerAdapter {
|
|
7
|
-
// sanitize: (value: string, options?: any) => string;
|
|
8
|
-
// }
|
|
9
|
-
// export class SanitizerManager {
|
|
10
|
-
// private primary: SanitizerAdapter;
|
|
11
|
-
// private fallback: SanitizerAdapter | null;
|
|
12
|
-
// constructor(primary: SanitizerAdapter, fallback: SanitizerAdapter | null = null) {
|
|
13
|
-
// this.primary = primary;
|
|
14
|
-
// this.fallback = fallback;
|
|
15
|
-
// }
|
|
16
|
-
// sanitize(value: string, options?: any): string {
|
|
17
|
-
// if (typeof value !== 'string') {
|
|
18
|
-
// return value;
|
|
19
|
-
// }
|
|
20
|
-
// try {
|
|
21
|
-
// return this.primary.sanitize(value, options);
|
|
22
|
-
// } catch (err: any) {
|
|
23
|
-
// logger.warn("Primary sanitizer failed", { error: err?.message });
|
|
24
|
-
// if (!this.fallback) {
|
|
25
|
-
// throw new SanitizerError("Primary sanitizer failed and no fallback available.");
|
|
26
|
-
// }
|
|
27
|
-
// logger.info("Using fallback sanitizer");
|
|
28
|
-
// return this.fallback.sanitize(value, options);
|
|
29
|
-
// }
|
|
30
|
-
// }
|
|
31
|
-
// middleware(options?: any) {
|
|
32
|
-
// return (req: any, _res: any, next: any) => {
|
|
33
|
-
// let fallbackTriggered = false;
|
|
34
|
-
// const safeSanitize = (value: string): string => {
|
|
35
|
-
// if (fallbackTriggered && this.fallback) {
|
|
36
|
-
// return this.fallback.sanitize(value, options);
|
|
37
|
-
// }
|
|
38
|
-
// try {
|
|
39
|
-
// return this.primary.sanitize(value, options);
|
|
40
|
-
// } catch (err: any) {
|
|
41
|
-
// if (!this.fallback) {
|
|
42
|
-
// throw err;
|
|
43
|
-
// }
|
|
44
|
-
// fallbackTriggered = true;
|
|
45
|
-
// logger.warn("Switching to fallback sanitizer for this request");
|
|
46
|
-
// return this.fallback.sanitize(value, options);
|
|
47
|
-
// }
|
|
48
|
-
// };
|
|
49
|
-
// try {
|
|
50
|
-
// if (req.body && typeof req.body === "object") {
|
|
51
|
-
// const originalBody = req.body;
|
|
52
|
-
// const sanitizedBody: any = Array.isArray(originalBody) ? [] : {};
|
|
53
|
-
// for (const key of Object.keys(originalBody)) {
|
|
54
|
-
// const value = originalBody[key];
|
|
55
|
-
// if (typeof value === "string") {
|
|
56
|
-
// sanitizedBody[key] = safeSanitize(value);
|
|
57
|
-
// } else if (Array.isArray(value)) {
|
|
58
|
-
// sanitizedBody[key] = value.map(item =>
|
|
59
|
-
// typeof item === "string" ? safeSanitize(item) : item
|
|
60
|
-
// );
|
|
61
|
-
// } else if (value && typeof value === "object") {
|
|
62
|
-
// sanitizedBody[key] = value;
|
|
63
|
-
// } else {
|
|
64
|
-
// sanitizedBody[key] = value;
|
|
65
|
-
// }
|
|
66
|
-
// }
|
|
67
|
-
// req.sanitizedBody = sanitizedBody;
|
|
68
|
-
// logger.debug("Request body sanitized", {
|
|
69
|
-
// originalKeys: Object.keys(originalBody),
|
|
70
|
-
// sanitizedKeys: Object.keys(sanitizedBody),
|
|
71
|
-
// usedFallback: fallbackTriggered
|
|
72
|
-
// });
|
|
73
|
-
// }
|
|
74
|
-
// next();
|
|
75
|
-
// } catch (err: any) {
|
|
76
|
-
// logger.error("Sanitizer middleware failed", {
|
|
77
|
-
// error: err?.message
|
|
78
|
-
// });
|
|
79
|
-
// next(new SanitizerError("Sanitizer middleware failure"));
|
|
80
|
-
// }
|
|
81
|
-
// };
|
|
82
|
-
// }
|
|
83
|
-
// }
|
|
84
4
|
const SanitizerError_1 = require("../core/errors/SanitizerError");
|
|
85
5
|
const logging_1 = require("../logging");
|
|
86
6
|
class SanitizerManager {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SanitizerManager.js","sourceRoot":"","sources":["../../src/managers/SanitizerManager.ts"],"names":[],"mappings":"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","sourcesContent":["// import { SanitizerError } from \"../core/errors/SanitizerError.js\";\r\n// import { logger } from \"../logging\";\r\n\r\n// interface SanitizerAdapter {\r\n// sanitize: (value: string, options?: any) => string;\r\n// }\r\n\r\n// export class SanitizerManager {\r\n// private primary: SanitizerAdapter;\r\n// private fallback: SanitizerAdapter | null;\r\n\r\n// constructor(primary: SanitizerAdapter, fallback: SanitizerAdapter | null = null) {\r\n// this.primary = primary;\r\n// this.fallback = fallback;\r\n// }\r\n\r\n// sanitize(value: string, options?: any): string {\r\n \r\n// if (typeof value !== 'string') {\r\n// return value;\r\n// }\r\n\r\n// try {\r\n// return this.primary.sanitize(value, options);\r\n// } catch (err: any) {\r\n// logger.warn(\"Primary sanitizer failed\", { error: err?.message });\r\n\r\n// if (!this.fallback) {\r\n// throw new SanitizerError(\"Primary sanitizer failed and no fallback available.\");\r\n// }\r\n\r\n// logger.info(\"Using fallback sanitizer\");\r\n// return this.fallback.sanitize(value, options);\r\n// }\r\n// }\r\n\r\n \r\n// middleware(options?: any) {\r\n// return (req: any, _res: any, next: any) => {\r\n// let fallbackTriggered = false;\r\n \r\n// const safeSanitize = (value: string): string => {\r\n// if (fallbackTriggered && this.fallback) {\r\n// return this.fallback.sanitize(value, options);\r\n// }\r\n \r\n// try {\r\n// return this.primary.sanitize(value, options);\r\n// } catch (err: any) {\r\n// if (!this.fallback) {\r\n// throw err;\r\n// }\r\n \r\n// fallbackTriggered = true;\r\n// logger.warn(\"Switching to fallback sanitizer for this request\");\r\n// return this.fallback.sanitize(value, options);\r\n// }\r\n// };\r\n\r\n// try {\r\n \r\n// if (req.body && typeof req.body === \"object\") {\r\n// const originalBody = req.body;\r\n// const sanitizedBody: any = Array.isArray(originalBody) ? [] : {};\r\n \r\n// for (const key of Object.keys(originalBody)) {\r\n// const value = originalBody[key];\r\n \r\n// if (typeof value === \"string\") {\r\n// sanitizedBody[key] = safeSanitize(value);\r\n// } else if (Array.isArray(value)) {\r\n// sanitizedBody[key] = value.map(item => \r\n// typeof item === \"string\" ? safeSanitize(item) : item\r\n// );\r\n// } else if (value && typeof value === \"object\") {\r\n// sanitizedBody[key] = value; \r\n// } else {\r\n// sanitizedBody[key] = value;\r\n// }\r\n// }\r\n \r\n// req.sanitizedBody = sanitizedBody;\r\n \r\n// logger.debug(\"Request body sanitized\", {\r\n// originalKeys: Object.keys(originalBody),\r\n// sanitizedKeys: Object.keys(sanitizedBody),\r\n// usedFallback: fallbackTriggered\r\n// });\r\n// }\r\n\r\n// next();\r\n// } catch (err: any) {\r\n// logger.error(\"Sanitizer middleware failed\", {\r\n// error: err?.message\r\n// });\r\n// next(new SanitizerError(\"Sanitizer middleware failure\"));\r\n// }\r\n// };\r\n// }\r\n// }\r\n\r\n\r\n\r\nimport { SanitizerError } from \"../core/errors/SanitizerError\";\r\nimport { logger } from \"../logging\";\r\n\r\ninterface SanitizerAdapter {\r\n sanitize: (value: string, options?: any) => string;\r\n}\r\n\r\nexport class SanitizerManager {\r\n private primary: SanitizerAdapter;\r\n private fallback: SanitizerAdapter | null;\r\n\r\n constructor(primary: SanitizerAdapter, fallback: SanitizerAdapter | null = null) {\r\n this.primary = primary;\r\n this.fallback = fallback;\r\n\r\n logger.info(\"SanitizerManager initialized\", {\r\n layer: \"sanitizer-manager\",\r\n fallbackEnabled: !!fallback\r\n });\r\n }\r\n\r\n sanitize(value: string, options?: any): string {\r\n if (typeof value !== \"string\") {\r\n return value;\r\n }\r\n\r\n try {\r\n return this.primary.sanitize(value, options);\r\n } catch (err: any) {\r\n logger.warn(\"Primary sanitizer failed\", {\r\n layer: \"sanitizer-manager\",\r\n operation: \"sanitize\",\r\n reason: err?.message\r\n });\r\n\r\n if (!this.fallback) {\r\n throw new SanitizerError(\r\n \"Primary sanitizer failed and no fallback available.\"\r\n );\r\n }\r\n\r\n logger.warn(\"Sanitizer fallback used\", {\r\n layer: \"sanitizer-manager\",\r\n operation: \"sanitize\"\r\n });\r\n\r\n return this.fallback.sanitize(value, options);\r\n }\r\n }\r\n\r\n middleware(options?: any) {\r\n return (req: any, _res: any, next: any) => {\r\n let fallbackTriggered = false;\r\n\r\n const safeSanitize = (value: string): string => {\r\n if (fallbackTriggered && this.fallback) {\r\n return this.fallback.sanitize(value, options);\r\n }\r\n\r\n try {\r\n return this.primary.sanitize(value, options);\r\n } catch (err: any) {\r\n if (!this.fallback) {\r\n throw err;\r\n }\r\n\r\n fallbackTriggered = true;\r\n\r\n logger.warn(\"Switching to fallback sanitizer for request\", {\r\n layer: \"sanitizer-manager\",\r\n operation: \"middleware\"\r\n });\r\n\r\n return this.fallback.sanitize(value, options);\r\n }\r\n };\r\n\r\n try {\r\n if (req.body && typeof req.body === \"object\") {\r\n const originalBody = req.body;\r\n const sanitizedBody: any = Array.isArray(originalBody) ? [] : {};\r\n\r\n for (const key of Object.keys(originalBody)) {\r\n const value = originalBody[key];\r\n\r\n if (typeof value === \"string\") {\r\n sanitizedBody[key] = safeSanitize(value);\r\n } else if (Array.isArray(value)) {\r\n sanitizedBody[key] = value.map(item =>\r\n typeof item === \"string\"\r\n ? safeSanitize(item)\r\n : item\r\n );\r\n } else {\r\n sanitizedBody[key] = value;\r\n }\r\n }\r\n\r\n req.sanitizedBody = sanitizedBody;\r\n\r\n // ✅ visible + safe info\r\n logger.info(\"Request body sanitized\", {\r\n layer: \"sanitizer-manager\",\r\n operation: \"middleware\",\r\n fieldCount: Object.keys(sanitizedBody).length,\r\n usedFallback: fallbackTriggered\r\n });\r\n }\r\n\r\n next();\r\n } catch (err: any) {\r\n logger.error(\"Sanitizer middleware failed\", {\r\n layer: \"sanitizer-manager\",\r\n operation: \"middleware\",\r\n reason: err?.message\r\n });\r\n\r\n next(new SanitizerError(\"Sanitizer middleware failure\"));\r\n }\r\n };\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"SanitizerManager.js","sourceRoot":"","sources":["../../src/managers/SanitizerManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { SanitizerError } from \"../core/errors/SanitizerError\";\r\nimport { logger } from \"../logging\";\r\n\r\ninterface SanitizerAdapter {\r\n sanitize: (value: string, options?: any) => string;\r\n}\r\n\r\nexport class SanitizerManager {\r\n private primary: SanitizerAdapter;\r\n private fallback: SanitizerAdapter | null;\r\n\r\n constructor(primary: SanitizerAdapter, fallback: SanitizerAdapter | null = null) {\r\n this.primary = primary;\r\n this.fallback = fallback;\r\n\r\n logger.info(\"SanitizerManager initialized\", {\r\n layer: \"sanitizer-manager\",\r\n fallbackEnabled: !!fallback\r\n });\r\n }\r\n\r\n sanitize(value: string, options?: any): string {\r\n if (typeof value !== \"string\") {\r\n return value;\r\n }\r\n\r\n try {\r\n return this.primary.sanitize(value, options);\r\n } catch (err: any) {\r\n logger.warn(\"Primary sanitizer failed\", {\r\n layer: \"sanitizer-manager\",\r\n operation: \"sanitize\",\r\n reason: err?.message\r\n });\r\n\r\n if (!this.fallback) {\r\n throw new SanitizerError(\r\n \"Primary sanitizer failed and no fallback available.\"\r\n );\r\n }\r\n\r\n logger.warn(\"Sanitizer fallback used\", {\r\n layer: \"sanitizer-manager\",\r\n operation: \"sanitize\"\r\n });\r\n\r\n return this.fallback.sanitize(value, options);\r\n }\r\n }\r\n\r\n middleware(options?: any) {\r\n return (req: any, _res: any, next: any) => {\r\n let fallbackTriggered = false;\r\n\r\n const safeSanitize = (value: string): string => {\r\n if (fallbackTriggered && this.fallback) {\r\n return this.fallback.sanitize(value, options);\r\n }\r\n\r\n try {\r\n return this.primary.sanitize(value, options);\r\n } catch (err: any) {\r\n if (!this.fallback) {\r\n throw err;\r\n }\r\n\r\n fallbackTriggered = true;\r\n\r\n logger.warn(\"Switching to fallback sanitizer for request\", {\r\n layer: \"sanitizer-manager\",\r\n operation: \"middleware\"\r\n });\r\n\r\n return this.fallback.sanitize(value, options);\r\n }\r\n };\r\n\r\n try {\r\n if (req.body && typeof req.body === \"object\") {\r\n const originalBody = req.body;\r\n const sanitizedBody: any = Array.isArray(originalBody) ? [] : {};\r\n\r\n for (const key of Object.keys(originalBody)) {\r\n const value = originalBody[key];\r\n\r\n if (typeof value === \"string\") {\r\n sanitizedBody[key] = safeSanitize(value);\r\n } else if (Array.isArray(value)) {\r\n sanitizedBody[key] = value.map(item =>\r\n typeof item === \"string\"\r\n ? safeSanitize(item)\r\n : item\r\n );\r\n } else {\r\n sanitizedBody[key] = value;\r\n }\r\n }\r\n\r\n req.sanitizedBody = sanitizedBody;\r\n\r\n // ✅ visible + safe info\r\n logger.info(\"Request body sanitized\", {\r\n layer: \"sanitizer-manager\",\r\n operation: \"middleware\",\r\n fieldCount: Object.keys(sanitizedBody).length,\r\n usedFallback: fallbackTriggered\r\n });\r\n }\r\n\r\n next();\r\n } catch (err: any) {\r\n logger.error(\"Sanitizer middleware failed\", {\r\n layer: \"sanitizer-manager\",\r\n operation: \"middleware\",\r\n reason: err?.message\r\n });\r\n\r\n next(new SanitizerError(\"Sanitizer middleware failure\"));\r\n }\r\n };\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValidatorManager.d.ts","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ValidatorManager.d.ts","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":"AAGA,UAAU,gBAAgB;IACtB,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC;CACnC;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,cAAc,CAAmB;gBAE7B,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB;IAU1E,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,IAST,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;CAmE5C"}
|
|
@@ -1,65 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// import { logger } from "../logging";
|
|
3
|
-
// import { ValidationError } from "../core/errors/ValidationError.js";
|
|
4
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
3
|
exports.ValidatorManager = void 0;
|
|
6
|
-
// interface ValidatorAdapter {
|
|
7
|
-
// validate: (schema?: any) => any;
|
|
8
|
-
// }
|
|
9
|
-
// export class ValidatorManager {
|
|
10
|
-
// private zodAdapter: ValidatorAdapter;
|
|
11
|
-
// private expressAdapter: ValidatorAdapter;
|
|
12
|
-
// constructor(zodAdapter: ValidatorAdapter, expressAdapter: ValidatorAdapter) {
|
|
13
|
-
// this.zodAdapter = zodAdapter;
|
|
14
|
-
// this.expressAdapter = expressAdapter;
|
|
15
|
-
// }
|
|
16
|
-
// validate(schema?: any) {
|
|
17
|
-
// const isZod =
|
|
18
|
-
// schema &&
|
|
19
|
-
// typeof schema === "object" &&
|
|
20
|
-
// typeof schema._def === "object" &&
|
|
21
|
-
// typeof schema.safeParse === "function";
|
|
22
|
-
// const isExpressValidator = Array.isArray(schema);
|
|
23
|
-
// return (req: any, res: any, next: any) => {
|
|
24
|
-
// let middleware;
|
|
25
|
-
// if (isZod) {
|
|
26
|
-
// logger.debug("Using Zod adapter");
|
|
27
|
-
// middleware = this.zodAdapter.validate(schema);
|
|
28
|
-
// }
|
|
29
|
-
// else if (isExpressValidator) {
|
|
30
|
-
// logger.debug(" Using express-validator adapter");
|
|
31
|
-
// middleware = this.expressAdapter.validate(schema);
|
|
32
|
-
// }
|
|
33
|
-
// else {
|
|
34
|
-
// return next();
|
|
35
|
-
// }
|
|
36
|
-
// // CASE 1 — express-validator returns ARRAY
|
|
37
|
-
// if (Array.isArray(middleware)) {
|
|
38
|
-
// let idx = 0;
|
|
39
|
-
// const run = (err?: any) => {
|
|
40
|
-
// if (err) return next(err);
|
|
41
|
-
// const fn = middleware[idx++];
|
|
42
|
-
// if (!fn) return next(); // done
|
|
43
|
-
// try {
|
|
44
|
-
// fn(req, res, run);
|
|
45
|
-
// } catch (error: any) {
|
|
46
|
-
// next(new ValidationError(error.message));
|
|
47
|
-
// }
|
|
48
|
-
// };
|
|
49
|
-
// return run();
|
|
50
|
-
// }
|
|
51
|
-
// // CASE 2 — Zod returns SINGLE MIDDLEWARE
|
|
52
|
-
// try {
|
|
53
|
-
// middleware(req, res, (err?: any) => {
|
|
54
|
-
// if (err) return next(err);
|
|
55
|
-
// next();
|
|
56
|
-
// });
|
|
57
|
-
// } catch (err: any) {
|
|
58
|
-
// next(new ValidationError(err.message));
|
|
59
|
-
// }
|
|
60
|
-
// };
|
|
61
|
-
// }
|
|
62
|
-
// }
|
|
63
4
|
const logging_1 = require("../logging");
|
|
64
5
|
const ValidationError_1 = require("../core/errors/ValidationError");
|
|
65
6
|
class ValidatorManager {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValidatorManager.js","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ValidatorManager.js","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { logger } from \"../logging\";\r\nimport { ValidationError } from \"../core/errors/ValidationError\";\r\n\r\ninterface ValidatorAdapter {\r\n validate: (schema?: any) => any;\r\n}\r\n\r\nexport class ValidatorManager {\r\n private zodAdapter: ValidatorAdapter;\r\n private expressAdapter: ValidatorAdapter;\r\n\r\n constructor(zodAdapter: ValidatorAdapter, expressAdapter: ValidatorAdapter) {\r\n this.zodAdapter = zodAdapter;\r\n this.expressAdapter = expressAdapter;\r\n\r\n logger.info(\"ValidatorManager initialized\", {\r\n layer: \"validator-manager\",\r\n adapters: [\"zod\", \"express-validator\"]\r\n });\r\n }\r\n\r\n validate(schema?: any) {\r\n const isZod =\r\n schema &&\r\n typeof schema === \"object\" &&\r\n typeof schema._def === \"object\" &&\r\n typeof schema.safeParse === \"function\";\r\n\r\n const isExpressValidator = Array.isArray(schema);\r\n\r\n return (req: any, res: any, next: any) => {\r\n let middleware;\r\n let adapterUsed: \"zod\" | \"express-validator\" | \"none\" = \"none\";\r\n\r\n if (isZod) {\r\n adapterUsed = \"zod\";\r\n middleware = this.zodAdapter.validate(schema);\r\n } else if (isExpressValidator) {\r\n adapterUsed = \"express-validator\";\r\n middleware = this.expressAdapter.validate(schema);\r\n } else {\r\n return next();\r\n }\r\n\r\n logger.info(\"Validation adapter selected\", {\r\n layer: \"validator-manager\",\r\n operation: \"select\",\r\n adapter: adapterUsed,\r\n path: req.path,\r\n method: req.method\r\n });\r\n\r\n // CASE 1 — express-validator returns ARRAY\r\n if (Array.isArray(middleware)) {\r\n let idx = 0;\r\n\r\n const run = (err?: any) => {\r\n if (err) return next(err);\r\n\r\n const fn = middleware[idx++];\r\n if (!fn) return next();\r\n\r\n try {\r\n fn(req, res, run);\r\n } catch (error: any) {\r\n logger.error(\"Validation middleware execution failed\", {\r\n layer: \"validator-manager\",\r\n operation: \"execute\",\r\n adapter: adapterUsed,\r\n reason: error?.message\r\n });\r\n\r\n next(new ValidationError(error.message));\r\n }\r\n };\r\n\r\n return run();\r\n }\r\n\r\n // CASE 2 — Zod returns SINGLE middleware\r\n try {\r\n middleware(req, res, (err?: any) => {\r\n if (err) return next(err);\r\n next();\r\n });\r\n } catch (err: any) {\r\n logger.error(\"Validation middleware execution failed\", {\r\n layer: \"validator-manager\",\r\n operation: \"execute\",\r\n adapter: adapterUsed,\r\n reason: err?.message\r\n });\r\n\r\n next(new ValidationError(err.message));\r\n }\r\n };\r\n }\r\n}\r\n"]}
|
package/package.json
CHANGED