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; } }