mirror of
https://github.com/prdlk/leetcode.git
synced 2026-11-02 13:12:44 +00:00
29 lines
999 B
JavaScript
29 lines
999 B
JavaScript
export default {
|
|
async fetch(request, env) {
|
|
const auth = request.headers.get("Authorization") ?? "";
|
|
if (auth.startsWith("Basic ")) {
|
|
let ok = false;
|
|
try {
|
|
const decoded = atob(auth.slice(6));
|
|
const password = decoded.slice(decoded.indexOf(":") + 1); // password may contain ':'
|
|
ok = await passwordMatches(password, env.SITE_PASSWORD);
|
|
} catch {}
|
|
if (ok) return env.ASSETS.fetch(request);
|
|
}
|
|
return new Response("Authentication required", {
|
|
status: 401,
|
|
headers: { "WWW-Authenticate": 'Basic realm="leetcode-docs", charset="UTF-8"' },
|
|
});
|
|
},
|
|
};
|
|
|
|
// timingSafeEqual needs equal-length buffers → hash both sides first
|
|
async function passwordMatches(candidate, expected) {
|
|
const enc = new TextEncoder();
|
|
const [a, b] = await Promise.all([
|
|
crypto.subtle.digest("SHA-256", enc.encode(candidate)),
|
|
crypto.subtle.digest("SHA-256", enc.encode(expected)),
|
|
]);
|
|
return crypto.subtle.timingSafeEqual(a, b);
|
|
}
|