From 7b8d5d09b21593c5ac675ceb5917b3b5fdb0d2f5 Mon Sep 17 00:00:00 2001 From: velzie Date: Sat, 10 Aug 2024 11:55:00 -0400 Subject: [PATCH] lobotomize cookie logic --- src/worker/cookie.ts | 21 +++++++++++ src/worker/fetch.ts | 87 ++++++++++++-------------------------------- 2 files changed, 44 insertions(+), 64 deletions(-) create mode 100644 src/worker/cookie.ts diff --git a/src/worker/cookie.ts b/src/worker/cookie.ts new file mode 100644 index 0000000..185a8c3 --- /dev/null +++ b/src/worker/cookie.ts @@ -0,0 +1,21 @@ +export type Cookie = { + name: string; + value: string; + path?: string; + expires?: Date; + maxAge?: number; + domain?: string; + secure?: boolean; + httpOnly?: boolean; + sameSite?: "strict" | "lax" | "none"; +}; + +class CookieStore { + private cookies: Cookie[] = []; + + async load() { + return this.cookies; + } +} + +export const cookieStore = new CookieStore(); diff --git a/src/worker/fetch.ts b/src/worker/fetch.ts index 3a3c757..c2002eb 100644 --- a/src/worker/fetch.ts +++ b/src/worker/fetch.ts @@ -4,6 +4,8 @@ import { ParseResultType } from "parse-domain"; import { ScramjetServiceWorker } from "."; import { renderError } from "./error"; import { FakeServiceWorker } from "./fakesw"; +import parse from "set-cookie-parser"; +import { cookieStore } from "./cookie"; const { encodeUrl, decodeUrl } = self.$scramjet.shared.url; const { rewriteHeaders, rewriteHtml, rewriteJs, rewriteCss, rewriteWorkers } = @@ -73,30 +75,31 @@ export async function swfetch( headers.set("Referer", decodeUrl(request.referrer)); - const cookieStore = new IDBMap(url.host, { - durability: "relaxed", - prefix: "Cookies", - }); + let cookies = [...(await cookieStore.entries())]; + console.log("cookies", cookies); + // if (url.protocol !== "https:") { + // cookies = cookies.filter(([_k, v]) => !v.args.includes(["Secure"])); + // } + cookies = cookies.filter( + ([_k, v]) => + v.args.domain.includes(url.hostname) || + url.hostname.includes(v.args.domain) + ); + + cookies = cookies.filter(([_k, v]) => v.value !== ""); - let cookies = await cookieStore.entries(); - if (url.protocol !== "https:") { - cookies = cookies.filter(([_k, v]) => !v.args.includes(["Secure"])); - } cookies = Array.from(cookies.map(([k, v]) => `${k}=${v.value}`)); + if (cookies.length) { - headers.set("Cookie", cookies.join(";")); - } - if (url.href.includes("bulk")) { - console.log(url, { - headers: Object.entries(headers.headers), - bod: request.body, - }); + headers.set("Cookie", cookies.join("; ")); } // TODO this is wrong somehow headers.set("Sec-Fetch-Mode", "navigate"); headers.set("Sec-Fetch-Site", "same-origin"); + dbg.log(url.toString(), headers.headers); + const response: BareResponseFetch = await this.client.fetch(url, { method: request.method, body: request.body, @@ -200,57 +203,13 @@ async function handleResponse( } async function handleCookies(url: URL, maybeHeaders: string[] | string) { - const cookieStore = new IDBMap(url.host, { - durability: "relaxed", - prefix: "Cookies", - }); - - let headers = maybeHeaders instanceof Array ? maybeHeaders : [maybeHeaders]; + const cookies = await cookieStore.load(); + const headers = maybeHeaders instanceof Array ? maybeHeaders : [maybeHeaders]; for (const cookie of headers) { - let cookieParsed = cookie.split(";").map((x) => x.trim().split("=")); + const parsed = parse(cookie)[0]; + console.error("set-cookie", parsed); - let [key, value] = cookieParsed.shift(); - if (!value) continue; - value = value.replace('"', ""); - - const hostArg = cookieParsed.find((x) => x[0] === "Domain"); - cookieParsed = cookieParsed.filter((x) => x[0] !== "Domain"); - let host = hostArg ? hostArg[1] : undefined; - - if (url.protocol === "http:" && cookieParsed.includes(["Secure"])) continue; - if ( - cookieParsed.includes(["SameSite", "None"]) && - !cookieParsed.includes(["Secure"]) - ) - continue; - - if (host && host !== url.host) { - if (host.startsWith(".")) host = host.slice(1); - const urlDomain = parseDomain(url.hostname); - - if (urlDomain.type === ParseResultType.Listed) { - const { subDomains: domain, topLevelDomains } = urlDomain; - if (!host.endsWith([domain, ...topLevelDomains].join("."))) continue; - } else { - continue; - } - - const realCookieStore = new IDBMap(host, { - durability: "relaxed", - prefix: "Cookies", - }); - realCookieStore.set(key, { - value: value, - args: cookieParsed, - subdomain: true, - }); - } else { - cookieStore.set(key, { - value: value, - args: cookieParsed, - subdomain: false, - }); - } + cookies.push(parsed); } }