98 lines
2.9 KiB
TypeScript
98 lines
2.9 KiB
TypeScript
import { ServerResponse } from "http";
|
|
import { APIResponseObject } from "../../../types";
|
|
import encrypt from "../../dsql/encrypt";
|
|
import debugLog from "../../../utils/logging/debug-log";
|
|
import getAuthCookieNames from "../cookies/get-auth-cookie-names";
|
|
import { writeAuthFile } from "./write-auth-files";
|
|
import grabCookieExpiryDate from "../../../utils/grab-cookie-expirt-date";
|
|
|
|
function debugFn(log: any, label?: string) {
|
|
debugLog({ log, addTime: true, title: "loginUser", label });
|
|
}
|
|
|
|
type Params = {
|
|
database: string;
|
|
httpResponse: APIResponseObject;
|
|
response?: ServerResponse & { [s: string]: any };
|
|
encryptionKey?: string;
|
|
encryptionSalt?: string;
|
|
debug?: boolean;
|
|
skipWriteAuthFile?: boolean;
|
|
token?: boolean;
|
|
cleanupTokens?: boolean;
|
|
secureCookie?: boolean;
|
|
};
|
|
|
|
/**
|
|
* # Login A user
|
|
*/
|
|
export default function postLoginResponseHandler({
|
|
database,
|
|
httpResponse,
|
|
response,
|
|
encryptionKey,
|
|
encryptionSalt,
|
|
debug,
|
|
token,
|
|
skipWriteAuthFile,
|
|
cleanupTokens,
|
|
secureCookie,
|
|
}: Params): boolean {
|
|
const COOKIE_EXPIRY_DATE = grabCookieExpiryDate();
|
|
|
|
if (httpResponse?.success) {
|
|
let encryptedPayload = encrypt({
|
|
data: JSON.stringify(httpResponse.payload),
|
|
encryptionKey,
|
|
encryptionSalt,
|
|
});
|
|
|
|
try {
|
|
if (token && encryptedPayload)
|
|
httpResponse["token"] = encryptedPayload;
|
|
} catch (error: any) {
|
|
console.log("Login User HTTP Response Error:", error.message);
|
|
}
|
|
|
|
const cookieNames = getAuthCookieNames({
|
|
database,
|
|
});
|
|
|
|
if (httpResponse.csrf && !skipWriteAuthFile) {
|
|
writeAuthFile(
|
|
httpResponse.csrf,
|
|
JSON.stringify(httpResponse.payload),
|
|
cleanupTokens && httpResponse.payload?.id
|
|
? { userId: httpResponse.payload.id }
|
|
: undefined
|
|
);
|
|
}
|
|
|
|
httpResponse["cookieNames"] = cookieNames;
|
|
httpResponse["key"] = String(encryptedPayload);
|
|
|
|
const authKeyName = cookieNames.keyCookieName;
|
|
const csrfName = cookieNames.csrfCookieName;
|
|
|
|
if (debug) {
|
|
debugFn(authKeyName, "authKeyName");
|
|
debugFn(csrfName, "csrfName");
|
|
debugFn(encryptedPayload, "encryptedPayload");
|
|
}
|
|
|
|
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 (debug) {
|
|
debugFn("Response Sent!");
|
|
}
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|