From a7f394afcbecabc73a20e969ff883fae43ebf102 Mon Sep 17 00:00:00 2001 From: James Cook Date: Fri, 22 Jul 2022 09:46:21 +0100 Subject: [PATCH] feat: migrate to parsing cookies properly --- 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..9cfa352 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 sessionCookie = parseCookies(cookies); + const sessionID = JSON.parse( + String(sessionCookie["student_session_credentials"]) ); this.sessionId = sessionID.session_id; this.pupils = await this.getPupils(); diff --git a/src/studentClient.ts b/src/studentClient.ts index b4e5d03..ffb27d4 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 sessionCookie = parseCookies(cookies); + const sessionID = JSON.parse( + String(sessionCookie["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; +}