···
type TranscriptionUpdate,
} from "./lib/transcription";
96
+
validatePasswordHash,
99
+
} from "./lib/validation";
import adminHTML from "./pages/admin.html";
import checkoutHTML from "./pages/checkout.html";
import classHTML from "./pages/class.html";
···
321
-
// Password is client-side hashed (PBKDF2), should be 64 char hex
322
-
if (password.length !== 64 || !/^[0-9a-f]+$/.test(password)) {
331
+
// Validate password format (client-side hashed PBKDF2)
332
+
const passwordValidation = validatePasswordHash(password);
333
+
if (!passwordValidation.valid) {
324
-
{ error: "Invalid password format" },
335
+
{ error: passwordValidation.error },
···
if (rateLimitError) return rateLimitError;
417
-
// Password is client-side hashed (PBKDF2), should be 64 char hex
418
-
if (password.length !== 64 || !/^[0-9a-f]+$/.test(password)) {
428
+
// Validate password format (client-side hashed PBKDF2)
429
+
const passwordValidation = validatePasswordHash(password);
430
+
if (!passwordValidation.valid) {
420
-
{ error: "Invalid password format" },
432
+
{ error: passwordValidation.error },
···
// Validate password format (client-side hashed PBKDF2)
790
-
if (password.length !== 64 || !/^[0-9a-f]+$/.test(password)) {
802
+
const passwordValidation = validatePasswordHash(password);
803
+
if (!passwordValidation.valid) {
792
-
{ error: "Invalid password format" },
805
+
{ error: passwordValidation.error },
···
return Response.json({ error: "Password required" }, { status: 400 });
1232
-
// Password is client-side hashed (PBKDF2), should be 64 char hex
1233
-
if (password.length !== 64 || !/^[0-9a-f]+$/.test(password)) {
1245
+
// Validate password format (client-side hashed PBKDF2)
1246
+
const passwordValidation = validatePasswordHash(password);
1247
+
if (!passwordValidation.valid) {
1235
-
{ error: "Invalid password format" },
1249
+
{ error: passwordValidation.error },
···
const body = await req.json();
const { name } = body as { name: string };
2436
-
if (!name || name.trim().length === 0) {
2450
+
const nameValidation = validateName(name);
2451
+
if (!nameValidation.valid) {
2438
-
{ error: "Name cannot be empty" },
2453
+
{ error: nameValidation.error },
···
skipVerification?: boolean;
2465
-
if (!email || !email.includes("@")) {
2480
+
const emailValidation = validateEmail(email);
2481
+
if (!emailValidation.valid) {
2467
-
{ error: "Invalid email address" },
2483
+
{ error: emailValidation.error },
···
2663
-
if (!course_code || !name || !professor || !semester || !year) {
2679
+
// Validate all required fields
2680
+
const courseCodeValidation = validateCourseCode(course_code);
2681
+
if (!courseCodeValidation.valid) {
2682
+
return Response.json(
2683
+
{ error: courseCodeValidation.error },
2688
+
const nameValidation = validateCourseName(name);
2689
+
if (!nameValidation.valid) {
2690
+
return Response.json(
2691
+
{ error: nameValidation.error },
2696
+
const professorValidation = validateName(professor, "Professor name");
2697
+
if (!professorValidation.valid) {
2665
-
{ error: "Missing required fields" },
2699
+
{ error: professorValidation.error },
2704
+
const semesterValidation = validateSemester(semester);
2705
+
if (!semesterValidation.valid) {
2706
+
return Response.json(
2707
+
{ error: semesterValidation.error },
2712
+
const yearValidation = validateYear(year);
2713
+
if (!yearValidation.valid) {
2714
+
return Response.json(
2715
+
{ error: yearValidation.error },
···
const body = await req.json();
const classId = body.class_id;
2725
-
if (!classId || typeof classId !== "string") {
2775
+
const classIdValidation = validateClassId(classId);
2776
+
if (!classIdValidation.valid) {
2727
-
{ error: "Class ID required" },
2778
+
{ error: classIdValidation.error },
···
2760
-
if (!courseCode || !courseName || !professor || !semester || !year) {
2811
+
// Validate all required fields
2812
+
const courseCodeValidation = validateCourseCode(courseCode);
2813
+
if (!courseCodeValidation.valid) {
2762
-
{ error: "Missing required fields" },
2815
+
{ error: courseCodeValidation.error },
2820
+
const nameValidation = validateCourseName(courseName);
2821
+
if (!nameValidation.valid) {
2822
+
return Response.json(
2823
+
{ error: nameValidation.error },
2828
+
const professorValidation = validateName(professor, "Professor name");
2829
+
if (!professorValidation.valid) {
2830
+
return Response.json(
2831
+
{ error: professorValidation.error },
2836
+
const semesterValidation = validateSemester(semester);
2837
+
if (!semesterValidation.valid) {
2838
+
return Response.json(
2839
+
{ error: semesterValidation.error },
2844
+
const yearValidation = validateYear(
2845
+
typeof year === "string" ? Number.parseInt(year, 10) : year,
2847
+
if (!yearValidation.valid) {
2848
+
return Response.json(
2849
+
{ error: yearValidation.error },