@@ -156,6 +156,7 @@ UserController = {
156156 if self .queried_user .verified then
157157 return okResponse (' User ' .. self .queried_user .username
158158 .. ' logged in' )
159+ -- TODO: Handle first-time student account logins.
159160 else
160161 return jsonResponse ({
161162 title = ' Verify your account' ,
@@ -171,13 +172,19 @@ UserController = {
171172 return self :build_url (' index' )
172173 end
173174 end ),
175+ logout_get = capture_errors (function (self )
176+ self .session .username = ' '
177+ self .session .user_id = nil
178+ self .cookies .persist_session = ' false'
179+ return { redirect_to = self :build_url (' /' ) }
180+ end ),
174181 logout = capture_errors (function (self )
175182 self .session .username = ' '
176183 self .session .user_id = nil
177184 self .cookies .persist_session = ' false'
178- return jsonResponse (
179- { redirect = self .params .redirect or self :build_url (' index ' ) }
180- )
185+ return jsonResponse ({
186+ redirect = ( self .params .redirect or self :build_url (' / ' ))
187+ } )
181188 end ),
182189 change_email = capture_errors (function (self )
183190 assert_logged_in (self )
@@ -187,6 +194,8 @@ UserController = {
187194 if self .queried_user then
188195 -- we're trying to change someone else's email
189196 assert_min_role (self , ' moderator' )
197+ elseif user :is_student () then
198+ yield_error (err .student_cannot_change_email )
190199 elseif (user .password ~=
191200 hash_password (self .params .password , user .salt )) then
192201 yield_error (err .wrong_password )
@@ -227,7 +236,7 @@ UserController = {
227236 local minutes = db .select (
228237 ' extract(minutes from (now()::timestamp - ?::timestamp))' ,
229238 token .created )[1 ].date_part
230- if minutes < 15 then
239+ if minutes and minutes < 15 then
231240 yield_error (err .too_many_password_resets )
232241 end
233242 end
@@ -490,20 +499,21 @@ UserController = {
490499 end
491500 end
492501 end
502+ local salt , password , result
493503 for _ , user in pairs (users ) do
494- user . username = util . trim ( tostring ( user . username ) )
495- user . password = util .trim (tostring (user .password ))
496- user . email = user . email or self . current_user . email
497- -- TODO: This doesn't reveal which record has an invalid value...
498- validate . assert_valid ( user , Users . validations )
499-
500- user . created = db . format_date ()
501- user . salt = secure_salt ()
502- user . password = hash_password ( user . password , user . salt )
503- user . verified = true
504- user . role = ' student '
505- user . creator_id = self . current_user . id
506- local result = Users : create ( user )
504+ salt = secure_salt ( )
505+ password = util .trim (tostring (user .password ))
506+ result = Users : create ({
507+ created = db . format_date (),
508+ username = util . trim ( tostring ( user . username )),
509+ salt = salt ,
510+ password = hash_password ( hash_password ( password , ' ' ), salt ),
511+ email = ( user . email or self . current_user . email ),
512+ verified = true ,
513+ role = ' student ' ,
514+ creator_id = self . current_user . id
515+ })
516+
507517 if not result then
508518 db .query (' ROLLBACK;' )
509519 return errorResponse (
0 commit comments