This commit is contained in:
Benjamin Toby
2024-12-15 12:27:16 +01:00
parent d9d32a4643
commit bc037e839f
314 changed files with 10191 additions and 408 deletions
@@ -128,8 +128,12 @@ module.exports = async function apiCreateUser({
tableName: "users",
data: {
...payload,
image: "/images/user-preset.png",
image_thumbnail: "/images/user-preset-thumbnail.png",
image:
process.env.DSQL_DEFAULT_USER_IMAGE ||
"/images/user-preset.png",
image_thumbnail:
process.env.DSQL_DEFAULT_USER_IMAGE ||
"/images/user-preset-thumbnail.png",
},
useLocal,
});
@@ -103,8 +103,8 @@ module.exports = async function apiLoginUser({
if (isPasswordCorrect && email_login) {
const resetTempCode = await varDatabaseDbHandler({
queryString: `UPDATE users SET ${email_login_field} = ? WHERE email = ? OR username = ?`,
queryValuesArray: ["", email, username],
queryString: `UPDATE users SET ${email_login_field} = '' WHERE email = ? OR username = ?`,
queryValuesArray: [email, username],
database: dbFullName.replace(/[^a-z0-9_]/g, ""),
useLocal,
});
@@ -1,8 +1,11 @@
// @ts-check
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");
const serializeCookies = require("../../../utils/serialize-cookies");
/**
* # Send Email Login Code
@@ -18,8 +21,10 @@ 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]
* @param {import("../../../../package-shared/types").CookieObject[]} [param.extraCookies]
*
* @returns {Promise<{success: boolean, msg?: string}>}
* @returns {Promise<import("../../../types").SendOneTimeCodeEmailResponse>}
*/
module.exports = async function apiSendEmailCode({
email,
@@ -32,6 +37,8 @@ module.exports = async function apiSendEmailCode({
mail_password,
html,
useLocal,
response,
extraCookies,
}) {
if (email?.match(/ /)) {
return {
@@ -39,10 +46,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,12 +78,12 @@ 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({
host: mail_domain || process.env.DSQL_MAIL_HOST,
port: mail_port || 465,
port: mail_port || process.env.DSQL_MAIL_PORT || 465,
secure: true,
auth: {
user: mail_username || process.env.DSQL_MAIL_EMAIL,
@@ -102,7 +106,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 +114,57 @@ 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 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",
};
}
};
@@ -16,7 +16,7 @@ const camelJoinedtoCamelSpace = require("../../../../utils/camelJoinedtoCamelSpa
* @param {string} [param.email]
* @param {string | number} [param.userId]
*
* @returns {Promise<import("../../../../types").APIGoogleLoginFunctionReturn>}
* @returns {Promise<import("../../../../types").APILoginFunctionReturn>}
*/
module.exports = async function apiGithubLogin({
code,
@@ -45,7 +45,7 @@ module.exports = async function apiGoogleLogin({
if (!database || typeof database != "string" || database?.match(/ /)) {
return {
success: false,
user: undefined,
payload: undefined,
msg: "Please provide a database slug(database name in lowercase with no spaces)",
};
}
@@ -89,7 +89,7 @@ module.exports = async function apiGoogleLogin({
return {
success: false,
user: undefined,
payload: undefined,
msg: error.message,
};
}
@@ -4,7 +4,7 @@ const fs = require("fs");
const decrypt = require("../dsql/decrypt");
/** @type {import("../../types").CheckApiCredentialsFn} */
const grabApiCred = ({ key, database, table, user_id }) => {
const grabApiCred = ({ key, database, table, user_id, media }) => {
if (!key) return null;
if (!user_id) return null;
@@ -27,6 +27,8 @@ const grabApiCred = ({ key, database, table, user_id }) => {
if (!isApiKeyValid) return null;
if (!ApiObject.target_database) return ApiObject;
if (media) return ApiObject;
if (!database && ApiObject.target_database) return null;
const isDatabaseAllowed = ApiObject.target_database
?.split(",")
@@ -41,7 +43,7 @@ const grabApiCred = ({ key, database, table, user_id }) => {
return null;
} catch (/** @type {any} */ error) {
console.log(`api-cred ERROR: ${error.message}`);
return null;
return { error: `api-cred ERROR: ${error.message}` };
}
};
@@ -4,7 +4,10 @@ const fs = require("fs");
const path = require("path");
const grabAuthDirs = () => {
const ROOT_DIR = path.resolve(process.cwd(), "./.tmp");
const DSQL_AUTH_DIR = process.env.DSQL_AUTH_DIR;
const ROOT_DIR = DSQL_AUTH_DIR?.match(/./)
? DSQL_AUTH_DIR
: path.resolve(process.cwd(), "./.tmp");
const AUTH_DIR = path.join(ROOT_DIR, "logins");
return { root: ROOT_DIR, auth: AUTH_DIR };
@@ -7,15 +7,17 @@
* @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 ||
params?.database?.replace(/^datasquirel_user_\d+_/, "") ||
process.env.DSQL_DB_NAME?.replace(/^datasquirel_user_\d+_/, "");
let keyCookieName = cookiesPrefix;
@@ -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,
};
};
@@ -2,7 +2,6 @@
const sanitizeHtml = require("sanitize-html");
const sanitizeHtmlOptions = require("../html/sanitizeHtmlOptions");
const updateDb = require("./updateDbEntry");
const updateDbEntry = require("./updateDbEntry");
const _ = require("lodash");
const DB_HANDLER = require("../../../utils/backend/global-db/DB_HANDLER");
@@ -160,7 +159,9 @@ async function addDbEntry({
console.log("DSQL: Encrypted value =>", value);
}
if (targetFieldSchema?.richText) {
const htmlRegex = /<[^>]+>/g;
if (targetFieldSchema?.richText || String(value).match(htmlRegex)) {
value = sanitizeHtml(value, sanitizeHtmlOptions);
}
@@ -98,7 +98,9 @@ async function updateDbEntry({
if (value == null || value == undefined) continue;
if (targetFieldSchema?.richText) {
const htmlRegex = /<[^>]+>/g;
if (targetFieldSchema?.richText || String(value).match(htmlRegex)) {
value = sanitizeHtml(value, sanitizeHtmlOptions);
}
@@ -17,7 +17,7 @@ const path = require("path");
* @param {string | number} params.userId
* @returns {import("../../types").DSQL_DatabaseSchemaType[] | null}
*/
export default function grabUserSchemaData({ userId }) {
module.exports = function grabUserSchemaData({ userId }) {
try {
const userSchemaFilePath = path.resolve(
process.cwd(),
@@ -36,7 +36,7 @@ export default function grabUserSchemaData({ userId }) {
return null;
}
}
};
/** ****************************************************************************** */
/** ****************************************************************************** */
@@ -18,7 +18,7 @@ const path = require("path");
* @param {import("../../types").DSQL_DatabaseSchemaType[]} params.schemaData
* @returns {boolean}
*/
export default function setUserSchemaData({ userId, schemaData }) {
module.exports = function setUserSchemaData({ userId, schemaData }) {
try {
const userSchemaFilePath = path.resolve(
process.cwd(),
@@ -39,7 +39,7 @@ export default function setUserSchemaData({ userId, schemaData }) {
return false;
}
}
};
/** ****************************************************************************** */
/** ****************************************************************************** */