hi-secure 1.0.2 → 1.0.3
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/ExpressRLAdapter.d.ts.map +1 -1
- package/dist/adapters/ExpressRLAdapter.js +0 -29
- package/dist/adapters/ExpressRLAdapter.js.map +1 -1
- package/dist/adapters/GoogleAdapter.d.ts.map +1 -1
- package/dist/adapters/GoogleAdapter.js +4 -3
- package/dist/adapters/GoogleAdapter.js.map +1 -1
- package/dist/adapters/JWTAdapter.d.ts.map +1 -1
- package/dist/adapters/JWTAdapter.js +3 -1
- package/dist/adapters/JWTAdapter.js.map +1 -1
- package/dist/core/HiSecure.d.ts +3 -18
- package/dist/core/HiSecure.d.ts.map +1 -1
- package/dist/core/HiSecure.js +29 -132
- package/dist/core/HiSecure.js.map +1 -1
- package/dist/core/errors/HttpError.d.ts +17 -0
- package/dist/core/errors/HttpError.d.ts.map +1 -0
- package/dist/core/errors/HttpError.js +36 -0
- package/dist/core/errors/HttpError.js.map +1 -0
- package/dist/core/useSecure.d.ts +0 -7
- package/dist/core/useSecure.d.ts.map +1 -1
- package/dist/core/useSecure.js +65 -21
- package/dist/core/useSecure.js.map +1 -1
- package/dist/index.d.ts +3 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -9
- package/dist/index.js.map +1 -1
- package/dist/managers/AuthManager.d.ts.map +1 -1
- package/dist/managers/AuthManager.js +18 -17
- package/dist/managers/AuthManager.js.map +1 -1
- package/dist/managers/ValidatorManager.d.ts +4 -6
- package/dist/managers/ValidatorManager.d.ts.map +1 -1
- package/dist/managers/ValidatorManager.js +97 -144
- package/dist/managers/ValidatorManager.js.map +1 -1
- package/dist/middlewares/errorHandler.js +2 -2
- package/dist/middlewares/errorHandler.js.map +1 -1
- package/dist/utils/normalizeOptions.d.ts.map +1 -1
- package/dist/utils/normalizeOptions.js +14 -4
- package/dist/utils/normalizeOptions.js.map +1 -1
- package/package.json +1 -1
- package/readme.md +38 -73
- package/src/adapters/GoogleAdapter.ts +5 -3
- package/src/adapters/JWTAdapter.ts +3 -1
- package/src/core/HiSecure.ts +414 -175
- package/src/core/useSecure.ts +91 -36
- package/src/index.ts +28 -12
- package/src/managers/AuthManager.ts +15 -13
- package/src/managers/ValidatorManager.ts +120 -182
- package/src/middlewares/errorHandler.ts +1 -1
- package/src/utils/normalizeOptions.ts +24 -9
- /package/src/core/errors/{HttpErrror.ts → HttpError.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../../src/managers/AuthManager.ts"],"names":[],"mappings":"AA4GA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../../src/managers/AuthManager.ts"],"names":[],"mappings":"AA4GA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAK1D,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAC,CAAgB;gBAE1B,IAAI,EAAE,WAAW;IAsB7B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE;IAK7E,MAAM,CAAC,KAAK,EAAE,MAAM;IAKd,mBAAmB,CAAC,OAAO,EAAE,MAAM;IAezC,OAAO,CAAC,OAAO,CAAC,EAAE,cAAc,IAIpB,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY;CA2D9D"}
|
|
@@ -88,7 +88,8 @@ exports.AuthManager = void 0;
|
|
|
88
88
|
const JWTAdapter_js_1 = require("../adapters/JWTAdapter.js");
|
|
89
89
|
const GoogleAdapter_js_1 = require("../adapters/GoogleAdapter.js");
|
|
90
90
|
const AdapterError_js_1 = require("../core/errors/AdapterError.js");
|
|
91
|
-
const
|
|
91
|
+
const HttpError_js_1 = require("../core/errors/HttpError.js");
|
|
92
|
+
// import { logError, logWarn, logInfo } from "../logging";
|
|
92
93
|
const logging_1 = require("../logging");
|
|
93
94
|
class AuthManager {
|
|
94
95
|
constructor(opts) {
|
|
@@ -96,37 +97,37 @@ class AuthManager {
|
|
|
96
97
|
throw new AdapterError_js_1.AdapterError("jwtSecret required in AuthOptions");
|
|
97
98
|
}
|
|
98
99
|
if (opts.jwtSecret.length < 32) {
|
|
99
|
-
|
|
100
|
+
logging_1.logger.warn("⚠ JWT secret is less than 32 characters - consider using a stronger secret");
|
|
100
101
|
}
|
|
101
|
-
|
|
102
|
+
logging_1.logger.info("AuthManager initialized");
|
|
102
103
|
this.jwtAdapter = new JWTAdapter_js_1.JWTAdapter({
|
|
103
104
|
secret: opts.jwtSecret,
|
|
104
105
|
expiresIn: opts.jwtExpiresIn ?? "1d",
|
|
105
106
|
});
|
|
106
107
|
if (opts.googleClientId) {
|
|
107
108
|
this.googleAdapter = new GoogleAdapter_js_1.GoogleAdapter(opts.googleClientId);
|
|
108
|
-
|
|
109
|
+
logging_1.logger.info("GoogleAdapter enabled");
|
|
109
110
|
}
|
|
110
111
|
}
|
|
111
112
|
sign(payload, options) {
|
|
112
|
-
|
|
113
|
+
logging_1.logger.info("JWT Sign called");
|
|
113
114
|
return this.jwtAdapter.sign(payload, options);
|
|
114
115
|
}
|
|
115
116
|
verify(token) {
|
|
116
|
-
|
|
117
|
+
logging_1.logger.info("JWT Verify called");
|
|
117
118
|
return this.jwtAdapter.verify(token);
|
|
118
119
|
}
|
|
119
120
|
async verifyGoogleIdToken(idToken) {
|
|
120
121
|
if (!this.googleAdapter) {
|
|
121
122
|
throw new AdapterError_js_1.AdapterError("GoogleAdapter not configured.");
|
|
122
123
|
}
|
|
123
|
-
|
|
124
|
+
logging_1.logger.info("Google ID Token verify called");
|
|
124
125
|
try {
|
|
125
126
|
return await this.googleAdapter.verifyIdToken(idToken);
|
|
126
127
|
}
|
|
127
128
|
catch (err) {
|
|
128
|
-
|
|
129
|
-
throw
|
|
129
|
+
logging_1.logger.error("Google ID Token verification failed", { error: err?.message });
|
|
130
|
+
throw HttpError_js_1.HttpError.Unauthorized("Invalid Google ID token");
|
|
130
131
|
}
|
|
131
132
|
}
|
|
132
133
|
protect(options) {
|
|
@@ -140,20 +141,20 @@ class AuthManager {
|
|
|
140
141
|
}
|
|
141
142
|
// If auth is required but no header
|
|
142
143
|
if (!header) {
|
|
143
|
-
|
|
144
|
+
logging_1.logger.warn("Missing Authorization header", {
|
|
144
145
|
path: req.path,
|
|
145
146
|
method: req.method
|
|
146
147
|
});
|
|
147
|
-
return next(
|
|
148
|
+
return next(HttpError_js_1.HttpError.Unauthorized("Missing Authorization header"));
|
|
148
149
|
}
|
|
149
150
|
// Parse Bearer token
|
|
150
151
|
const [type, token] = String(header).split(" ");
|
|
151
152
|
if (type !== "Bearer" || !token) {
|
|
152
|
-
|
|
153
|
+
logging_1.logger.warn("Invalid Authorization header", {
|
|
153
154
|
path: req.path,
|
|
154
155
|
method: req.method
|
|
155
156
|
});
|
|
156
|
-
return next(
|
|
157
|
+
return next(HttpError_js_1.HttpError.Unauthorized("Invalid Authorization header"));
|
|
157
158
|
}
|
|
158
159
|
try {
|
|
159
160
|
// Verify JWT
|
|
@@ -165,23 +166,23 @@ class AuthManager {
|
|
|
165
166
|
if (roles && roles.length > 0) {
|
|
166
167
|
const userRole = decoded.role || decoded.roles?.[0];
|
|
167
168
|
if (!userRole || !roles.includes(userRole)) {
|
|
168
|
-
|
|
169
|
+
logging_1.logger.warn("Insufficient permissions", {
|
|
169
170
|
path: req.path,
|
|
170
171
|
requiredRoles: roles,
|
|
171
172
|
userRole
|
|
172
173
|
});
|
|
173
|
-
return next(
|
|
174
|
+
return next(HttpError_js_1.HttpError.Forbidden("Insufficient permissions"));
|
|
174
175
|
}
|
|
175
176
|
}
|
|
176
177
|
return next();
|
|
177
178
|
}
|
|
178
179
|
catch (err) {
|
|
179
|
-
|
|
180
|
+
logging_1.logger.error("JWT verify failed", {
|
|
180
181
|
error: err?.message,
|
|
181
182
|
path: req.path,
|
|
182
183
|
method: req.method
|
|
183
184
|
});
|
|
184
|
-
return next(
|
|
185
|
+
return next(HttpError_js_1.HttpError.Unauthorized("Invalid or expired token"));
|
|
185
186
|
}
|
|
186
187
|
};
|
|
187
188
|
}
|
|
@@ -1 +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}"]}
|
|
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/HttpError.js\";\r\nimport { Request, Response, NextFunction } from \"express\";\r\n// import { logError, logWarn, logInfo } from \"../logging\";\r\nimport { logger } from \"../logging\";\r\n\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 logger.warn(\"⚠ JWT secret is less than 32 characters - consider using a stronger secret\");\r\n }\r\n\r\n logger.info(\"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 logger.info(\"GoogleAdapter enabled\");\r\n }\r\n }\r\n\r\n sign(payload: object, options?: { expiresIn?: string | number, jti?: string }) {\r\n logger.info(\"JWT Sign called\");\r\n return this.jwtAdapter.sign(payload, options);\r\n }\r\n\r\n verify(token: string) {\r\n logger.info(\"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 logger.info(\"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 logger.error(\"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 logger.warn(\"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 logger.warn(\"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 logger.warn(\"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 logger.error(\"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}"]}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import { HiSecureConfig } from "../core/types/HiSecureConfig.js";
|
|
2
1
|
interface ValidatorAdapter {
|
|
3
2
|
validate: (schema?: any) => any;
|
|
4
3
|
}
|
|
5
4
|
export declare class ValidatorManager {
|
|
6
|
-
private
|
|
7
|
-
private
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
validate(schema?: any): (req: any, res: any, next: any) => void;
|
|
5
|
+
private zodAdapter;
|
|
6
|
+
private expressAdapter;
|
|
7
|
+
constructor(zodAdapter: ValidatorAdapter, expressAdapter: ValidatorAdapter);
|
|
8
|
+
validate(schema?: any): (req: any, res: any, next: any) => any;
|
|
11
9
|
}
|
|
12
10
|
export {};
|
|
13
11
|
//# sourceMappingURL=ValidatorManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValidatorManager.d.ts","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ValidatorManager.d.ts","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":"AAwIA,UAAU,gBAAgB;IACtB,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,GAAG,CAAC;CACnC;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,cAAc,CAAmB;gBAE7B,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,gBAAgB;IAK1E,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,IAUT,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;CA8C5C"}
|
|
@@ -1,110 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// //
|
|
3
|
-
// // // import { logger } from "../logging";
|
|
4
|
-
// // // import { ValidationError } from "../core/errors/ValidationError";
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.ValidatorManager = void 0;
|
|
7
|
-
// // // export class ValidatorManager {
|
|
8
|
-
// // // private config: HiSecureConfig["validation"];
|
|
9
|
-
// // // private primaryAdapter: any;
|
|
10
|
-
// // // private fallbackAdapter: any;
|
|
11
|
-
// // // constructor(
|
|
12
|
-
// // // config: HiSecureConfig["validation"],
|
|
13
|
-
// // // primaryAdapter: any,
|
|
14
|
-
// // // fallbackAdapter: any
|
|
15
|
-
// // // ) {
|
|
16
|
-
// // // this.config = config;
|
|
17
|
-
// // // this.primaryAdapter = primaryAdapter;
|
|
18
|
-
// // // this.fallbackAdapter = fallbackAdapter;
|
|
19
|
-
// // // }
|
|
20
|
-
// // // /**
|
|
21
|
-
// // // * Validate request body using primary adapter (Zod/express-validator).
|
|
22
|
-
// // // * Fallback is only used if the adapter implementation itself throws.
|
|
23
|
-
// // // */
|
|
24
|
-
// // // validate(schema: any) {
|
|
25
|
-
// // // return (req: any, res: any, next: any) => {
|
|
26
|
-
// // // try {
|
|
27
|
-
// // // const middleware = this.primaryAdapter.validate(schema);
|
|
28
|
-
// // // return middleware(req, res, next);
|
|
29
|
-
// // // } catch (err: any) {
|
|
30
|
-
// // // logger.warn("⚠ Primary validator failed", {
|
|
31
|
-
// // // error: err?.message,
|
|
32
|
-
// // // path: req.path,
|
|
33
|
-
// // // method: req.method
|
|
34
|
-
// // // });
|
|
35
|
-
// // // if (!this.fallbackAdapter) {
|
|
36
|
-
// // // return next(new ValidationError("Validation failed."));
|
|
37
|
-
// // // }
|
|
38
|
-
// // // try {
|
|
39
|
-
// // // logger.info("📌 Using fallback validator");
|
|
40
|
-
// // // const fallbackMiddleware = this.fallbackAdapter.validate(schema);
|
|
41
|
-
// // // return fallbackMiddleware(req, res, next);
|
|
42
|
-
// // // } catch (fallbackErr: any) {
|
|
43
|
-
// // // logger.error("❌ Fallback validation also failed", {
|
|
44
|
-
// // // error: fallbackErr?.message
|
|
45
|
-
// // // });
|
|
46
|
-
// // // return next(new ValidationError("Both validators failed."));
|
|
47
|
-
// // // }
|
|
48
|
-
// // // }
|
|
49
|
-
// // // };
|
|
50
|
-
// // // }
|
|
51
|
-
// // // }
|
|
52
|
-
// // import { HiSecureConfig } from "../core/config.js";
|
|
53
|
-
// // import { logger } from "../logging";
|
|
54
|
-
// // import { ValidationError } from "../core/errors/ValidationError.js";
|
|
55
|
-
// // interface ValidatorAdapter {
|
|
56
|
-
// // validate: (schema?: any) => any;
|
|
57
|
-
// // }
|
|
58
|
-
// // export class ValidatorManager {
|
|
59
|
-
// // private config: HiSecureConfig["validation"];
|
|
60
|
-
// // private primaryAdapter: ValidatorAdapter;
|
|
61
|
-
// // private fallbackAdapter: ValidatorAdapter | null;
|
|
62
|
-
// // constructor(
|
|
63
|
-
// // config: HiSecureConfig["validation"],
|
|
64
|
-
// // primaryAdapter: ValidatorAdapter,
|
|
65
|
-
// // fallbackAdapter: ValidatorAdapter | null
|
|
66
|
-
// // ) {
|
|
67
|
-
// // this.config = config;
|
|
68
|
-
// // this.primaryAdapter = primaryAdapter;
|
|
69
|
-
// // this.fallbackAdapter = fallbackAdapter;
|
|
70
|
-
// // }
|
|
71
|
-
// // /**
|
|
72
|
-
// // * MAIN DYNAMIC VALIDATOR ENTRY
|
|
73
|
-
// // * schema = per-route schema
|
|
74
|
-
// // * If schema is undefined → use global schema
|
|
75
|
-
// // */
|
|
76
|
-
// // validate(schema?: any) {
|
|
77
|
-
// // return (req: any, res: any, next: any) => {
|
|
78
|
-
// // try {
|
|
79
|
-
// // const middleware = this.primaryAdapter.validate(schema);
|
|
80
|
-
// // return middleware(req, res, next);
|
|
81
|
-
// // } catch (err: any) {
|
|
82
|
-
// // logger.warn("⚠ Primary validator failed", {
|
|
83
|
-
// // error: err?.message,
|
|
84
|
-
// // path: req.path,
|
|
85
|
-
// // method: req.method
|
|
86
|
-
// // });
|
|
87
|
-
// // if (!this.fallbackAdapter) {
|
|
88
|
-
// // return next(new ValidationError("Validation failed"));
|
|
89
|
-
// // }
|
|
90
|
-
// // try {
|
|
91
|
-
// // logger.info("📌 Using fallback validator");
|
|
92
|
-
// // const fallbackMiddleware = this.fallbackAdapter.validate(schema);
|
|
93
|
-
// // return fallbackMiddleware(req, res, next);
|
|
94
|
-
// // } catch (fallbackErr: any) {
|
|
95
|
-
// // logger.error("❌ Fallback validator also failed", {
|
|
96
|
-
// // error: fallbackErr?.message
|
|
97
|
-
// // });
|
|
98
|
-
// // return next(new ValidationError("Both validators failed"));
|
|
99
|
-
// // }
|
|
100
|
-
// // }
|
|
101
|
-
// // };
|
|
102
|
-
// // }
|
|
103
|
-
// // }
|
|
104
|
-
// // src/managers/ValidatorManager.ts - FIXED
|
|
2
|
+
// // src/managers/ValidatorManager.ts - COMPLETE FIXED
|
|
105
3
|
// import { logger } from "../logging";
|
|
106
4
|
// import { ValidationError } from "../core/errors/ValidationError.js";
|
|
107
|
-
// import { HiSecureConfig } from "../core/types/HiSecureConfig";
|
|
5
|
+
// import { HiSecureConfig } from "../core/types/HiSecureConfig.js"; // ✅ FIXED IMPORT
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ValidatorManager = void 0;
|
|
108
8
|
// interface ValidatorAdapter {
|
|
109
9
|
// validate: (schema?: any) => any;
|
|
110
10
|
// }
|
|
@@ -163,54 +63,107 @@ exports.ValidatorManager = void 0;
|
|
|
163
63
|
// };
|
|
164
64
|
// }
|
|
165
65
|
// }
|
|
166
|
-
// src/managers/ValidatorManager.ts
|
|
66
|
+
// // src/managers/ValidatorManager.ts
|
|
67
|
+
// import { logger } from "../logging";
|
|
68
|
+
// import { ValidationError } from "../core/errors/ValidationError.js";
|
|
69
|
+
// interface ValidatorAdapter {
|
|
70
|
+
// validate: (schema?: any) => any;
|
|
71
|
+
// }
|
|
72
|
+
// export class ValidatorManager {
|
|
73
|
+
// private primaryAdapter: ValidatorAdapter;
|
|
74
|
+
// private fallbackAdapter: ValidatorAdapter | null;
|
|
75
|
+
// constructor(primaryAdapter: ValidatorAdapter, fallbackAdapter: ValidatorAdapter | null) {
|
|
76
|
+
// this.primaryAdapter = primaryAdapter;
|
|
77
|
+
// this.fallbackAdapter = fallbackAdapter;
|
|
78
|
+
// }
|
|
79
|
+
// validate(schema?: any) {
|
|
80
|
+
// return (req: any, res: any, next: any) => {
|
|
81
|
+
// const isZod = schema && typeof schema === "object" && typeof schema.safeParse === "function";
|
|
82
|
+
// const isExpressValidator = Array.isArray(schema);
|
|
83
|
+
// let adapter: ValidatorAdapter;
|
|
84
|
+
// if (isZod) {
|
|
85
|
+
// adapter = this.primaryAdapter; // ZodAdapter
|
|
86
|
+
// logger.debug("📌 Using Zod adapter for validation");
|
|
87
|
+
// }
|
|
88
|
+
// else if (isExpressValidator) {
|
|
89
|
+
// adapter = this.fallbackAdapter!; // ExpressValidatorAdapter
|
|
90
|
+
// logger.debug("📌 Using express-validator adapter for validation");
|
|
91
|
+
// }
|
|
92
|
+
// else {
|
|
93
|
+
// return next(); // nothing to validate
|
|
94
|
+
// }
|
|
95
|
+
// const middleware = adapter.validate(schema);
|
|
96
|
+
// // Execute validation chain
|
|
97
|
+
// middleware(req, res, (err?: any) => {
|
|
98
|
+
// if (err instanceof ValidationError) {
|
|
99
|
+
// return next(err);
|
|
100
|
+
// }
|
|
101
|
+
// if (err) {
|
|
102
|
+
// logger.error("❌ Validator internal error", { error: err.message });
|
|
103
|
+
// return next(new ValidationError("Validation failed internally."));
|
|
104
|
+
// }
|
|
105
|
+
// next();
|
|
106
|
+
// });
|
|
107
|
+
// };
|
|
108
|
+
// }
|
|
109
|
+
// }
|
|
110
|
+
// src/managers/ValidatorManager.ts
|
|
167
111
|
const logging_1 = require("../logging");
|
|
168
112
|
const ValidationError_js_1 = require("../core/errors/ValidationError.js");
|
|
169
113
|
class ValidatorManager {
|
|
170
|
-
constructor(
|
|
171
|
-
this.
|
|
172
|
-
this.
|
|
173
|
-
this.fallbackAdapter = fallbackAdapter;
|
|
114
|
+
constructor(zodAdapter, expressAdapter) {
|
|
115
|
+
this.zodAdapter = zodAdapter;
|
|
116
|
+
this.expressAdapter = expressAdapter;
|
|
174
117
|
}
|
|
175
118
|
validate(schema) {
|
|
119
|
+
// const isZod = schema && typeof schema.safeParse === "function";
|
|
120
|
+
const isZod = schema &&
|
|
121
|
+
typeof schema === "object" &&
|
|
122
|
+
typeof schema._def === "object" &&
|
|
123
|
+
typeof schema.safeParse === "function";
|
|
124
|
+
const isExpressValidator = Array.isArray(schema);
|
|
176
125
|
return (req, res, next) => {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
const fallbackMiddleware = this.fallbackAdapter.validate(schema);
|
|
204
|
-
fallbackMiddleware(req, res, (fallbackErr) => {
|
|
205
|
-
if (fallbackErr) {
|
|
206
|
-
logging_1.logger.error("❌ Fallback validator also failed", {
|
|
207
|
-
error: fallbackErr?.message
|
|
208
|
-
});
|
|
209
|
-
return next(new ValidationError_js_1.ValidationError("Validation system unavailable"));
|
|
126
|
+
let middleware;
|
|
127
|
+
if (isZod) {
|
|
128
|
+
logging_1.logger.debug("📌 Using Zod adapter");
|
|
129
|
+
middleware = this.zodAdapter.validate(schema);
|
|
130
|
+
}
|
|
131
|
+
else if (isExpressValidator) {
|
|
132
|
+
logging_1.logger.debug("📌 Using express-validator adapter");
|
|
133
|
+
middleware = this.expressAdapter.validate(schema);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
return next(); // no schema found
|
|
137
|
+
}
|
|
138
|
+
// CASE 1 — express-validator returns ARRAY
|
|
139
|
+
if (Array.isArray(middleware)) {
|
|
140
|
+
let idx = 0;
|
|
141
|
+
const run = (err) => {
|
|
142
|
+
if (err)
|
|
143
|
+
return next(err);
|
|
144
|
+
const fn = middleware[idx++];
|
|
145
|
+
if (!fn)
|
|
146
|
+
return next(); // done
|
|
147
|
+
try {
|
|
148
|
+
fn(req, res, run);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
next(new ValidationError_js_1.ValidationError(error.message));
|
|
210
152
|
}
|
|
211
|
-
|
|
153
|
+
};
|
|
154
|
+
return run();
|
|
155
|
+
}
|
|
156
|
+
// CASE 2 — Zod returns SINGLE MIDDLEWARE
|
|
157
|
+
try {
|
|
158
|
+
middleware(req, res, (err) => {
|
|
159
|
+
if (err)
|
|
160
|
+
return next(err);
|
|
161
|
+
next();
|
|
212
162
|
});
|
|
213
|
-
}
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
next(new ValidationError_js_1.ValidationError(err.message));
|
|
166
|
+
}
|
|
214
167
|
};
|
|
215
168
|
}
|
|
216
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValidatorManager.js","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":"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","sourcesContent":["// // // import { HiSecureConfig } from \"../core/config\";\r\n// // // import { logger } from \"../logging\";\r\n// // // import { ValidationError } from \"../core/errors/ValidationError\";\r\n\r\n// // // export class ValidatorManager {\r\n// // // private config: HiSecureConfig[\"validation\"];\r\n// // // private primaryAdapter: any;\r\n// // // private fallbackAdapter: any;\r\n\r\n// // // constructor(\r\n// // // config: HiSecureConfig[\"validation\"],\r\n// // // primaryAdapter: any,\r\n// // // fallbackAdapter: any\r\n// // // ) {\r\n// // // this.config = config;\r\n// // // this.primaryAdapter = primaryAdapter;\r\n// // // this.fallbackAdapter = fallbackAdapter;\r\n// // // }\r\n\r\n// // // /**\r\n// // // * Validate request body using primary adapter (Zod/express-validator).\r\n// // // * Fallback is only used if the adapter implementation itself throws.\r\n// // // */\r\n// // // validate(schema: any) {\r\n// // // return (req: any, res: any, next: any) => {\r\n// // // try {\r\n// // // const middleware = this.primaryAdapter.validate(schema);\r\n// // // return middleware(req, res, next);\r\n\r\n// // // } catch (err: any) {\r\n// // // logger.warn(\"⚠ Primary validator failed\", {\r\n// // // error: err?.message,\r\n// // // path: req.path,\r\n// // // method: req.method\r\n// // // });\r\n\r\n// // // if (!this.fallbackAdapter) {\r\n// // // return next(new ValidationError(\"Validation failed.\"));\r\n// // // }\r\n\r\n// // // try {\r\n// // // logger.info(\"📌 Using fallback validator\");\r\n// // // const fallbackMiddleware = this.fallbackAdapter.validate(schema);\r\n// // // return fallbackMiddleware(req, res, next);\r\n\r\n// // // } catch (fallbackErr: any) {\r\n// // // logger.error(\"❌ Fallback validation also failed\", {\r\n// // // error: fallbackErr?.message\r\n// // // });\r\n\r\n// // // return next(new ValidationError(\"Both validators failed.\"));\r\n// // // }\r\n// // // }\r\n// // // };\r\n// // // }\r\n// // // }\r\n\r\n\r\n\r\n// // import { HiSecureConfig } from \"../core/config.js\";\r\n// // import { logger } from \"../logging\";\r\n// // import { ValidationError } from \"../core/errors/ValidationError.js\";\r\n\r\n// // interface ValidatorAdapter {\r\n// // validate: (schema?: any) => any;\r\n// // }\r\n\r\n// // export class ValidatorManager {\r\n// // private config: HiSecureConfig[\"validation\"];\r\n// // private primaryAdapter: ValidatorAdapter;\r\n// // private fallbackAdapter: ValidatorAdapter | null;\r\n\r\n// // constructor(\r\n// // config: HiSecureConfig[\"validation\"],\r\n// // primaryAdapter: ValidatorAdapter,\r\n// // fallbackAdapter: ValidatorAdapter | null\r\n// // ) {\r\n// // this.config = config;\r\n// // this.primaryAdapter = primaryAdapter;\r\n// // this.fallbackAdapter = fallbackAdapter;\r\n// // }\r\n\r\n// // /**\r\n// // * MAIN DYNAMIC VALIDATOR ENTRY\r\n// // * schema = per-route schema\r\n// // * If schema is undefined → use global schema\r\n// // */\r\n// // validate(schema?: any) {\r\n// // return (req: any, res: any, next: any) => {\r\n// // try {\r\n// // const middleware = this.primaryAdapter.validate(schema);\r\n// // return middleware(req, res, next);\r\n\r\n// // } catch (err: any) {\r\n// // logger.warn(\"⚠ Primary validator failed\", {\r\n// // error: err?.message,\r\n// // path: req.path,\r\n// // method: req.method\r\n// // });\r\n\r\n// // if (!this.fallbackAdapter) {\r\n// // return next(new ValidationError(\"Validation failed\"));\r\n// // }\r\n\r\n// // try {\r\n// // logger.info(\"📌 Using fallback validator\");\r\n// // const fallbackMiddleware = this.fallbackAdapter.validate(schema);\r\n// // return fallbackMiddleware(req, res, next);\r\n\r\n// // } catch (fallbackErr: any) {\r\n// // logger.error(\"❌ Fallback validator also failed\", {\r\n// // error: fallbackErr?.message\r\n// // });\r\n\r\n// // return next(new ValidationError(\"Both validators failed\"));\r\n// // }\r\n// // }\r\n// // };\r\n// // }\r\n// // }\r\n\r\n\r\n\r\n\r\n\r\n// // src/managers/ValidatorManager.ts - FIXED\r\n// import { logger } from \"../logging\";\r\n// import { ValidationError } from \"../core/errors/ValidationError.js\";\r\n// import { HiSecureConfig } from \"../core/types/HiSecureConfig\";\r\n\r\n// interface ValidatorAdapter {\r\n// validate: (schema?: any) => any;\r\n// }\r\n\r\n// export class ValidatorManager {\r\n// private config: HiSecureConfig[\"validation\"];\r\n// private primaryAdapter: ValidatorAdapter;\r\n// private fallbackAdapter: ValidatorAdapter | null;\r\n\r\n// constructor(\r\n// config: HiSecureConfig[\"validation\"],\r\n// primaryAdapter: ValidatorAdapter,\r\n// fallbackAdapter: ValidatorAdapter | null\r\n// ) {\r\n// this.config = config;\r\n// this.primaryAdapter = primaryAdapter;\r\n// this.fallbackAdapter = fallbackAdapter;\r\n// }\r\n\r\n// validate(schema?: any) {\r\n// return (req: any, res: any, next: any) => {\r\n// // Execute primary adapter middleware\r\n// const primaryMiddleware = this.primaryAdapter.validate(schema);\r\n \r\n// // Run middleware and handle errors properly\r\n// primaryMiddleware(req, res, (err?: any) => {\r\n// if (!err) {\r\n// return next(); // Validation passed\r\n// }\r\n \r\n// // If error is a ValidationError, pass it through (don't fallback!)\r\n// if (err instanceof ValidationError) {\r\n// logger.warn(\"⚠ Validation failed\", {\r\n// path: req.path,\r\n// method: req.method,\r\n// error: err.message\r\n// });\r\n// return next(err);\r\n// }\r\n \r\n// // Only use fallback for ADAPTER errors, not validation errors\r\n// logger.warn(\"⚠ Primary validator adapter failed\", {\r\n// error: err?.message,\r\n// path: req.path,\r\n// method: req.method\r\n// });\r\n\r\n// if (!this.fallbackAdapter) {\r\n// return next(new ValidationError(\"Validation system error\"));\r\n// }\r\n\r\n// // Try fallback adapter\r\n// const fallbackMiddleware = this.fallbackAdapter.validate(schema);\r\n// fallbackMiddleware(req, res, (fallbackErr?: any) => {\r\n// if (fallbackErr) {\r\n// logger.error(\"❌ Fallback validator also failed\", {\r\n// error: fallbackErr?.message\r\n// });\r\n// return next(new ValidationError(\"Validation system unavailable\"));\r\n// }\r\n// next(); // Fallback validation passed\r\n// });\r\n// });\r\n// };\r\n// }\r\n// }\r\n\r\n\r\n// src/managers/ValidatorManager.ts - COMPLETE FIXED\r\nimport { logger } from \"../logging\";\r\nimport { ValidationError } from \"../core/errors/ValidationError.js\";\r\nimport { HiSecureConfig } from \"../core/types/HiSecureConfig.js\"; // ✅ FIXED IMPORT\r\n\r\ninterface ValidatorAdapter {\r\n validate: (schema?: any) => any;\r\n}\r\n\r\nexport class ValidatorManager {\r\n private config: HiSecureConfig[\"validation\"];\r\n private primaryAdapter: ValidatorAdapter;\r\n private fallbackAdapter: ValidatorAdapter | null;\r\n\r\n constructor(\r\n config: HiSecureConfig[\"validation\"],\r\n primaryAdapter: ValidatorAdapter,\r\n fallbackAdapter: ValidatorAdapter | null\r\n ) {\r\n this.config = config;\r\n this.primaryAdapter = primaryAdapter;\r\n this.fallbackAdapter = fallbackAdapter;\r\n }\r\n\r\n validate(schema?: any) {\r\n return (req: any, res: any, next: any) => {\r\n // Execute primary adapter middleware\r\n const primaryMiddleware = this.primaryAdapter.validate(schema);\r\n \r\n // Run middleware and handle errors properly\r\n primaryMiddleware(req, res, (err?: any) => {\r\n if (!err) {\r\n return next(); // Validation passed\r\n }\r\n \r\n // If error is a ValidationError, pass it through (don't fallback!)\r\n if (err instanceof ValidationError) {\r\n logger.warn(\"⚠ Validation failed\", {\r\n path: req.path,\r\n method: req.method,\r\n error: err.message\r\n });\r\n return next(err);\r\n }\r\n \r\n // Only use fallback for ADAPTER errors, not validation errors\r\n logger.warn(\"⚠ Primary validator adapter failed\", {\r\n error: err?.message,\r\n path: req.path,\r\n method: req.method\r\n });\r\n\r\n if (!this.fallbackAdapter) {\r\n return next(new ValidationError(\"Validation system error\"));\r\n }\r\n\r\n // Try fallback adapter\r\n const fallbackMiddleware = this.fallbackAdapter.validate(schema);\r\n fallbackMiddleware(req, res, (fallbackErr?: any) => {\r\n if (fallbackErr) {\r\n logger.error(\"❌ Fallback validator also failed\", {\r\n error: fallbackErr?.message\r\n });\r\n return next(new ValidationError(\"Validation system unavailable\"));\r\n }\r\n next(); // Fallback validation passed\r\n });\r\n });\r\n };\r\n }\r\n}"]}
|
|
1
|
+
{"version":3,"file":"ValidatorManager.js","sourceRoot":"","sources":["../../src/managers/ValidatorManager.ts"],"names":[],"mappings":"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","sourcesContent":["// // src/managers/ValidatorManager.ts - COMPLETE FIXED\r\n// import { logger } from \"../logging\";\r\n// import { ValidationError } from \"../core/errors/ValidationError.js\";\r\n// import { HiSecureConfig } from \"../core/types/HiSecureConfig.js\"; // ✅ FIXED IMPORT\r\n\r\n// interface ValidatorAdapter {\r\n// validate: (schema?: any) => any;\r\n// }\r\n\r\n// export class ValidatorManager {\r\n// private config: HiSecureConfig[\"validation\"];\r\n// private primaryAdapter: ValidatorAdapter;\r\n// private fallbackAdapter: ValidatorAdapter | null;\r\n\r\n// constructor(\r\n// config: HiSecureConfig[\"validation\"],\r\n// primaryAdapter: ValidatorAdapter,\r\n// fallbackAdapter: ValidatorAdapter | null\r\n// ) {\r\n// this.config = config;\r\n// this.primaryAdapter = primaryAdapter;\r\n// this.fallbackAdapter = fallbackAdapter;\r\n// }\r\n\r\n// validate(schema?: any) {\r\n// return (req: any, res: any, next: any) => {\r\n// // Execute primary adapter middleware\r\n// const primaryMiddleware = this.primaryAdapter.validate(schema);\r\n \r\n// // Run middleware and handle errors properly\r\n// primaryMiddleware(req, res, (err?: any) => {\r\n// if (!err) {\r\n// return next(); // Validation passed\r\n// }\r\n \r\n// // If error is a ValidationError, pass it through (don't fallback!)\r\n// if (err instanceof ValidationError) {\r\n// logger.warn(\"⚠ Validation failed\", {\r\n// path: req.path,\r\n// method: req.method,\r\n// error: err.message\r\n// });\r\n// return next(err);\r\n// }\r\n \r\n// // Only use fallback for ADAPTER errors, not validation errors\r\n// logger.warn(\"⚠ Primary validator adapter failed\", {\r\n// error: err?.message,\r\n// path: req.path,\r\n// method: req.method\r\n// });\r\n\r\n// if (!this.fallbackAdapter) {\r\n// return next(new ValidationError(\"Validation system error\"));\r\n// }\r\n\r\n// // Try fallback adapter\r\n// const fallbackMiddleware = this.fallbackAdapter.validate(schema);\r\n// fallbackMiddleware(req, res, (fallbackErr?: any) => {\r\n// if (fallbackErr) {\r\n// logger.error(\"❌ Fallback validator also failed\", {\r\n// error: fallbackErr?.message\r\n// });\r\n// return next(new ValidationError(\"Validation system unavailable\"));\r\n// }\r\n// next(); // Fallback validation passed\r\n// });\r\n// });\r\n// };\r\n// }\r\n// }\r\n\r\n\r\n\r\n\r\n// // src/managers/ValidatorManager.ts\r\n// import { logger } from \"../logging\";\r\n// import { ValidationError } from \"../core/errors/ValidationError.js\";\r\n\r\n// interface ValidatorAdapter {\r\n// validate: (schema?: any) => any;\r\n// }\r\n\r\n// export class ValidatorManager {\r\n// private primaryAdapter: ValidatorAdapter;\r\n// private fallbackAdapter: ValidatorAdapter | null;\r\n\r\n// constructor(primaryAdapter: ValidatorAdapter, fallbackAdapter: ValidatorAdapter | null) {\r\n// this.primaryAdapter = primaryAdapter;\r\n// this.fallbackAdapter = fallbackAdapter;\r\n// }\r\n\r\n// validate(schema?: any) {\r\n// return (req: any, res: any, next: any) => {\r\n// const isZod = schema && typeof schema === \"object\" && typeof schema.safeParse === \"function\";\r\n// const isExpressValidator = Array.isArray(schema);\r\n\r\n// let adapter: ValidatorAdapter;\r\n\r\n// if (isZod) {\r\n// adapter = this.primaryAdapter; // ZodAdapter\r\n// logger.debug(\"📌 Using Zod adapter for validation\");\r\n// } \r\n// else if (isExpressValidator) {\r\n// adapter = this.fallbackAdapter!; // ExpressValidatorAdapter\r\n// logger.debug(\"📌 Using express-validator adapter for validation\");\r\n// } \r\n// else {\r\n// return next(); // nothing to validate\r\n// }\r\n\r\n// const middleware = adapter.validate(schema);\r\n\r\n// // Execute validation chain\r\n// middleware(req, res, (err?: any) => {\r\n// if (err instanceof ValidationError) {\r\n// return next(err);\r\n// }\r\n// if (err) {\r\n// logger.error(\"❌ Validator internal error\", { error: err.message });\r\n// return next(new ValidationError(\"Validation failed internally.\"));\r\n// }\r\n// next();\r\n// });\r\n// };\r\n// }\r\n// }\r\n\r\n\r\n\r\n\r\n\r\n// src/managers/ValidatorManager.ts\r\nimport { logger } from \"../logging\";\r\nimport { ValidationError } from \"../core/errors/ValidationError.js\";\r\n\r\ninterface ValidatorAdapter {\r\n validate: (schema?: any) => any;\r\n}\r\n\r\nexport class ValidatorManager {\r\n private zodAdapter: ValidatorAdapter;\r\n private expressAdapter: ValidatorAdapter;\r\n\r\n constructor(zodAdapter: ValidatorAdapter, expressAdapter: ValidatorAdapter) {\r\n this.zodAdapter = zodAdapter;\r\n this.expressAdapter = expressAdapter;\r\n }\r\n\r\n validate(schema?: any) {\r\n // const isZod = schema && typeof schema.safeParse === \"function\";\r\n const isZod =\r\n schema &&\r\n typeof schema === \"object\" &&\r\n typeof schema._def === \"object\" && \r\n typeof schema.safeParse === \"function\";\r\n\r\n const isExpressValidator = Array.isArray(schema);\r\n\r\n return (req: any, res: any, next: any) => {\r\n let middleware;\r\n\r\n if (isZod) {\r\n logger.debug(\"📌 Using Zod adapter\");\r\n middleware = this.zodAdapter.validate(schema);\r\n } \r\n else if (isExpressValidator) {\r\n logger.debug(\"📌 Using express-validator adapter\");\r\n middleware = this.expressAdapter.validate(schema);\r\n } \r\n else {\r\n return next(); // no schema found\r\n }\r\n\r\n // CASE 1 — express-validator returns ARRAY\r\n if (Array.isArray(middleware)) {\r\n let idx = 0;\r\n\r\n const run = (err?: any) => {\r\n if (err) return next(err);\r\n\r\n const fn = middleware[idx++];\r\n if (!fn) return next(); // done\r\n\r\n try {\r\n fn(req, res, run);\r\n } catch (error: any) {\r\n next(new ValidationError(error.message));\r\n }\r\n };\r\n\r\n return run();\r\n }\r\n\r\n // CASE 2 — Zod returns SINGLE MIDDLEWARE\r\n try {\r\n middleware(req, res, (err?: any) => {\r\n if (err) return next(err);\r\n next();\r\n });\r\n } catch (err: any) {\r\n next(new ValidationError(err.message));\r\n }\r\n };\r\n }\r\n}\r\n\r\n"]}
|
|
@@ -12,7 +12,7 @@ const AdapterError_js_1 = require("../core/errors/AdapterError.js");
|
|
|
12
12
|
const ValidationError_js_1 = require("../core/errors/ValidationError.js");
|
|
13
13
|
const SanitizerError_js_1 = require("../core/errors/SanitizerError.js");
|
|
14
14
|
const SecurityError_js_1 = require("../core/errors/SecurityError.js");
|
|
15
|
-
const
|
|
15
|
+
const HttpError_js_1 = require("../core/errors/HttpError.js");
|
|
16
16
|
function errorHandler(err, req, res, _next) {
|
|
17
17
|
const message = typeof err === "string"
|
|
18
18
|
? err
|
|
@@ -34,7 +34,7 @@ function errorHandler(err, req, res, _next) {
|
|
|
34
34
|
// ---------------------------------------------------
|
|
35
35
|
// 1. HttpError (developer thrown)
|
|
36
36
|
// ---------------------------------------------------
|
|
37
|
-
if (err instanceof
|
|
37
|
+
if (err instanceof HttpError_js_1.HttpError) {
|
|
38
38
|
return res.status(err.status).json({
|
|
39
39
|
success: false,
|
|
40
40
|
error: err.code,
|