diff options
-rw-r--r-- | plugins/mod_component.lua | 31 | ||||
-rw-r--r-- | util/interpolation.lua | 18 | ||||
-rw-r--r-- | util/prosodyctl.lua | 30 | ||||
-rw-r--r-- | util/sql.lua | 4 |
4 files changed, 46 insertions, 37 deletions
diff --git a/plugins/mod_component.lua b/plugins/mod_component.lua index 53ef4ed0..f29245b2 100644 --- a/plugins/mod_component.lua +++ b/plugins/mod_component.lua @@ -33,7 +33,7 @@ function module.add_host(module) if module:get_host_type() ~= "component" then error("Don't load mod_component manually, it should be for a component, please see http://prosody.im/doc/components", 0); end - + local env = module.environment; env.connected = false; @@ -44,26 +44,26 @@ function module.add_host(module) send = nil; session.on_destroy = nil; end - + -- Handle authentication attempts by component local function handle_component_auth(event) local session, stanza = event.origin, event.stanza; - + if session.type ~= "component_unauthed" then return; end - + if (not session.host) or #stanza.tags > 0 then (session.log or log)("warn", "Invalid component handshake for host: %s", session.host); session:close("not-authorized"); return true; end - + local secret = module:get_option("component_secret"); if not secret then (session.log or log)("warn", "Component attempted to identify as %s, but component_secret is not set", session.host); session:close("not-authorized"); return true; end - + local supplied_token = t_concat(stanza); local calculated_token = sha1(session.streamid..secret, true); if supplied_token:lower() ~= calculated_token:lower() then @@ -71,13 +71,13 @@ function module.add_host(module) session:close{ condition = "not-authorized", text = "Given token does not match calculated token" }; return true; end - + if env.connected then module:log("error", "Second component attempted to connect, denying connection"); session:close{ condition = "conflict", text = "Component already connected" }; return true; end - + env.connected = true; send = session.send; session.on_destroy = on_destroy; @@ -85,7 +85,8 @@ function module.add_host(module) session.type = "component"; module:log("info", "External component successfully authenticated"); session.send(st.stanza("handshake")); - + module:fire_event("component-authenticated", { session = session }); + return true; end module:hook("stanza/jabber:component:accept:handshake", handle_component_auth, -1); @@ -116,7 +117,7 @@ function module.add_host(module) end return true; end - + module:hook("iq/bare", handle_stanza, -1); module:hook("message/bare", handle_stanza, -1); module:hook("presence/bare", handle_stanza, -1); @@ -273,14 +274,14 @@ function listener.onconnect(conn) if opt_keepalives then conn:setoption("keepalive", opt_keepalives); end - + session.log("info", "Incoming Jabber component connection"); - + local stream = new_xmpp_stream(session, stream_callbacks); session.stream = stream; - + session.notopen = true; - + function session.reset_stream() session.notopen = true; session.stream:reset(); @@ -292,7 +293,7 @@ function listener.onconnect(conn) module:log("debug", "Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " "):gsub("[%z\1-\31]", "_")); session:close("not-well-formed"); end - + session.dispatch_stanza = stream_callbacks.handlestanza; sessions[conn] = session; diff --git a/util/interpolation.lua b/util/interpolation.lua index b78bdfd1..315cc203 100644 --- a/util/interpolation.lua +++ b/util/interpolation.lua @@ -1,6 +1,6 @@ -- Simple template language -- --- The new() function takes a pattern and an escape function and returns +-- The new() function takes a pattern and an escape function and returns -- a render() function. Both are required. -- -- The function render() takes a string template and a table of values. @@ -9,14 +9,14 @@ -- symbol. -- -- Variants are: --- {name} is substituted for values["name"] and is escaped using the +-- {name} is substituted for values["name"] and is escaped using the -- second argument to new_render(). To disable the escaping, use {name!}. -- {name.item} can be used to access table items. -- To renter lists of items: {name# item number {idx} is {item} } -- Or key-value pairs: {name% t[ {idx} ] = {item} } --- To show a defaults for missing values {name? sub-template } can be used, +-- To show a defaults for missing values {name? sub-template } can be used, -- which renders a sub-template if values["name"] is false-ish. --- {name& sub-template } does the opposite, the sub-template is rendered +-- {name& sub-template } does the opposite, the sub-template is rendered -- if the selected value is anything but false or nil. local type, tostring = type, tostring; @@ -24,7 +24,7 @@ local pairs, ipairs = pairs, ipairs; local s_sub, s_gsub, s_match = string.sub, string.gsub, string.match; local t_concat = table.concat; -local function new_render(pat, escape) +local function new_render(pat, escape, funcs) -- assert(type(pat) == "string", "bad argument #1 to 'new_render' (string expected)"); -- assert(type(escape) == "function", "bad argument #2 to 'new_render' (function expected)"); local function render(template, values) @@ -42,6 +42,14 @@ local function new_render(pat, escape) if not value then break; end end end + if funcs then + while value ~= nil and opt == '|' do + local f; + f, opt, e = s_match(block, "^([%a_][%w_.]*)(%p?)()", e); + f = funcs[f]; + if f then value = f(value); end + end + end if opt == '#' or opt == '%' then if type(value) ~= "table" then return ""; end local iter = opt == '#' and ipairs or pairs; diff --git a/util/prosodyctl.lua b/util/prosodyctl.lua index cc48d590..9e30f8ea 100644 --- a/util/prosodyctl.lua +++ b/util/prosodyctl.lua @@ -1,7 +1,7 @@ -- Prosody IM -- Copyright (C) 2008-2010 Matthew Wild -- Copyright (C) 2008-2010 Waqas Hussain --- +-- -- This project is MIT/X11 licensed. Please see the -- COPYING file in the source package for more information. -- @@ -146,7 +146,7 @@ function adduser(params) if not(provider) or provider.name == "null" then usermanager.initialize_host(host); end - + local ok, errmsg = usermanager.create_user(user, password, host); if not ok then return false, errmsg; @@ -162,7 +162,7 @@ function user_exists(params) if not(provider) or provider.name == "null" then usermanager.initialize_host(host); end - + return usermanager.user_exists(user, host); end @@ -170,7 +170,7 @@ function passwd(params) if not _M.user_exists(params) then return false, "no-such-user"; end - + return _M.adduser(params); end @@ -179,7 +179,7 @@ function deluser(params) return false, "no-such-user"; end local user, host = nodeprep(params.user), nameprep(params.host); - + return usermanager.delete_user(user, host); end @@ -192,30 +192,30 @@ function getpid() if type(pidfile) ~= "string" then return false, "invalid-pidfile"; end - + local modules_enabled = set.new(config.get("*", "modules_disabled")); if prosody.platform ~= "posix" or modules_enabled:contains("posix") then return false, "no-posix"; end - + local file, err = io.open(pidfile, "r+"); if not file then return false, "pidfile-read-failed", err; end - + local locked, err = lfs.lock(file, "w"); if locked then file:close(); return false, "pidfile-not-locked"; end - + local pid = tonumber(file:read("*a")); file:close(); - + if not pid then return false, "invalid-pid"; end - + return true, pid; end @@ -256,10 +256,10 @@ function stop() if not ret then return false, "not-running"; end - + local ok, pid = _M.getpid() if not ok then return false, pid; end - + signal.kill(pid, signal.SIGTERM); return true; end @@ -272,10 +272,10 @@ function reload() if not ret then return false, "not-running"; end - + local ok, pid = _M.getpid() if not ok then return false, pid; end - + signal.kill(pid, signal.SIGHUP); return true; end diff --git a/util/sql.lua b/util/sql.lua index f934bbdf..be34c381 100644 --- a/util/sql.lua +++ b/util/sql.lua @@ -285,7 +285,7 @@ function engine:set_encoding() -- to UTF-8 if not ok then return ok, err; end - + if driver == "MySQL" then local ok, actual_charset = self:transaction(function () return self:select"SHOW SESSION VARIABLES LIKE 'character_set_client'"; @@ -297,7 +297,7 @@ function engine:set_encoding() -- to UTF-8 end end end - + return true; end local engine_mt = { __index = engine }; |