Software / code / prosody
Comparison
plugins/mod_register_ibr.lua @ 11200:bf8f2da84007
Merge 0.11->trunk
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 05 Nov 2020 22:31:25 +0100 |
| parent | 10946:84441c19750e |
| child | 12330:38b5b05407be |
comparison
equal
deleted
inserted
replaced
| 11199:6c7c50a4de32 | 11200:bf8f2da84007 |
|---|---|
| 7 -- | 7 -- |
| 8 | 8 |
| 9 | 9 |
| 10 local st = require "util.stanza"; | 10 local st = require "util.stanza"; |
| 11 local dataform_new = require "util.dataforms".new; | 11 local dataform_new = require "util.dataforms".new; |
| 12 local usermanager_user_exists = require "core.usermanager".user_exists; | 12 local usermanager_user_exists = require "core.usermanager".user_exists; |
| 13 local usermanager_create_user = require "core.usermanager".create_user; | 13 local usermanager_create_user = require "core.usermanager".create_user; |
| 14 local usermanager_delete_user = require "core.usermanager".delete_user; | 14 local usermanager_set_password = require "core.usermanager".create_user; |
| 15 local usermanager_delete_user = require "core.usermanager".delete_user; | |
| 15 local nodeprep = require "util.encodings".stringprep.nodeprep; | 16 local nodeprep = require "util.encodings".stringprep.nodeprep; |
| 17 local util_error = require "util.error"; | |
| 16 | 18 |
| 17 local additional_fields = module:get_option("additional_registration_fields", {}); | 19 local additional_fields = module:get_option("additional_registration_fields", {}); |
| 18 local require_encryption = module:get_option_boolean("c2s_require_encryption", | 20 local require_encryption = module:get_option_boolean("c2s_require_encryption", |
| 19 module:get_option_boolean("require_encryption", false)); | 21 module:get_option_boolean("require_encryption", false)); |
| 20 | 22 |
| 153 end | 155 end |
| 154 session.send(st.error_reply(stanza, "modify", "not-acceptable", table.concat(textual_errors, "\n"))); | 156 session.send(st.error_reply(stanza, "modify", "not-acceptable", table.concat(textual_errors, "\n"))); |
| 155 return true; | 157 return true; |
| 156 end | 158 end |
| 157 | 159 |
| 158 local username, password = nodeprep(data.username), data.password; | 160 local username, password = nodeprep(data.username, true), data.password; |
| 159 data.username, data.password = nil, nil; | 161 data.username, data.password = nil, nil; |
| 160 local host = module.host; | 162 local host = module.host; |
| 161 if not username or username == "" then | 163 if not username or username == "" then |
| 162 log("debug", "The requested username is invalid."); | 164 log("debug", "The requested username is invalid."); |
| 163 session.send(st.error_reply(stanza, "modify", "not-acceptable", "The requested username is invalid.")); | 165 session.send(st.error_reply(stanza, "modify", "not-acceptable", "The requested username is invalid.")); |
| 165 end | 167 end |
| 166 | 168 |
| 167 local user = { username = username, password = password, host = host, additional = data, ip = session.ip, session = session, allowed = true } | 169 local user = { username = username, password = password, host = host, additional = data, ip = session.ip, session = session, allowed = true } |
| 168 module:fire_event("user-registering", user); | 170 module:fire_event("user-registering", user); |
| 169 if not user.allowed then | 171 if not user.allowed then |
| 170 log("debug", "Registration disallowed by module: %s", user.reason or "no reason given"); | 172 local error_type, error_condition, reason; |
| 171 session.send(st.error_reply(stanza, "modify", "not-acceptable", user.reason)); | 173 local err = user.error; |
| 174 if err then | |
| 175 error_type, error_condition, reason = err.type, err.condition, err.text; | |
| 176 else | |
| 177 -- COMPAT pre-util.error | |
| 178 error_type, error_condition, reason = user.error_type, user.error_condition, user.reason; | |
| 179 end | |
| 180 log("debug", "Registration disallowed by module: %s", reason or "no reason given"); | |
| 181 session.send(st.error_reply(stanza, error_type or "modify", error_condition or "not-acceptable", reason)); | |
| 172 return true; | 182 return true; |
| 173 end | 183 end |
| 174 | 184 |
| 175 if usermanager_user_exists(username, host) then | 185 if usermanager_user_exists(username, host) then |
| 176 log("debug", "Attempt to register with existing username"); | 186 if user.allow_reset == username then |
| 177 session.send(st.error_reply(stanza, "cancel", "conflict", "The requested username already exists.")); | 187 local ok, err = util_error.coerce(usermanager_set_password(username, password, host)); |
| 178 return true; | 188 if ok then |
| 179 end | 189 module:fire_event("user-password-reset", user); |
| 180 | 190 session.send(st.reply(stanza)); -- reset ok! |
| 181 -- TODO unable to write file, file may be locked, etc, what's the correct error? | 191 else |
| 182 local error_reply = st.error_reply(stanza, "wait", "internal-server-error", "Failed to write data to disk."); | 192 session.log("error", "Unable to reset password for %s@%s: %s", username, host, err); |
| 183 if usermanager_create_user(username, password, host) then | 193 session.send(st.error_reply(stanza, err.type, err.condition, err.text)); |
| 194 end | |
| 195 return true; | |
| 196 else | |
| 197 log("debug", "Attempt to register with existing username"); | |
| 198 session.send(st.error_reply(stanza, "cancel", "conflict", "The requested username already exists.")); | |
| 199 return true; | |
| 200 end | |
| 201 end | |
| 202 | |
| 203 local created, err = usermanager_create_user(username, password, host); | |
| 204 if created then | |
| 184 data.registered = os.time(); | 205 data.registered = os.time(); |
| 185 if not account_details:set(username, data) then | 206 if not account_details:set(username, data) then |
| 186 log("debug", "Could not store extra details"); | 207 log("debug", "Could not store extra details"); |
| 187 usermanager_delete_user(username, host); | 208 usermanager_delete_user(username, host); |
| 188 session.send(error_reply); | 209 session.send(st.error_reply(stanza, "wait", "internal-server-error", "Failed to write data to disk.")); |
| 189 return true; | 210 return true; |
| 190 end | 211 end |
| 191 session.send(st.reply(stanza)); -- user created! | 212 session.send(st.reply(stanza)); -- user created! |
| 192 log("info", "User account created: %s@%s", username, host); | 213 log("info", "User account created: %s@%s", username, host); |
| 193 module:fire_event("user-registered", { | 214 module:fire_event("user-registered", { |
| 194 username = username, host = host, source = "mod_register", | 215 username = username, host = host, source = "mod_register", |
| 195 session = session }); | 216 session = session }); |
| 196 else | 217 else |
| 197 log("debug", "Could not create user"); | 218 log("debug", "Could not create user", err); |
| 198 session.send(error_reply); | 219 session.send(st.error_reply(stanza, "cancel", "feature-not-implemented", err)); |
| 199 end | 220 end |
| 200 return true; | 221 return true; |
| 201 end); | 222 end); |