This commit is contained in:
Benjamin Toby 2025-05-12 10:47:47 +01:00
parent 07c2186b98
commit 674af34355
9 changed files with 268 additions and 231 deletions

View File

@ -13,29 +13,23 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.default = reauthUser; exports.default = reauthUser;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const encrypt_1 = __importDefault(require("../../functions/dsql/encrypt"));
const user_auth_1 = __importDefault(require("./user-auth")); const user_auth_1 = __importDefault(require("./user-auth"));
const grab_host_names_1 = __importDefault(require("../../utils/grab-host-names")); const grab_host_names_1 = __importDefault(require("../../utils/grab-host-names"));
const api_reauth_user_1 = __importDefault(require("../../functions/api/users/api-reauth-user")); const login_user_1 = __importDefault(require("./login-user"));
const write_auth_files_1 = require("../../functions/backend/auth/write-auth-files");
const get_auth_cookie_names_1 = __importDefault(require("../../functions/backend/cookies/get-auth-cookie-names"));
const grab_cookie_expirt_date_1 = __importDefault(require("../../utils/grab-cookie-expirt-date"));
/** /**
* # Reauthorize User * # Reauthorize User
*/ */
function reauthUser(_a) { function reauthUser(_a) {
return __awaiter(this, arguments, void 0, function* ({ key, database, response, request, level, encryptionKey, encryptionSalt, additionalFields, encryptedUserString, user_id, secureCookie, }) { return __awaiter(this, arguments, void 0, function* ({ key, database, response, request, level, encryptionKey, encryptionSalt, additionalFields, encryptedUserString, user_id, secureCookie, }) {
var _b, _c; var _b;
/** /**
* Check Encryption Keys * Check Encryption Keys
* *
* @description Check Encryption Keys * @description Check Encryption Keys
*/ */
const grabedHostNames = (0, grab_host_names_1.default)(); const grabedHostNames = (0, grab_host_names_1.default)();
const { host, port, scheme } = grabedHostNames; // const { host, port, scheme } = grabedHostNames;
const COOKIE_EXPIRY_DATE = (0, grab_cookie_expirt_date_1.default)(); // const COOKIE_EXPIRY_DATE = grabCookieExpiryDate();
const finalEncryptionKey = encryptionKey || process.env.DSQL_ENCRYPTION_PASSWORD; const finalEncryptionKey = encryptionKey || process.env.DSQL_ENCRYPTION_PASSWORD;
const finalEncryptionSalt = encryptionSalt || process.env.DSQL_ENCRYPTION_SALT; const finalEncryptionSalt = encryptionSalt || process.env.DSQL_ENCRYPTION_SALT;
const existingUser = (0, user_auth_1.default)({ const existingUser = (0, user_auth_1.default)({
@ -53,6 +47,19 @@ function reauthUser(_a) {
msg: "Cookie Credentials Invalid", msg: "Cookie Credentials Invalid",
}; };
} }
return yield (0, login_user_1.default)({
database: database || "",
payload: {
email: existingUser.payload.email,
},
additionalFields,
skipPassword: true,
response,
request,
user_id,
secureCookie,
key,
});
/** /**
* Initialize HTTP response variable * Initialize HTTP response variable
*/ */
@ -62,97 +69,111 @@ function reauthUser(_a) {
* *
* @description Look for local db settings in `.env` file and by pass the http request if available * @description Look for local db settings in `.env` file and by pass the http request if available
*/ */
const { DSQL_DB_HOST, DSQL_DB_USERNAME, DSQL_DB_PASSWORD, DSQL_DB_NAME } = process.env; // const { DSQL_DB_HOST, DSQL_DB_USERNAME, DSQL_DB_PASSWORD, DSQL_DB_NAME } =
if ((DSQL_DB_HOST === null || DSQL_DB_HOST === void 0 ? void 0 : DSQL_DB_HOST.match(/./)) && // process.env;
(DSQL_DB_USERNAME === null || DSQL_DB_USERNAME === void 0 ? void 0 : DSQL_DB_USERNAME.match(/./)) && // if (
(DSQL_DB_PASSWORD === null || DSQL_DB_PASSWORD === void 0 ? void 0 : DSQL_DB_PASSWORD.match(/./)) && // DSQL_DB_HOST?.match(/./) &&
(DSQL_DB_NAME === null || DSQL_DB_NAME === void 0 ? void 0 : DSQL_DB_NAME.match(/./)) && // DSQL_DB_USERNAME?.match(/./) &&
global.DSQL_USE_LOCAL) { // DSQL_DB_PASSWORD?.match(/./) &&
let dbSchema; // DSQL_DB_NAME?.match(/./) &&
try { // global.DSQL_USE_LOCAL
const localDbSchemaPath = path_1.default.resolve(process.cwd(), "dsql.schema.json"); // ) {
dbSchema = JSON.parse(fs_1.default.readFileSync(localDbSchemaPath, "utf8")); // let dbSchema: import("../../types").DSQL_DatabaseSchemaType | undefined;
} // try {
catch (error) { } // const localDbSchemaPath = path.resolve(
httpResponse = yield (0, api_reauth_user_1.default)({ // process.cwd(),
existingUser: existingUser.payload, // "dsql.schema.json"
additionalFields, // );
}); // dbSchema = JSON.parse(fs.readFileSync(localDbSchemaPath, "utf8"));
} // } catch (error) {}
else { // httpResponse = await apiReauthUser({
/** // existingUser: existingUser.payload,
* Make https request // additionalFields,
* // });
* @description make a request to datasquirel.com // } else {
*/ // /**
httpResponse = (yield new Promise((resolve, reject) => { // * Make https request
const reqPayload = JSON.stringify({ // *
existingUser: existingUser.payload, // * @description make a request to datasquirel.com
database, // */
additionalFields, // httpResponse = (await new Promise((resolve, reject) => {
}); // const reqPayload = JSON.stringify({
const httpsRequest = scheme.request({ // existingUser: existingUser.payload,
method: "POST", // database,
headers: { // additionalFields,
"Content-Type": "application/json", // });
"Content-Length": Buffer.from(reqPayload).length, // const httpsRequest = scheme.request(
Authorization: key || // {
process.env.DSQL_FULL_ACCESS_API_KEY || // method: "POST",
process.env.DSQL_API_KEY, // headers: {
}, // "Content-Type": "application/json",
port, // "Content-Length": Buffer.from(reqPayload).length,
hostname: host, // Authorization:
path: `/api/user/${user_id || grabedHostNames.user_id}/reauth-user`, // key ||
}, // process.env.DSQL_FULL_ACCESS_API_KEY ||
/** // process.env.DSQL_API_KEY,
* Callback Function // },
* // port,
* @description https request callback // hostname: host,
*/ // path: `/api/user/${
(response) => { // user_id || grabedHostNames.user_id
var str = ""; // }/reauth-user`,
response.on("data", function (chunk) { // },
str += chunk; // /**
}); // * Callback Function
response.on("end", function () { // *
resolve(JSON.parse(str)); // * @description https request callback
}); // */
response.on("error", (err) => { // (response) => {
reject(err); // var str = "";
}); // response.on("data", function (chunk) {
}); // str += chunk;
httpsRequest.write(reqPayload); // });
httpsRequest.end(); // response.on("end", function () {
})); // resolve(JSON.parse(str));
} // });
/** // response.on("error", (err) => {
* Make https request // reject(err);
* // });
* @description make a request to datasquirel.com // }
*/ // );
if (httpResponse === null || httpResponse === void 0 ? void 0 : httpResponse.success) { // httpsRequest.write(reqPayload);
let encryptedPayload = (0, encrypt_1.default)({ // httpsRequest.end();
data: JSON.stringify(httpResponse.payload), // })) as APILoginFunctionReturn;
encryptionKey: finalEncryptionKey, // }
encryptionSalt: finalEncryptionSalt, // /**
}); // * Make https request
const cookieNames = (0, get_auth_cookie_names_1.default)({ // *
database, // * @description make a request to datasquirel.com
userId: user_id || grabedHostNames.user_id, // */
}); // if (httpResponse?.success) {
httpResponse["cookieNames"] = cookieNames; // let encryptedPayload = encrypt({
httpResponse["key"] = String(encryptedPayload); // data: JSON.stringify(httpResponse.payload),
const authKeyName = cookieNames.keyCookieName; // encryptionKey: finalEncryptionKey,
const csrfName = cookieNames.csrfCookieName; // encryptionSalt: finalEncryptionSalt,
response === null || response === void 0 ? void 0 : response.setHeader("Set-Cookie", [ // });
`${authKeyName}=${encryptedPayload};samesite=strict;path=/;HttpOnly=true;Expires=${COOKIE_EXPIRY_DATE}${secureCookie ? ";Secure=true" : ""}`, // const cookieNames = getAuthCookieNames({
`${csrfName}=${(_c = httpResponse.payload) === null || _c === void 0 ? void 0 : _c.csrf_k};samesite=strict;path=/;HttpOnly=true;Expires=${COOKIE_EXPIRY_DATE}`, // database,
]); // userId: user_id || grabedHostNames.user_id,
if (httpResponse.csrf) { // });
(0, write_auth_files_1.deleteAuthFile)(String(existingUser.payload.csrf_k)); // httpResponse["cookieNames"] = cookieNames;
(0, write_auth_files_1.writeAuthFile)(httpResponse.csrf, JSON.stringify(httpResponse.payload)); // httpResponse["key"] = String(encryptedPayload);
} // const authKeyName = cookieNames.keyCookieName;
} // const csrfName = cookieNames.csrfCookieName;
return httpResponse; // response?.setHeader("Set-Cookie", [
// `${authKeyName}=${encryptedPayload};samesite=strict;path=/;HttpOnly=true;Expires=${COOKIE_EXPIRY_DATE}${
// secureCookie ? ";Secure=true" : ""
// }`,
// `${csrfName}=${httpResponse.payload?.csrf_k};samesite=strict;path=/;HttpOnly=true;Expires=${COOKIE_EXPIRY_DATE}`,
// ]);
// if (httpResponse.csrf) {
// deleteAuthFile(String(existingUser.payload.csrf_k));
// writeAuthFile(
// httpResponse.csrf,
// JSON.stringify(httpResponse.payload)
// );
// }
// }
// return httpResponse;
}); });
} }

View File

@ -1,5 +1,4 @@
"use strict"; "use strict";
// @ts-check
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
const sanitizeHtmlOptions = { const sanitizeHtmlOptions = {
allowedTags: [ allowedTags: [
@ -27,9 +26,9 @@ const sanitizeHtmlOptions = {
"br", "br",
], ],
allowedAttributes: { allowedAttributes: {
a: ["href"], a: ["href", "title", "class", "style"],
img: ["src", "alt", "width", "height", "class", "style"], img: ["src", "alt", "width", "height", "class", "style"],
"*": ["style", "class"], "*": ["style", "class", "title"],
}, },
}; };
exports.default = sanitizeHtmlOptions; exports.default = sanitizeHtmlOptions;

View File

@ -949,6 +949,7 @@ export type ServerQueryParam<T extends {
[k: string]: any; [k: string]: any;
}> = { }> = {
selectFields?: string[]; selectFields?: string[];
omitFields?: string[];
query?: ServerQueryQueryObject<T>; query?: ServerQueryQueryObject<T>;
limit?: number; limit?: number;
page?: number; page?: number;
@ -1003,6 +1004,11 @@ export type ServerQueryParamsJoin<Table extends string = string, Field extends o
alias?: string; alias?: string;
count?: boolean; count?: boolean;
})[]; })[];
omitFields?: (keyof Field | {
field: keyof Field;
alias?: string;
count?: boolean;
})[];
operator?: (typeof ServerQueryOperators)[number]; operator?: (typeof ServerQueryOperators)[number];
}; };
export type ServerQueryParamsJoinMatchObject<Field extends object = { export type ServerQueryParamsJoinMatchObject<Field extends object = {

View File

@ -24,7 +24,7 @@ function slugify(str) {
.replace(/^-/, "") .replace(/^-/, "")
.replace(/-$/, ""); .replace(/-$/, "");
} }
catch ( /** @type {any} */error) { catch (error) {
console.log(`Slugify ERROR: ${error.message}`); console.log(`Slugify ERROR: ${error.message}`);
return ""; return "";
} }

View File

@ -1,18 +1,8 @@
import http from "http"; import http from "http";
import fs from "fs";
import path from "path";
import encrypt from "../../functions/dsql/encrypt";
import userAuth from "./user-auth"; import userAuth from "./user-auth";
import grabHostNames from "../../utils/grab-host-names"; import grabHostNames from "../../utils/grab-host-names";
import apiReauthUser from "../../functions/api/users/api-reauth-user";
import {
writeAuthFile,
deleteAuthFile,
} from "../../functions/backend/auth/write-auth-files";
import getAuthCookieNames from "../../functions/backend/cookies/get-auth-cookie-names";
import { APILoginFunctionReturn } from "../../types"; import { APILoginFunctionReturn } from "../../types";
import grabCookieExpiryDate from "../../utils/grab-cookie-expirt-date"; import loginUser from "./login-user";
type Param = { type Param = {
key?: string; key?: string;
@ -50,8 +40,8 @@ export default async function reauthUser({
* @description Check Encryption Keys * @description Check Encryption Keys
*/ */
const grabedHostNames = grabHostNames(); const grabedHostNames = grabHostNames();
const { host, port, scheme } = grabedHostNames; // const { host, port, scheme } = grabedHostNames;
const COOKIE_EXPIRY_DATE = grabCookieExpiryDate(); // const COOKIE_EXPIRY_DATE = grabCookieExpiryDate();
const finalEncryptionKey = const finalEncryptionKey =
encryptionKey || process.env.DSQL_ENCRYPTION_PASSWORD; encryptionKey || process.env.DSQL_ENCRYPTION_PASSWORD;
@ -75,6 +65,20 @@ export default async function reauthUser({
}; };
} }
return await loginUser({
database: database || "",
payload: {
email: existingUser.payload.email,
},
additionalFields,
skipPassword: true,
response,
request,
user_id,
secureCookie,
key,
});
/** /**
* Initialize HTTP response variable * Initialize HTTP response variable
*/ */
@ -85,126 +89,126 @@ export default async function reauthUser({
* *
* @description Look for local db settings in `.env` file and by pass the http request if available * @description Look for local db settings in `.env` file and by pass the http request if available
*/ */
const { DSQL_DB_HOST, DSQL_DB_USERNAME, DSQL_DB_PASSWORD, DSQL_DB_NAME } = // const { DSQL_DB_HOST, DSQL_DB_USERNAME, DSQL_DB_PASSWORD, DSQL_DB_NAME } =
process.env; // process.env;
if ( // if (
DSQL_DB_HOST?.match(/./) && // DSQL_DB_HOST?.match(/./) &&
DSQL_DB_USERNAME?.match(/./) && // DSQL_DB_USERNAME?.match(/./) &&
DSQL_DB_PASSWORD?.match(/./) && // DSQL_DB_PASSWORD?.match(/./) &&
DSQL_DB_NAME?.match(/./) && // DSQL_DB_NAME?.match(/./) &&
global.DSQL_USE_LOCAL // global.DSQL_USE_LOCAL
) { // ) {
let dbSchema: import("../../types").DSQL_DatabaseSchemaType | undefined; // let dbSchema: import("../../types").DSQL_DatabaseSchemaType | undefined;
try { // try {
const localDbSchemaPath = path.resolve( // const localDbSchemaPath = path.resolve(
process.cwd(), // process.cwd(),
"dsql.schema.json" // "dsql.schema.json"
); // );
dbSchema = JSON.parse(fs.readFileSync(localDbSchemaPath, "utf8")); // dbSchema = JSON.parse(fs.readFileSync(localDbSchemaPath, "utf8"));
} catch (error) {} // } catch (error) {}
httpResponse = await apiReauthUser({ // httpResponse = await apiReauthUser({
existingUser: existingUser.payload, // existingUser: existingUser.payload,
additionalFields, // additionalFields,
}); // });
} else { // } else {
/** // /**
* Make https request // * Make https request
* // *
* @description make a request to datasquirel.com // * @description make a request to datasquirel.com
*/ // */
httpResponse = (await new Promise((resolve, reject) => { // httpResponse = (await new Promise((resolve, reject) => {
const reqPayload = JSON.stringify({ // const reqPayload = JSON.stringify({
existingUser: existingUser.payload, // existingUser: existingUser.payload,
database, // database,
additionalFields, // additionalFields,
}); // });
const httpsRequest = scheme.request( // const httpsRequest = scheme.request(
{ // {
method: "POST", // method: "POST",
headers: { // headers: {
"Content-Type": "application/json", // "Content-Type": "application/json",
"Content-Length": Buffer.from(reqPayload).length, // "Content-Length": Buffer.from(reqPayload).length,
Authorization: // Authorization:
key || // key ||
process.env.DSQL_FULL_ACCESS_API_KEY || // process.env.DSQL_FULL_ACCESS_API_KEY ||
process.env.DSQL_API_KEY, // process.env.DSQL_API_KEY,
}, // },
port, // port,
hostname: host, // hostname: host,
path: `/api/user/${ // path: `/api/user/${
user_id || grabedHostNames.user_id // user_id || grabedHostNames.user_id
}/reauth-user`, // }/reauth-user`,
}, // },
/** // /**
* Callback Function // * Callback Function
* // *
* @description https request callback // * @description https request callback
*/ // */
(response) => { // (response) => {
var str = ""; // var str = "";
response.on("data", function (chunk) { // response.on("data", function (chunk) {
str += chunk; // str += chunk;
}); // });
response.on("end", function () { // response.on("end", function () {
resolve(JSON.parse(str)); // resolve(JSON.parse(str));
}); // });
response.on("error", (err) => { // response.on("error", (err) => {
reject(err); // reject(err);
}); // });
} // }
); // );
httpsRequest.write(reqPayload); // httpsRequest.write(reqPayload);
httpsRequest.end(); // httpsRequest.end();
})) as APILoginFunctionReturn; // })) as APILoginFunctionReturn;
} // }
/** // /**
* Make https request // * Make https request
* // *
* @description make a request to datasquirel.com // * @description make a request to datasquirel.com
*/ // */
if (httpResponse?.success) { // if (httpResponse?.success) {
let encryptedPayload = encrypt({ // let encryptedPayload = encrypt({
data: JSON.stringify(httpResponse.payload), // data: JSON.stringify(httpResponse.payload),
encryptionKey: finalEncryptionKey, // encryptionKey: finalEncryptionKey,
encryptionSalt: finalEncryptionSalt, // encryptionSalt: finalEncryptionSalt,
}); // });
const cookieNames = getAuthCookieNames({ // const cookieNames = getAuthCookieNames({
database, // database,
userId: user_id || grabedHostNames.user_id, // userId: user_id || grabedHostNames.user_id,
}); // });
httpResponse["cookieNames"] = cookieNames; // httpResponse["cookieNames"] = cookieNames;
httpResponse["key"] = String(encryptedPayload); // httpResponse["key"] = String(encryptedPayload);
const authKeyName = cookieNames.keyCookieName; // const authKeyName = cookieNames.keyCookieName;
const csrfName = cookieNames.csrfCookieName; // const csrfName = cookieNames.csrfCookieName;
response?.setHeader("Set-Cookie", [ // response?.setHeader("Set-Cookie", [
`${authKeyName}=${encryptedPayload};samesite=strict;path=/;HttpOnly=true;Expires=${COOKIE_EXPIRY_DATE}${ // `${authKeyName}=${encryptedPayload};samesite=strict;path=/;HttpOnly=true;Expires=${COOKIE_EXPIRY_DATE}${
secureCookie ? ";Secure=true" : "" // secureCookie ? ";Secure=true" : ""
}`, // }`,
`${csrfName}=${httpResponse.payload?.csrf_k};samesite=strict;path=/;HttpOnly=true;Expires=${COOKIE_EXPIRY_DATE}`, // `${csrfName}=${httpResponse.payload?.csrf_k};samesite=strict;path=/;HttpOnly=true;Expires=${COOKIE_EXPIRY_DATE}`,
]); // ]);
if (httpResponse.csrf) { // if (httpResponse.csrf) {
deleteAuthFile(String(existingUser.payload.csrf_k)); // deleteAuthFile(String(existingUser.payload.csrf_k));
writeAuthFile( // writeAuthFile(
httpResponse.csrf, // httpResponse.csrf,
JSON.stringify(httpResponse.payload) // JSON.stringify(httpResponse.payload)
); // );
} // }
} // }
return httpResponse; // return httpResponse;
} }

View File

@ -1,5 +1,3 @@
// @ts-check
const sanitizeHtmlOptions = { const sanitizeHtmlOptions = {
allowedTags: [ allowedTags: [
"b", "b",
@ -26,9 +24,9 @@ const sanitizeHtmlOptions = {
"br", "br",
], ],
allowedAttributes: { allowedAttributes: {
a: ["href"], a: ["href", "title", "class", "style"],
img: ["src", "alt", "width", "height", "class", "style"], img: ["src", "alt", "width", "height", "class", "style"],
"*": ["style", "class"], "*": ["style", "class", "title"],
}, },
}; };

View File

@ -1098,6 +1098,7 @@ export type ServerQueryParam<
T extends { [k: string]: any } = { [k: string]: any } T extends { [k: string]: any } = { [k: string]: any }
> = { > = {
selectFields?: string[]; selectFields?: string[];
omitFields?: string[];
query?: ServerQueryQueryObject<T>; query?: ServerQueryQueryObject<T>;
limit?: number; limit?: number;
page?: number; page?: number;
@ -1160,6 +1161,14 @@ export type ServerQueryParamsJoin<
count?: boolean; count?: boolean;
} }
)[]; )[];
omitFields?: (
| keyof Field
| {
field: keyof Field;
alias?: string;
count?: boolean;
}
)[];
operator?: (typeof ServerQueryOperators)[number]; operator?: (typeof ServerQueryOperators)[number];
}; };

View File

@ -21,7 +21,7 @@ export default function slugify(str?: string): string {
.replace(/-{2,}/g, "-") .replace(/-{2,}/g, "-")
.replace(/^-/, "") .replace(/^-/, "")
.replace(/-$/, ""); .replace(/-$/, "");
} catch (/** @type {any} */ error: any) { } catch (error: any) {
console.log(`Slugify ERROR: ${error.message}`); console.log(`Slugify ERROR: ${error.message}`);
return ""; return "";
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "@moduletrace/datasquirel", "name": "@moduletrace/datasquirel",
"version": "4.5.7", "version": "4.5.8",
"description": "Cloud-based SQL data management tool", "description": "Cloud-based SQL data management tool",
"main": "dist/index.js", "main": "dist/index.js",
"bin": { "bin": {