hi-secure 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.
Files changed (210) hide show
  1. package/dist/adapters/ArgonAdapter.d.ts +8 -0
  2. package/dist/adapters/ArgonAdapter.d.ts.map +1 -0
  3. package/dist/adapters/ArgonAdapter.js +45 -0
  4. package/dist/adapters/ArgonAdapter.js.map +1 -0
  5. package/dist/adapters/BcryptAdapter.d.ts +7 -0
  6. package/dist/adapters/BcryptAdapter.d.ts.map +1 -0
  7. package/dist/adapters/BcryptAdapter.js +48 -0
  8. package/dist/adapters/BcryptAdapter.js.map +1 -0
  9. package/dist/adapters/DomPurifyAdapter.d.ts +13 -0
  10. package/dist/adapters/DomPurifyAdapter.d.ts.map +1 -0
  11. package/dist/adapters/DomPurifyAdapter.js +61 -0
  12. package/dist/adapters/DomPurifyAdapter.js.map +1 -0
  13. package/dist/adapters/ExpressRLAdapter.d.ts +13 -0
  14. package/dist/adapters/ExpressRLAdapter.d.ts.map +1 -0
  15. package/dist/adapters/ExpressRLAdapter.js +68 -0
  16. package/dist/adapters/ExpressRLAdapter.js.map +1 -0
  17. package/dist/adapters/ExpressValidatorAdapter.d.ts +6 -0
  18. package/dist/adapters/ExpressValidatorAdapter.d.ts.map +1 -0
  19. package/dist/adapters/ExpressValidatorAdapter.js +78 -0
  20. package/dist/adapters/ExpressValidatorAdapter.js.map +1 -0
  21. package/dist/adapters/GoggleAdapter.d.ts +15 -0
  22. package/dist/adapters/GoggleAdapter.d.ts.map +1 -0
  23. package/dist/adapters/GoggleAdapter.js +91 -0
  24. package/dist/adapters/GoggleAdapter.js.map +1 -0
  25. package/dist/adapters/GoogleAdapter.d.ts +15 -0
  26. package/dist/adapters/GoogleAdapter.d.ts.map +1 -0
  27. package/dist/adapters/GoogleAdapter.js +159 -0
  28. package/dist/adapters/GoogleAdapter.js.map +1 -0
  29. package/dist/adapters/JWTAdapter.d.ts +28 -0
  30. package/dist/adapters/JWTAdapter.d.ts.map +1 -0
  31. package/dist/adapters/JWTAdapter.js +276 -0
  32. package/dist/adapters/JWTAdapter.js.map +1 -0
  33. package/dist/adapters/RLFlexibleAdapter.d.ts +11 -0
  34. package/dist/adapters/RLFlexibleAdapter.d.ts.map +1 -0
  35. package/dist/adapters/RLFlexibleAdapter.js +115 -0
  36. package/dist/adapters/RLFlexibleAdapter.js.map +1 -0
  37. package/dist/adapters/SanitizeHtmlAdapter.d.ts +12 -0
  38. package/dist/adapters/SanitizeHtmlAdapter.d.ts.map +1 -0
  39. package/dist/adapters/SanitizeHtmlAdapter.js +141 -0
  40. package/dist/adapters/SanitizeHtmlAdapter.js.map +1 -0
  41. package/dist/adapters/XSSAdapter.d.ts +33 -0
  42. package/dist/adapters/XSSAdapter.d.ts.map +1 -0
  43. package/dist/adapters/XSSAdapter.js +127 -0
  44. package/dist/adapters/XSSAdapter.js.map +1 -0
  45. package/dist/adapters/ZodAdapter.d.ts +7 -0
  46. package/dist/adapters/ZodAdapter.d.ts.map +1 -0
  47. package/dist/adapters/ZodAdapter.js +39 -0
  48. package/dist/adapters/ZodAdapter.js.map +1 -0
  49. package/dist/core/HiSecure.d.ts +62 -0
  50. package/dist/core/HiSecure.d.ts.map +1 -0
  51. package/dist/core/HiSecure.js +273 -0
  52. package/dist/core/HiSecure.js.map +1 -0
  53. package/dist/core/config.d.ts +3 -0
  54. package/dist/core/config.d.ts.map +1 -0
  55. package/dist/core/config.js +53 -0
  56. package/dist/core/config.js.map +1 -0
  57. package/dist/core/constants.d.ts +37 -0
  58. package/dist/core/constants.d.ts.map +1 -0
  59. package/dist/core/constants.js +67 -0
  60. package/dist/core/constants.js.map +1 -0
  61. package/dist/core/errors/AdapterError.d.ts +5 -0
  62. package/dist/core/errors/AdapterError.d.ts.map +1 -0
  63. package/dist/core/errors/AdapterError.js +15 -0
  64. package/dist/core/errors/AdapterError.js.map +1 -0
  65. package/dist/core/errors/HttpErrror.d.ts +17 -0
  66. package/dist/core/errors/HttpErrror.d.ts.map +1 -0
  67. package/dist/core/errors/HttpErrror.js +36 -0
  68. package/dist/core/errors/HttpErrror.js.map +1 -0
  69. package/dist/core/errors/SanitizerError.d.ts +5 -0
  70. package/dist/core/errors/SanitizerError.d.ts.map +1 -0
  71. package/dist/core/errors/SanitizerError.js +14 -0
  72. package/dist/core/errors/SanitizerError.js.map +1 -0
  73. package/dist/core/errors/SecurityError.d.ts +5 -0
  74. package/dist/core/errors/SecurityError.d.ts.map +1 -0
  75. package/dist/core/errors/SecurityError.js +14 -0
  76. package/dist/core/errors/SecurityError.js.map +1 -0
  77. package/dist/core/errors/ValidationError.d.ts +5 -0
  78. package/dist/core/errors/ValidationError.d.ts.map +1 -0
  79. package/dist/core/errors/ValidationError.js +14 -0
  80. package/dist/core/errors/ValidationError.js.map +1 -0
  81. package/dist/core/types/HiSecureConfig.d.ts +47 -0
  82. package/dist/core/types/HiSecureConfig.d.ts.map +1 -0
  83. package/dist/core/types/HiSecureConfig.js +3 -0
  84. package/dist/core/types/HiSecureConfig.js.map +1 -0
  85. package/dist/core/types/SecureOptions.d.ts +30 -0
  86. package/dist/core/types/SecureOptions.d.ts.map +1 -0
  87. package/dist/core/types/SecureOptions.js +4 -0
  88. package/dist/core/types/SecureOptions.js.map +1 -0
  89. package/dist/core/useSecure.d.ts +10 -0
  90. package/dist/core/useSecure.d.ts.map +1 -0
  91. package/dist/core/useSecure.js +85 -0
  92. package/dist/core/useSecure.js.map +1 -0
  93. package/dist/examples/e1.d.ts +1 -0
  94. package/dist/examples/e1.d.ts.map +1 -0
  95. package/dist/examples/e1.js +3 -0
  96. package/dist/examples/e1.js.map +1 -0
  97. package/dist/index.d.ts +9 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +15 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/logging/index.d.ts +3 -0
  102. package/dist/logging/index.d.ts.map +1 -0
  103. package/dist/logging/index.js +19 -0
  104. package/dist/logging/index.js.map +1 -0
  105. package/dist/logging/morganSetup.d.ts +2 -0
  106. package/dist/logging/morganSetup.d.ts.map +1 -0
  107. package/dist/logging/morganSetup.js +9 -0
  108. package/dist/logging/morganSetup.js.map +1 -0
  109. package/dist/logging/winstonSetup.d.ts +6 -0
  110. package/dist/logging/winstonSetup.d.ts.map +1 -0
  111. package/dist/logging/winstonSetup.js +22 -0
  112. package/dist/logging/winstonSetup.js.map +1 -0
  113. package/dist/managers/AuthManager.d.ts +23 -0
  114. package/dist/managers/AuthManager.d.ts.map +1 -0
  115. package/dist/managers/AuthManager.js +190 -0
  116. package/dist/managers/AuthManager.js.map +1 -0
  117. package/dist/managers/CorsManager.d.ts +9 -0
  118. package/dist/managers/CorsManager.d.ts.map +1 -0
  119. package/dist/managers/CorsManager.js +55 -0
  120. package/dist/managers/CorsManager.js.map +1 -0
  121. package/dist/managers/HashManager.d.ts +22 -0
  122. package/dist/managers/HashManager.d.ts.map +1 -0
  123. package/dist/managers/HashManager.js +319 -0
  124. package/dist/managers/HashManager.js.map +1 -0
  125. package/dist/managers/JsonManager.d.ts +6 -0
  126. package/dist/managers/JsonManager.d.ts.map +1 -0
  127. package/dist/managers/JsonManager.js +142 -0
  128. package/dist/managers/JsonManager.js.map +1 -0
  129. package/dist/managers/RateLimitManager.d.ts +16 -0
  130. package/dist/managers/RateLimitManager.d.ts.map +1 -0
  131. package/dist/managers/RateLimitManager.js +108 -0
  132. package/dist/managers/RateLimitManager.js.map +1 -0
  133. package/dist/managers/SanitizerManager.d.ts +18 -0
  134. package/dist/managers/SanitizerManager.d.ts.map +1 -0
  135. package/dist/managers/SanitizerManager.js +296 -0
  136. package/dist/managers/SanitizerManager.js.map +1 -0
  137. package/dist/managers/ValidatorManager.d.ts +13 -0
  138. package/dist/managers/ValidatorManager.d.ts.map +1 -0
  139. package/dist/managers/ValidatorManager.js +218 -0
  140. package/dist/managers/ValidatorManager.js.map +1 -0
  141. package/dist/middlewares/errorHandler.d.ts +3 -0
  142. package/dist/middlewares/errorHandler.d.ts.map +1 -0
  143. package/dist/middlewares/errorHandler.js +94 -0
  144. package/dist/middlewares/errorHandler.js.map +1 -0
  145. package/dist/middlewares/index.d.ts +3 -0
  146. package/dist/middlewares/index.d.ts.map +1 -0
  147. package/dist/middlewares/index.js +19 -0
  148. package/dist/middlewares/index.js.map +1 -0
  149. package/dist/middlewares/requestLogger.d.ts +2 -0
  150. package/dist/middlewares/requestLogger.d.ts.map +1 -0
  151. package/dist/middlewares/requestLogger.js +8 -0
  152. package/dist/middlewares/requestLogger.js.map +1 -0
  153. package/dist/test/t1.d.ts +1 -0
  154. package/dist/test/t1.d.ts.map +1 -0
  155. package/dist/test/t1.js +3 -0
  156. package/dist/test/t1.js.map +1 -0
  157. package/dist/utils/deepFreeze.d.ts +2 -0
  158. package/dist/utils/deepFreeze.d.ts.map +1 -0
  159. package/dist/utils/deepFreeze.js +69 -0
  160. package/dist/utils/deepFreeze.js.map +1 -0
  161. package/dist/utils/deepMerge.d.ts +5 -0
  162. package/dist/utils/deepMerge.d.ts.map +1 -0
  163. package/dist/utils/deepMerge.js +68 -0
  164. package/dist/utils/deepMerge.js.map +1 -0
  165. package/dist/utils/normalizeOptions.d.ts +38 -0
  166. package/dist/utils/normalizeOptions.d.ts.map +1 -0
  167. package/dist/utils/normalizeOptions.js +119 -0
  168. package/dist/utils/normalizeOptions.js.map +1 -0
  169. package/package.json +50 -0
  170. package/src/adapters/ArgonAdapter.ts +41 -0
  171. package/src/adapters/BcryptAdapter.ts +49 -0
  172. package/src/adapters/ExpressRLAdapter.ts +84 -0
  173. package/src/adapters/ExpressValidatorAdapter.ts +99 -0
  174. package/src/adapters/GoogleAdapter.ts +206 -0
  175. package/src/adapters/JWTAdapter.ts +346 -0
  176. package/src/adapters/RLFlexibleAdapter.ts +139 -0
  177. package/src/adapters/SanitizeHtmlAdapter.ts +162 -0
  178. package/src/adapters/XSSAdapter.ts +153 -0
  179. package/src/adapters/ZodAdapter.ts +91 -0
  180. package/src/core/HiSecure.ts +955 -0
  181. package/src/core/config.ts +156 -0
  182. package/src/core/constants.ts +73 -0
  183. package/src/core/errors/AdapterError.ts +14 -0
  184. package/src/core/errors/HttpErrror.ts +46 -0
  185. package/src/core/errors/SanitizerError.ts +13 -0
  186. package/src/core/errors/SecurityError.ts +13 -0
  187. package/src/core/errors/ValidationError.ts +13 -0
  188. package/src/core/types/HiSecureConfig.ts +62 -0
  189. package/src/core/types/SecureOptions.ts +61 -0
  190. package/src/core/useSecure.ts +111 -0
  191. package/src/examples/e1.ts +1 -0
  192. package/src/index.ts +17 -0
  193. package/src/logging/index.ts +2 -0
  194. package/src/logging/morganSetup.ts +3 -0
  195. package/src/logging/winstonSetup.ts +17 -0
  196. package/src/managers/AuthManager.ts +237 -0
  197. package/src/managers/CorsManager.ts +58 -0
  198. package/src/managers/HashManager.ts +390 -0
  199. package/src/managers/JsonManager.ts +149 -0
  200. package/src/managers/RateLimitManager.ts +368 -0
  201. package/src/managers/SanitizerManager.ts +359 -0
  202. package/src/managers/ValidatorManager.ts +269 -0
  203. package/src/middlewares/errorHandler.ts +265 -0
  204. package/src/middlewares/index.ts +2 -0
  205. package/src/middlewares/requestLogger.ts +5 -0
  206. package/src/test/t1.ts +1 -0
  207. package/src/utils/deepFreeze.ts +76 -0
  208. package/src/utils/deepMerge.ts +87 -0
  209. package/src/utils/normalizeOptions.ts +265 -0
  210. package/tsconfig.json +30 -0
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ // import { JWTAdapter } from "../adapters/JWTAdapter.js";
3
+ // import { GoogleAdapter } from "../adapters/GoggleAdapter.js";
4
+ // import { AdapterError } from "../core/errors/AdapterError.js";
5
+ // import { HttpError } from "../core/errors/HttpErrror.js";
6
+ // import { Request, Response, NextFunction } from "express";
7
+ // import { logError, logWarn, logInfo } from "../logging";
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.AuthManager = void 0;
10
+ // export interface AuthOptions {
11
+ // jwtSecret: string;
12
+ // jwtExpiresIn?: string | number | undefined;
13
+ // googleClientId?: string | undefined;
14
+ // }
15
+ // export class AuthManager {
16
+ // private jwtAdapter: JWTAdapter;
17
+ // private googleAdapter?: GoogleAdapter;
18
+ // constructor(opts: AuthOptions) {
19
+ // if (!opts.jwtSecret)
20
+ // throw new AdapterError("jwtSecret required in AuthOptions");
21
+ // logInfo("AuthManager initialized");
22
+ // this.jwtAdapter = new JWTAdapter({
23
+ // secret: opts.jwtSecret,
24
+ // expiresIn: opts.jwtExpiresIn ?? undefined,
25
+ // });
26
+ // if (opts.googleClientId) {
27
+ // this.googleAdapter = new GoogleAdapter(opts.googleClientId);
28
+ // logInfo("GoogleAdapter enabled");
29
+ // }
30
+ // }
31
+ // sign(payload: object, options?: { expiresIn?: string | number }) {
32
+ // logInfo("JWT Sign called");
33
+ // return this.jwtAdapter.sign(payload, options);
34
+ // }
35
+ // verify(token: string) {
36
+ // logInfo("JWT Verify called");
37
+ // return this.jwtAdapter.verify(token);
38
+ // }
39
+ // async verifyGoogleIdToken(idToken: string) {
40
+ // if (!this.googleAdapter)
41
+ // throw new AdapterError("GoogleAdapter not configured.");
42
+ // logInfo("Google ID Token verify called");
43
+ // try {
44
+ // return await this.googleAdapter.verifyIdToken(idToken);
45
+ // } catch (err: any) {
46
+ // logError("Google ID Token verification failed", { error: err?.message });
47
+ // throw HttpError.Unauthorized("Invalid Google ID token");
48
+ // }
49
+ // }
50
+ // protect(options?: { required?: boolean }) {
51
+ // const required = options?.required ?? true;
52
+ // return (req: Request, res: Response, next: NextFunction) => {
53
+ // const header = req.headers["authorization"] || req.headers["Authorization"];
54
+ // if (!header) {
55
+ // if (required) {
56
+ // logWarn("Missing Authorization header", {
57
+ // path: req.path,
58
+ // method: req.method
59
+ // });
60
+ // return next(HttpError.Unauthorized("Missing Authorization header"));
61
+ // }
62
+ // return next();
63
+ // }
64
+ // const [type, token] = String(header).split(" ");
65
+ // if (type !== "Bearer" || !token) {
66
+ // logWarn("Invalid Authorization header", {
67
+ // path: req.path,
68
+ // method: req.method
69
+ // });
70
+ // return next(HttpError.Unauthorized("Invalid Authorization header"));
71
+ // }
72
+ // try {
73
+ // const decoded = this.verify(token);
74
+ // (req as any).auth = decoded;
75
+ // return next();
76
+ // } catch (err: any) {
77
+ // logError("JWT verify failed", {
78
+ // error: err?.message,
79
+ // path: req.path,
80
+ // method: req.method
81
+ // });
82
+ // return next(HttpError.Unauthorized("Invalid or expired token"));
83
+ // }
84
+ // };
85
+ // }
86
+ // }
87
+ // src/managers/AuthManager.ts - FIXED
88
+ const JWTAdapter_js_1 = require("../adapters/JWTAdapter.js");
89
+ const GoogleAdapter_js_1 = require("../adapters/GoogleAdapter.js");
90
+ const AdapterError_js_1 = require("../core/errors/AdapterError.js");
91
+ const HttpErrror_js_1 = require("../core/errors/HttpErrror.js");
92
+ const logging_1 = require("../logging");
93
+ class AuthManager {
94
+ constructor(opts) {
95
+ if (!opts.jwtSecret) {
96
+ throw new AdapterError_js_1.AdapterError("jwtSecret required in AuthOptions");
97
+ }
98
+ if (opts.jwtSecret.length < 32) {
99
+ (0, logging_1.logWarn)("⚠ JWT secret is less than 32 characters - consider using a stronger secret");
100
+ }
101
+ (0, logging_1.logInfo)("AuthManager initialized");
102
+ this.jwtAdapter = new JWTAdapter_js_1.JWTAdapter({
103
+ secret: opts.jwtSecret,
104
+ expiresIn: opts.jwtExpiresIn ?? "1d",
105
+ });
106
+ if (opts.googleClientId) {
107
+ this.googleAdapter = new GoogleAdapter_js_1.GoogleAdapter(opts.googleClientId);
108
+ (0, logging_1.logInfo)("GoogleAdapter enabled");
109
+ }
110
+ }
111
+ sign(payload, options) {
112
+ (0, logging_1.logInfo)("JWT Sign called");
113
+ return this.jwtAdapter.sign(payload, options);
114
+ }
115
+ verify(token) {
116
+ (0, logging_1.logInfo)("JWT Verify called");
117
+ return this.jwtAdapter.verify(token);
118
+ }
119
+ async verifyGoogleIdToken(idToken) {
120
+ if (!this.googleAdapter) {
121
+ throw new AdapterError_js_1.AdapterError("GoogleAdapter not configured.");
122
+ }
123
+ (0, logging_1.logInfo)("Google ID Token verify called");
124
+ try {
125
+ return await this.googleAdapter.verifyIdToken(idToken);
126
+ }
127
+ catch (err) {
128
+ (0, logging_1.logError)("Google ID Token verification failed", { error: err?.message });
129
+ throw HttpErrror_js_1.HttpError.Unauthorized("Invalid Google ID token");
130
+ }
131
+ }
132
+ protect(options) {
133
+ const required = options?.required ?? true;
134
+ const roles = options?.roles;
135
+ return (req, res, next) => {
136
+ const header = req.headers["authorization"];
137
+ // If auth is not required, skip authentication
138
+ if (!required && !header) {
139
+ return next();
140
+ }
141
+ // If auth is required but no header
142
+ if (!header) {
143
+ (0, logging_1.logWarn)("Missing Authorization header", {
144
+ path: req.path,
145
+ method: req.method
146
+ });
147
+ return next(HttpErrror_js_1.HttpError.Unauthorized("Missing Authorization header"));
148
+ }
149
+ // Parse Bearer token
150
+ const [type, token] = String(header).split(" ");
151
+ if (type !== "Bearer" || !token) {
152
+ (0, logging_1.logWarn)("Invalid Authorization header", {
153
+ path: req.path,
154
+ method: req.method
155
+ });
156
+ return next(HttpErrror_js_1.HttpError.Unauthorized("Invalid Authorization header"));
157
+ }
158
+ try {
159
+ // Verify JWT
160
+ const decoded = this.verify(token);
161
+ // Attach to request
162
+ req.auth = decoded;
163
+ req.user = decoded; // Common pattern
164
+ // Role-based authorization
165
+ if (roles && roles.length > 0) {
166
+ const userRole = decoded.role || decoded.roles?.[0];
167
+ if (!userRole || !roles.includes(userRole)) {
168
+ (0, logging_1.logWarn)("Insufficient permissions", {
169
+ path: req.path,
170
+ requiredRoles: roles,
171
+ userRole
172
+ });
173
+ return next(HttpErrror_js_1.HttpError.Forbidden("Insufficient permissions"));
174
+ }
175
+ }
176
+ return next();
177
+ }
178
+ catch (err) {
179
+ (0, logging_1.logError)("JWT verify failed", {
180
+ error: err?.message,
181
+ path: req.path,
182
+ method: req.method
183
+ });
184
+ return next(HttpErrror_js_1.HttpError.Unauthorized("Invalid or expired token"));
185
+ }
186
+ };
187
+ }
188
+ }
189
+ exports.AuthManager = AuthManager;
190
+ //# sourceMappingURL=AuthManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthManager.js","sourceRoot":"","sources":["../../src/managers/AuthManager.ts"],"names":[],"mappings":"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","sourcesContent":["// import { JWTAdapter } from \"../adapters/JWTAdapter.js\";\r\n// import { GoogleAdapter } from \"../adapters/GoggleAdapter.js\";\r\n// import { AdapterError } from \"../core/errors/AdapterError.js\";\r\n// import { HttpError } from \"../core/errors/HttpErrror.js\";\r\n// import { Request, Response, NextFunction } from \"express\";\r\n// import { logError, logWarn, logInfo } from \"../logging\";\r\n\r\n// export interface AuthOptions {\r\n// jwtSecret: string;\r\n// jwtExpiresIn?: string | number | undefined;\r\n// googleClientId?: string | undefined;\r\n// }\r\n\r\n// export class AuthManager {\r\n// private jwtAdapter: JWTAdapter;\r\n// private googleAdapter?: GoogleAdapter;\r\n\r\n// constructor(opts: AuthOptions) {\r\n// if (!opts.jwtSecret)\r\n// throw new AdapterError(\"jwtSecret required in AuthOptions\");\r\n\r\n// logInfo(\"AuthManager initialized\");\r\n\r\n// this.jwtAdapter = new JWTAdapter({\r\n// secret: opts.jwtSecret,\r\n// expiresIn: opts.jwtExpiresIn ?? undefined,\r\n// });\r\n\r\n// if (opts.googleClientId) {\r\n// this.googleAdapter = new GoogleAdapter(opts.googleClientId);\r\n// logInfo(\"GoogleAdapter enabled\");\r\n// }\r\n// }\r\n\r\n// sign(payload: object, options?: { expiresIn?: string | number }) {\r\n// logInfo(\"JWT Sign called\");\r\n// return this.jwtAdapter.sign(payload, options);\r\n// }\r\n\r\n// verify(token: string) {\r\n// logInfo(\"JWT Verify called\");\r\n// return this.jwtAdapter.verify(token);\r\n// }\r\n\r\n// async verifyGoogleIdToken(idToken: string) {\r\n// if (!this.googleAdapter)\r\n// throw new AdapterError(\"GoogleAdapter not configured.\");\r\n\r\n// logInfo(\"Google ID Token verify called\");\r\n\r\n// try {\r\n// return await this.googleAdapter.verifyIdToken(idToken);\r\n// } catch (err: any) {\r\n// logError(\"Google ID Token verification failed\", { error: err?.message });\r\n// throw HttpError.Unauthorized(\"Invalid Google ID token\");\r\n// }\r\n// }\r\n\r\n// protect(options?: { required?: boolean }) {\r\n// const required = options?.required ?? true;\r\n\r\n// return (req: Request, res: Response, next: NextFunction) => {\r\n// const header = req.headers[\"authorization\"] || req.headers[\"Authorization\"];\r\n\r\n// if (!header) {\r\n// if (required) {\r\n// logWarn(\"Missing Authorization header\", {\r\n// path: req.path,\r\n// method: req.method\r\n// });\r\n// return next(HttpError.Unauthorized(\"Missing Authorization header\"));\r\n// }\r\n// return next();\r\n// }\r\n\r\n// const [type, token] = String(header).split(\" \");\r\n\r\n// if (type !== \"Bearer\" || !token) {\r\n// logWarn(\"Invalid Authorization header\", {\r\n// path: req.path,\r\n// method: req.method\r\n// });\r\n// return next(HttpError.Unauthorized(\"Invalid Authorization header\"));\r\n// }\r\n\r\n// try {\r\n// const decoded = this.verify(token);\r\n// (req as any).auth = decoded;\r\n// return next();\r\n// } catch (err: any) {\r\n// logError(\"JWT verify failed\", {\r\n// error: err?.message,\r\n// path: req.path,\r\n// method: req.method\r\n// });\r\n// return next(HttpError.Unauthorized(\"Invalid or expired token\"));\r\n// }\r\n// };\r\n// }\r\n// }\r\n\r\n\r\n\r\n// src/managers/AuthManager.ts - FIXED\r\nimport { JWTAdapter } from \"../adapters/JWTAdapter.js\";\r\nimport { GoogleAdapter } from \"../adapters/GoogleAdapter.js\";\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\nimport { HttpError } from \"../core/errors/HttpErrror.js\";\r\nimport { Request, Response, NextFunction } from \"express\";\r\nimport { logError, logWarn, logInfo } from \"../logging\";\r\n\r\nexport interface AuthOptions {\r\n jwtSecret: string;\r\n jwtExpiresIn?: string | number;\r\n googleClientId?: string;\r\n}\r\n\r\nexport interface ProtectOptions {\r\n required?: boolean;\r\n roles?: string[];\r\n}\r\n\r\nexport class AuthManager {\r\n private jwtAdapter: JWTAdapter;\r\n private googleAdapter?: GoogleAdapter;\r\n\r\n constructor(opts: AuthOptions) {\r\n if (!opts.jwtSecret) {\r\n throw new AdapterError(\"jwtSecret required in AuthOptions\");\r\n }\r\n\r\n if (opts.jwtSecret.length < 32) {\r\n logWarn(\"⚠ JWT secret is less than 32 characters - consider using a stronger secret\");\r\n }\r\n\r\n logInfo(\"AuthManager initialized\");\r\n\r\n this.jwtAdapter = new JWTAdapter({\r\n secret: opts.jwtSecret,\r\n expiresIn: opts.jwtExpiresIn ?? \"1d\",\r\n });\r\n\r\n if (opts.googleClientId) {\r\n this.googleAdapter = new GoogleAdapter(opts.googleClientId);\r\n logInfo(\"GoogleAdapter enabled\");\r\n }\r\n }\r\n\r\n sign(payload: object, options?: { expiresIn?: string | number, jti?: string }) {\r\n logInfo(\"JWT Sign called\");\r\n return this.jwtAdapter.sign(payload, options);\r\n }\r\n\r\n verify(token: string) {\r\n logInfo(\"JWT Verify called\");\r\n return this.jwtAdapter.verify(token);\r\n }\r\n\r\n async verifyGoogleIdToken(idToken: string) {\r\n if (!this.googleAdapter) {\r\n throw new AdapterError(\"GoogleAdapter not configured.\");\r\n }\r\n\r\n logInfo(\"Google ID Token verify called\");\r\n\r\n try {\r\n return await this.googleAdapter.verifyIdToken(idToken);\r\n } catch (err: any) {\r\n logError(\"Google ID Token verification failed\", { error: err?.message });\r\n throw HttpError.Unauthorized(\"Invalid Google ID token\");\r\n }\r\n }\r\n\r\n protect(options?: ProtectOptions) {\r\n const required = options?.required ?? true;\r\n const roles = options?.roles;\r\n\r\n return (req: Request, res: Response, next: NextFunction) => {\r\n const header = req.headers[\"authorization\"];\r\n\r\n // If auth is not required, skip authentication\r\n if (!required && !header) {\r\n return next();\r\n }\r\n\r\n // If auth is required but no header\r\n if (!header) {\r\n logWarn(\"Missing Authorization header\", {\r\n path: req.path,\r\n method: req.method\r\n });\r\n return next(HttpError.Unauthorized(\"Missing Authorization header\"));\r\n }\r\n\r\n // Parse Bearer token\r\n const [type, token] = String(header).split(\" \");\r\n if (type !== \"Bearer\" || !token) {\r\n logWarn(\"Invalid Authorization header\", {\r\n path: req.path,\r\n method: req.method\r\n });\r\n return next(HttpError.Unauthorized(\"Invalid Authorization header\"));\r\n }\r\n\r\n try {\r\n // Verify JWT\r\n const decoded = this.verify(token);\r\n \r\n // Attach to request\r\n (req as any).auth = decoded;\r\n (req as any).user = decoded; // Common pattern\r\n \r\n // Role-based authorization\r\n if (roles && roles.length > 0) {\r\n const userRole = (decoded as any).role || (decoded as any).roles?.[0];\r\n if (!userRole || !roles.includes(userRole)) {\r\n logWarn(\"Insufficient permissions\", {\r\n path: req.path,\r\n requiredRoles: roles,\r\n userRole\r\n });\r\n return next(HttpError.Forbidden(\"Insufficient permissions\"));\r\n }\r\n }\r\n \r\n return next();\r\n } catch (err: any) {\r\n logError(\"JWT verify failed\", {\r\n error: err?.message,\r\n path: req.path,\r\n method: req.method\r\n });\r\n return next(HttpError.Unauthorized(\"Invalid or expired token\"));\r\n }\r\n };\r\n }\r\n}"]}
@@ -0,0 +1,9 @@
1
+ import cors from "cors";
2
+ export declare class CorsManager {
3
+ middleware(options?: any): (req: cors.CorsRequest, res: {
4
+ statusCode?: number | undefined;
5
+ setHeader(key: string, value: string): any;
6
+ end(): any;
7
+ }, next: (err?: any) => any) => void;
8
+ }
9
+ //# sourceMappingURL=CorsManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CorsManager.d.ts","sourceRoot":"","sources":["../../src/managers/CorsManager.ts"],"names":[],"mappings":"AAwBA,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,qBAAa,WAAW;IAEpB,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG;kBAaZ,CAAN;;;iBAIE,CAAV;CAUD"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ // import cors from "cors";
3
+ // import { logger } from "../logging";
4
+ // import { AdapterError } from "../core/errors/AdapterError.js";
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.CorsManager = void 0;
10
+ // export class CorsManager {
11
+ // middleware(options?: any) {
12
+ // try {
13
+ // // options = undefined → use default CORS
14
+ // return options ? cors(options) : cors();
15
+ // } catch (err: any) {
16
+ // logger.error("❌ CORS Manager: failed to create CORS middleware", {
17
+ // error: err?.message || err,
18
+ // options
19
+ // });
20
+ // throw new AdapterError("CORS middleware initialization failed.");
21
+ // }
22
+ // }
23
+ // }
24
+ // src/managers/CorsManager.ts - IMPROVED
25
+ const cors_1 = __importDefault(require("cors"));
26
+ const logging_1 = require("../logging");
27
+ const AdapterError_js_1 = require("../core/errors/AdapterError.js");
28
+ class CorsManager {
29
+ middleware(options) {
30
+ try {
31
+ const defaultOptions = {
32
+ origin: '*',
33
+ methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],
34
+ allowedHeaders: ['Content-Type', 'Authorization'],
35
+ credentials: false,
36
+ maxAge: 86400 // 24 hours
37
+ };
38
+ const finalOptions = options ? { ...defaultOptions, ...options } : defaultOptions;
39
+ logging_1.logger.debug("🔧 CORS configured", {
40
+ origin: finalOptions.origin,
41
+ methods: finalOptions.methods
42
+ });
43
+ return (0, cors_1.default)(finalOptions);
44
+ }
45
+ catch (err) {
46
+ logging_1.logger.error("❌ CORS Manager: failed to create CORS middleware", {
47
+ error: err?.message || err,
48
+ options
49
+ });
50
+ throw new AdapterError_js_1.AdapterError("CORS middleware initialization failed.");
51
+ }
52
+ }
53
+ }
54
+ exports.CorsManager = CorsManager;
55
+ //# sourceMappingURL=CorsManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CorsManager.js","sourceRoot":"","sources":["../../src/managers/CorsManager.ts"],"names":[],"mappings":";AAAA,2BAA2B;AAC3B,uCAAuC;AACvC,iEAAiE;;;;;;AAEjE,6BAA6B;AAE7B,kCAAkC;AAClC,gBAAgB;AAChB,wDAAwD;AACxD,uDAAuD;AAEvD,+BAA+B;AAC/B,iFAAiF;AACjF,8CAA8C;AAC9C,0BAA0B;AAC1B,kBAAkB;AAClB,gFAAgF;AAChF,YAAY;AACZ,QAAQ;AACR,IAAI;AAIJ,yCAAyC;AACzC,gDAAwB;AACxB,wCAAoC;AACpC,oEAA8D;AAE9D,MAAa,WAAW;IAEpB,UAAU,CAAC,OAAa;QACpB,IAAI,CAAC;YACD,MAAM,cAAc,GAAG;gBACnB,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;gBAC7D,cAAc,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC;gBACjD,WAAW,EAAE,KAAK;gBAClB,MAAM,EAAE,KAAK,CAAC,WAAW;aAC5B,CAAC;YAEF,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;YAElF,gBAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBAC/B,MAAM,EAAE,YAAY,CAAC,MAAM;gBAC3B,OAAO,EAAE,YAAY,CAAC,OAAO;aAChC,CAAC,CAAC;YAEH,OAAO,IAAA,cAAI,EAAC,YAAY,CAAC,CAAC;QAE9B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAChB,gBAAM,CAAC,KAAK,CAAC,kDAAkD,EAAE;gBAC7D,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,GAAG;gBAC1B,OAAO;aACV,CAAC,CAAC;YACH,MAAM,IAAI,8BAAY,CAAC,wCAAwC,CAAC,CAAC;QACrE,CAAC;IACL,CAAC;CACJ;AA7BD,kCA6BC","sourcesContent":["// import cors from \"cors\";\r\n// import { logger } from \"../logging\";\r\n// import { AdapterError } from \"../core/errors/AdapterError.js\";\r\n\r\n// export class CorsManager {\r\n\r\n// middleware(options?: any) {\r\n// try {\r\n// // options = undefined → use default CORS\r\n// return options ? cors(options) : cors();\r\n\r\n// } catch (err: any) {\r\n// logger.error(\"❌ CORS Manager: failed to create CORS middleware\", {\r\n// error: err?.message || err,\r\n// options\r\n// });\r\n// throw new AdapterError(\"CORS middleware initialization failed.\");\r\n// }\r\n// }\r\n// }\r\n\r\n\r\n\r\n// src/managers/CorsManager.ts - IMPROVED\r\nimport cors from \"cors\";\r\nimport { logger } from \"../logging\";\r\nimport { AdapterError } from \"../core/errors/AdapterError.js\";\r\n\r\nexport class CorsManager {\r\n \r\n middleware(options?: any) {\r\n try {\r\n const defaultOptions = {\r\n origin: '*',\r\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],\r\n allowedHeaders: ['Content-Type', 'Authorization'],\r\n credentials: false,\r\n maxAge: 86400 // 24 hours\r\n };\r\n \r\n const finalOptions = options ? { ...defaultOptions, ...options } : defaultOptions;\r\n \r\n logger.debug(\"🔧 CORS configured\", {\r\n origin: finalOptions.origin,\r\n methods: finalOptions.methods\r\n });\r\n \r\n return cors(finalOptions);\r\n \r\n } catch (err: any) {\r\n logger.error(\"❌ CORS Manager: failed to create CORS middleware\", {\r\n error: err?.message || err,\r\n options\r\n });\r\n throw new AdapterError(\"CORS middleware initialization failed.\");\r\n }\r\n }\r\n}"]}
@@ -0,0 +1,22 @@
1
+ import { HiSecureConfig } from "../core/types/HiSecureConfig.js";
2
+ interface HashAdapter {
3
+ hash(value: string): Promise<string>;
4
+ verify(value: string, hashed: string): Promise<boolean>;
5
+ }
6
+ export interface HashResult {
7
+ hash: string;
8
+ algorithm: string;
9
+ usedFallback: boolean;
10
+ }
11
+ export declare class HashManager {
12
+ private config;
13
+ private primaryAdapter;
14
+ private fallbackAdapter;
15
+ constructor(config: HiSecureConfig["hashing"], primaryAdapter: HashAdapter, fallbackAdapter: HashAdapter | null);
16
+ hash(value: string, options?: {
17
+ allowFallback?: boolean;
18
+ }): Promise<HashResult>;
19
+ verify(value: string, hashed: string): Promise<boolean>;
20
+ }
21
+ export {};
22
+ //# sourceMappingURL=HashManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HashManager.d.ts","sourceRoot":"","sources":["../../src/managers/HashManager.ts"],"names":[],"mappings":"AA8RA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAGjE,UAAU,WAAW;IACjB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAE3D;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,eAAe,CAAqB;gBAGxC,MAAM,EAAE,cAAc,CAAC,SAAS,CAAC,EACjC,cAAc,EAAE,WAAW,EAC3B,eAAe,EAAE,WAAW,GAAG,IAAI;IAOjC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IA6C/E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CA4BhE"}
@@ -0,0 +1,319 @@
1
+ "use strict";
2
+ // // // import { AdapterError } from "../core/errors/AdapterError";
3
+ // // // import { HiSecureConfig } from "../core/config";
4
+ // // // import { logger } from "../logging";
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HashManager = void 0;
7
+ // // // export class HashManager {
8
+ // // // private config: HiSecureConfig["hashing"];
9
+ // // // private primaryAdapter: {
10
+ // // // hash: (value: string) => Promise<string>;
11
+ // // // verify: (value: string, hashed: string) => Promise<boolean>;
12
+ // // // };
13
+ // // // private fallbackAdapter: {
14
+ // // // hash: (value: string) => Promise<string>;
15
+ // // // verify: (value: string, hashed: string) => Promise<boolean>;
16
+ // // // } | null;
17
+ // // // constructor(
18
+ // // // config: HiSecureConfig["hashing"],
19
+ // // // primaryAdapter: any,
20
+ // // // fallbackAdapter: any
21
+ // // // ) {
22
+ // // // this.config = config;
23
+ // // // this.primaryAdapter = primaryAdapter;
24
+ // // // this.fallbackAdapter = fallbackAdapter;
25
+ // // // }
26
+ // // // /**
27
+ // // // * Hash a password using primary adapter (Argon2)
28
+ // // // * If it fails → fallback (Bcrypt)
29
+ // // // */
30
+ // // // async hash(value: string): Promise<string> {
31
+ // // // try {
32
+ // // // return await this.primaryAdapter.hash(value);
33
+ // // // } catch (err: any) {
34
+ // // // logger.warn("⚠ Primary hashing failed — switching to fallback", {
35
+ // // // error: err?.message,
36
+ // // // });
37
+ // // // if (!this.fallbackAdapter) {
38
+ // // // throw new AdapterError(
39
+ // // // "Primary hashing failed and no fallback adapter is configured."
40
+ // // // );
41
+ // // // }
42
+ // // // try {
43
+ // // // return await this.fallbackAdapter.hash(value);
44
+ // // // } catch (fallbackErr: any) {
45
+ // // // logger.error("❌ Fallback hashing failed", {
46
+ // // // error: fallbackErr?.message,
47
+ // // // });
48
+ // // // throw new AdapterError(
49
+ // // // "Both primary and fallback hashing failed."
50
+ // // // );
51
+ // // // }
52
+ // // // }
53
+ // // // }
54
+ // // // /**
55
+ // // // * Verify using primary hashing method.
56
+ // // // * If mismatch OR failure → use fallback.
57
+ // // // */
58
+ // // // async verify(value: string, hashed: string): Promise<boolean> {
59
+ // // // try {
60
+ // // // return await this.primaryAdapter.verify(value, hashed);
61
+ // // // } catch (err: any) {
62
+ // // // logger.warn("⚠ Primary verify failed — trying fallback", {
63
+ // // // error: err?.message,
64
+ // // // });
65
+ // // // if (!this.fallbackAdapter) {
66
+ // // // throw new AdapterError(
67
+ // // // "Primary verify failed and no fallback adapter is configured."
68
+ // // // );
69
+ // // // }
70
+ // // // try {
71
+ // // // return await this.fallbackAdapter.verify(value, hashed);
72
+ // // // } catch (fallbackErr: any) {
73
+ // // // logger.error("❌ Fallback verify failed", {
74
+ // // // error: fallbackErr?.message,
75
+ // // // });
76
+ // // // throw new AdapterError(
77
+ // // // "Both primary and fallback verify failed."
78
+ // // // );
79
+ // // // }
80
+ // // // }
81
+ // // // }
82
+ // // // }
83
+ // // import { AdapterError } from "../core/errors/AdapterError.js";
84
+ // // import { HiSecureConfig } from "../core/config.js";
85
+ // // import { logger } from "../logging";
86
+ // // interface HashAdapter {
87
+ // // hash(value: string): Promise<string>;
88
+ // // verify(value: string, hashed: string): Promise<boolean>;
89
+ // // }
90
+ // // export class HashManager {
91
+ // // private config: HiSecureConfig["hashing"];
92
+ // // private primaryAdapter: HashAdapter;
93
+ // // private fallbackAdapter: HashAdapter | null;
94
+ // // constructor(
95
+ // // config: HiSecureConfig["hashing"],
96
+ // // primaryAdapter: HashAdapter,
97
+ // // fallbackAdapter: HashAdapter | null
98
+ // // ) {
99
+ // // this.config = config;
100
+ // // this.primaryAdapter = primaryAdapter;
101
+ // // this.fallbackAdapter = fallbackAdapter;
102
+ // // }
103
+ // // async hash(value: string): Promise<string> {
104
+ // // try {
105
+ // // return await this.primaryAdapter.hash(value);
106
+ // // } catch (err: any) {
107
+ // // logger.warn("⚠ Primary hashing failed — trying fallback", {
108
+ // // error: err?.message,
109
+ // // });
110
+ // // if (!this.fallbackAdapter) {
111
+ // // throw new AdapterError(
112
+ // // "Primary hashing failed and no fallback adapter configured."
113
+ // // );
114
+ // // }
115
+ // // try {
116
+ // // return await this.fallbackAdapter.hash(value);
117
+ // // } catch (fallbackErr: any) {
118
+ // // logger.error("❌ Fallback hashing failed", {
119
+ // // error: fallbackErr?.message,
120
+ // // });
121
+ // // throw new AdapterError(
122
+ // // "Both primary and fallback hashing failed."
123
+ // // );
124
+ // // }
125
+ // // }
126
+ // // }
127
+ // // async verify(value: string, hashed: string): Promise<boolean> {
128
+ // // try {
129
+ // // return await this.primaryAdapter.verify(value, hashed);
130
+ // // } catch (err: any) {
131
+ // // logger.warn("⚠ Primary verify failed — trying fallback", {
132
+ // // error: err?.message,
133
+ // // });
134
+ // // if (!this.fallbackAdapter) {
135
+ // // throw new AdapterError(
136
+ // // "Primary verify failed and no fallback adapter configured."
137
+ // // );
138
+ // // }
139
+ // // try {
140
+ // // return await this.fallbackAdapter.verify(value, hashed);
141
+ // // } catch (fallbackErr: any) {
142
+ // // logger.error("❌ Fallback verify failed", {
143
+ // // error: fallbackErr?.message,
144
+ // // });
145
+ // // throw new AdapterError(
146
+ // // "Both primary and fallback verify failed."
147
+ // // );
148
+ // // }
149
+ // // }
150
+ // // }
151
+ // // }
152
+ // // src/managers/HashManager.ts - FIXED
153
+ // import { AdapterError } from "../core/errors/AdapterError.js";
154
+ // import { HiSecureConfig } from "../core/types/HiSecureConfig.js";
155
+ // import { logger } from "../logging";
156
+ // interface HashAdapter {
157
+ // hash(value: string): Promise<string>;
158
+ // verify(value: string, hashed: string): Promise<boolean>;
159
+ // getAlgorithm(): string;
160
+ // }
161
+ // export interface HashResult {
162
+ // hash: string;
163
+ // algorithm: string;
164
+ // usedFallback: boolean;
165
+ // }
166
+ // export class HashManager {
167
+ // private config: HiSecureConfig["hashing"];
168
+ // private primaryAdapter: HashAdapter;
169
+ // private fallbackAdapter: HashAdapter | null;
170
+ // constructor(
171
+ // config: HiSecureConfig["hashing"],
172
+ // primaryAdapter: HashAdapter,
173
+ // fallbackAdapter: HashAdapter | null
174
+ // ) {
175
+ // this.config = config;
176
+ // this.primaryAdapter = primaryAdapter;
177
+ // this.fallbackAdapter = fallbackAdapter;
178
+ // }
179
+ // async hash(value: string, options?: { allowFallback?: boolean }): Promise<HashResult> {
180
+ // try {
181
+ // const hash = await this.primaryAdapter.hash(value);
182
+ // return {
183
+ // hash,
184
+ // algorithm: this.config.primary,
185
+ // usedFallback: false
186
+ // };
187
+ // } catch (err: any) {
188
+ // logger.warn("⚠ Primary hashing failed", {
189
+ // error: err.message,
190
+ // algorithm: this.config.primary
191
+ // });
192
+ // if (!options?.allowFallback || !this.fallbackAdapter) {
193
+ // throw new AdapterError(
194
+ // `Primary hashing (${this.config.primary}) failed. Fallback not allowed.`
195
+ // );
196
+ // }
197
+ // try {
198
+ // const hash = await this.fallbackAdapter.hash(value);
199
+ // // Log security downgrade warning
200
+ // logger.warn("⚠ SECURITY DOWNGRADE: Using fallback hashing", {
201
+ // from: this.config.primary,
202
+ // to: this.config.fallback
203
+ // });
204
+ // return {
205
+ // hash,
206
+ // algorithm: this.config.fallback || 'bcrypt',
207
+ // usedFallback: true
208
+ // };
209
+ // } catch (fallbackErr: any) {
210
+ // logger.error("❌ Fallback hashing failed", {
211
+ // error: fallbackErr?.message,
212
+ // });
213
+ // throw new AdapterError(
214
+ // "Both primary and fallback hashing failed."
215
+ // );
216
+ // }
217
+ // }
218
+ // }
219
+ // async verify(value: string, hashed: string): Promise<boolean> {
220
+ // // Try primary adapter first
221
+ // try {
222
+ // return await this.primaryAdapter.verify(value, hashed);
223
+ // } catch (primaryErr: any) {
224
+ // logger.warn("⚠ Primary verify failed", {
225
+ // error: primaryErr?.message,
226
+ // });
227
+ // // If fallback exists, try it
228
+ // if (this.fallbackAdapter) {
229
+ // try {
230
+ // return await this.fallbackAdapter.verify(value, hashed);
231
+ // } catch (fallbackErr: any) {
232
+ // logger.error("❌ Fallback verify failed", {
233
+ // error: fallbackErr?.message,
234
+ // });
235
+ // throw new AdapterError(
236
+ // "Both primary and fallback verify failed."
237
+ // );
238
+ // }
239
+ // }
240
+ // throw new AdapterError(
241
+ // "Primary verify failed and no fallback adapter configured."
242
+ // );
243
+ // }
244
+ // }
245
+ // }
246
+ // src/managers/HashManager.ts - COMPLETE FIXED
247
+ const AdapterError_js_1 = require("../core/errors/AdapterError.js");
248
+ const logging_1 = require("../logging");
249
+ class HashManager {
250
+ constructor(config, primaryAdapter, fallbackAdapter) {
251
+ this.config = config;
252
+ this.primaryAdapter = primaryAdapter;
253
+ this.fallbackAdapter = fallbackAdapter;
254
+ }
255
+ async hash(value, options) {
256
+ try {
257
+ const hash = await this.primaryAdapter.hash(value);
258
+ return {
259
+ hash,
260
+ algorithm: this.config.primary,
261
+ usedFallback: false
262
+ };
263
+ }
264
+ catch (err) {
265
+ logging_1.logger.warn("⚠ Primary hashing failed", {
266
+ error: err.message,
267
+ algorithm: this.config.primary
268
+ });
269
+ if (!options?.allowFallback || !this.fallbackAdapter) {
270
+ throw new AdapterError_js_1.AdapterError(`Primary hashing (${this.config.primary}) failed. Fallback not allowed.`);
271
+ }
272
+ try {
273
+ const hash = await this.fallbackAdapter.hash(value);
274
+ // Log security downgrade warning
275
+ logging_1.logger.warn("⚠ SECURITY DOWNGRADE: Using fallback hashing", {
276
+ from: this.config.primary,
277
+ to: this.config.fallback
278
+ });
279
+ return {
280
+ hash,
281
+ algorithm: this.config.fallback || 'bcrypt',
282
+ usedFallback: true
283
+ };
284
+ }
285
+ catch (fallbackErr) {
286
+ logging_1.logger.error("❌ Fallback hashing failed", {
287
+ error: fallbackErr?.message,
288
+ });
289
+ throw new AdapterError_js_1.AdapterError("Both primary and fallback hashing failed.");
290
+ }
291
+ }
292
+ }
293
+ async verify(value, hashed) {
294
+ // Try primary adapter first
295
+ try {
296
+ return await this.primaryAdapter.verify(value, hashed);
297
+ }
298
+ catch (primaryErr) {
299
+ logging_1.logger.warn("⚠ Primary verify failed", {
300
+ error: primaryErr?.message,
301
+ });
302
+ // If fallback exists, try it
303
+ if (this.fallbackAdapter) {
304
+ try {
305
+ return await this.fallbackAdapter.verify(value, hashed);
306
+ }
307
+ catch (fallbackErr) {
308
+ logging_1.logger.error("❌ Fallback verify failed", {
309
+ error: fallbackErr?.message,
310
+ });
311
+ throw new AdapterError_js_1.AdapterError("Both primary and fallback verify failed.");
312
+ }
313
+ }
314
+ throw new AdapterError_js_1.AdapterError("Primary verify failed and no fallback adapter configured.");
315
+ }
316
+ }
317
+ }
318
+ exports.HashManager = HashManager;
319
+ //# sourceMappingURL=HashManager.js.map