prostgles-server 4.2.134 → 4.2.136

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/Auth/AuthHandler.d.ts +66 -0
  2. package/dist/Auth/AuthHandler.d.ts.map +1 -0
  3. package/dist/Auth/AuthHandler.js +425 -0
  4. package/dist/Auth/AuthHandler.js.map +1 -0
  5. package/dist/Auth/AuthTypes.d.ts +218 -0
  6. package/dist/Auth/AuthTypes.d.ts.map +1 -0
  7. package/dist/Auth/AuthTypes.js +3 -0
  8. package/dist/Auth/AuthTypes.js.map +1 -0
  9. package/dist/Auth/authInit.d.ts +3 -0
  10. package/dist/Auth/authInit.d.ts.map +1 -0
  11. package/dist/Auth/authInit.js +155 -0
  12. package/dist/Auth/authInit.js.map +1 -0
  13. package/dist/Auth/getSafeReturnURL.d.ts +2 -0
  14. package/dist/Auth/getSafeReturnURL.d.ts.map +1 -0
  15. package/dist/Auth/getSafeReturnURL.js +35 -0
  16. package/dist/Auth/getSafeReturnURL.js.map +1 -0
  17. package/dist/Auth/setAuthSignup.d.ts +5 -0
  18. package/dist/Auth/setAuthSignup.d.ts.map +1 -0
  19. package/dist/Auth/setAuthSignup.js +85 -0
  20. package/dist/Auth/setAuthSignup.js.map +1 -0
  21. package/dist/DboBuilder/DboBuilderTypes.d.ts +3 -3
  22. package/dist/DboBuilder/DboBuilderTypes.d.ts.map +1 -1
  23. package/dist/DboBuilder/DboBuilderTypes.js.map +1 -1
  24. package/dist/DboBuilder/QueryBuilder/getNewQuery.d.ts +1 -1
  25. package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts +1 -1
  26. package/dist/DboBuilder/runSQL.d.ts +1 -1
  27. package/dist/FileManager/initFileManager.js +1 -1
  28. package/dist/FileManager/initFileManager.js.map +1 -1
  29. package/dist/Filtering.d.ts +1 -1
  30. package/dist/Prostgles.d.ts +1 -1
  31. package/dist/Prostgles.d.ts.map +1 -1
  32. package/dist/Prostgles.js +1 -1
  33. package/dist/Prostgles.js.map +1 -1
  34. package/dist/ProstglesTypes.d.ts +1 -1
  35. package/dist/ProstglesTypes.d.ts.map +1 -1
  36. package/dist/PublishParser/PublishParser.d.ts +2 -2
  37. package/dist/PublishParser/PublishParser.d.ts.map +1 -1
  38. package/dist/PublishParser/PublishParser.js.map +1 -1
  39. package/dist/PublishParser/getFileTableRules.d.ts +1 -1
  40. package/dist/PublishParser/getFileTableRules.d.ts.map +1 -1
  41. package/dist/PublishParser/getSchemaFromPublish.d.ts +1 -1
  42. package/dist/PublishParser/getSchemaFromPublish.d.ts.map +1 -1
  43. package/dist/PublishParser/getTableRulesWithoutFileTable.d.ts +1 -1
  44. package/dist/PublishParser/getTableRulesWithoutFileTable.d.ts.map +1 -1
  45. package/dist/PublishParser/publishTypesAndUtils.d.ts +1 -1
  46. package/dist/PublishParser/publishTypesAndUtils.d.ts.map +1 -1
  47. package/dist/PublishParser/publishTypesAndUtils.js.map +1 -1
  48. package/dist/RestApi.d.ts +1 -1
  49. package/dist/RestApi.d.ts.map +1 -1
  50. package/dist/RestApi.js +1 -1
  51. package/dist/RestApi.js.map +1 -1
  52. package/dist/index.d.ts +1 -1
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/initProstgles.js +1 -1
  55. package/dist/initProstgles.js.map +1 -1
  56. package/dist/runClientRequest.d.ts +1 -1
  57. package/dist/runClientRequest.d.ts.map +1 -1
  58. package/dist/runClientRequest.js +1 -1
  59. package/dist/runClientRequest.js.map +1 -1
  60. package/lib/Auth/AuthHandler.ts +474 -0
  61. package/lib/Auth/AuthTypes.ts +247 -0
  62. package/lib/Auth/authInit.ts +166 -0
  63. package/lib/Auth/getSafeReturnURL.ts +35 -0
  64. package/lib/Auth/setAuthSignup.ts +100 -0
  65. package/lib/DBSchemaBuilder.ts +1 -1
  66. package/lib/DboBuilder/DboBuilderTypes.ts +4 -3
  67. package/lib/FileManager/initFileManager.ts +1 -1
  68. package/lib/Prostgles.ts +2 -2
  69. package/lib/ProstglesTypes.ts +1 -1
  70. package/lib/PublishParser/PublishParser.ts +3 -3
  71. package/lib/PublishParser/getFileTableRules.ts +1 -1
  72. package/lib/PublishParser/getSchemaFromPublish.ts +1 -1
  73. package/lib/PublishParser/getTableRulesWithoutFileTable.ts +1 -1
  74. package/lib/PublishParser/publishTypesAndUtils.ts +1 -1
  75. package/lib/RestApi.ts +2 -1
  76. package/lib/index.ts +1 -1
  77. package/lib/initProstgles.ts +1 -1
  78. package/lib/runClientRequest.ts +3 -3
  79. package/package.json +14 -4
  80. package/tests/client/index.ts +9 -7
  81. package/tests/client/package-lock.json +2827 -143
  82. package/tests/client/package.json +1 -1
  83. package/tests/client/tsconfig.json +0 -6
  84. package/tests/clientFileTests.spec.ts +2 -3
  85. package/tests/clientOnlyQueries.spec.ts +2 -2
  86. package/tests/clientRestApi.spec.ts +2 -2
  87. package/tests/server/index.ts +1 -1
  88. package/tests/server/package-lock.json +62 -77
  89. package/tests/server/package.json +2 -2
  90. package/tests/server/tsconfig.json +1 -2
  91. package/tests/serverOnlyQueries.spec.ts +2 -2
  92. package/tsconfig.json +0 -1
  93. package/lib/AuthHandler.ts +0 -816
@@ -0,0 +1,66 @@
1
+ import { AnyObject, AuthSocketSchema } from "prostgles-types";
2
+ import { LocalParams, PRGLIOSocket } from "../DboBuilder/DboBuilder";
3
+ import { DB, DBHandlerServer, Prostgles } from "../Prostgles";
4
+ import { Auth, AuthClientRequest, AuthResult, BasicSession, ExpressReq, ExpressRes, LoginClientInfo } from "./AuthTypes";
5
+ export declare const HTTPCODES: {
6
+ AUTH_ERROR: number;
7
+ NOT_FOUND: number;
8
+ BAD_REQUEST: number;
9
+ INTERNAL_SERVER_ERROR: number;
10
+ };
11
+ export declare const getLoginClientInfo: (req: AuthClientRequest) => AuthClientRequest & LoginClientInfo;
12
+ export declare class AuthHandler {
13
+ protected prostgles: Prostgles;
14
+ protected opts?: Auth;
15
+ dbo: DBHandlerServer;
16
+ db: DB;
17
+ sidKeyName?: string;
18
+ routes: {
19
+ login?: string;
20
+ returnUrlParamName?: string;
21
+ logoutGetPath?: string;
22
+ magicLinks?: {
23
+ route: string;
24
+ expressRoute: string;
25
+ };
26
+ readonly catchAll: '*';
27
+ };
28
+ constructor(prostgles: Prostgles);
29
+ validateSid: (sid: string | undefined) => string | undefined;
30
+ matchesRoute: (route: string | undefined, clientFullRoute: string) => boolean | "" | undefined;
31
+ isUserRoute: (pathname: string) => boolean;
32
+ setCookieAndGoToReturnURLIFSet: (cookie: {
33
+ sid: string;
34
+ expires: number;
35
+ }, r: {
36
+ req: ExpressReq;
37
+ res: ExpressRes;
38
+ }) => void;
39
+ getUser: (clientReq: {
40
+ httpReq: ExpressReq;
41
+ }) => Promise<AuthResult>;
42
+ init: () => Promise<void>;
43
+ getReturnUrl: (req: ExpressReq) => string | null | undefined;
44
+ destroy: () => void;
45
+ throttledFunc: <T>(func: () => Promise<T>, throttle?: number) => Promise<T>;
46
+ loginThrottled: (params: AnyObject, client: LoginClientInfo) => Promise<BasicSession>;
47
+ /**
48
+ * Will return first sid value found in:
49
+ * Bearer header
50
+ * http cookie
51
+ * query params
52
+ * Based on sid names in auth
53
+ */
54
+ getSID(localParams: LocalParams): string | undefined;
55
+ /**
56
+ * Used for logging
57
+ */
58
+ getSIDNoError: (localParams: LocalParams | undefined) => string | undefined;
59
+ getClientInfo(localParams: Pick<LocalParams, "socket" | "httpReq">): Promise<AuthResult>;
60
+ isValidSocketSession: (socket: PRGLIOSocket, session: BasicSession) => boolean;
61
+ getClientAuth: (clientReq: Pick<LocalParams, "socket" | "httpReq">) => Promise<{
62
+ auth: AuthSocketSchema;
63
+ userData: AuthResult;
64
+ }>;
65
+ }
66
+ //# sourceMappingURL=AuthHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthHandler.d.ts","sourceRoot":"","sources":["../../lib/Auth/AuthHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA0D,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACtH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGrE,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAKxH,eAAO,MAAM,SAAS;;;;;CAKrB,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAS,iBAAiB,KAAG,iBAAiB,GAAG,eAqB/E,CAAA;AAED,qBAAa,WAAW;IACtB,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC;IAC/B,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACtB,GAAG,EAAE,eAAe,CAAC;IACrB,EAAE,EAAE,EAAE,CAAC;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,MAAM,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE;YACX,KAAK,EAAE,MAAM,CAAC;YACd,YAAY,EAAE,MAAM,CAAC;SACtB,CAAA;QACD,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC;KACxB,CAEA;gBAEW,SAAS,EAAE,SAAS;IAsBhC,WAAW,QAAS,MAAM,GAAG,SAAS,wBAIrC;IAED,YAAY,UAAW,MAAM,GAAG,SAAS,mBAAmB,MAAM,8BAKjE;IAED,WAAW,aAAc,MAAM,aAW9B;IAED,8BAA8B,WAAY;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;KAAE,KAAK;QAAE,GAAG,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,UAAU,CAAA;KAAE,UAmCnH;IAED,OAAO,cAAqB;QAAE,OAAO,EAAE,UAAU,CAAC;KAAE,KAAG,QAAQ,UAAU,CAAC,CAezE;IAED,IAAI,sBAAuB;IAE3B,YAAY,QAAS,UAAU,+BAQ9B;IAED,OAAO,aAIN;IAED,aAAa,+DAgCZ;IAED,cAAc,WAAkB,SAAS,UAAU,eAAe,KAAG,QAAQ,YAAY,CAAC,CAqBzF;IAGD;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS;IA8CpD;;OAEG;IACH,aAAa,gBAAiB,WAAW,GAAG,SAAS,KAAG,MAAM,GAAG,SAAS,CAOzE;IAEK,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAgE9F,oBAAoB,WAAY,YAAY,WAAW,YAAY,KAAG,OAAO,CAc5E;IAED,aAAa,cAAqB,KAAK,WAAW,EAAE,QAAQ,GAAG,SAAS,CAAC;cAAmB,gBAAgB;kBAAY,UAAU;OAyFjI;CACF"}
@@ -0,0 +1,425 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AuthHandler = exports.getLoginClientInfo = exports.HTTPCODES = void 0;
4
+ const prostgles_types_1 = require("prostgles-types");
5
+ const FileManager_1 = require("../FileManager/FileManager");
6
+ const getSafeReturnURL_1 = require("./getSafeReturnURL");
7
+ const authInit_1 = require("./authInit");
8
+ const setAuthSignup_1 = require("./setAuthSignup");
9
+ exports.HTTPCODES = {
10
+ AUTH_ERROR: 401,
11
+ NOT_FOUND: 404,
12
+ BAD_REQUEST: 400,
13
+ INTERNAL_SERVER_ERROR: 500,
14
+ };
15
+ const getLoginClientInfo = (req) => {
16
+ if ("httpReq" in req) {
17
+ const ip_address = req.httpReq.ip;
18
+ if (!ip_address)
19
+ throw new Error("ip_address missing from req.httpReq");
20
+ const user_agent = req.httpReq.headers["user-agent"];
21
+ return {
22
+ ...req,
23
+ ip_address,
24
+ ip_address_remote: req.httpReq.connection.remoteAddress,
25
+ x_real_ip: req.httpReq.headers['x-real-ip'],
26
+ user_agent,
27
+ };
28
+ }
29
+ else {
30
+ return {
31
+ ...req,
32
+ ip_address: req.socket.handshake.address,
33
+ ip_address_remote: req.socket.request.connection.remoteAddress,
34
+ x_real_ip: req.socket.handshake.headers?.["x-real-ip"],
35
+ user_agent: req.socket.handshake.headers?.['user-agent'],
36
+ };
37
+ }
38
+ };
39
+ exports.getLoginClientInfo = getLoginClientInfo;
40
+ class AuthHandler {
41
+ prostgles;
42
+ opts;
43
+ dbo;
44
+ db;
45
+ sidKeyName;
46
+ routes = {
47
+ catchAll: "*"
48
+ };
49
+ constructor(prostgles) {
50
+ this.prostgles = prostgles;
51
+ this.opts = prostgles.opts.auth;
52
+ if (prostgles.opts.auth?.expressConfig) {
53
+ const { magicLinks, returnUrlParamName, loginRoute, logoutGetPath } = prostgles.opts.auth.expressConfig;
54
+ const magicLinksRoute = magicLinks?.route || "/magic-link";
55
+ this.routes = {
56
+ magicLinks: magicLinks ? {
57
+ expressRoute: `${magicLinksRoute}/:id`,
58
+ route: magicLinksRoute
59
+ } : undefined,
60
+ returnUrlParamName: returnUrlParamName || "returnURL",
61
+ login: loginRoute || "/login",
62
+ logoutGetPath: logoutGetPath || "/logout",
63
+ catchAll: "*"
64
+ };
65
+ }
66
+ if (!prostgles.dbo || !prostgles.db)
67
+ throw "dbo or db missing";
68
+ this.dbo = prostgles.dbo;
69
+ this.db = prostgles.db;
70
+ }
71
+ validateSid = (sid) => {
72
+ if (!sid)
73
+ return undefined;
74
+ if (typeof sid !== "string")
75
+ throw "sid missing or not a string";
76
+ return sid;
77
+ };
78
+ matchesRoute = (route, clientFullRoute) => {
79
+ return route && clientFullRoute && (route === clientFullRoute ||
80
+ clientFullRoute.startsWith(route) && ["/", "?", "#"].includes(clientFullRoute[route.length] ?? ""));
81
+ };
82
+ isUserRoute = (pathname) => {
83
+ const pubRoutes = [
84
+ ...this.opts?.expressConfig?.publicRoutes || [],
85
+ ];
86
+ if (this.routes?.login)
87
+ pubRoutes.push(this.routes.login);
88
+ if (this.routes?.logoutGetPath)
89
+ pubRoutes.push(this.routes.logoutGetPath);
90
+ if (this.routes?.magicLinks?.route)
91
+ pubRoutes.push(this.routes.magicLinks.route);
92
+ return !pubRoutes.some(publicRoute => {
93
+ return this.matchesRoute(publicRoute, pathname);
94
+ });
95
+ };
96
+ setCookieAndGoToReturnURLIFSet = (cookie, r) => {
97
+ const { sid, expires } = cookie;
98
+ const { res, req } = r;
99
+ if (sid) {
100
+ const maxAgeOneDay = 60 * 60 * 24; // 24 hours;
101
+ let cookieDuration = {
102
+ maxAge: maxAgeOneDay
103
+ };
104
+ if (expires && Number.isFinite(expires) && !isNaN(+new Date(expires))) {
105
+ // const maxAge = (+new Date(expires)) - Date.now();
106
+ cookieDuration = { expires: new Date(expires) };
107
+ const days = (+cookieDuration.expires - Date.now()) / (24 * 60 * 60e3);
108
+ if (days >= 400) {
109
+ console.warn(`Cookie expiration is higher than the Chrome 400 day limit: ${days}days`);
110
+ }
111
+ }
112
+ const cookieOpts = {
113
+ ...cookieDuration,
114
+ httpOnly: true, // The cookie only accessible by the web server
115
+ //signed: true // Indicates if the cookie should be signed
116
+ secure: true,
117
+ sameSite: "strict",
118
+ ...(this.opts?.expressConfig?.cookieOptions || {})
119
+ };
120
+ const cookieData = sid;
121
+ if (!this.sidKeyName || !this.routes?.returnUrlParamName)
122
+ throw "sidKeyName or returnURL missing";
123
+ res.cookie(this.sidKeyName, cookieData, cookieOpts);
124
+ const successURL = this.getReturnUrl(req) || "/";
125
+ res.redirect(successURL);
126
+ }
127
+ else {
128
+ throw ("no user or session");
129
+ }
130
+ };
131
+ getUser = async (clientReq) => {
132
+ if (!this.sidKeyName || !this.opts?.getUser) {
133
+ throw "sidKeyName or this.opts.getUser missing";
134
+ }
135
+ const sid = clientReq.httpReq?.cookies?.[this.sidKeyName];
136
+ if (!sid)
137
+ return undefined;
138
+ try {
139
+ return this.throttledFunc(async () => {
140
+ return this.opts.getUser(this.validateSid(sid), this.dbo, this.db, (0, exports.getLoginClientInfo)(clientReq));
141
+ }, 50);
142
+ }
143
+ catch (err) {
144
+ console.error(err);
145
+ }
146
+ return undefined;
147
+ };
148
+ init = authInit_1.authInit.bind(this);
149
+ getReturnUrl = (req) => {
150
+ const { returnUrlParamName } = this.routes;
151
+ if (returnUrlParamName && req?.query?.[returnUrlParamName]) {
152
+ const returnURL = decodeURIComponent(req?.query?.[returnUrlParamName]);
153
+ return (0, getSafeReturnURL_1.getSafeReturnURL)(returnURL, returnUrlParamName);
154
+ }
155
+ return null;
156
+ };
157
+ destroy = () => {
158
+ const app = this.opts?.expressConfig?.app;
159
+ const { login, logoutGetPath, magicLinks } = this.routes;
160
+ (0, FileManager_1.removeExpressRoute)(app, [login, logoutGetPath, magicLinks?.expressRoute]);
161
+ };
162
+ throttledFunc = (func, throttle = 500) => {
163
+ return new Promise(async (resolve, reject) => {
164
+ let result, error, finished = false;
165
+ /**
166
+ * Throttle reject response times to prevent timing attacks
167
+ */
168
+ const interval = setInterval(() => {
169
+ if (finished) {
170
+ clearInterval(interval);
171
+ if (error) {
172
+ reject(error);
173
+ }
174
+ else {
175
+ resolve(result);
176
+ }
177
+ }
178
+ }, throttle);
179
+ try {
180
+ result = await func();
181
+ resolve(result);
182
+ clearInterval(interval);
183
+ }
184
+ catch (err) {
185
+ console.log(err);
186
+ error = err;
187
+ }
188
+ finished = true;
189
+ });
190
+ };
191
+ loginThrottled = async (params, client) => {
192
+ if (!this.opts?.login)
193
+ throw "Auth login config missing";
194
+ const { responseThrottle = 500 } = this.opts;
195
+ return this.throttledFunc(async () => {
196
+ const result = await this.opts?.login?.(params, this.dbo, this.db, client);
197
+ const err = {
198
+ msg: "Bad login result type. \nExpecting: undefined | null | { sid: string; expires: number } but got: " + JSON.stringify(result)
199
+ };
200
+ if (!result)
201
+ throw err;
202
+ if (result && (typeof result.sid !== "string" || typeof result.expires !== "number") || !result && ![undefined, null].includes(result)) {
203
+ throw err;
204
+ }
205
+ if (result && result.expires < Date.now()) {
206
+ throw { msg: "auth.login() is returning an expired session. Can only login with a session.expires greater than Date.now()" };
207
+ }
208
+ return result;
209
+ }, responseThrottle);
210
+ };
211
+ /**
212
+ * Will return first sid value found in:
213
+ * Bearer header
214
+ * http cookie
215
+ * query params
216
+ * Based on sid names in auth
217
+ */
218
+ getSID(localParams) {
219
+ if (!this.opts)
220
+ return undefined;
221
+ const { sidKeyName } = this.opts;
222
+ if (!sidKeyName || !localParams)
223
+ return undefined;
224
+ if (localParams.socket) {
225
+ const { handshake } = localParams.socket;
226
+ const querySid = handshake?.auth?.[sidKeyName] || handshake?.query?.[sidKeyName];
227
+ let rawSid = querySid;
228
+ if (!rawSid) {
229
+ const cookie_str = localParams.socket?.handshake?.headers?.cookie;
230
+ const cookie = parseCookieStr(cookie_str);
231
+ rawSid = cookie[sidKeyName];
232
+ }
233
+ return this.validateSid(rawSid);
234
+ }
235
+ else if (localParams.httpReq) {
236
+ const [tokenType, base64Token] = localParams.httpReq.headers.authorization?.split(' ') ?? [];
237
+ let bearerSid;
238
+ if (tokenType && base64Token) {
239
+ if (tokenType.trim() !== "Bearer") {
240
+ throw "Only Bearer Authorization header allowed";
241
+ }
242
+ bearerSid = Buffer.from(base64Token, 'base64').toString();
243
+ }
244
+ return this.validateSid(bearerSid ?? localParams.httpReq?.cookies?.[sidKeyName]);
245
+ }
246
+ else
247
+ throw "socket OR httpReq missing from localParams";
248
+ function parseCookieStr(cookie_str) {
249
+ if (!cookie_str || typeof cookie_str !== "string") {
250
+ return {};
251
+ }
252
+ return cookie_str.replace(/\s/g, '')
253
+ .split(";")
254
+ .reduce((prev, current) => {
255
+ const [name, value] = current.split('=');
256
+ prev[name] = value;
257
+ return prev;
258
+ }, {});
259
+ }
260
+ }
261
+ /**
262
+ * Used for logging
263
+ */
264
+ getSIDNoError = (localParams) => {
265
+ if (!localParams)
266
+ return undefined;
267
+ try {
268
+ return this.getSID(localParams);
269
+ }
270
+ catch {
271
+ return undefined;
272
+ }
273
+ };
274
+ async getClientInfo(localParams) {
275
+ if (!this.opts)
276
+ return {};
277
+ const getSession = this.opts.cacheSession?.getSession;
278
+ const isSocket = "socket" in localParams;
279
+ if (isSocket) {
280
+ if (getSession && localParams.socket?.__prglCache) {
281
+ const { session, user, clientUser } = localParams.socket.__prglCache;
282
+ const isValid = this.isValidSocketSession(localParams.socket, session);
283
+ if (isValid) {
284
+ return {
285
+ sid: session.sid,
286
+ user,
287
+ clientUser,
288
+ };
289
+ }
290
+ else
291
+ return {
292
+ sid: session.sid
293
+ };
294
+ }
295
+ }
296
+ const authStart = Date.now();
297
+ const res = await this.throttledFunc(async () => {
298
+ const { getUser } = this.opts ?? {};
299
+ if (getUser && localParams && (localParams.httpReq || localParams.socket)) {
300
+ const sid = this.getSID(localParams);
301
+ const clientReq = localParams.httpReq ? { httpReq: localParams.httpReq } : { socket: localParams.socket };
302
+ let user, clientUser;
303
+ if (sid) {
304
+ const res = await getUser(sid, this.dbo, this.db, (0, exports.getLoginClientInfo)(clientReq));
305
+ user = res?.user;
306
+ clientUser = res?.clientUser;
307
+ }
308
+ if (getSession && isSocket) {
309
+ const session = await getSession(sid, this.dbo, this.db);
310
+ if (session?.expires && user && clientUser && localParams.socket) {
311
+ localParams.socket.__prglCache = {
312
+ session,
313
+ user,
314
+ clientUser,
315
+ };
316
+ }
317
+ }
318
+ if (sid) {
319
+ return { sid, user, clientUser };
320
+ }
321
+ }
322
+ return {};
323
+ }, 5);
324
+ await this.prostgles.opts.onLog?.({
325
+ type: "auth",
326
+ command: "getClientInfo",
327
+ duration: Date.now() - authStart,
328
+ sid: res.sid,
329
+ socketId: localParams.socket?.id,
330
+ });
331
+ return res;
332
+ }
333
+ isValidSocketSession = (socket, session) => {
334
+ const hasExpired = Boolean(session && session.expires <= Date.now());
335
+ if (this.opts?.expressConfig?.publicRoutes && !this.opts.expressConfig?.disableSocketAuthGuard) {
336
+ const error = "Session has expired";
337
+ if (hasExpired) {
338
+ if (session.onExpiration === "redirect")
339
+ socket.emit(prostgles_types_1.CHANNELS.AUTHGUARD, {
340
+ shouldReload: session.onExpiration === "redirect",
341
+ error
342
+ });
343
+ throw error;
344
+ }
345
+ }
346
+ return Boolean(session && !hasExpired);
347
+ };
348
+ getClientAuth = async (clientReq) => {
349
+ let pathGuard = false;
350
+ if (this.opts?.expressConfig?.publicRoutes && !this.opts.expressConfig?.disableSocketAuthGuard) {
351
+ pathGuard = true;
352
+ if ("socket" in clientReq && clientReq.socket) {
353
+ const { socket } = clientReq;
354
+ socket.removeAllListeners(prostgles_types_1.CHANNELS.AUTHGUARD);
355
+ socket.on(prostgles_types_1.CHANNELS.AUTHGUARD, async (params, cb = (_err, _res) => { }) => {
356
+ try {
357
+ const { pathname, origin } = typeof params === "string" ? JSON.parse(params) : (params || {});
358
+ if (pathname && typeof pathname !== "string") {
359
+ console.warn("Invalid pathname provided for AuthGuardLocation: ", pathname);
360
+ }
361
+ /** These origins */
362
+ const IGNORED_API_ORIGINS = ["file://"];
363
+ if (!IGNORED_API_ORIGINS.includes(origin) && pathname && typeof pathname === "string" && this.isUserRoute(pathname) && !(await this.getClientInfo({ socket }))?.user) {
364
+ cb(null, { shouldReload: true });
365
+ }
366
+ else {
367
+ cb(null, { shouldReload: false });
368
+ }
369
+ }
370
+ catch (err) {
371
+ console.error("AUTHGUARD err: ", err);
372
+ cb(err);
373
+ }
374
+ });
375
+ }
376
+ }
377
+ /**
378
+ * ARE THESE NEEDED?!
379
+ */
380
+ // const {
381
+ // register,
382
+ // logout
383
+ // } = this.opts;
384
+ // const login = this.loginThrottled
385
+ // let handlers: {
386
+ // name: keyof Omit<AuthSocketSchema, "user">;
387
+ // ch: string;
388
+ // func: (...args: any) => any;
389
+ // }[] = [
390
+ // { func: (params: any, dbo: any, db: DB, client: LoginClientInfo) => register?.(params, dbo, db), ch: CHANNELS.REGISTER, name: "register" as keyof Omit<AuthSocketSchema, "user"> },
391
+ // { func: (params: any, dbo: any, db: DB, client: LoginClientInfo) => login(params, client), ch: CHANNELS.LOGIN, name: "login" as keyof Omit<AuthSocketSchema, "user"> },
392
+ // { func: (params: any, dbo: any, db: DB, client: LoginClientInfo) => logout?.(this.getSID({ socket }), dbo, db), ch: CHANNELS.LOGOUT, name: "logout" as keyof Omit<AuthSocketSchema, "user">}
393
+ // ].filter(h => h.func);
394
+ // handlers.map(({ func, ch, name }) => {
395
+ // auth[name] = true;
396
+ // socket.removeAllListeners(ch)
397
+ // socket.on(ch, async (params: any, cb = (..._callback: any) => { /** Empty */ }) => {
398
+ // try {
399
+ // if (!socket) throw "socket missing??!!";
400
+ // const id_address = (socket as any)?.conn?.remoteAddress;
401
+ // const user_agent = socket.handshake?.headers?.["user-agent"];
402
+ // const res = await func(params, this.dbo as any, this.db, { user_agent, id_address });
403
+ // if (name === "login" && res && res.sid) {
404
+ // /* TODO: Re-send schema to client */
405
+ // }
406
+ // cb(null, true);
407
+ // } catch (err) {
408
+ // console.error(name + " err", err);
409
+ // cb(err)
410
+ // }
411
+ // });
412
+ // });
413
+ const userData = await this.getClientInfo(clientReq);
414
+ const auth = {
415
+ providers: (0, setAuthSignup_1.getProviders)(this.opts?.expressConfig?.registrations),
416
+ register: this.opts?.expressConfig?.registrations?.email && { type: this.opts?.expressConfig?.registrations?.email.signupType, url: "/register" },
417
+ user: userData?.clientUser,
418
+ loginType: this.opts?.expressConfig?.registrations?.email.signupType,
419
+ pathGuard,
420
+ };
421
+ return { auth, userData };
422
+ };
423
+ }
424
+ exports.AuthHandler = AuthHandler;
425
+ //# sourceMappingURL=AuthHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthHandler.js","sourceRoot":"","sources":["../../lib/Auth/AuthHandler.ts"],"names":[],"mappings":"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"}