liquid_feedback_frontend

annotate app/main/index/_action/register.lua @ 91:3da86120cadd

Security related fix of locking during registration process
author bsw
date Thu Aug 19 15:36:13 2010 +0200 (2010-08-19)
parents 8d760110ee4a
children 217653875fbb 9345ea6af3b2
rev   line source
bsw@91 1 local code = param.get("code")
bsw@91 2
bsw@91 3 local invite_code = InviteCode:new_selector()
bsw@91 4 :add_where{ "code = ?", code }
bsw@91 5 :optional_object_mode()
bsw@91 6 :for_update()
bsw@91 7 :exec()
bsw/jbe@5 8
bsw/jbe@5 9 if not invite_code or invite_code.used then
bsw/jbe@5 10 slot.put_into("error", _"The code you've entered is invalid")
bsw/jbe@5 11 request.redirect{
bsw/jbe@5 12 mode = "forward",
bsw/jbe@5 13 module = "index",
bsw/jbe@5 14 view = "register"
bsw/jbe@5 15 }
bsw/jbe@5 16 return false
bsw/jbe@5 17 end
bsw/jbe@5 18
bsw/jbe@6 19 local notify_email = param.get("notify_email")
bsw/jbe@5 20
bsw/jbe@6 21 if invite_code and not notify_email then
bsw/jbe@6 22 request.redirect{
bsw/jbe@6 23 mode = "redirect",
bsw/jbe@6 24 module = "index",
bsw/jbe@6 25 view = "register",
bsw/jbe@6 26 params = { code = invite_code.code }
bsw/jbe@6 27 }
bsw/jbe@6 28 return false
bsw/jbe@6 29 end
bsw/jbe@6 30
bsw/jbe@6 31 if #notify_email < 5 then
bsw/jbe@6 32 slot.put_into("error", _"Email address too short!")
bsw/jbe@5 33 request.redirect{
bsw/jbe@5 34 mode = "redirect",
bsw/jbe@5 35 module = "index",
bsw/jbe@5 36 view = "register",
bsw/jbe@5 37 params = { code = invite_code.code }
bsw/jbe@5 38 }
bsw/jbe@5 39 return false
bsw/jbe@5 40 end
bsw/jbe@5 41
bsw/jbe@6 42 local name = param.get("name")
bsw/jbe@6 43
bsw/jbe@6 44 if notify_email and not name then
bsw/jbe@6 45 request.redirect{
bsw/jbe@6 46 mode = "redirect",
bsw/jbe@6 47 module = "index",
bsw/jbe@6 48 view = "register",
bsw/jbe@6 49 params = {
bsw/jbe@6 50 code = invite_code.code,
bsw/jbe@6 51 notify_email = notify_email
bsw/jbe@6 52 }
bsw/jbe@6 53 }
bsw/jbe@6 54 return false
bsw/jbe@6 55 end
bsw/jbe@6 56
bsw/jbe@6 57 name = util.trim(name)
bsw/jbe@6 58
bsw/jbe@6 59 if #name < 3 then
bsw/jbe@6 60 slot.put_into("error", _"This username is too short!")
bsw/jbe@6 61 request.redirect{
bsw/jbe@6 62 mode = "redirect",
bsw/jbe@6 63 module = "index",
bsw/jbe@6 64 view = "register",
bsw/jbe@6 65 params = {
bsw/jbe@6 66 code = invite_code.code,
bsw/jbe@6 67 notify_email = notify_email
bsw/jbe@6 68 }
bsw/jbe@6 69 }
bsw/jbe@6 70 return false
bsw/jbe@6 71 end
bsw/jbe@6 72
bsw/jbe@5 73 if Member:by_name(name) then
bsw/jbe@5 74 slot.put_into("error", _"This name is already taken, please choose another one!")
bsw/jbe@5 75 request.redirect{
bsw/jbe@5 76 mode = "redirect",
bsw/jbe@5 77 module = "index",
bsw/jbe@5 78 view = "register",
bsw/jbe@6 79 params = {
bsw/jbe@6 80 code = invite_code.code,
bsw/jbe@6 81 notify_email = notify_email
bsw/jbe@6 82 }
bsw/jbe@5 83 }
bsw/jbe@5 84 return false
bsw/jbe@5 85 end
bsw/jbe@5 86
bsw/jbe@5 87 local login = param.get("login")
bsw/jbe@5 88
bsw/jbe@5 89 if name and not login then
bsw/jbe@5 90 request.redirect{
bsw/jbe@5 91 mode = "redirect",
bsw/jbe@5 92 module = "index",
bsw/jbe@5 93 view = "register",
bsw/jbe@5 94 params = {
bsw/jbe@5 95 code = invite_code.code,
bsw/jbe@6 96 notify_email = notify_email,
bsw/jbe@6 97 name = name
bsw/jbe@6 98 }
bsw/jbe@6 99 }
bsw/jbe@6 100 return false
bsw/jbe@6 101 end
bsw/jbe@6 102
bsw/jbe@6 103 login = util.trim(login)
bsw/jbe@6 104
bsw/jbe@6 105 if #login < 3 then
bsw/jbe@6 106 slot.put_into("error", _"This login is too short!")
bsw/jbe@6 107 request.redirect{
bsw/jbe@6 108 mode = "redirect",
bsw/jbe@6 109 module = "index",
bsw/jbe@6 110 view = "register",
bsw/jbe@6 111 params = {
bsw/jbe@6 112 code = invite_code.code,
bsw/jbe@6 113 notify_email = notify_email,
bsw/jbe@5 114 name = name
bsw/jbe@5 115 }
bsw/jbe@5 116 }
bsw/jbe@5 117 return false
bsw/jbe@5 118 end
bsw/jbe@5 119
bsw/jbe@5 120 if Member:by_login(login) then
bsw/jbe@5 121 slot.put_into("error", _"This login is already taken, please choose another one!")
bsw/jbe@5 122 request.redirect{
bsw/jbe@5 123 mode = "redirect",
bsw/jbe@5 124 module = "index",
bsw/jbe@5 125 view = "register",
bsw/jbe@5 126 params = {
bsw/jbe@5 127 code = invite_code.code,
bsw/jbe@6 128 notify_email = notify_email,
bsw/jbe@5 129 name = name
bsw/jbe@5 130 }
bsw/jbe@5 131 }
bsw/jbe@5 132 return false
bsw/jbe@5 133 end
bsw/jbe@5 134
bsw@79 135 if login and param.get("step") ~= "5" then
bsw/jbe@6 136 request.redirect{
bsw/jbe@6 137 mode = "redirect",
bsw/jbe@6 138 module = "index",
bsw/jbe@6 139 view = "register",
bsw/jbe@6 140 params = {
bsw/jbe@6 141 code = invite_code.code,
bsw/jbe@6 142 notify_email = notify_email,
bsw/jbe@6 143 name = name,
bsw/jbe@6 144 login = login
bsw/jbe@6 145 }
bsw/jbe@6 146 }
bsw/jbe@6 147 return false
bsw/jbe@6 148 end
bsw/jbe@6 149
bsw@79 150 for i, checkbox in ipairs(config.use_terms_checkboxes) do
bsw@79 151 local accepted = param.get("use_terms_checkbox_" .. checkbox.name, atom.boolean)
bsw@79 152 if not accepted then
bsw@79 153 slot.put_into("error", checkbox.not_accepted_error)
bsw@79 154 return false
bsw@79 155 end
bsw@79 156 end
bsw/jbe@6 157
bsw/jbe@5 158 local password1 = param.get("password1")
bsw/jbe@5 159 local password2 = param.get("password2")
bsw/jbe@5 160
bsw/jbe@5 161 if login and not password1 then
bsw/jbe@5 162 request.redirect{
bsw/jbe@5 163 mode = "redirect",
bsw/jbe@5 164 module = "index",
bsw/jbe@5 165 view = "register",
bsw/jbe@5 166 params = {
bsw/jbe@5 167 code = invite_code.code,
bsw/jbe@6 168 notify_email = notify_email,
bsw/jbe@5 169 name = name,
bsw/jbe@5 170 login = login
bsw/jbe@5 171 }
bsw/jbe@5 172 }
bsw@79 173 --]]
bsw/jbe@5 174 return false
bsw/jbe@5 175 end
bsw/jbe@5 176
bsw/jbe@5 177 if password1 ~= password2 then
bsw/jbe@5 178 slot.put_into("error", _"Passwords don't match!")
bsw/jbe@5 179 return false
bsw/jbe@5 180 end
bsw/jbe@5 181
bsw/jbe@5 182 if #password1 < 8 then
bsw/jbe@5 183 slot.put_into("error", _"Passwords must consist of at least 8 characters!")
bsw/jbe@5 184 return false
bsw/jbe@5 185 end
bsw/jbe@5 186
bsw/jbe@5 187 local member = Member:new()
bsw/jbe@5 188
bsw/jbe@5 189 member.login = login
bsw/jbe@5 190 member.name = name
bsw/jbe@6 191
bsw/jbe@6 192 local success = member:set_notify_email(notify_email)
bsw/jbe@6 193 if not success then
bsw/jbe@6 194 slot.put_into("error", _"Can't send confirmation email")
bsw/jbe@6 195 return
bsw/jbe@6 196 end
bsw/jbe@6 197
bsw/jbe@5 198 member:set_password(password1)
bsw/jbe@5 199 member:save()
bsw/jbe@5 200
bsw@83 201 local now = db:query("SELECT now() AS now", "object").now
bsw@83 202
bsw@79 203 for i, checkbox in ipairs(config.use_terms_checkboxes) do
bsw@79 204 local accepted = param.get("use_terms_checkbox_" .. checkbox.name, atom.boolean)
bsw@83 205 member:set_setting("use_terms_checkbox_" .. checkbox.name, "accepted at " .. tostring(now))
bsw@79 206 end
bsw@79 207
bsw/jbe@5 208 invite_code.member_id = member.id
bsw/jbe@5 209 invite_code.used = "now"
bsw/jbe@5 210 invite_code:save()
bsw/jbe@5 211
bsw/jbe@5 212 slot.put_into("notice", _"You've successfully registered and you can login now with your login and password!")
bsw/jbe@5 213
bsw/jbe@6 214 request.redirect{
bsw/jbe@6 215 mode = "redirect",
bsw/jbe@6 216 module = "index",
bsw/jbe@6 217 view = "login",
bsw/jbe@6 218 }

Impressum / About Us