--- Prosody IM v0.4
+-- Prosody IM
-- Copyright (C) 2008-2009 Matthew Wild
-- Copyright (C) 2008-2009 Waqas Hussain
--
local hosts = _G.hosts;
local st = require "util.stanza";
-local config = require "core.configmanager";
local datamanager = require "util.datamanager";
local usermanager_user_exists = require "core.usermanager".user_exists;
local usermanager_create_user = require "core.usermanager".create_user;
session:close({condition = "not-authorized", text = "Account deleted"});
end
-- TODO datamanager should be able to delete all user data itself
- datamanager.store(username, host, "roster", nil);
datamanager.store(username, host, "vcard", nil);
datamanager.store(username, host, "private", nil);
datamanager.store(username, host, "offline", nil);
- --local bare = username.."@"..host;
+ local bare = username.."@"..host;
for jid, item in pairs(roster) do
- if jid ~= "pending" then
- if item.subscription == "both" or item.subscription == "to" then
- -- TODO unsubscribe
+ if jid and jid ~= "pending" then
+ if item.subscription == "both" or item.subscription == "from" or (roster.pending and roster.pending[jid]) then
+ core_post_stanza(hosts[host], st.presence({type="unsubscribed", from=bare, to=jid}));
end
- if item.subscription == "both" or item.subscription == "from" then
- -- TODO unsubscribe
+ if item.subscription == "both" or item.subscription == "to" or item.ask then
+ core_post_stanza(hosts[host], st.presence({type="unsubscribe", from=bare, to=jid}));
end
end
end
+ datamanager.store(username, host, "roster", nil);
datamanager.store(username, host, "accounts", nil); -- delete accounts datastore at the end
module:log("info", "User removed their account: %s@%s", username, host);
- module:fire_event("user-deregistered", { username = username, host = host, source = "mod_register" });
+ module:fire_event("user-deregistered", { username = username, host = host, source = "mod_register", session = session });
else
local username = query:child_with_name("username");
local password = query:child_with_name("password");
end);
local recent_ips = {};
-local min_seconds_between_registrations = config.get(module.host, "core", "min_seconds_between_registrations");
-local whitelist_only = config.get(module.host, "core", "whitelist_registration_only");
-local whitelisted_ips = config.get(module.host, "core", "registration_whitelist") or { "127.0.0.1" };
-local blacklisted_ips = config.get(module.host, "core", "registration_blacklist") or {};
+local min_seconds_between_registrations = module:get_option("min_seconds_between_registrations");
+local whitelist_only = module:get_option("whitelist_registration_only");
+local whitelisted_ips = module:get_option("registration_whitelist") or { "127.0.0.1" };
+local blacklisted_ips = module:get_option("registration_blacklist") or {};
for _, ip in ipairs(whitelisted_ips) do whitelisted_ips[ip] = true; end
for _, ip in ipairs(blacklisted_ips) do blacklisted_ips[ip] = true; end
module:add_iq_handler("c2s_unauthed", "jabber:iq:register", function (session, stanza)
- if config.get(module.host, "core", "allow_registration") == false then
+ if module:get_option("allow_registration") == false then
session.send(st.error_reply(stanza, "cancel", "service-unavailable"));
elseif stanza.tags[1].name == "query" then
local query = stanza.tags[1];
local password = query:child_with_name("password");
if username and password then
-- Check that the user is not blacklisted or registering too often
- if blacklisted_ips[session.ip] or (whitelist_only and not whitelisted_ips[session.ip]) then
- session.send(st.error_reply(stanza, "cancel", "not-acceptable"));
- return;
+ if not session.ip then
+ module:log("debug", "User's IP not known; can't apply blacklist/whitelist");
+ elseif blacklisted_ips[session.ip] or (whitelist_only and not whitelisted_ips[session.ip]) then
+ session.send(st.error_reply(stanza, "cancel", "not-acceptable", "You are not allowed to register an account."));
+ return;
elseif min_seconds_between_registrations and not whitelisted_ips[session.ip] then
if not recent_ips[session.ip] then
recent_ips[session.ip] = { time = os_time(), count = 1 };
else
-
local ip = recent_ips[session.ip];
ip.count = ip.count + 1;
if os_time() - ip.time < min_seconds_between_registrations then
ip.time = os_time();
- session.send(st.error_reply(stanza, "cancel", "not-acceptable"));
+ session.send(st.error_reply(stanza, "wait", "not-acceptable"));
return;
end
ip.time = os_time();
-- FIXME shouldn't use table.concat
username = nodeprep(table.concat(username));
password = table.concat(password);
- if usermanager_user_exists(username, session.host) then
- session.send(st.error_reply(stanza, "cancel", "conflict"));
+ local host = module.host;
+ if not username or username == "" then
+ session.send(st.error_reply(stanza, "modify", "not-acceptable", "The requested username is invalid."));
+ elseif usermanager_user_exists(username, host) then
+ session.send(st.error_reply(stanza, "cancel", "conflict", "The requested username already exists."));
else
- if usermanager_create_user(username, password, session.host) then
+ if usermanager_create_user(username, password, host) then
session.send(st.reply(stanza)); -- user created!
- module:log("info", "User account created: %s@%s", username, session.host);
+ module:log("info", "User account created: %s@%s", username, host);
module:fire_event("user-registered", {
- username = username, host = session.host, source = "mod_register" });
+ username = username, host = host, source = "mod_register",
+ session = session });
else
-- TODO unable to write file, file may be locked, etc, what's the correct error?
- session.send(st.error_reply(stanza, "wait", "internal-server-error"));
+ session.send(st.error_reply(stanza, "wait", "internal-server-error", "Failed to write data to disk."));
end
end
else