From 1e464bdd6d249e39d28ee049028cf4da1e4f337b Mon Sep 17 00:00:00 2001 From: Martin Dimitrov Date: Wed, 15 Oct 2025 17:31:20 -0700 Subject: [PATCH] add cookie session handler --- bun.lockb | Bin 437480 -> 448048 bytes packages/doorman-api/.env.local | 2 + packages/doorman-api/.env.twiliotemplate | 2 + packages/doorman-api/package.json | 1 + .../doorman-api/src/common/DoormanHandler.ts | 13 +++-- .../src/common/DoormanHandlerContext.ts | 1 + .../doorman-api/src/common/SessionHandler.ts | 50 ++++++++++++++++++ .../src/functions/api/door/info.ts | 11 +++- packages/doorman-client/.env.local | 4 +- packages/doorman-client/.env.twiliotemplate | 4 +- packages/doorman-client/package.json | 1 + 11 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 packages/doorman-api/src/common/SessionHandler.ts diff --git a/bun.lockb b/bun.lockb index 3e694fddf0d115e3177e3bd7d6203d6d1c35b948..a42e586c07765dff4264a277fc0437fdd2745649 100755 GIT binary patch delta 67156 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 VKIR*oDdKZWXp_&S%rW14{|8j)$kqS= diff --git a/packages/doorman-api/.env.local b/packages/doorman-api/.env.local index 86f563c..065c26d 100644 --- a/packages/doorman-api/.env.local +++ b/packages/doorman-api/.env.local @@ -34,3 +34,5 @@ DOORMAN_URL=http://localhost:3005 # this isn't really a secret, its just to prevent spam on /notify in prod NOTIFY_SECRET_KEY=discordnotifyme + +COOKIE_PASSWORD=testtesttesttesttesttesttesttest diff --git a/packages/doorman-api/.env.twiliotemplate b/packages/doorman-api/.env.twiliotemplate index 39c73b5..b1e6c37 100644 --- a/packages/doorman-api/.env.twiliotemplate +++ b/packages/doorman-api/.env.twiliotemplate @@ -28,3 +28,5 @@ LOKI_PW=doormanlogs NOTIFY_SECRET_KEY=discordnotifyme DOORMAN_URL= + +COOKIE_PASSWORD=testtesttesttesttesttesttesttest diff --git a/packages/doorman-api/package.json b/packages/doorman-api/package.json index 028981e..f973e93 100644 --- a/packages/doorman-api/package.json +++ b/packages/doorman-api/package.json @@ -21,6 +21,7 @@ "discord-oauth2": "^2.12.1", "discord.js": "^14.19.3", "dynabridge": "^0.3.8", + "iron-session": "^8.0.4", "is-deep-subset": "^0.1.1", "prom-client": "^15.1.3", "promise.timeout": "^1.2.0", diff --git a/packages/doorman-api/src/common/DoormanHandler.ts b/packages/doorman-api/src/common/DoormanHandler.ts index ab6bf7c..4653b72 100644 --- a/packages/doorman-api/src/common/DoormanHandler.ts +++ b/packages/doorman-api/src/common/DoormanHandler.ts @@ -1,4 +1,4 @@ -import { ServerlessCallback, ServerlessFunctionSignature } from "@twilio-labs/serverless-runtime-types/types"; +import { ServerlessCallback, ServerlessFunctionSignature, TwilioResponse } from "@twilio-labs/serverless-runtime-types/types"; import { PrometheusContentType, Registry, Pushgateway, Summary, Counter, register } from "prom-client"; import { DoormanLambdaContext } from "./DoormanHandlerContext"; import { shouldBlockRequest } from "../utils/blockUserAgent"; @@ -13,8 +13,7 @@ import pTimeout, { TimeoutError } from "promise.timeout"; import { ZodError } from "zod"; import { fromError } from "zod-validation-error"; import { setResponseJson } from "../utils/responseUtils"; - -export type BaseEvent = { request: { cookies: {}; headers: {}; }; } +import { BaseEvent, getSessionFromRequest, SessionType, setSessionOnResponse } from "./SessionHandler"; export type CallbackResult = Parameters; export type FailFastCallback = () => CallbackResult; @@ -73,7 +72,8 @@ const INNER_HANDLER_MAXIMUM_DURATION_MS: number = 8_750; */ export function withMetrics( functionName: string, - handler: DoormanLambda + handler: DoormanLambda, + parseSessionCookie?: boolean, ): ServerlessFunctionSignature { return async (context, event, callback) => { console.log("[CommonHandler] created loki logger"); @@ -208,6 +208,11 @@ export function withMetrics const startTime = Date.now(); console.log(`[CommonHandler] started handler at ${startTime}`); + if (parseSessionCookie) { + console.log(`[CommonHandler] unwrapping session cookie`); + event.request.session = await getSessionFromRequest(event, context); + } + const handlerResponsePromise: Promise> = new Promise(async (resolve, reject) => { // intercept the callbackResult let callbackResult: Parameters | undefined; diff --git a/packages/doorman-api/src/common/DoormanHandlerContext.ts b/packages/doorman-api/src/common/DoormanHandlerContext.ts index 42a26da..42efcac 100644 --- a/packages/doorman-api/src/common/DoormanHandlerContext.ts +++ b/packages/doorman-api/src/common/DoormanHandlerContext.ts @@ -15,4 +15,5 @@ export interface DoormanLambdaContext extends EnvironmentVariables { LOKI_PW: string; NOTIFY_SECRET_KEY: string; DOORMAN_URL: string; + COOKIE_PASSWORD: string; }; diff --git a/packages/doorman-api/src/common/SessionHandler.ts b/packages/doorman-api/src/common/SessionHandler.ts new file mode 100644 index 0000000..30d38ae --- /dev/null +++ b/packages/doorman-api/src/common/SessionHandler.ts @@ -0,0 +1,50 @@ +import { TwilioResponse } from "@twilio-labs/serverless-runtime-types/types"; +import { TwilioContext } from "../types/TwilioContext"; +import { sealData, unsealData } from "iron-session"; +import { DoormanLambdaContext } from "./DoormanHandlerContext"; + +export type BaseEvent = { request: { cookies: { session?: string; }; headers: {}; session?: SessionType }; } + +export type SessionType = any; +export const IRON_SESSION_COOKIE_NAME = "session"; + +export async function getSessionFromRequest(event: BaseEvent, context: DoormanLambdaContext): Promise { + if (!event.request.cookies[IRON_SESSION_COOKIE_NAME]) { + return undefined + } + + let session: SessionType | undefined; + try { + session = await unsealData(event.request.cookies[IRON_SESSION_COOKIE_NAME], { + password: context.COOKIE_PASSWORD, + }); + } catch (e: any) { + console.error("error unsealing cookie"); + } + + return session; +} + +export async function setSessionOnResponse(res: TwilioResponse, context: TwilioContext, session: any): Promise { + if (!session) { + return res; + } + + try { + const cookie = await sealData(session, { + password: context.COOKIE_PASSWORD, + }); + console.log(cookie); + res.setCookie(IRON_SESSION_COOKIE_NAME, cookie); + } catch (e: any) { + console.log("failed to seal cookie"); + console.log(e.message); + } + + return res; +} + +export async function destroySession(res: TwilioResponse): Promise { + res.removeCookie(IRON_SESSION_COOKIE_NAME); + return res; +} diff --git a/packages/doorman-api/src/functions/api/door/info.ts b/packages/doorman-api/src/functions/api/door/info.ts index 8297386..f17e7d5 100644 --- a/packages/doorman-api/src/functions/api/door/info.ts +++ b/packages/doorman-api/src/functions/api/door/info.ts @@ -14,6 +14,7 @@ import { z } from "zod"; import { UserAgentHeader } from "../../../utils/blockUserAgent"; import { setResponseJson } from "../../../utils/responseUtils"; import { sanitizePhoneNumber } from "../../../utils/phoneUtils"; +import { BaseEvent, destroySession, setSessionOnResponse } from "../../../common/SessionHandler"; export const InfoRequestSchema = z.object({ door: z.string().optional(), @@ -23,7 +24,7 @@ export const InfoRequestSchema = z.object({ .refine(data => data.buzzer || data.door, 'Buzzer or door must be provided'); export type InfoRequest = z.infer; -export interface InfoRequestTwilio extends ServerlessEventObject { }; +export type InfoRequestTwilio = ServerlessEventObject & BaseEvent; export const InfoResponseClientSchema = DoorConfigSchema .omit({ PK: true, SK: true, pin: true }) @@ -95,5 +96,13 @@ export const handler: ServerlessFunctionSignature