sessionmanager: Make session.send() return true unless there really is an error ...
[prosody.git] / plugins / mod_saslauth.lua
index 7708572a481572f617d1af21622b7695c8a6756b..c5d3dc917bd847b00869efc563ccc0640f75aca6 100644 (file)
@@ -11,7 +11,6 @@
 local st = require "util.stanza";
 local sm_bind_resource = require "core.sessionmanager".bind_resource;
 local sm_make_authenticated = require "core.sessionmanager".make_authenticated;
-local s2s_make_authenticated = require "core.s2smanager".make_authenticated;
 local base64 = require "util.encodings".base64;
 
 local cert_verify_identity = require "util.x509".verify_identity;
@@ -26,7 +25,6 @@ local log = module._log;
 
 local xmlns_sasl ='urn:ietf:params:xml:ns:xmpp-sasl';
 local xmlns_bind ='urn:ietf:params:xml:ns:xmpp-bind';
-local xmlns_stanzas ='urn:ietf:params:xml:ns:xmpp-stanzas';
 
 local function build_reply(status, ret, err_msg)
        local reply = st.stanza(status, {xmlns = xmlns_sasl});
@@ -89,13 +87,9 @@ module:hook_stanza(xmlns_sasl, "success", function (session, stanza)
        module:log("debug", "SASL EXTERNAL with %s succeeded", session.to_host);
        session.external_auth = "succeeded"
        session:reset_stream();
+       session:open_stream(session.from_host, session.to_host);
 
-       local default_stream_attr = {xmlns = "jabber:server", ["xmlns:stream"] = "http://etherx.jabber.org/streams",
-                                   ["xmlns:db"] = 'jabber:server:dialback', version = "1.0", to = session.to_host, from = session.from_host};
-       session.sends2s("<?xml version='1.0'?>");
-       session.sends2s(st.stanza("stream:stream", default_stream_attr):top_tag());
-
-       s2s_make_authenticated(session, session.to_host);
+       module:fire_event("s2s-authenticated", { session = session, host = session.to_host });
        return true;
 end)
 
@@ -192,7 +186,7 @@ local function s2s_external_auth(session, stanza)
 
        local domain = text ~= "" and text or session.from_host;
        module:log("info", "Accepting SASL EXTERNAL identity from %s", domain);
-       s2s_make_authenticated(session, domain);
+       module:fire_event("s2s-authenticated", { session = session, host = domain });
        session:reset_stream();
        return true
 end
@@ -203,13 +197,13 @@ module:hook("stanza/urn:ietf:params:xml:ns:xmpp-sasl:auth", function(event)
                return s2s_external_auth(session, stanza)
        end
 
-       if session.type ~= "c2s_unauthed" then return; end
+       if session.type ~= "c2s_unauthed" or module:get_host_type() ~= "local" then return; end
 
        if session.sasl_handler and session.sasl_handler.selected then
                session.sasl_handler = nil; -- allow starting a new SASL negotiation before completing an old one
        end
        if not session.sasl_handler then
-               session.sasl_handler = usermanager_get_sasl_handler(module.host);
+               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
@@ -247,7 +241,7 @@ module:hook("stream-features", function(event)
                if secure_auth_only and not origin.secure then
                        return;
                end
-               origin.sasl_handler = usermanager_get_sasl_handler(module.host);
+               origin.sasl_handler = usermanager_get_sasl_handler(module.host, origin);
                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