plugins/mod_register.lua
changeset 7020 ff734a602886
parent 5776 bd0ff8ae98a8
child 7021 5c3d4254d415
equal deleted inserted replaced
7019:e0a0af42b09f 7020:ff734a602886
    82 	features:add_child(register_stream_feature);
    82 	features:add_child(register_stream_feature);
    83 end);
    83 end);
    84 
    84 
    85 local function handle_registration_stanza(event)
    85 local function handle_registration_stanza(event)
    86 	local session, stanza = event.origin, event.stanza;
    86 	local session, stanza = event.origin, event.stanza;
       
    87 	local log = session.log or module._log;
    87 
    88 
    88 	local query = stanza.tags[1];
    89 	local query = stanza.tags[1];
    89 	if stanza.attr.type == "get" then
    90 	if stanza.attr.type == "get" then
    90 		local reply = st.reply(stanza);
    91 		local reply = st.reply(stanza);
    91 		reply:tag("query", {xmlns = "jabber:iq:register"})
    92 		reply:tag("query", {xmlns = "jabber:iq:register"})
   104 			end
   105 			end
   105 
   106 
   106 			local ok, err = usermanager_delete_user(username, host);
   107 			local ok, err = usermanager_delete_user(username, host);
   107 
   108 
   108 			if not ok then
   109 			if not ok then
   109 				module:log("debug", "Removing user account %s@%s failed: %s", username, host, err);
   110 				log("debug", "Removing user account %s@%s failed: %s", username, host, err);
   110 				session.close = old_session_close;
   111 				session.close = old_session_close;
   111 				session.send(st.error_reply(stanza, "cancel", "service-unavailable", err));
   112 				session.send(st.error_reply(stanza, "cancel", "service-unavailable", err));
   112 				return true;
   113 				return true;
   113 			end
   114 			end
   114 
   115 
   115 			module:log("info", "User removed their account: %s@%s", username, host);
   116 			log("info", "User removed their account: %s@%s", username, host);
   116 			module:fire_event("user-deregistered", { username = username, host = host, source = "mod_register", session = session });
   117 			module:fire_event("user-deregistered", { username = username, host = host, source = "mod_register", session = session });
   117 		else
   118 		else
   118 			local username = nodeprep(query:get_child_text("username"));
   119 			local username = nodeprep(query:get_child_text("username"));
   119 			local password = query:get_child_text("password");
   120 			local password = query:get_child_text("password");
   120 			if username and password then
   121 			if username and password then
   175 local whitelisted_ips = module:get_option_set("registration_whitelist", { "127.0.0.1" })._items;
   176 local whitelisted_ips = module:get_option_set("registration_whitelist", { "127.0.0.1" })._items;
   176 local blacklisted_ips = module:get_option_set("registration_blacklist", {})._items;
   177 local blacklisted_ips = module:get_option_set("registration_blacklist", {})._items;
   177 
   178 
   178 module:hook("stanza/iq/jabber:iq:register:query", function(event)
   179 module:hook("stanza/iq/jabber:iq:register:query", function(event)
   179 	local session, stanza = event.origin, event.stanza;
   180 	local session, stanza = event.origin, event.stanza;
       
   181 	local log = session.log or module._log;
   180 
   182 
   181 	if not(allow_registration) or session.type ~= "c2s_unauthed" then
   183 	if not(allow_registration) or session.type ~= "c2s_unauthed" then
   182 		session.send(st.error_reply(stanza, "cancel", "service-unavailable"));
   184 		session.send(st.error_reply(stanza, "cancel", "service-unavailable"));
   183 	else
   185 	else
   184 		local query = stanza.tags[1];
   186 		local query = stanza.tags[1];
   194 				if errors then
   196 				if errors then
   195 					session.send(st.error_reply(stanza, "modify", "not-acceptable"));
   197 					session.send(st.error_reply(stanza, "modify", "not-acceptable"));
   196 				else
   198 				else
   197 					-- Check that the user is not blacklisted or registering too often
   199 					-- Check that the user is not blacklisted or registering too often
   198 					if not session.ip then
   200 					if not session.ip then
   199 						module:log("debug", "User's IP not known; can't apply blacklist/whitelist");
   201 						log("debug", "User's IP not known; can't apply blacklist/whitelist");
   200 					elseif blacklisted_ips[session.ip] or (whitelist_only and not whitelisted_ips[session.ip]) then
   202 					elseif blacklisted_ips[session.ip] or (whitelist_only and not whitelisted_ips[session.ip]) then
   201 						session.send(st.error_reply(stanza, "cancel", "not-acceptable", "You are not allowed to register an account."));
   203 						session.send(st.error_reply(stanza, "cancel", "not-acceptable", "You are not allowed to register an account."));
   202 						return true;
   204 						return true;
   203 					elseif min_seconds_between_registrations and not whitelisted_ips[session.ip] then
   205 					elseif min_seconds_between_registrations and not whitelisted_ips[session.ip] then
   204 						if not recent_ips[session.ip] then
   206 						if not recent_ips[session.ip] then
   236 								usermanager_delete_user(username, host);
   238 								usermanager_delete_user(username, host);
   237 								session.send(error_reply);
   239 								session.send(error_reply);
   238 								return true;
   240 								return true;
   239 							end
   241 							end
   240 							session.send(st.reply(stanza)); -- user created!
   242 							session.send(st.reply(stanza)); -- user created!
   241 							module:log("info", "User account created: %s@%s", username, host);
   243 							log("info", "User account created: %s@%s", username, host);
   242 							module:fire_event("user-registered", {
   244 							module:fire_event("user-registered", {
   243 								username = username, host = host, source = "mod_register",
   245 								username = username, host = host, source = "mod_register",
   244 								session = session });
   246 								session = session });
   245 						else
   247 						else
   246 							session.send(error_reply);
   248 							session.send(error_reply);