From 64909d82b4d7293ced6bde5a6da44003888b3b44 Mon Sep 17 00:00:00 2001 From: James Cook Date: Wed, 3 Aug 2022 16:53:46 +0100 Subject: [PATCH] feat: parse cookies properly (#15) --- src/parentClient.ts | 18 ++++++------------ src/studentClient.ts | 17 ++++++----------- src/utils.ts | 11 +++++++++++ 3 files changed, 23 insertions(+), 23 deletions(-) create mode 100644 src/utils.ts diff --git a/src/parentClient.ts b/src/parentClient.ts index a3fc497..929ab48 100644 --- a/src/parentClient.ts +++ b/src/parentClient.ts @@ -3,6 +3,7 @@ import type { GetPupilsResponse } from "./types"; import { ClasschartsClient } from "./baseClient"; import { API_BASE_PARENT, BASE_URL } from "./consts"; +import { parseCookies } from "./utils"; /** * The base client */ @@ -51,18 +52,11 @@ export class ClasschartsParentClient extends ClasschartsClient { if (request.status != 302 || !request.headers["set-cookie"]) throw new Error("Unauthenticated: Classcharts returned an error"); - const cookies = request.headers["set-cookie"]; - for (let i = 0; i < cookies.length; i++) { - cookies[i] = cookies[i].substring(0, cookies[i].indexOf(";")); - } - - this.authCookies = cookies; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let sessionID: any = decodeURI(cookies[1]) - .replace(/%3A/g, ":") - .replace(/%2C/g, ","); - sessionID = JSON.parse( - sessionID.substring(sessionID.indexOf("{"), sessionID.length) + const cookies = String(request.headers["set-cookie"]); + this.authCookies = cookies.split(";"); + const sessionCookies = parseCookies(cookies); + const sessionID = JSON.parse( + String(sessionCookies["parent_session_credentials"]) ); this.sessionId = sessionID.session_id; this.pupils = await this.getPupils(); diff --git a/src/studentClient.ts b/src/studentClient.ts index b4e5d03..7fc2893 100644 --- a/src/studentClient.ts +++ b/src/studentClient.ts @@ -1,6 +1,7 @@ import type { AxiosRequestConfig } from "axios"; import { API_BASE_STUDENT, BASE_URL } from "./consts"; import { ClasschartsClient } from "./baseClient"; +import { parseCookies } from "./utils"; /** * The base client */ @@ -47,17 +48,11 @@ export class ClasschartsStudentClient extends ClasschartsClient { }); if (request.status != 302 || !request.headers["set-cookie"]) throw new Error("Unauthenticated: Classcharts returned an error"); - const cookies = request.headers["set-cookie"]; - for (let i = 0; i < cookies.length; i++) { - cookies[i] = cookies[i].substring(0, cookies[i].indexOf(";")); - } - this.authCookies = cookies; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let sessionID: any = decodeURI(cookies[1]) - .replace(/%3A/g, ":") - .replace(/%2C/g, ","); - sessionID = JSON.parse( - sessionID.substring(sessionID.indexOf("{"), sessionID.length) + const cookies = String(request.headers["set-cookie"]); + this.authCookies = cookies.split(";"); + const sessionCookies = parseCookies(cookies); + const sessionID = JSON.parse( + String(sessionCookies["student_session_credentials"]) ); this.sessionId = sessionID.session_id; const user = await this.getStudentInfo(); diff --git a/src/utils.ts b/src/utils.ts new file mode 100644 index 0000000..3c9538b --- /dev/null +++ b/src/utils.ts @@ -0,0 +1,11 @@ +export function parseCookies(input: string) { + const output: Record = {}; + const cookies = input.split(","); + for (const cookie of cookies) { + const cookieSplit = cookie.split(";")[0].split("="); + output[decodeURIComponent(cookieSplit[0])] = decodeURIComponent( + cookieSplit[1] + ); + } + return output; +}