Spaces:
Sleeping
Sleeping
File size: 1,936 Bytes
6230227 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | export const APP_COOKIE = "app_session";
export const APP_SESSION_MAX_AGE = 60 * 60 * 24 * 7;
export const DEFAULT_APP_USERNAME = "student";
export const DEFAULT_APP_PASSWORD = "password";
const encoder = new TextEncoder();
export function appUsername() {
return process.env.APP_USERNAME || DEFAULT_APP_USERNAME;
}
export function appPassword() {
return process.env.APP_PASSWORD || DEFAULT_APP_PASSWORD;
}
function safeEqual(a: string, b: string) {
if (a.length !== b.length) return false;
let diff = 0;
for (let i = 0; i < a.length; i += 1) {
diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
}
return diff === 0;
}
async function sha256Hex(value: string) {
const digest = await crypto.subtle.digest("SHA-256", encoder.encode(value));
return [...new Uint8Array(digest)]
.map((byte) => byte.toString(16).padStart(2, "0"))
.join("");
}
export async function appSessionToken() {
return sha256Hex(`${appUsername()}:${appPassword()}`);
}
export async function verifyAppCredentials(username: string, password: string) {
return safeEqual(username, appUsername()) && safeEqual(password, appPassword());
}
export async function isValidAppSession(value: string | undefined) {
if (!value) return false;
return safeEqual(value, await appSessionToken());
}
function attributes(isHttps: boolean, maxAge: number) {
const parts = [`Path=/`, `Max-Age=${maxAge}`, "HttpOnly"];
if (isHttps) {
parts.push("Secure", "SameSite=None", "Partitioned");
} else {
parts.push("SameSite=Lax");
}
return parts.join("; ");
}
export function setAppSessionCookie(headers: Headers, value: string, isHttps: boolean) {
headers.append(
"set-cookie",
`${APP_COOKIE}=${encodeURIComponent(value)}; ${attributes(isHttps, APP_SESSION_MAX_AGE)}`
);
}
export function clearAppSessionCookie(headers: Headers, isHttps: boolean) {
headers.append("set-cookie", `${APP_COOKIE}=; ${attributes(isHttps, 0)}`);
}
|