Mercurial > prosody-modules
comparison mod_register_json/mod_register_json.lua @ 723:c26652d055b5
mod_register_json: moved throttling logic so that if there's a failure during nick registration the user can retry and referenced usermanager from prosody's _G instead of req. it.
author | Marco Cirillo <maranda@lightwitch.org> |
---|---|
date | Mon, 25 Jun 2012 22:20:27 +0000 |
parents | 9080b0898b6f |
children | 836e4e110c71 |
comparison
equal
deleted
inserted
replaced
722:5c7175be532b | 723:c26652d055b5 |
---|---|
4 -- A Good chunk of the code is from mod_data_access.lua by Kim Alvefur | 4 -- A Good chunk of the code is from mod_data_access.lua by Kim Alvefur |
5 -- aka Zash. | 5 -- aka Zash. |
6 | 6 |
7 local jid_prep = require "util.jid".prep | 7 local jid_prep = require "util.jid".prep |
8 local jid_split = require "util.jid".split | 8 local jid_split = require "util.jid".split |
9 local usermanager = require "core.usermanager" | 9 local usermanager = usermanager |
10 local b64_decode = require "util.encodings".base64.decode | 10 local b64_decode = require "util.encodings".base64.decode |
11 local json_decode = require "util.json".decode | 11 local json_decode = require "util.json".decode |
12 local os_time = os.time | 12 local os_time = os.time |
13 local nodeprep = require "util.encodings".stringprep.nodeprep | 13 local nodeprep = require "util.encodings".stringprep.nodeprep |
14 | 14 |
76 -- Check if user is an admin of said host | 76 -- Check if user is an admin of said host |
77 if not usermanager.is_admin(user, req_body["host"]) then | 77 if not usermanager.is_admin(user, req_body["host"]) then |
78 module:log("warn", "%s tried to submit registration data for %s but he's not an admin", user, req_body["host"]) | 78 module:log("warn", "%s tried to submit registration data for %s but he's not an admin", user, req_body["host"]) |
79 return http_response(event, 401, "I obey only to my masters... Have a nice day.") | 79 return http_response(event, 401, "I obey only to my masters... Have a nice day.") |
80 else | 80 else |
81 -- Checks for both Throttling/Whitelist and Blacklist (basically copycatted from prosody's register.lua code) | 81 -- Blacklist can be checked here. |
82 if blacklist:contains(req_body["ip"]) then module:log("warn", "Attempt of reg. submission to the JSON servlet from blacklisted address: %s", req_body["ip"]) ; return http_response(403, "The specified address is blacklisted, sorry sorry.") end | 82 if blacklist:contains(req_body["ip"]) then module:log("warn", "Attempt of reg. submission to the JSON servlet from blacklisted address: %s", req_body["ip"]) ; return http_response(403, "The specified address is blacklisted, sorry sorry.") end |
83 if throttle_time and not whitelist:contains(req_body["ip"]) then | |
84 if not recent_ips[req_body["ip"]] then | |
85 recent_ips[req_body["ip"]] = os_time() | |
86 else | |
87 if os_time() - recent_ips[req_body["ip"]] < throttle_time then | |
88 recent_ips[req_body["ip"]] = os_time() | |
89 module:log("warn", "JSON Registration request from %s has been throttled.", req_body["ip"]) | |
90 return http_response(event, 503, "Woah... How many users you want to register..? Request throttled, wait a bit and try again.") | |
91 end | |
92 recent_ips[req_body["ip"]] = os_time() | |
93 end | |
94 end | |
95 | 83 |
96 -- We first check if the supplied username for registration is already there. | 84 -- We first check if the supplied username for registration is already there. |
97 -- And nodeprep the username | 85 -- And nodeprep the username |
98 local username = nodeprep(req_body["username"]) | 86 local username = nodeprep(req_body["username"]) |
99 if not username then | 87 if not username then |
100 module:log("debug", "%s supplied an username containing invalid characters: %s", user, username) | 88 module:log("debug", "%s supplied an username containing invalid characters: %s", user, username) |
101 return http_response(event, 406, "Supplied username contains invalid characters, see RFC 6122.") | 89 return http_response(event, 406, "Supplied username contains invalid characters, see RFC 6122.") |
102 else | 90 else |
103 if not usermanager.user_exists(username, req_body["host"]) then | 91 if not usermanager.user_exists(username, req_body["host"]) then |
92 -- if username fails to register successive requests shouldn't be throttled until one is successful. | |
93 if throttle_time and not whitelist:contains(req_body["ip"]) then | |
94 if not recent_ips[req_body["ip"]] then | |
95 recent_ips[req_body["ip"]] = os_time() | |
96 else | |
97 if os_time() - recent_ips[req_body["ip"]] < throttle_time then | |
98 recent_ips[req_body["ip"]] = os_time() | |
99 module:log("warn", "JSON Registration request from %s has been throttled.", req_body["ip"]) | |
100 return http_response(event, 503, "Woah... How many users you want to register..? Request throttled, wait a bit and try again.") | |
101 end | |
102 recent_ips[req_body["ip"]] = os_time() | |
103 end | |
104 end | |
105 | |
104 local ok, error = usermanager.create_user(username, req_body["password"], req_body["host"]) | 106 local ok, error = usermanager.create_user(username, req_body["password"], req_body["host"]) |
105 if ok then | 107 if ok then |
106 hosts[req_body["host"]].events.fire_event("user-registered", { username = username, host = req_body["host"], source = "mod_register_json", session = { ip = req_body["ip"] } }) | 108 hosts[req_body["host"]].events.fire_event("user-registered", { username = username, host = req_body["host"], source = "mod_register_json", session = { ip = req_body["ip"] } }) |
107 module:log("debug", "%s registration data submission for %s@%s is successful", user, username, req_body["host"]) | 109 module:log("debug", "%s registration data submission for %s@%s is successful", user, username, req_body["host"]) |
108 return http_response(event, 200, "Done.") | 110 return http_response(event, 200, "Done.") |