Mercurial > prosody-modules
comparison mod_register_redirect/mod_register_redirect.lua @ 440:9a71493368de
mod_register_redirect: initial commit.
| author | Marco Cirillo <maranda@lightwitch.org> |
|---|---|
| date | Thu, 22 Sep 2011 15:03:51 +0000 |
| parents | |
| children | bfc8bc7d77f3 |
comparison
equal
deleted
inserted
replaced
| 439:c01679811fe8 | 440:9a71493368de |
|---|---|
| 1 -- Registration Redirect module for Prosody | |
| 2 -- | |
| 3 -- Redirects IP addresses not in the whitelist to a web page or another method to complete the registration. | |
| 4 | |
| 5 local st = require "util.stanza"; | |
| 6 local cman = require "core.configmanager"; | |
| 7 | |
| 8 function reg_redirect(event) | |
| 9 local stanza, origin = event.stanza, event.origin; | |
| 10 local ip_wl = module:get_option("registration_whitelist") or { "127.0.0.1" }; | |
| 11 local url = module:get_option_string("registration_url" or nil); | |
| 12 local inst_text = module:get_option_string("registration_text" or nil); | |
| 13 local oob = module:get_option_boolean("registration_oob" or true); | |
| 14 local admins_g = cman.get("*", core, "admins"); | |
| 15 local admins_l = cman.get(module:get_host(), core, "admins"); | |
| 16 local no_wl = module:get_option_boolean("no_registration_whitelist", false); | |
| 17 local test_ip = false; | |
| 18 | |
| 19 if type(admins_g) ~= "table" then admins_g = nil; end | |
| 20 if type(admins_l) ~= "table" then admins_g = nil; end | |
| 21 | |
| 22 -- perform checks to set default responses and sanity checks. | |
| 23 if not inst_text then | |
| 24 if url and oob then | |
| 25 if url:match("^%w+[:].*$") then | |
| 26 if url:match("^(%w+)[:].*$") == "http" or url:match("^(%w+)[:].*$") == "https" then | |
| 27 inst_text = "Please visit "..url.." to register an account on this server." | |
| 28 elseif url:match("^(%w+)[:].*$") == "mailto" then | |
| 29 inst_text = "Please send an e-mail at "..url:match("^%w+[:](.*)$").." to register an account on this server." | |
| 30 elseif url:match("^(%w+)[:].*$") == "xmpp" then | |
| 31 inst_text = "Please contact "..module:get_host().." server administrator via xmpp to register an account on this server at: "..url:match("^%wÃ+[:](.*)$") | |
| 32 else | |
| 33 module:log("error", "This module supports only http/https, mailto or xmpp as URL formats.") | |
| 34 module:log("error", "If you want to use personalized instructions without an Out-Of-Band method,") | |
| 35 module:log("error", "specify: register_oob = false; -- in your configuration along your banner string (register_text).") | |
| 36 origin.send(st.error_reply(stanza, "wait", "internal-server-error")); return true -- bouncing request. | |
| 37 end | |
| 38 else | |
| 39 module:log("error", "Please check your configuration, the URL you specified is invalid") | |
| 40 origin.send(st.error_reply(stanza, "wait", "internal-server-error")); return true -- bouncing request. | |
| 41 end | |
| 42 else | |
| 43 if admins_l then | |
| 44 local ajid; for _,v in ipairs(admins_l) do ajid = v; break; end | |
| 45 inst_text = "Please contact "..module:get_host().." server administrator via xmpp to register an account on this server at: "..ajid | |
| 46 else | |
| 47 if admins_g then | |
| 48 local ajid; for _,v in ipairs(admins_g) do ajid = v; break; end | |
| 49 inst_text = "Please contact "..module:get_host().." server administrator via xmpp to register an account on this server at: "..ajid | |
| 50 else | |
| 51 module:log("error", "Please be sure to, _at the very least_, configure one server administrator either global or hostwise...") | |
| 52 module:log("error", "if you want to use this module, or read it's configuration wiki at: http://code.google.com/p/prosody-modules/wiki/mod_register_redirect") | |
| 53 origin.send(st.error_reply(stanza, "wait", "internal-server-error")) -- bouncing request. | |
| 54 return true; | |
| 55 end | |
| 56 end | |
| 57 end | |
| 58 elseif text and oob then | |
| 59 if not url:match("^%w+[:].*$") then | |
| 60 module:log("error", "Please check your configuration, the URL specified is not valid.") | |
| 61 origin.send(st.error_reply(stanza, "wait", "internal-server-error")) -- bouncing request. | |
| 62 end | |
| 63 end | |
| 64 | |
| 65 if not no_wl then | |
| 66 for i,ip in ipairs(ip_wl) do | |
| 67 if origin.ip == ip then test_ip = true; end | |
| 68 break; | |
| 69 end | |
| 70 end | |
| 71 | |
| 72 -- Prepare replies. | |
| 73 local reply = st.reply(event.stanza); | |
| 74 if oob then | |
| 75 reply:query("jabber:iq:register") | |
| 76 :tag("instructions"):text(inst_text):up() | |
| 77 :tag("x", {xmlns = "jabber:x:oob"}) | |
| 78 :tag("url"):text(url); | |
| 79 else | |
| 80 reply:query("jabber:iq:register") | |
| 81 :tag("instructions"):text(inst_text):up() | |
| 82 end | |
| 83 | |
| 84 if stanza.attr.type == "get" then | |
| 85 origin.send(reply); | |
| 86 return true; | |
| 87 else | |
| 88 origin.send(st.error_reply(stanza, "cancel", "not-authorized")) | |
| 89 return true | |
| 90 end | |
| 91 end | |
| 92 | |
| 93 module:hook("stanza/iq/jabber:iq:register:query", reg_redirect, 10); |
