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.
- package/dist/adapters/ArgonAdapter.d.ts +8 -0
- package/dist/adapters/ArgonAdapter.d.ts.map +1 -0
- package/dist/adapters/ArgonAdapter.js +45 -0
- package/dist/adapters/ArgonAdapter.js.map +1 -0
- package/dist/adapters/BcryptAdapter.d.ts +7 -0
- package/dist/adapters/BcryptAdapter.d.ts.map +1 -0
- package/dist/adapters/BcryptAdapter.js +48 -0
- package/dist/adapters/BcryptAdapter.js.map +1 -0
- package/dist/adapters/DomPurifyAdapter.d.ts +13 -0
- package/dist/adapters/DomPurifyAdapter.d.ts.map +1 -0
- package/dist/adapters/DomPurifyAdapter.js +61 -0
- package/dist/adapters/DomPurifyAdapter.js.map +1 -0
- package/dist/adapters/ExpressRLAdapter.d.ts +13 -0
- package/dist/adapters/ExpressRLAdapter.d.ts.map +1 -0
- package/dist/adapters/ExpressRLAdapter.js +68 -0
- package/dist/adapters/ExpressRLAdapter.js.map +1 -0
- package/dist/adapters/ExpressValidatorAdapter.d.ts +6 -0
- package/dist/adapters/ExpressValidatorAdapter.d.ts.map +1 -0
- package/dist/adapters/ExpressValidatorAdapter.js +78 -0
- package/dist/adapters/ExpressValidatorAdapter.js.map +1 -0
- package/dist/adapters/GoggleAdapter.d.ts +15 -0
- package/dist/adapters/GoggleAdapter.d.ts.map +1 -0
- package/dist/adapters/GoggleAdapter.js +91 -0
- package/dist/adapters/GoggleAdapter.js.map +1 -0
- package/dist/adapters/GoogleAdapter.d.ts +15 -0
- package/dist/adapters/GoogleAdapter.d.ts.map +1 -0
- package/dist/adapters/GoogleAdapter.js +159 -0
- package/dist/adapters/GoogleAdapter.js.map +1 -0
- package/dist/adapters/JWTAdapter.d.ts +28 -0
- package/dist/adapters/JWTAdapter.d.ts.map +1 -0
- package/dist/adapters/JWTAdapter.js +276 -0
- package/dist/adapters/JWTAdapter.js.map +1 -0
- package/dist/adapters/RLFlexibleAdapter.d.ts +11 -0
- package/dist/adapters/RLFlexibleAdapter.d.ts.map +1 -0
- package/dist/adapters/RLFlexibleAdapter.js +115 -0
- package/dist/adapters/RLFlexibleAdapter.js.map +1 -0
- package/dist/adapters/SanitizeHtmlAdapter.d.ts +12 -0
- package/dist/adapters/SanitizeHtmlAdapter.d.ts.map +1 -0
- package/dist/adapters/SanitizeHtmlAdapter.js +141 -0
- package/dist/adapters/SanitizeHtmlAdapter.js.map +1 -0
- package/dist/adapters/XSSAdapter.d.ts +33 -0
- package/dist/adapters/XSSAdapter.d.ts.map +1 -0
- package/dist/adapters/XSSAdapter.js +127 -0
- package/dist/adapters/XSSAdapter.js.map +1 -0
- package/dist/adapters/ZodAdapter.d.ts +7 -0
- package/dist/adapters/ZodAdapter.d.ts.map +1 -0
- package/dist/adapters/ZodAdapter.js +39 -0
- package/dist/adapters/ZodAdapter.js.map +1 -0
- package/dist/core/HiSecure.d.ts +62 -0
- package/dist/core/HiSecure.d.ts.map +1 -0
- package/dist/core/HiSecure.js +273 -0
- package/dist/core/HiSecure.js.map +1 -0
- package/dist/core/config.d.ts +3 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +53 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.d.ts +37 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +67 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/errors/AdapterError.d.ts +5 -0
- package/dist/core/errors/AdapterError.d.ts.map +1 -0
- package/dist/core/errors/AdapterError.js +15 -0
- package/dist/core/errors/AdapterError.js.map +1 -0
- package/dist/core/errors/HttpErrror.d.ts +17 -0
- package/dist/core/errors/HttpErrror.d.ts.map +1 -0
- package/dist/core/errors/HttpErrror.js +36 -0
- package/dist/core/errors/HttpErrror.js.map +1 -0
- package/dist/core/errors/SanitizerError.d.ts +5 -0
- package/dist/core/errors/SanitizerError.d.ts.map +1 -0
- package/dist/core/errors/SanitizerError.js +14 -0
- package/dist/core/errors/SanitizerError.js.map +1 -0
- package/dist/core/errors/SecurityError.d.ts +5 -0
- package/dist/core/errors/SecurityError.d.ts.map +1 -0
- package/dist/core/errors/SecurityError.js +14 -0
- package/dist/core/errors/SecurityError.js.map +1 -0
- package/dist/core/errors/ValidationError.d.ts +5 -0
- package/dist/core/errors/ValidationError.d.ts.map +1 -0
- package/dist/core/errors/ValidationError.js +14 -0
- package/dist/core/errors/ValidationError.js.map +1 -0
- package/dist/core/types/HiSecureConfig.d.ts +47 -0
- package/dist/core/types/HiSecureConfig.d.ts.map +1 -0
- package/dist/core/types/HiSecureConfig.js +3 -0
- package/dist/core/types/HiSecureConfig.js.map +1 -0
- package/dist/core/types/SecureOptions.d.ts +30 -0
- package/dist/core/types/SecureOptions.d.ts.map +1 -0
- package/dist/core/types/SecureOptions.js +4 -0
- package/dist/core/types/SecureOptions.js.map +1 -0
- package/dist/core/useSecure.d.ts +10 -0
- package/dist/core/useSecure.d.ts.map +1 -0
- package/dist/core/useSecure.js +85 -0
- package/dist/core/useSecure.js.map +1 -0
- package/dist/examples/e1.d.ts +1 -0
- package/dist/examples/e1.d.ts.map +1 -0
- package/dist/examples/e1.js +3 -0
- package/dist/examples/e1.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/index.d.ts +3 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +19 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/morganSetup.d.ts +2 -0
- package/dist/logging/morganSetup.d.ts.map +1 -0
- package/dist/logging/morganSetup.js +9 -0
- package/dist/logging/morganSetup.js.map +1 -0
- package/dist/logging/winstonSetup.d.ts +6 -0
- package/dist/logging/winstonSetup.d.ts.map +1 -0
- package/dist/logging/winstonSetup.js +22 -0
- package/dist/logging/winstonSetup.js.map +1 -0
- package/dist/managers/AuthManager.d.ts +23 -0
- package/dist/managers/AuthManager.d.ts.map +1 -0
- package/dist/managers/AuthManager.js +190 -0
- package/dist/managers/AuthManager.js.map +1 -0
- package/dist/managers/CorsManager.d.ts +9 -0
- package/dist/managers/CorsManager.d.ts.map +1 -0
- package/dist/managers/CorsManager.js +55 -0
- package/dist/managers/CorsManager.js.map +1 -0
- package/dist/managers/HashManager.d.ts +22 -0
- package/dist/managers/HashManager.d.ts.map +1 -0
- package/dist/managers/HashManager.js +319 -0
- package/dist/managers/HashManager.js.map +1 -0
- package/dist/managers/JsonManager.d.ts +6 -0
- package/dist/managers/JsonManager.d.ts.map +1 -0
- package/dist/managers/JsonManager.js +142 -0
- package/dist/managers/JsonManager.js.map +1 -0
- package/dist/managers/RateLimitManager.d.ts +16 -0
- package/dist/managers/RateLimitManager.d.ts.map +1 -0
- package/dist/managers/RateLimitManager.js +108 -0
- package/dist/managers/RateLimitManager.js.map +1 -0
- package/dist/managers/SanitizerManager.d.ts +18 -0
- package/dist/managers/SanitizerManager.d.ts.map +1 -0
- package/dist/managers/SanitizerManager.js +296 -0
- package/dist/managers/SanitizerManager.js.map +1 -0
- package/dist/managers/ValidatorManager.d.ts +13 -0
- package/dist/managers/ValidatorManager.d.ts.map +1 -0
- package/dist/managers/ValidatorManager.js +218 -0
- package/dist/managers/ValidatorManager.js.map +1 -0
- package/dist/middlewares/errorHandler.d.ts +3 -0
- package/dist/middlewares/errorHandler.d.ts.map +1 -0
- package/dist/middlewares/errorHandler.js +94 -0
- package/dist/middlewares/errorHandler.js.map +1 -0
- package/dist/middlewares/index.d.ts +3 -0
- package/dist/middlewares/index.d.ts.map +1 -0
- package/dist/middlewares/index.js +19 -0
- package/dist/middlewares/index.js.map +1 -0
- package/dist/middlewares/requestLogger.d.ts +2 -0
- package/dist/middlewares/requestLogger.d.ts.map +1 -0
- package/dist/middlewares/requestLogger.js +8 -0
- package/dist/middlewares/requestLogger.js.map +1 -0
- package/dist/test/t1.d.ts +1 -0
- package/dist/test/t1.d.ts.map +1 -0
- package/dist/test/t1.js +3 -0
- package/dist/test/t1.js.map +1 -0
- package/dist/utils/deepFreeze.d.ts +2 -0
- package/dist/utils/deepFreeze.d.ts.map +1 -0
- package/dist/utils/deepFreeze.js +69 -0
- package/dist/utils/deepFreeze.js.map +1 -0
- package/dist/utils/deepMerge.d.ts +5 -0
- package/dist/utils/deepMerge.d.ts.map +1 -0
- package/dist/utils/deepMerge.js +68 -0
- package/dist/utils/deepMerge.js.map +1 -0
- package/dist/utils/normalizeOptions.d.ts +38 -0
- package/dist/utils/normalizeOptions.d.ts.map +1 -0
- package/dist/utils/normalizeOptions.js +119 -0
- package/dist/utils/normalizeOptions.js.map +1 -0
- package/package.json +50 -0
- package/src/adapters/ArgonAdapter.ts +41 -0
- package/src/adapters/BcryptAdapter.ts +49 -0
- package/src/adapters/ExpressRLAdapter.ts +84 -0
- package/src/adapters/ExpressValidatorAdapter.ts +99 -0
- package/src/adapters/GoogleAdapter.ts +206 -0
- package/src/adapters/JWTAdapter.ts +346 -0
- package/src/adapters/RLFlexibleAdapter.ts +139 -0
- package/src/adapters/SanitizeHtmlAdapter.ts +162 -0
- package/src/adapters/XSSAdapter.ts +153 -0
- package/src/adapters/ZodAdapter.ts +91 -0
- package/src/core/HiSecure.ts +955 -0
- package/src/core/config.ts +156 -0
- package/src/core/constants.ts +73 -0
- package/src/core/errors/AdapterError.ts +14 -0
- package/src/core/errors/HttpErrror.ts +46 -0
- package/src/core/errors/SanitizerError.ts +13 -0
- package/src/core/errors/SecurityError.ts +13 -0
- package/src/core/errors/ValidationError.ts +13 -0
- package/src/core/types/HiSecureConfig.ts +62 -0
- package/src/core/types/SecureOptions.ts +61 -0
- package/src/core/useSecure.ts +111 -0
- package/src/examples/e1.ts +1 -0
- package/src/index.ts +17 -0
- package/src/logging/index.ts +2 -0
- package/src/logging/morganSetup.ts +3 -0
- package/src/logging/winstonSetup.ts +17 -0
- package/src/managers/AuthManager.ts +237 -0
- package/src/managers/CorsManager.ts +58 -0
- package/src/managers/HashManager.ts +390 -0
- package/src/managers/JsonManager.ts +149 -0
- package/src/managers/RateLimitManager.ts +368 -0
- package/src/managers/SanitizerManager.ts +359 -0
- package/src/managers/ValidatorManager.ts +269 -0
- package/src/middlewares/errorHandler.ts +265 -0
- package/src/middlewares/index.ts +2 -0
- package/src/middlewares/requestLogger.ts +5 -0
- package/src/test/t1.ts +1 -0
- package/src/utils/deepFreeze.ts +76 -0
- package/src/utils/deepMerge.ts +87 -0
- package/src/utils/normalizeOptions.ts +265 -0
- 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
|