@rpcbase/auth 0.187.0 → 0.189.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/api/request-password-reset/handler.d.ts.map +1 -1
- package/dist/email-validation/index.d.ts +1 -2
- package/dist/email-validation/index.d.ts.map +1 -1
- package/dist/email-validation/index.js +7 -21
- package/dist/email-validation/index.js.map +1 -1
- package/dist/{handler-DOaODKMb.js → handler-aS6g_PVg.js} +10 -2
- package/dist/handler-aS6g_PVg.js.map +1 -0
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/node-yVzWCUin.js +56399 -0
- package/dist/node-yVzWCUin.js.map +1 -0
- package/dist/passwordReset.d.ts +2 -1
- package/dist/passwordReset.d.ts.map +1 -1
- package/dist/rolldown-runtime-FDOR9p9I.js +24 -0
- package/dist/routes.js +1 -1
- package/package.json +4 -5
- package/dist/handler-DOaODKMb.js.map +0 -1
package/dist/passwordReset.d.ts
CHANGED
|
@@ -4,7 +4,8 @@ export type PasswordResetCodeRequestResult = {
|
|
|
4
4
|
};
|
|
5
5
|
export declare class PasswordResetCodeRequestError extends Error {
|
|
6
6
|
retryAfterSeconds?: number;
|
|
7
|
-
|
|
7
|
+
errorCode?: string;
|
|
8
|
+
constructor(retryAfterSeconds?: number, errorCode?: string);
|
|
8
9
|
}
|
|
9
10
|
export declare const requestPasswordResetCode: (email: string) => Promise<PasswordResetCodeRequestResult>;
|
|
10
11
|
export declare const usePasswordResetResend: ({ email, cooldownSeconds, }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passwordReset.d.ts","sourceRoot":"","sources":["../src/passwordReset.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,uCAAuC,KAAK,CAAA;AAEzD,MAAM,MAAM,8BAA8B,GAAG;IAC3C,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,iBAAiB,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"passwordReset.d.ts","sourceRoot":"","sources":["../src/passwordReset.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,uCAAuC,KAAK,CAAA;AAEzD,MAAM,MAAM,8BAA8B,GAAG;IAC3C,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;gBAEN,iBAAiB,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAM3D;AAQD,eAAO,MAAM,wBAAwB,GAAS,OAAO,MAAM,KAAG,OAAO,CAAC,8BAA8B,CAuBnG,CAAA;AAED,eAAO,MAAM,sBAAsB,GAAI,6BAGpC;IACD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;;;;;;;CAkCA,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __commonJSMin = (cb, mod) => () => (mod || (cb((mod = { exports: {} }).exports, mod), cb = null), mod.exports);
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
11
|
+
key = keys[i];
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
13
|
+
get: ((k) => from[k]).bind(null, key),
|
|
14
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
20
|
+
value: mod,
|
|
21
|
+
enumerable: true
|
|
22
|
+
}) : target, mod));
|
|
23
|
+
//#endregion
|
|
24
|
+
export { __toESM as n, __commonJSMin as t };
|
package/dist/routes.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
//#region src/routes.ts
|
|
2
2
|
var routes = Object.entries({ .../* #__PURE__ */ Object.assign({
|
|
3
3
|
"./api/me/handler.ts": () => import("./handler-W_XZ0lnx.js"),
|
|
4
|
-
"./api/request-password-reset/handler.ts": () => import("./handler-
|
|
4
|
+
"./api/request-password-reset/handler.ts": () => import("./handler-aS6g_PVg.js"),
|
|
5
5
|
"./api/resend-otp/handler.ts": () => import("./handler-C7SfLP4c.js"),
|
|
6
6
|
"./api/set-active-account/handler.ts": () => import("./handler-J2FOxq-2.js"),
|
|
7
7
|
"./api/set-new-password/handler.ts": () => import("./handler-DoyR_l2O.js"),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rpcbase/auth",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.189.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
@@ -96,9 +96,6 @@
|
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
},
|
|
99
|
-
"dependencies": {
|
|
100
|
-
"mailchecker": "6.0.21"
|
|
101
|
-
},
|
|
102
99
|
"peerDependencies": {
|
|
103
100
|
"@rpcbase/api": "*",
|
|
104
101
|
"@rpcbase/db": "*",
|
|
@@ -107,5 +104,7 @@
|
|
|
107
104
|
"@rpcbase/server": "*",
|
|
108
105
|
"clsx": "*"
|
|
109
106
|
},
|
|
110
|
-
"devDependencies": {
|
|
107
|
+
"devDependencies": {
|
|
108
|
+
"mailchecker": "6.0.21"
|
|
109
|
+
}
|
|
111
110
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handler-DOaODKMb.js","names":["z","ROUTE","requestSchema","object","email","string","RequestPayload","infer","responseSchema","success","boolean","error","optional","retryAfterSeconds","number","int","positive","ResponsePayload","crypto","Api","ApiHandler","Ctx","models","sendEmail","AuthSessionUser","RequestPasswordReset","PASSWORD_RESET_COOLDOWN_SECONDS","PASSWORD_RESET_CODE_TTL_SECONDS","maskEmailForLog","email","localRaw","domainRaw","split","local","domain","localPrefix","slice","Math","min","length","localMask","repeat","max","domainTailLength","domainTail","domainMask","requestPasswordReset","RequestPayload","ResponsePayload","payload","ctx","Promise","User","getGlobal","parsed","requestSchema","safeParse","success","res","status","error","data","requestedAt","Date","cooldownEligibleExpiresAt","getTime","passwordResetCode","randomInt","toString","padStart","passwordResetCodeExpiresAt","user","findOneAndUpdate","$or","$exists","$lte","$set","$unset","passwordResetToken","passwordResetTokenExpiresAt","returnDocument","setHeader","String","existingUser","findOne","_id","console","info","to","subject","html","text","err","retryAfterSeconds","releaseResult","updateOne","modifiedCount","removeHeader","releaseErr","api","post","ROUTE"],"sources":["../src/api/request-password-reset/index.ts","../src/api/request-password-reset/handler.ts"],"sourcesContent":["import { z } from \"zod\"\n\n\nexport const ROUTE = \"/api/rb/auth/request-password-reset\"\n\nexport const requestSchema = z.object({\n email: z.string().email(),\n})\n\nexport type RequestPayload = z.infer<typeof requestSchema>\n\nexport const responseSchema = z.object({\n success: z.boolean(),\n error: z.string().optional(),\n retryAfterSeconds: z.number().int().positive().optional(),\n})\n\nexport type ResponsePayload = z.infer<typeof responseSchema>\n","import crypto from \"crypto\"\n\nimport { Api, ApiHandler, Ctx } from \"@rpcbase/api\"\nimport { models } from \"@rpcbase/db\"\nimport { sendEmail } from \"@rpcbase/server\"\n\nimport type { AuthSessionUser } from \"../../types\"\n\nimport * as RequestPasswordReset from \"./index\"\n\n\nexport const PASSWORD_RESET_COOLDOWN_SECONDS = 60\nconst PASSWORD_RESET_CODE_TTL_SECONDS = 10 * 60\n\nconst maskEmailForLog = (email: string) => {\n const [localRaw, domainRaw = \"\"] = email.split(\"@\")\n const local = localRaw || \"\"\n const domain = domainRaw || \"\"\n const localPrefix = local.slice(0, Math.min(3, local.length))\n const localMask = \"*\".repeat(Math.max(5, local.length - localPrefix.length))\n\n if (!domain) {\n return `${localPrefix}${localMask}@****`\n }\n\n const domainTailLength = Math.min(7, domain.length)\n const domainTail = domain.slice(-domainTailLength)\n const domainMask = \"*\".repeat(Math.max(4, domain.length - domainTailLength))\n\n return `${localPrefix}${localMask}@${domainMask}${domainTail}`\n}\n\n\nexport const requestPasswordReset: ApiHandler<\n RequestPasswordReset.RequestPayload,\n RequestPasswordReset.ResponsePayload,\n AuthSessionUser\n> = async(\n payload,\n ctx: Ctx<AuthSessionUser>\n): Promise<RequestPasswordReset.ResponsePayload> => {\n const User = await models.getGlobal(\"RBUser\", ctx)\n\n const parsed = RequestPasswordReset.requestSchema.safeParse(payload)\n\n if (!parsed.success) {\n ctx.res.status(400)\n return { success: false, error: \"invalid_payload\" }\n }\n\n const { email } = parsed.data\n const requestedAt = new Date()\n const cooldownEligibleExpiresAt = new Date(\n requestedAt.getTime() + (PASSWORD_RESET_CODE_TTL_SECONDS - PASSWORD_RESET_COOLDOWN_SECONDS) * 1000,\n )\n const passwordResetCode = crypto.randomInt(0, 1_000_000).toString().padStart(6, \"0\")\n const passwordResetCodeExpiresAt = new Date(requestedAt.getTime() + PASSWORD_RESET_CODE_TTL_SECONDS * 1000)\n\n const user = await User.findOneAndUpdate(\n {\n email,\n $or: [\n { passwordResetCodeExpiresAt: { $exists: false } },\n { passwordResetCodeExpiresAt: { $lte: cooldownEligibleExpiresAt } },\n ],\n },\n {\n $set: {\n passwordResetCode,\n passwordResetCodeExpiresAt,\n },\n $unset: {\n passwordResetToken: \"\",\n passwordResetTokenExpiresAt: \"\",\n },\n },\n { returnDocument: \"after\" },\n )\n\n ctx.res.setHeader(\"Retry-After\", String(PASSWORD_RESET_COOLDOWN_SECONDS))\n\n if (!user) {\n const existingUser = await User.findOne({ email }, { _id: 1 })\n\n if (!existingUser) {\n try {\n console.info(`sending password reset account notice to email ${maskEmailForLog(email)}`)\n await sendEmail({\n to: email,\n subject: \"No account found for your password reset request\",\n html: `\n <p>Hello,</p>\n <p>You requested a new password reset code for this email address, but unfortunately we couldn't find an account associated with it.</p>\n <p>If you didn't request this, you can ignore this message.</p>\n <p>If you're having trouble accessing your account, please contact support.</p>\n `,\n text: \"Hello, You requested a new password reset code for this email address, but unfortunately we couldn't find an account associated with it. If you didn't request this, you can ignore this message. If you're having trouble accessing your account, please contact support.\",\n })\n } catch (err) {\n console.error(\"failed to send password reset account notice email\", err)\n ctx.res.status(500)\n return { success: false, error: \"email_delivery_failed\" }\n }\n }\n\n return { success: true, retryAfterSeconds: PASSWORD_RESET_COOLDOWN_SECONDS }\n }\n\n try {\n console.info(`sending password reset to email ${maskEmailForLog(email)}`)\n await sendEmail({\n to: email,\n subject: `Your password reset code: ${passwordResetCode}`,\n html: `\n <p>Your password reset code is <strong>${passwordResetCode}</strong>. It expires in 10 minutes.</p>\n <p>If you didn't request this, you can ignore this message.</p>\n `,\n text: `Your password reset code is ${passwordResetCode}. It expires in 10 minutes. If you didn't request this, you can ignore this message.`,\n })\n } catch (err) {\n console.error(\"failed to send password reset email\", err)\n\n try {\n const releaseResult = await User.updateOne(\n { _id: user._id, passwordResetCode },\n {\n $unset: {\n passwordResetCode: \"\",\n passwordResetCodeExpiresAt: \"\",\n },\n },\n )\n if (releaseResult.modifiedCount > 0) {\n ctx.res.removeHeader(\"Retry-After\")\n }\n } catch (releaseErr) {\n console.error(\"failed to release password reset cooldown\", releaseErr)\n }\n\n ctx.res.status(500)\n return { success: false, error: \"email_delivery_failed\" }\n }\n\n return { success: true, retryAfterSeconds: PASSWORD_RESET_COOLDOWN_SECONDS }\n}\n\nexport default (api: Api<AuthSessionUser>) => {\n api.post(RequestPasswordReset.ROUTE, requestPasswordReset)\n}\n"],"mappings":"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"}
|