import varDatabaseDbHandler from "../../backend/varDatabaseDbHandler"; import nodemailer from "nodemailer"; import getAuthCookieNames from "../../backend/cookies/get-auth-cookie-names"; import encrypt from "../../dsql/encrypt"; import serializeCookies from "../../../utils/serialize-cookies"; /** * # Send Email Login Code */ export default async function apiSendEmailCode({ email, database, email_login_field, mail_domain, mail_port, sender, mail_username, mail_password, html, response, extraCookies, }) { if (email === null || email === void 0 ? void 0 : email.match(/ /)) { return { success: false, msg: "Invalid Email/Password format", }; } const createdAt = Date.now(); const foundUserQuery = `SELECT * FROM ${database}.users WHERE email = ?`; const foundUserValues = [email]; let foundUser = await varDatabaseDbHandler({ queryString: foundUserQuery, queryValuesArray: foundUserValues, database, }); //////////////////////////////////////// //////////////////////////////////////// //////////////////////////////////////// if (!foundUser || !foundUser[0]) { return { success: false, msg: "No user found", }; } function generateCode() { const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; let code = ""; for (let i = 0; i < 8; i++) { code += chars[Math.floor(Math.random() * chars.length)]; } return code; } if ((foundUser === null || foundUser === void 0 ? void 0 : foundUser[0]) && email_login_field) { const tempCode = generateCode(); let transporter = nodemailer.createTransport({ host: mail_domain || process.env.DSQL_MAIL_HOST, port: mail_port ? mail_port : process.env.DSQL_MAIL_PORT ? Number(process.env.DSQL_MAIL_PORT) : 465, secure: true, auth: { user: mail_username || process.env.DSQL_MAIL_EMAIL, pass: mail_password || process.env.DSQL_MAIL_PASSWORD, }, }); let mailObject = {}; mailObject["from"] = `"Datasquirel SSO" <${sender || "support@datasquirel.com"}>`; mailObject["sender"] = sender || "support@datasquirel.com"; mailObject["to"] = email; mailObject["subject"] = "One Time Login Code"; mailObject["html"] = html.replace(/{{code}}/, tempCode); const info = await transporter.sendMail(mailObject); if (!(info === null || info === void 0 ? void 0 : info.accepted)) throw new Error("Mail not Sent!"); const setTempCodeQuery = `UPDATE ${database}.users SET ${email_login_field} = ? WHERE email = ?`; const setTempCodeValues = [tempCode + `-${createdAt}`, email]; let setTempCode = await varDatabaseDbHandler({ queryString: setTempCodeQuery, queryValuesArray: setTempCodeValues, database, }); /** @type {import("../../../types").SendOneTimeCodeEmailResponse} */ const resObject = { success: true, code: tempCode, email: email, createdAt, msg: "Success", }; if (response) { const cookieKeyNames = getAuthCookieNames(); const oneTimeCodeCookieName = cookieKeyNames.oneTimeCodeName; const encryptedPayload = encrypt({ data: JSON.stringify(resObject), }); if (!encryptedPayload) { throw new Error("apiSendEmailCode Error: Failed to encrypt payload"); } /** @type {import("../../../../package-shared/types").CookieObject} */ const oneTimeCookieObject = { name: oneTimeCodeCookieName, value: encryptedPayload, sameSite: "Strict", path: "/", httpOnly: true, secure: true, }; /** @type {import("../../../../package-shared/types").CookieObject[]} */ const cookiesObjectArray = extraCookies ? [...extraCookies, oneTimeCookieObject] : [oneTimeCookieObject]; const serializedCookies = serializeCookies({ cookies: cookiesObjectArray, }); response.setHeader("Set-Cookie", serializedCookies); } return resObject; } else { return { success: false, msg: "Invalid Email/Password format", }; } }