hi-secure 1.0.15 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/adapters/ArgonAdapter.d.ts +1 -1
  2. package/dist/adapters/ArgonAdapter.d.ts.map +1 -1
  3. package/dist/adapters/ArgonAdapter.js +43 -5
  4. package/dist/adapters/ArgonAdapter.js.map +1 -1
  5. package/dist/adapters/BcryptAdapter.d.ts.map +1 -1
  6. package/dist/adapters/BcryptAdapter.js +43 -3
  7. package/dist/adapters/BcryptAdapter.js.map +1 -1
  8. package/dist/adapters/ExpressRLAdapter.d.ts.map +1 -1
  9. package/dist/adapters/ExpressRLAdapter.js +48 -6
  10. package/dist/adapters/ExpressRLAdapter.js.map +1 -1
  11. package/dist/adapters/ExpressValidatorAdapter.d.ts.map +1 -1
  12. package/dist/adapters/ExpressValidatorAdapter.js +50 -10
  13. package/dist/adapters/ExpressValidatorAdapter.js.map +1 -1
  14. package/dist/adapters/GoogleAdapter.d.ts.map +1 -1
  15. package/dist/adapters/GoogleAdapter.js +82 -16
  16. package/dist/adapters/GoogleAdapter.js.map +1 -1
  17. package/dist/adapters/JWTAdapter.d.ts.map +1 -1
  18. package/dist/adapters/JWTAdapter.js +104 -15
  19. package/dist/adapters/JWTAdapter.js.map +1 -1
  20. package/dist/adapters/RLFlexibleAdapter.d.ts.map +1 -1
  21. package/dist/adapters/RLFlexibleAdapter.js +87 -12
  22. package/dist/adapters/RLFlexibleAdapter.js.map +1 -1
  23. package/dist/adapters/SanitizeHtmlAdapter.d.ts.map +1 -1
  24. package/dist/adapters/SanitizeHtmlAdapter.js +81 -13
  25. package/dist/adapters/SanitizeHtmlAdapter.js.map +1 -1
  26. package/dist/adapters/XSSAdapter.d.ts +1 -1
  27. package/dist/adapters/XSSAdapter.d.ts.map +1 -1
  28. package/dist/adapters/XSSAdapter.js +137 -20
  29. package/dist/adapters/XSSAdapter.js.map +1 -1
  30. package/dist/adapters/ZodAdapter.d.ts +1 -1
  31. package/dist/adapters/ZodAdapter.d.ts.map +1 -1
  32. package/dist/adapters/ZodAdapter.js +13 -8
  33. package/dist/adapters/ZodAdapter.js.map +1 -1
  34. package/dist/core/HiSecure.d.ts +3 -4
  35. package/dist/core/HiSecure.d.ts.map +1 -1
  36. package/dist/core/HiSecure.js +108 -121
  37. package/dist/core/HiSecure.js.map +1 -1
  38. package/dist/index.d.ts +2 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +8 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/logging/index.d.ts.map +1 -1
  43. package/dist/logging/index.js +2 -0
  44. package/dist/logging/index.js.map +1 -1
  45. package/dist/logging/morganSetup.d.ts.map +1 -1
  46. package/dist/logging/morganSetup.js +22 -1
  47. package/dist/logging/morganSetup.js.map +1 -1
  48. package/dist/logging/winstonSetup.d.ts.map +1 -1
  49. package/dist/logging/winstonSetup.js +61 -3
  50. package/dist/logging/winstonSetup.js.map +1 -1
  51. package/dist/managers/AuthManager.d.ts +2 -2
  52. package/dist/managers/AuthManager.d.ts.map +1 -1
  53. package/dist/managers/AuthManager.js +167 -31
  54. package/dist/managers/AuthManager.js.map +1 -1
  55. package/dist/managers/CorsManager.d.ts.map +1 -1
  56. package/dist/managers/CorsManager.js +46 -11
  57. package/dist/managers/CorsManager.js.map +1 -1
  58. package/dist/managers/HashManager.d.ts +1 -1
  59. package/dist/managers/HashManager.d.ts.map +1 -1
  60. package/dist/managers/HashManager.js +127 -17
  61. package/dist/managers/HashManager.js.map +1 -1
  62. package/dist/managers/JsonManager.d.ts +1 -1
  63. package/dist/managers/JsonManager.d.ts.map +1 -1
  64. package/dist/managers/JsonManager.js +99 -16
  65. package/dist/managers/JsonManager.js.map +1 -1
  66. package/dist/managers/RateLimitManager.d.ts +1 -1
  67. package/dist/managers/RateLimitManager.d.ts.map +1 -1
  68. package/dist/managers/RateLimitManager.js +46 -22
  69. package/dist/managers/RateLimitManager.js.map +1 -1
  70. package/dist/managers/SanitizerManager.d.ts.map +1 -1
  71. package/dist/managers/SanitizerManager.js +112 -15
  72. package/dist/managers/SanitizerManager.js.map +1 -1
  73. package/dist/managers/ValidatorManager.d.ts.map +1 -1
  74. package/dist/managers/ValidatorManager.js +90 -7
  75. package/dist/managers/ValidatorManager.js.map +1 -1
  76. package/package.json +2 -6
  77. package/readme.md +3 -6
  78. package/src/adapters/ArgonAdapter.ts +55 -6
  79. package/src/adapters/BcryptAdapter.ts +56 -8
  80. package/src/adapters/ExpressRLAdapter.ts +62 -9
  81. package/src/adapters/ExpressValidatorAdapter.ts +67 -11
  82. package/src/adapters/GoogleAdapter.ts +106 -21
  83. package/src/adapters/JWTAdapter.ts +129 -21
  84. package/src/adapters/RLFlexibleAdapter.ts +113 -16
  85. package/src/adapters/SanitizeHtmlAdapter.ts +111 -18
  86. package/src/adapters/XSSAdapter.ts +183 -39
  87. package/src/adapters/ZodAdapter.ts +56 -10
  88. package/src/core/HiSecure.ts +496 -162
  89. package/src/index.ts +4 -0
  90. package/src/logging/index.ts +6 -0
  91. package/src/logging/morganSetup.ts +36 -1
  92. package/src/logging/winstonSetup.ts +97 -8
  93. package/src/managers/AuthManager.ts +205 -34
  94. package/src/managers/CorsManager.ts +63 -16
  95. package/src/managers/HashManager.ts +156 -19
  96. package/src/managers/JsonManager.ts +119 -15
  97. package/src/managers/RateLimitManager.ts +174 -29
  98. package/src/managers/SanitizerManager.ts +150 -25
  99. package/src/managers/ValidatorManager.ts +115 -15
@@ -1,4 +1,107 @@
1
- import { SanitizerError } from "../core/errors/SanitizerError.js";
1
+ // import { SanitizerError } from "../core/errors/SanitizerError.js";
2
+ // import { logger } from "../logging";
3
+
4
+ // interface SanitizerAdapter {
5
+ // sanitize: (value: string, options?: any) => string;
6
+ // }
7
+
8
+ // export class SanitizerManager {
9
+ // private primary: SanitizerAdapter;
10
+ // private fallback: SanitizerAdapter | null;
11
+
12
+ // constructor(primary: SanitizerAdapter, fallback: SanitizerAdapter | null = null) {
13
+ // this.primary = primary;
14
+ // this.fallback = fallback;
15
+ // }
16
+
17
+ // sanitize(value: string, options?: any): string {
18
+
19
+ // if (typeof value !== 'string') {
20
+ // return value;
21
+ // }
22
+
23
+ // try {
24
+ // return this.primary.sanitize(value, options);
25
+ // } catch (err: any) {
26
+ // logger.warn("Primary sanitizer failed", { error: err?.message });
27
+
28
+ // if (!this.fallback) {
29
+ // throw new SanitizerError("Primary sanitizer failed and no fallback available.");
30
+ // }
31
+
32
+ // logger.info("Using fallback sanitizer");
33
+ // return this.fallback.sanitize(value, options);
34
+ // }
35
+ // }
36
+
37
+
38
+ // middleware(options?: any) {
39
+ // return (req: any, _res: any, next: any) => {
40
+ // let fallbackTriggered = false;
41
+
42
+ // const safeSanitize = (value: string): string => {
43
+ // if (fallbackTriggered && this.fallback) {
44
+ // return this.fallback.sanitize(value, options);
45
+ // }
46
+
47
+ // try {
48
+ // return this.primary.sanitize(value, options);
49
+ // } catch (err: any) {
50
+ // if (!this.fallback) {
51
+ // throw err;
52
+ // }
53
+
54
+ // fallbackTriggered = true;
55
+ // logger.warn("Switching to fallback sanitizer for this request");
56
+ // return this.fallback.sanitize(value, options);
57
+ // }
58
+ // };
59
+
60
+ // try {
61
+
62
+ // if (req.body && typeof req.body === "object") {
63
+ // const originalBody = req.body;
64
+ // const sanitizedBody: any = Array.isArray(originalBody) ? [] : {};
65
+
66
+ // for (const key of Object.keys(originalBody)) {
67
+ // const value = originalBody[key];
68
+
69
+ // if (typeof value === "string") {
70
+ // sanitizedBody[key] = safeSanitize(value);
71
+ // } else if (Array.isArray(value)) {
72
+ // sanitizedBody[key] = value.map(item =>
73
+ // typeof item === "string" ? safeSanitize(item) : item
74
+ // );
75
+ // } else if (value && typeof value === "object") {
76
+ // sanitizedBody[key] = value;
77
+ // } else {
78
+ // sanitizedBody[key] = value;
79
+ // }
80
+ // }
81
+
82
+ // req.sanitizedBody = sanitizedBody;
83
+
84
+ // logger.debug("Request body sanitized", {
85
+ // originalKeys: Object.keys(originalBody),
86
+ // sanitizedKeys: Object.keys(sanitizedBody),
87
+ // usedFallback: fallbackTriggered
88
+ // });
89
+ // }
90
+
91
+ // next();
92
+ // } catch (err: any) {
93
+ // logger.error("Sanitizer middleware failed", {
94
+ // error: err?.message
95
+ // });
96
+ // next(new SanitizerError("Sanitizer middleware failure"));
97
+ // }
98
+ // };
99
+ // }
100
+ // }
101
+
102
+
103
+
104
+ import { SanitizerError } from "../core/errors/SanitizerError";
2
105
  import { logger } from "../logging";
3
106
 
4
107
  interface SanitizerAdapter {
@@ -12,78 +115,97 @@ export class SanitizerManager {
12
115
  constructor(primary: SanitizerAdapter, fallback: SanitizerAdapter | null = null) {
13
116
  this.primary = primary;
14
117
  this.fallback = fallback;
118
+
119
+ logger.info("SanitizerManager initialized", {
120
+ layer: "sanitizer-manager",
121
+ fallbackEnabled: !!fallback
122
+ });
15
123
  }
16
124
 
17
125
  sanitize(value: string, options?: any): string {
18
-
19
- if (typeof value !== 'string') {
126
+ if (typeof value !== "string") {
20
127
  return value;
21
128
  }
22
129
 
23
130
  try {
24
131
  return this.primary.sanitize(value, options);
25
132
  } catch (err: any) {
26
- logger.warn("Primary sanitizer failed", { error: err?.message });
133
+ logger.warn("Primary sanitizer failed", {
134
+ layer: "sanitizer-manager",
135
+ operation: "sanitize",
136
+ reason: err?.message
137
+ });
27
138
 
28
139
  if (!this.fallback) {
29
- throw new SanitizerError("Primary sanitizer failed and no fallback available.");
140
+ throw new SanitizerError(
141
+ "Primary sanitizer failed and no fallback available."
142
+ );
30
143
  }
31
144
 
32
- logger.info("Using fallback sanitizer");
145
+ logger.warn("Sanitizer fallback used", {
146
+ layer: "sanitizer-manager",
147
+ operation: "sanitize"
148
+ });
149
+
33
150
  return this.fallback.sanitize(value, options);
34
151
  }
35
152
  }
36
153
 
37
-
38
154
  middleware(options?: any) {
39
155
  return (req: any, _res: any, next: any) => {
40
156
  let fallbackTriggered = false;
41
-
157
+
42
158
  const safeSanitize = (value: string): string => {
43
159
  if (fallbackTriggered && this.fallback) {
44
160
  return this.fallback.sanitize(value, options);
45
161
  }
46
-
162
+
47
163
  try {
48
164
  return this.primary.sanitize(value, options);
49
165
  } catch (err: any) {
50
166
  if (!this.fallback) {
51
167
  throw err;
52
168
  }
53
-
169
+
54
170
  fallbackTriggered = true;
55
- logger.warn("Switching to fallback sanitizer for this request");
171
+
172
+ logger.warn("Switching to fallback sanitizer for request", {
173
+ layer: "sanitizer-manager",
174
+ operation: "middleware"
175
+ });
176
+
56
177
  return this.fallback.sanitize(value, options);
57
178
  }
58
179
  };
59
180
 
60
181
  try {
61
-
62
182
  if (req.body && typeof req.body === "object") {
63
183
  const originalBody = req.body;
64
184
  const sanitizedBody: any = Array.isArray(originalBody) ? [] : {};
65
-
185
+
66
186
  for (const key of Object.keys(originalBody)) {
67
187
  const value = originalBody[key];
68
-
188
+
69
189
  if (typeof value === "string") {
70
190
  sanitizedBody[key] = safeSanitize(value);
71
191
  } else if (Array.isArray(value)) {
72
- sanitizedBody[key] = value.map(item =>
73
- typeof item === "string" ? safeSanitize(item) : item
192
+ sanitizedBody[key] = value.map(item =>
193
+ typeof item === "string"
194
+ ? safeSanitize(item)
195
+ : item
74
196
  );
75
- } else if (value && typeof value === "object") {
76
- sanitizedBody[key] = value;
77
197
  } else {
78
198
  sanitizedBody[key] = value;
79
199
  }
80
200
  }
81
-
201
+
82
202
  req.sanitizedBody = sanitizedBody;
83
-
84
- logger.debug("Request body sanitized", {
85
- originalKeys: Object.keys(originalBody),
86
- sanitizedKeys: Object.keys(sanitizedBody),
203
+
204
+ // visible + safe info
205
+ logger.info("Request body sanitized", {
206
+ layer: "sanitizer-manager",
207
+ operation: "middleware",
208
+ fieldCount: Object.keys(sanitizedBody).length,
87
209
  usedFallback: fallbackTriggered
88
210
  });
89
211
  }
@@ -91,10 +213,13 @@ export class SanitizerManager {
91
213
  next();
92
214
  } catch (err: any) {
93
215
  logger.error("Sanitizer middleware failed", {
94
- error: err?.message
216
+ layer: "sanitizer-manager",
217
+ operation: "middleware",
218
+ reason: err?.message
95
219
  });
220
+
96
221
  next(new SanitizerError("Sanitizer middleware failure"));
97
222
  }
98
223
  };
99
224
  }
100
- }
225
+ }
@@ -1,5 +1,80 @@
1
+ // import { logger } from "../logging";
2
+ // import { ValidationError } from "../core/errors/ValidationError.js";
3
+
4
+ // interface ValidatorAdapter {
5
+ // validate: (schema?: any) => any;
6
+ // }
7
+
8
+ // export class ValidatorManager {
9
+ // private zodAdapter: ValidatorAdapter;
10
+ // private expressAdapter: ValidatorAdapter;
11
+
12
+ // constructor(zodAdapter: ValidatorAdapter, expressAdapter: ValidatorAdapter) {
13
+ // this.zodAdapter = zodAdapter;
14
+ // this.expressAdapter = expressAdapter;
15
+ // }
16
+
17
+ // validate(schema?: any) {
18
+ // const isZod =
19
+ // schema &&
20
+ // typeof schema === "object" &&
21
+ // typeof schema._def === "object" &&
22
+ // typeof schema.safeParse === "function";
23
+
24
+ // const isExpressValidator = Array.isArray(schema);
25
+
26
+ // return (req: any, res: any, next: any) => {
27
+ // let middleware;
28
+
29
+ // if (isZod) {
30
+ // logger.debug("Using Zod adapter");
31
+ // middleware = this.zodAdapter.validate(schema);
32
+ // }
33
+ // else if (isExpressValidator) {
34
+ // logger.debug(" Using express-validator adapter");
35
+ // middleware = this.expressAdapter.validate(schema);
36
+ // }
37
+ // else {
38
+ // return next();
39
+ // }
40
+
41
+ // // CASE 1 — express-validator returns ARRAY
42
+ // if (Array.isArray(middleware)) {
43
+ // let idx = 0;
44
+
45
+ // const run = (err?: any) => {
46
+ // if (err) return next(err);
47
+
48
+ // const fn = middleware[idx++];
49
+ // if (!fn) return next(); // done
50
+
51
+ // try {
52
+ // fn(req, res, run);
53
+ // } catch (error: any) {
54
+ // next(new ValidationError(error.message));
55
+ // }
56
+ // };
57
+
58
+ // return run();
59
+ // }
60
+
61
+ // // CASE 2 — Zod returns SINGLE MIDDLEWARE
62
+ // try {
63
+ // middleware(req, res, (err?: any) => {
64
+ // if (err) return next(err);
65
+ // next();
66
+ // });
67
+ // } catch (err: any) {
68
+ // next(new ValidationError(err.message));
69
+ // }
70
+ // };
71
+ // }
72
+ // }
73
+
74
+
75
+
1
76
  import { logger } from "../logging";
2
- import { ValidationError } from "../core/errors/ValidationError.js";
77
+ import { ValidationError } from "../core/errors/ValidationError";
3
78
 
4
79
  interface ValidatorAdapter {
5
80
  validate: (schema?: any) => any;
@@ -12,32 +87,44 @@ export class ValidatorManager {
12
87
  constructor(zodAdapter: ValidatorAdapter, expressAdapter: ValidatorAdapter) {
13
88
  this.zodAdapter = zodAdapter;
14
89
  this.expressAdapter = expressAdapter;
90
+
91
+ logger.info("ValidatorManager initialized", {
92
+ layer: "validator-manager",
93
+ adapters: ["zod", "express-validator"]
94
+ });
15
95
  }
16
96
 
17
97
  validate(schema?: any) {
18
98
  const isZod =
19
- schema &&
20
- typeof schema === "object" &&
21
- typeof schema._def === "object" &&
22
- typeof schema.safeParse === "function";
99
+ schema &&
100
+ typeof schema === "object" &&
101
+ typeof schema._def === "object" &&
102
+ typeof schema.safeParse === "function";
23
103
 
24
104
  const isExpressValidator = Array.isArray(schema);
25
105
 
26
106
  return (req: any, res: any, next: any) => {
27
107
  let middleware;
108
+ let adapterUsed: "zod" | "express-validator" | "none" = "none";
28
109
 
29
110
  if (isZod) {
30
- logger.debug("Using Zod adapter");
111
+ adapterUsed = "zod";
31
112
  middleware = this.zodAdapter.validate(schema);
32
- }
33
- else if (isExpressValidator) {
34
- logger.debug(" Using express-validator adapter");
113
+ } else if (isExpressValidator) {
114
+ adapterUsed = "express-validator";
35
115
  middleware = this.expressAdapter.validate(schema);
36
- }
37
- else {
38
- return next();
116
+ } else {
117
+ return next();
39
118
  }
40
119
 
120
+ logger.info("Validation adapter selected", {
121
+ layer: "validator-manager",
122
+ operation: "select",
123
+ adapter: adapterUsed,
124
+ path: req.path,
125
+ method: req.method
126
+ });
127
+
41
128
  // CASE 1 — express-validator returns ARRAY
42
129
  if (Array.isArray(middleware)) {
43
130
  let idx = 0;
@@ -46,11 +133,18 @@ export class ValidatorManager {
46
133
  if (err) return next(err);
47
134
 
48
135
  const fn = middleware[idx++];
49
- if (!fn) return next(); // done
136
+ if (!fn) return next();
50
137
 
51
138
  try {
52
139
  fn(req, res, run);
53
140
  } catch (error: any) {
141
+ logger.error("Validation middleware execution failed", {
142
+ layer: "validator-manager",
143
+ operation: "execute",
144
+ adapter: adapterUsed,
145
+ reason: error?.message
146
+ });
147
+
54
148
  next(new ValidationError(error.message));
55
149
  }
56
150
  };
@@ -58,16 +152,22 @@ export class ValidatorManager {
58
152
  return run();
59
153
  }
60
154
 
61
- // CASE 2 — Zod returns SINGLE MIDDLEWARE
155
+ // CASE 2 — Zod returns SINGLE middleware
62
156
  try {
63
157
  middleware(req, res, (err?: any) => {
64
158
  if (err) return next(err);
65
159
  next();
66
160
  });
67
161
  } catch (err: any) {
162
+ logger.error("Validation middleware execution failed", {
163
+ layer: "validator-manager",
164
+ operation: "execute",
165
+ adapter: adapterUsed,
166
+ reason: err?.message
167
+ });
168
+
68
169
  next(new ValidationError(err.message));
69
170
  }
70
171
  };
71
172
  }
72
173
  }
73
-