This commit is contained in:
Benjamin Toby
2024-12-10 15:10:32 +01:00
parent a1d2325156
commit 04a4452821
19 changed files with 161 additions and 340 deletions
@@ -1,4 +1,4 @@
declare function _exports({ email, database, email_login_field, mail_domain, mail_port, sender, mail_username, mail_password, html, useLocal, }: {
declare function _exports({ email, database, email_login_field, mail_domain, mail_port, sender, mail_username, mail_password, html, useLocal, response, }: {
email: string;
database: string;
email_login_field?: string;
@@ -9,8 +9,9 @@ declare function _exports({ email, database, email_login_field, mail_domain, mai
mail_password?: string;
html: string;
useLocal?: boolean;
}): Promise<{
success: boolean;
msg?: string;
}>;
response?: http.ServerResponse & {
[x: string]: any;
};
}): Promise<import("../../../types").SendOneTimeCodeEmailResponse>;
export = _exports;
import http = require("http");
@@ -3,6 +3,9 @@
const LOCAL_DB_HANDLER = require("../../../utils/backend/global-db/LOCAL_DB_HANDLER");
const varDatabaseDbHandler = require("../../backend/varDatabaseDbHandler");
const nodemailer = require("nodemailer");
const http = require("http");
const getAuthCookieNames = require("../../backend/cookies/get-auth-cookie-names");
const encrypt = require("../../dsql/encrypt");
/**
* # Send Email Login Code
@@ -18,8 +21,9 @@ const nodemailer = require("nodemailer");
* @param {string} [param.mail_password]
* @param {string} param.html
* @param {boolean} [param.useLocal]
* @param {http.ServerResponse & Object<string,any>} [param.response]
*
* @returns {Promise<{success: boolean, msg?: string}>}
* @returns {Promise<import("../../../types").SendOneTimeCodeEmailResponse>}
*/
module.exports = async function apiSendEmailCode({
email,
@@ -32,6 +36,7 @@ module.exports = async function apiSendEmailCode({
mail_password,
html,
useLocal,
response,
}) {
if (email?.match(/ /)) {
return {
@@ -39,10 +44,7 @@ module.exports = async function apiSendEmailCode({
msg: "Invalid Email/Password format",
};
}
////////////////////////////////////////
////////////////////////////////////////
////////////////////////////////////////
const createdAt = Date.now();
const foundUserQuery = `SELECT * FROM users WHERE email = ?`;
const foundUserValues = [email];
@@ -74,7 +76,7 @@ module.exports = async function apiSendEmailCode({
return code;
}
if (foundUser && foundUser[0] && email_login_field) {
if (foundUser?.[0] && email_login_field) {
const tempCode = generateCode();
let transporter = nodemailer.createTransport({
@@ -102,7 +104,7 @@ module.exports = async function apiSendEmailCode({
if (!info?.accepted) throw new Error("Mail not Sent!");
const setTempCodeQuery = `UPDATE users SET ${email_login_field} = ? WHERE email = ?`;
const setTempCodeValues = [tempCode + `-${Date.now()}`, email];
const setTempCodeValues = [tempCode + `-${createdAt}`, email];
let setTempCode = await varDatabaseDbHandler({
queryString: setTempCodeQuery,
@@ -110,10 +112,34 @@ module.exports = async function apiSendEmailCode({
database: database,
useLocal,
});
}
return {
success: true,
msg: "Success",
};
/** @type {import("../../../types").SendOneTimeCodeEmailResponse} */
const resObject = {
success: true,
code: tempCode,
email: email,
createdAt,
msg: "Success",
};
if (response) {
const keyNames = getAuthCookieNames();
const oneTimeCodeCookieName = keyNames.oneTimeCodeName;
const encryptedPayload = encrypt({
data: JSON.stringify(resObject),
});
response?.setHeader("Set-Cookie", [
`${oneTimeCodeCookieName}=${encryptedPayload};samesite=strict;path=/;HttpOnly=true;Secure=true`,
]);
}
return resObject;
} else {
return {
success: false,
msg: "Invalid Email/Password format",
};
}
};
@@ -4,5 +4,6 @@ declare function _exports(params?: {
}): {
keyCookieName: string;
csrfCookieName: string;
oneTimeCodeName: string;
};
export = _exports;
@@ -7,12 +7,14 @@
* @param {string} [params.database]
* @param {string | number} [params.userId]
*
* @returns {{ keyCookieName: string, csrfCookieName: string }}
* @returns {{ keyCookieName: string, csrfCookieName: string, oneTimeCodeName: string }}
*/
module.exports = function getAuthCookieNames(params) {
const cookiesPrefix = process.env.DSQL_COOKIES_PREFIX || "dsql_";
const cookiesKeyName = process.env.DSQL_COOKIES_KEY_NAME || "key";
const cookiesCSRFName = process.env.DSQL_COOKIES_CSRF_NAME || "csrf";
const cookieOneTimeCodeName =
process.env.DSQL_COOKIES_ONE_TIME_CODE_NAME || "one-time-code";
const targetDatabase =
params?.database ||
@@ -28,8 +30,14 @@ module.exports = function getAuthCookieNames(params) {
if (targetDatabase) csrfCookieName += `${targetDatabase}_`;
csrfCookieName += cookiesCSRFName;
let oneTimeCodeName = cookiesPrefix;
if (params?.userId) oneTimeCodeName += `user_${params.userId}_`;
if (targetDatabase) oneTimeCodeName += `${targetDatabase}_`;
oneTimeCodeName += cookieOneTimeCodeName;
return {
keyCookieName,
csrfCookieName,
oneTimeCodeName,
};
};
+7
View File
@@ -1195,4 +1195,11 @@ export interface AceEditorOptions {
wrapBehavioursEnabled?: boolean;
wrapMethod?: "code" | "text" | "auto";
}
export type SendOneTimeCodeEmailResponse = {
success: boolean;
code?: string;
createdAt?: number;
email?: string;
msg?: string;
};
export {};
+8
View File
@@ -1417,3 +1417,11 @@ export interface AceEditorOptions {
wrapBehavioursEnabled?: boolean;
wrapMethod?: "code" | "text" | "auto";
}
export type SendOneTimeCodeEmailResponse = {
success: boolean;
code?: string;
createdAt?: number;
email?: string;
msg?: string;
};
+5
View File
@@ -0,0 +1,5 @@
declare function _exports({ request }: {
request: http.IncomingMessage;
}): any | null;
export = _exports;
import http = require("http");