Merge 0.10->trunk
authorKim Alvefur <zash@zash.se>
Sun, 26 Oct 2014 19:58:02 +0000 (20:58 +0100)
committerKim Alvefur <zash@zash.se>
Sun, 26 Oct 2014 19:58:02 +0000 (20:58 +0100)
net/http.lua
plugins/mod_blocklist.lua
plugins/mod_legacyauth.lua
plugins/mod_saslauth.lua
plugins/mod_tls.lua
prosodyctl
util/stanza.lua

index 35e02fdf7d003f99373d32b8d274ac1ab33d541a..357b74520a4700e67d6d49b839327fe8bbc32361 100644 (file)
@@ -165,7 +165,7 @@ function request(u, ex, callback)
 
        local sslctx = false;
        if using_https then
-               sslctx = ex and ex.sslctx or { mode = "client", protocol = "sslv23", options = { "no_sslv2" } };
+               sslctx = ex and ex.sslctx or { mode = "client", protocol = "sslv23", options = { "no_sslv2", "no_sslv3" } };
        end
 
        local handler, conn = server.addclient(host, port_number, listener, "*a", sslctx)
index 1f09ca135b46420793ddf4ffb271d41a6d9ca2cd..70bfb5fc83cbc0d215af1b65b90c05741a113a46 100644 (file)
@@ -43,7 +43,6 @@ end
 -- Migrates from the old mod_privacy storage
 local function migrate_privacy_list(username)
        local migrated_data = { [false] = "not empty" };
-       module:log("info", "Migrating blocklist from mod_privacy storage for user '%s'", username);
        local legacy_data = module:open_store("privacy"):get(username);
        if legacy_data and legacy_data.lists and legacy_data.default then
                legacy_data = legacy_data.lists[legacy_data.default];
@@ -52,6 +51,7 @@ local function migrate_privacy_list(username)
                return migrated_data;
        end
        if legacy_data then
+               module:log("info", "Migrating blocklist from mod_privacy storage for user '%s'", username);
                local item, jid;
                for i = 1, #legacy_data do
                        item = legacy_data[i];
@@ -149,7 +149,9 @@ local function edit_blocklist(event)
                for jid, in_roster in pairs(new) do
                        if not blocklist[jid] and in_roster and sessions[username] then
                                for _, session in pairs(sessions[username].sessions) do
-                                       module:send(st.presence({ type = "unavailable", to = jid, from = session.full_jid }));
+                                       if session.presence then
+                                               module:send(st.presence({ type = "unavailable", to = jid, from = session.full_jid }));
+                                       end
                                end
                        end
                end
index 54cbec24c2c20a6fed1ef7b3147a446112ca33d3..5edc26bb2567604348e42d33b00854f4f24db921 100644 (file)
@@ -11,8 +11,8 @@
 local st = require "util.stanza";
 local t_concat = table.concat;
 
-local secure_auth_only = module:get_option("c2s_require_encryption")
-       or module:get_option("require_encryption")
+local secure_auth_only = module:get_option("c2s_require_encryption",
+       module:get_option("require_encryption"))
        or not(module:get_option("allow_unencrypted_plain_auth"));
 
 local sessionmanager = require "core.sessionmanager";
index 9e63b4c7a9421e73a650ed97e6c7aab682a733f9..e42adbe1625365eb08ffa9ed3cb15e8811c99d27 100644 (file)
@@ -16,8 +16,10 @@ local base64 = require "util.encodings".base64;
 local usermanager_get_sasl_handler = require "core.usermanager".get_sasl_handler;
 local tostring = tostring;
 
-local secure_auth_only = module:get_option("c2s_require_encryption") or module:get_option("require_encryption");
-local allow_unencrypted_plain_auth = module:get_option("allow_unencrypted_plain_auth")
+local secure_auth_only = module:get_option_boolean("c2s_require_encryption", module:get_option_boolean("require_encryption", false));
+local allow_unencrypted_plain_auth = module:get_option_boolean("allow_unencrypted_plain_auth", false)
+local insecure_mechanisms = module:get_option_set("insecure_sasl_mechanisms", allow_unencrypted_plain_auth and {} or {"PLAIN", "LOGIN"});
+local disabled_mechanisms = module:get_option_set("disable_sasl_mechanisms", {});
 
 local log = module._log;
 
@@ -183,9 +185,12 @@ module:hook("stanza/urn:ietf:params:xml:ns:xmpp-sasl:auth", function(event)
                session.sasl_handler = usermanager_get_sasl_handler(module.host, session);
        end
        local mechanism = stanza.attr.mechanism;
-       if not session.secure and (secure_auth_only or (mechanism == "PLAIN" and not allow_unencrypted_plain_auth)) then
+       if not session.secure and (secure_auth_only or insecure_mechanisms:contains(mechanism)) then
                session.send(build_reply("failure", "encryption-required"));
                return true;
+       elseif disabled_mechanisms:contains(mechanism) then
+               session.send(build_reply("failure", "invalid-mechanism"));
+               return true;
        end
        local valid_mechanism = session.sasl_handler:select(mechanism);
        if not valid_mechanism then
@@ -231,11 +236,15 @@ module:hook("stream-features", function(event)
                end
                local mechanisms = st.stanza("mechanisms", mechanisms_attr);
                for mechanism in pairs(origin.sasl_handler:mechanisms()) do
-                       if mechanism ~= "PLAIN" or origin.secure or allow_unencrypted_plain_auth then
+                       if (not disabled_mechanisms:contains(mechanism)) and (origin.secure or not insecure_mechanisms:contains(mechanism)) then
                                mechanisms:tag("mechanism"):text(mechanism):up();
                        end
                end
-               if mechanisms[1] then features:add_child(mechanisms); end
+               if mechanisms[1] then
+                       features:add_child(mechanisms);
+               else
+                       (origin.log or log)("warn", "No SASL mechanisms to offer");
+               end
        else
                features:tag("bind", bind_attr):tag("required"):up():up();
                features:tag("session", xmpp_session_attr):tag("optional"):up():up();
index 351aaffc9708ead631446118096334067e0a2f4d..f2d76c38e5c9b697f328aa7fb6f16ca99137661d 100644 (file)
@@ -9,7 +9,7 @@
 local create_context = require "core.certmanager".create_context;
 local st = require "util.stanza";
 
-local c2s_require_encryption = module:get_option("c2s_require_encryption") or module:get_option("require_encryption");
+local c2s_require_encryption = module:get_option("c2s_require_encryption", module:get_option("require_encryption"));
 local s2s_require_encryption = module:get_option("s2s_require_encryption");
 local allow_s2s_tls = module:get_option("s2s_allow_encryption") ~= false;
 local s2s_secure_auth = module:get_option("s2s_secure_auth");
index df8c8e755312df4b20ba4869cdba6a1a8a0aadbe..bfb118c3039949ce2c737ecc40fd8121e21a52e2 100755 (executable)
@@ -552,7 +552,7 @@ function commands.about(arg)
                print("  "..path);
        end
        print("");
-       local luarocks_status = (pcall(require, "luarocks.loader") and "Installed ("..(luarocks.cfg.program_version or "2.x+")..")")
+       local luarocks_status = (pcall(require, "luarocks.loader") and "Installed ("..(package.loaded["luarocks.cfg"].program_version or "2.x+")..")")
                or (pcall(require, "luarocks.require") and "Installed (1.x)")
                or "Not installed";
        print("LuaRocks:        ", luarocks_status);
@@ -816,7 +816,7 @@ function commands.check(arg)
        if not what or what == "config" then
                print("Checking config...");
                local deprecated = set.new({
-                       "bosh_ports", "disallow_s2s", "no_daemonize", "anonymous_login",
+                       "bosh_ports", "disallow_s2s", "no_daemonize", "anonymous_login", "require_encryption",
                });
                local known_global_options = set.new({
                        "pidfile", "log", "plugin_paths", "prosody_user", "prosody_group", "daemonize",
index 3d7caf8c5bff1582d1888f25d166edc03ec76d67..82601e630986fc4376f22c714144bba267b27212 100644 (file)
@@ -202,19 +202,8 @@ end
 
 local xml_escape
 do
-       local escape_table = {
-               ["'"] = "&apos;";
-               ['"'] = "&quot;";
-               ["<"] = "&lt;";
-               [">"] = "&gt;";
-               ["&"] = "&amp;";
-               -- escape this whitespace because [\r\n\t] change into spaces in attributes
-               -- and \r\n changes into \n in text, and we want to preserve original bytes
-               ["\t"] = "&#x9;";
-               ["\n"] = "&#xA;";
-               ["\r"] = "&#xD;";
-       };
-       function xml_escape(str) return (s_gsub(str, "['&<>\"\t\n\r]", escape_table)); end
+       local escape_table = { ["'"] = "&apos;", ["\""] = "&quot;", ["<"] = "&lt;", [">"] = "&gt;", ["&"] = "&amp;" };
+       function xml_escape(str) return (s_gsub(str, "['&<>\"]", escape_table)); end
        _M.xml_escape = xml_escape;
 end