hi-secure 1.0.15 → 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.
Files changed (95) 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 +7 -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 +7 -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 +10 -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 +14 -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 +19 -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 +25 -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 +23 -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 +17 -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 +21 -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 +10 -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 +91 -120
  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/morganSetup.d.ts.map +1 -1
  43. package/dist/logging/morganSetup.js +8 -1
  44. package/dist/logging/morganSetup.js.map +1 -1
  45. package/dist/logging/winstonSetup.d.ts.map +1 -1
  46. package/dist/logging/winstonSetup.js +17 -3
  47. package/dist/logging/winstonSetup.js.map +1 -1
  48. package/dist/managers/AuthManager.d.ts +2 -2
  49. package/dist/managers/AuthManager.d.ts.map +1 -1
  50. package/dist/managers/AuthManager.js +59 -31
  51. package/dist/managers/AuthManager.js.map +1 -1
  52. package/dist/managers/CorsManager.d.ts.map +1 -1
  53. package/dist/managers/CorsManager.js +18 -11
  54. package/dist/managers/CorsManager.js.map +1 -1
  55. package/dist/managers/HashManager.d.ts +1 -1
  56. package/dist/managers/HashManager.d.ts.map +1 -1
  57. package/dist/managers/HashManager.js +35 -17
  58. package/dist/managers/HashManager.js.map +1 -1
  59. package/dist/managers/JsonManager.d.ts +1 -1
  60. package/dist/managers/JsonManager.d.ts.map +1 -1
  61. package/dist/managers/JsonManager.js +44 -16
  62. package/dist/managers/JsonManager.js.map +1 -1
  63. package/dist/managers/RateLimitManager.d.ts +1 -1
  64. package/dist/managers/RateLimitManager.d.ts.map +1 -1
  65. package/dist/managers/RateLimitManager.js +43 -22
  66. package/dist/managers/RateLimitManager.js.map +1 -1
  67. package/dist/managers/SanitizerManager.d.ts.map +1 -1
  68. package/dist/managers/SanitizerManager.js +32 -15
  69. package/dist/managers/SanitizerManager.js.map +1 -1
  70. package/dist/managers/ValidatorManager.d.ts.map +1 -1
  71. package/dist/managers/ValidatorManager.js +31 -7
  72. package/dist/managers/ValidatorManager.js.map +1 -1
  73. package/package.json +2 -6
  74. package/readme.md +3 -6
  75. package/src/adapters/ArgonAdapter.ts +10 -6
  76. package/src/adapters/BcryptAdapter.ts +7 -8
  77. package/src/adapters/ExpressRLAdapter.ts +14 -9
  78. package/src/adapters/ExpressValidatorAdapter.ts +17 -11
  79. package/src/adapters/GoogleAdapter.ts +24 -21
  80. package/src/adapters/JWTAdapter.ts +33 -21
  81. package/src/adapters/RLFlexibleAdapter.ts +31 -16
  82. package/src/adapters/SanitizeHtmlAdapter.ts +28 -18
  83. package/src/adapters/XSSAdapter.ts +33 -38
  84. package/src/adapters/ZodAdapter.ts +10 -10
  85. package/src/core/HiSecure.ts +127 -161
  86. package/src/index.ts +4 -0
  87. package/src/logging/morganSetup.ts +11 -1
  88. package/src/logging/winstonSetup.ts +35 -8
  89. package/src/managers/AuthManager.ts +64 -34
  90. package/src/managers/CorsManager.ts +23 -16
  91. package/src/managers/HashManager.ts +48 -19
  92. package/src/managers/JsonManager.ts +57 -15
  93. package/src/managers/RateLimitManager.ts +61 -29
  94. package/src/managers/SanitizerManager.ts +47 -25
  95. package/src/managers/ValidatorManager.ts +40 -15
@@ -1,4 +1,4 @@
1
- import { SanitizerError } from "../core/errors/SanitizerError.js";
1
+ import { SanitizerError } from "../core/errors/SanitizerError";
2
2
  import { logger } from "../logging";
3
3
 
4
4
  interface SanitizerAdapter {
@@ -12,78 +12,97 @@ export class SanitizerManager {
12
12
  constructor(primary: SanitizerAdapter, fallback: SanitizerAdapter | null = null) {
13
13
  this.primary = primary;
14
14
  this.fallback = fallback;
15
+
16
+ logger.info("SanitizerManager initialized", {
17
+ layer: "sanitizer-manager",
18
+ fallbackEnabled: !!fallback
19
+ });
15
20
  }
16
21
 
17
22
  sanitize(value: string, options?: any): string {
18
-
19
- if (typeof value !== 'string') {
23
+ if (typeof value !== "string") {
20
24
  return value;
21
25
  }
22
26
 
23
27
  try {
24
28
  return this.primary.sanitize(value, options);
25
29
  } catch (err: any) {
26
- logger.warn("Primary sanitizer failed", { error: err?.message });
30
+ logger.warn("Primary sanitizer failed", {
31
+ layer: "sanitizer-manager",
32
+ operation: "sanitize",
33
+ reason: err?.message
34
+ });
27
35
 
28
36
  if (!this.fallback) {
29
- throw new SanitizerError("Primary sanitizer failed and no fallback available.");
37
+ throw new SanitizerError(
38
+ "Primary sanitizer failed and no fallback available."
39
+ );
30
40
  }
31
41
 
32
- logger.info("Using fallback sanitizer");
42
+ logger.warn("Sanitizer fallback used", {
43
+ layer: "sanitizer-manager",
44
+ operation: "sanitize"
45
+ });
46
+
33
47
  return this.fallback.sanitize(value, options);
34
48
  }
35
49
  }
36
50
 
37
-
38
51
  middleware(options?: any) {
39
52
  return (req: any, _res: any, next: any) => {
40
53
  let fallbackTriggered = false;
41
-
54
+
42
55
  const safeSanitize = (value: string): string => {
43
56
  if (fallbackTriggered && this.fallback) {
44
57
  return this.fallback.sanitize(value, options);
45
58
  }
46
-
59
+
47
60
  try {
48
61
  return this.primary.sanitize(value, options);
49
62
  } catch (err: any) {
50
63
  if (!this.fallback) {
51
64
  throw err;
52
65
  }
53
-
66
+
54
67
  fallbackTriggered = true;
55
- logger.warn("Switching to fallback sanitizer for this request");
68
+
69
+ logger.warn("Switching to fallback sanitizer for request", {
70
+ layer: "sanitizer-manager",
71
+ operation: "middleware"
72
+ });
73
+
56
74
  return this.fallback.sanitize(value, options);
57
75
  }
58
76
  };
59
77
 
60
78
  try {
61
-
62
79
  if (req.body && typeof req.body === "object") {
63
80
  const originalBody = req.body;
64
81
  const sanitizedBody: any = Array.isArray(originalBody) ? [] : {};
65
-
82
+
66
83
  for (const key of Object.keys(originalBody)) {
67
84
  const value = originalBody[key];
68
-
85
+
69
86
  if (typeof value === "string") {
70
87
  sanitizedBody[key] = safeSanitize(value);
71
88
  } else if (Array.isArray(value)) {
72
- sanitizedBody[key] = value.map(item =>
73
- typeof item === "string" ? safeSanitize(item) : item
89
+ sanitizedBody[key] = value.map(item =>
90
+ typeof item === "string"
91
+ ? safeSanitize(item)
92
+ : item
74
93
  );
75
- } else if (value && typeof value === "object") {
76
- sanitizedBody[key] = value;
77
94
  } else {
78
95
  sanitizedBody[key] = value;
79
96
  }
80
97
  }
81
-
98
+
82
99
  req.sanitizedBody = sanitizedBody;
83
-
84
- logger.debug("Request body sanitized", {
85
- originalKeys: Object.keys(originalBody),
86
- sanitizedKeys: Object.keys(sanitizedBody),
100
+
101
+ // visible + safe info
102
+ logger.info("Request body sanitized", {
103
+ layer: "sanitizer-manager",
104
+ operation: "middleware",
105
+ fieldCount: Object.keys(sanitizedBody).length,
87
106
  usedFallback: fallbackTriggered
88
107
  });
89
108
  }
@@ -91,10 +110,13 @@ export class SanitizerManager {
91
110
  next();
92
111
  } catch (err: any) {
93
112
  logger.error("Sanitizer middleware failed", {
94
- error: err?.message
113
+ layer: "sanitizer-manager",
114
+ operation: "middleware",
115
+ reason: err?.message
95
116
  });
117
+
96
118
  next(new SanitizerError("Sanitizer middleware failure"));
97
119
  }
98
120
  };
99
121
  }
100
- }
122
+ }
@@ -1,5 +1,5 @@
1
1
  import { logger } from "../logging";
2
- import { ValidationError } from "../core/errors/ValidationError.js";
2
+ import { ValidationError } from "../core/errors/ValidationError";
3
3
 
4
4
  interface ValidatorAdapter {
5
5
  validate: (schema?: any) => any;
@@ -12,32 +12,44 @@ export class ValidatorManager {
12
12
  constructor(zodAdapter: ValidatorAdapter, expressAdapter: ValidatorAdapter) {
13
13
  this.zodAdapter = zodAdapter;
14
14
  this.expressAdapter = expressAdapter;
15
+
16
+ logger.info("ValidatorManager initialized", {
17
+ layer: "validator-manager",
18
+ adapters: ["zod", "express-validator"]
19
+ });
15
20
  }
16
21
 
17
22
  validate(schema?: any) {
18
23
  const isZod =
19
- schema &&
20
- typeof schema === "object" &&
21
- typeof schema._def === "object" &&
22
- typeof schema.safeParse === "function";
24
+ schema &&
25
+ typeof schema === "object" &&
26
+ typeof schema._def === "object" &&
27
+ typeof schema.safeParse === "function";
23
28
 
24
29
  const isExpressValidator = Array.isArray(schema);
25
30
 
26
31
  return (req: any, res: any, next: any) => {
27
32
  let middleware;
33
+ let adapterUsed: "zod" | "express-validator" | "none" = "none";
28
34
 
29
35
  if (isZod) {
30
- logger.debug("Using Zod adapter");
36
+ adapterUsed = "zod";
31
37
  middleware = this.zodAdapter.validate(schema);
32
- }
33
- else if (isExpressValidator) {
34
- logger.debug(" Using express-validator adapter");
38
+ } else if (isExpressValidator) {
39
+ adapterUsed = "express-validator";
35
40
  middleware = this.expressAdapter.validate(schema);
36
- }
37
- else {
38
- return next();
41
+ } else {
42
+ return next();
39
43
  }
40
44
 
45
+ logger.info("Validation adapter selected", {
46
+ layer: "validator-manager",
47
+ operation: "select",
48
+ adapter: adapterUsed,
49
+ path: req.path,
50
+ method: req.method
51
+ });
52
+
41
53
  // CASE 1 — express-validator returns ARRAY
42
54
  if (Array.isArray(middleware)) {
43
55
  let idx = 0;
@@ -46,11 +58,18 @@ export class ValidatorManager {
46
58
  if (err) return next(err);
47
59
 
48
60
  const fn = middleware[idx++];
49
- if (!fn) return next(); // done
61
+ if (!fn) return next();
50
62
 
51
63
  try {
52
64
  fn(req, res, run);
53
65
  } catch (error: any) {
66
+ logger.error("Validation middleware execution failed", {
67
+ layer: "validator-manager",
68
+ operation: "execute",
69
+ adapter: adapterUsed,
70
+ reason: error?.message
71
+ });
72
+
54
73
  next(new ValidationError(error.message));
55
74
  }
56
75
  };
@@ -58,16 +77,22 @@ export class ValidatorManager {
58
77
  return run();
59
78
  }
60
79
 
61
- // CASE 2 — Zod returns SINGLE MIDDLEWARE
80
+ // CASE 2 — Zod returns SINGLE middleware
62
81
  try {
63
82
  middleware(req, res, (err?: any) => {
64
83
  if (err) return next(err);
65
84
  next();
66
85
  });
67
86
  } catch (err: any) {
87
+ logger.error("Validation middleware execution failed", {
88
+ layer: "validator-manager",
89
+ operation: "execute",
90
+ adapter: adapterUsed,
91
+ reason: err?.message
92
+ });
93
+
68
94
  next(new ValidationError(err.message));
69
95
  }
70
96
  };
71
97
  }
72
98
  }
73
-