@@ -3,6 +3,7 @@ package internal
33import (
44 "fmt"
55 "html/template"
6+ "maps"
67 "net/http"
78 "regexp"
89 "strings"
@@ -66,9 +67,7 @@ func (a *Application) ServeTemplateExtra(logger *zerolog.Logger, templateName st
6667 if data == nil {
6768 data = map [string ]any {}
6869 }
69- for k , v := range extraData {
70- data [k ] = v
71- }
70+ maps .Copy (data , extraData )
7271 user , err := a .GetLoggedInTeacher (r )
7372 if err == nil {
7473 data ["Username" ] = user .Name
@@ -217,36 +216,43 @@ func (a *Application) Start() {
217216 router .HandleFunc ("POST " + path , renderFn (fn ))
218217 }
219218
220- // Admin pages
221- router .HandleFunc ("GET /admin" , a .ServeTemplate (a .Log , "adminhome.html" , noArgs ))
219+ // Admin pages (unprotected — these exact patterns beat the /admin/ prefix below)
222220 router .HandleFunc ("GET /admin/login" , a .ServeTemplate (a .Log , "adminlogin.html" , noArgs ))
223- router .HandleFunc ("GET /admin/dietaryrestrictions" , a .ServeTemplate (a .Log , "admindietaryrestrictions.html" , a .GetAdminDietaryRestrictionsTemplate ))
224- router .HandleFunc ("GET /admin/teams" , a .ServeTemplate (a .Log , "adminteams.html" , a .GetAdminTeamsTemplate ))
225221 router .HandleFunc ("GET /admin/emaillogin" , a .HandleAdminEmailLogin )
226222 router .HandleFunc ("POST /admin/emaillogin" , a .HandleAdminLogin )
227223
228- adminAPIRouter := http .NewServeMux ()
229- adminAPIRouter .HandleFunc ("GET /resendstudentemail" , a .HandleResendStudentEmail )
230- adminAPIRouter .HandleFunc ("GET /resendparentemail" , a .HandleResendParentEmail )
231- adminAPIRouter .HandleFunc ("GET /confirmationlink/student" , a .HandleGetStudentEmailConfirmationLink )
232- adminAPIRouter .HandleFunc ("GET /confirmationlink/parent" , a .HandleGetParentEmailConfirmationLink )
233- adminAPIRouter .HandleFunc ("GET /sendemailconfirmationreminders" , a .HandleSendEmailConfirmationReminders )
234- adminAPIRouter .HandleFunc ("GET /sendparentreminders" , a .HandleSendParentReminders )
235- adminAPIRouter .HandleFunc ("GET /sendqrcodes" , a .HandleSendQRCodes )
236- adminAPIRouter .HandleFunc ("GET /kattis/teams" , a .HandleKattisTeamsExport )
237- adminAPIRouter .HandleFunc ("GET /kattis/participants" , a .HandleKattisParticipantsExport )
238- adminAPIRouter .HandleFunc ("GET /zoom/breakout" , a .HandleZoomBreakoutExport )
239- adminAPIRouter .HandleFunc ("GET /manualcheckin" , a .HandleManualCheckin )
240- adminAPIRouter .HandleFunc ("GET /team-list" , a .HandleTeamList )
241- router .Handle ("/admin/api/" , http .StripPrefix ("/admin/api" , a .AdminAuthMiddleware (adminAPIRouter )))
242-
243- // Volunteer pages
224+ // Admin pages (protected) — subrouter consolidates all protected admin routes
225+ adminRouter := http .NewServeMux ()
226+ adminRouter .HandleFunc ("GET /{$}" , a .ServeTemplate (a .Log , "adminhome.html" , noArgs ))
227+ adminRouter .HandleFunc ("GET /dietaryrestrictions" , a .ServeTemplate (a .Log , "admindietaryrestrictions.html" , a .GetAdminDietaryRestrictionsTemplate ))
228+ adminRouter .HandleFunc ("GET /teams" , a .ServeTemplate (a .Log , "adminteams.html" , a .GetAdminTeamsTemplate ))
229+ adminRouter .HandleFunc ("GET /api/resendstudentemail" , a .HandleResendStudentEmail )
230+ adminRouter .HandleFunc ("GET /api/resendparentemail" , a .HandleResendParentEmail )
231+ adminRouter .HandleFunc ("GET /api/confirmationlink/student" , a .HandleGetStudentEmailConfirmationLink )
232+ adminRouter .HandleFunc ("GET /api/confirmationlink/parent" , a .HandleGetParentEmailConfirmationLink )
233+ adminRouter .HandleFunc ("GET /api/sendemailconfirmationreminders" , a .HandleSendEmailConfirmationReminders )
234+ adminRouter .HandleFunc ("GET /api/sendparentreminders" , a .HandleSendParentReminders )
235+ adminRouter .HandleFunc ("GET /api/sendqrcodes" , a .HandleSendQRCodes )
236+ adminRouter .HandleFunc ("GET /api/kattis/teams" , a .HandleKattisTeamsExport )
237+ adminRouter .HandleFunc ("GET /api/kattis/participants" , a .HandleKattisParticipantsExport )
238+ adminRouter .HandleFunc ("GET /api/zoom/breakout" , a .HandleZoomBreakoutExport )
239+ adminRouter .HandleFunc ("GET /api/manualcheckin" , a .HandleManualCheckin )
240+ adminRouter .HandleFunc ("GET /api/team-list" , a .HandleTeamList )
241+ router .Handle ("/admin/" , http .StripPrefix ("/admin" , a .AdminAuthMiddleware (adminRouter )))
242+ router .Handle ("GET /admin" , a .AdminAuthMiddleware (
243+ http .HandlerFunc (a .ServeTemplate (a .Log , "adminhome.html" , noArgs ))))
244+
245+ // Volunteer pages (unprotected)
244246 router .HandleFunc ("GET /volunteer" , a .ServeTemplate (a .Log , "volunteerhome.html" , noArgs ))
245247 router .HandleFunc ("GET /volunteer/login" , a .ServeTemplate (a .Log , "volunteerlogin.html" , noArgs ))
246248 router .HandleFunc ("GET /volunteer/emaillogin" , a .HandleVolunteerEmailLogin )
247249 router .HandleFunc ("POST /volunteer/emaillogin" , a .HandleVolunteerLogin )
248- router .HandleFunc ("GET /volunteer/scan" , a .ServeTemplate (a .Log , "volunteerscan.html" , a .GetVolunteerScanTemplate ))
249- router .HandleFunc ("GET /volunteer/checkin" , a .HandleVolunteerCheckIn )
250+
251+ // Volunteer pages (protected)
252+ router .Handle ("GET /volunteer/scan" , a .VolunteerAuthMiddleware (
253+ http .HandlerFunc (a .ServeTemplate (a .Log , "volunteerscan.html" , a .GetVolunteerScanTemplate ))))
254+ router .Handle ("GET /volunteer/checkin" , a .VolunteerAuthMiddleware (
255+ http .HandlerFunc (a .HandleVolunteerCheckIn )))
250256
251257 var handler http.Handler = router
252258 handler = hlog .RequestIDHandler ("request_id" , "RequestID" )(handler )
0 commit comments