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);