Software /
code /
prosody
Comparison
plugins/mod_saslauth.lua @ 2179:c985536d5452 sasl
Making mod_saslauth use the new SASL API.
author | Tobias Markmann <tm@ayena.de> |
---|---|
date | Fri, 28 Aug 2009 13:04:38 +0200 |
parent | 1639:0914d128c55e |
child | 2193:8fbbdb11a520 |
comparison
equal
deleted
inserted
replaced
2178:28d841403a21 | 2179:c985536d5452 |
---|---|
31 local xmlns_sasl ='urn:ietf:params:xml:ns:xmpp-sasl'; | 31 local xmlns_sasl ='urn:ietf:params:xml:ns:xmpp-sasl'; |
32 local xmlns_bind ='urn:ietf:params:xml:ns:xmpp-bind'; | 32 local xmlns_bind ='urn:ietf:params:xml:ns:xmpp-bind'; |
33 local xmlns_stanzas ='urn:ietf:params:xml:ns:xmpp-stanzas'; | 33 local xmlns_stanzas ='urn:ietf:params:xml:ns:xmpp-stanzas'; |
34 | 34 |
35 local new_sasl = require "util.sasl".new; | 35 local new_sasl = require "util.sasl".new; |
36 | |
37 default_authentication_profile = { | |
38 plain = function(username, realm) | |
39 return usermanager_get_password(username, realm), true; | |
40 end | |
41 }; | |
36 | 42 |
37 local function build_reply(status, ret, err_msg) | 43 local function build_reply(status, ret, err_msg) |
38 local reply = st.stanza(status, {xmlns = xmlns_sasl}); | 44 local reply = st.stanza(status, {xmlns = xmlns_sasl}); |
39 if status == "challenge" then | 45 if status == "challenge" then |
40 log("debug", "%s", ret or ""); | 46 log("debug", "%s", ret or ""); |
99 return session.send(build_reply("failure", "invalid-mechanism")); | 105 return session.send(build_reply("failure", "invalid-mechanism")); |
100 end | 106 end |
101 elseif stanza.attr.mechanism == "ANONYMOUS" then | 107 elseif stanza.attr.mechanism == "ANONYMOUS" then |
102 return session.send(build_reply("failure", "mechanism-too-weak")); | 108 return session.send(build_reply("failure", "mechanism-too-weak")); |
103 end | 109 end |
104 session.sasl_handler = new_sasl(stanza.attr.mechanism, session.host, credentials_callback); | 110 local valid_mechanism = session.sasl_handler:select(stanza.attr.mechanism); |
105 if not session.sasl_handler then | 111 if not valid_mechanism then |
106 return session.send(build_reply("failure", "invalid-mechanism")); | 112 return session.send(build_reply("failure", "invalid-mechanism")); |
107 end | 113 end |
108 elseif not session.sasl_handler then | 114 elseif not session.sasl_handler then |
109 return; -- FIXME ignoring out of order stanzas because ejabberd does | 115 return; -- FIXME ignoring out of order stanzas because ejabberd does |
110 end | 116 end |
116 session.sasl_handler = nil; | 122 session.sasl_handler = nil; |
117 session.send(build_reply("failure", "incorrect-encoding")); | 123 session.send(build_reply("failure", "incorrect-encoding")); |
118 return; | 124 return; |
119 end | 125 end |
120 end | 126 end |
121 local status, ret, err_msg = session.sasl_handler:feed(text); | 127 local status, ret, err_msg = session.sasl_handler:process(text); |
122 handle_status(session, status); | 128 handle_status(session, status); |
123 local s = build_reply(status, ret, err_msg); | 129 local s = build_reply(status, ret, err_msg); |
124 log("debug", "sasl reply: %s", tostring(s)); | 130 log("debug", "sasl reply: %s", tostring(s)); |
125 session.send(s); | 131 session.send(s); |
126 end | 132 end |
136 function (session, features) | 142 function (session, features) |
137 if not session.username then | 143 if not session.username then |
138 if secure_auth_only and not session.secure then | 144 if secure_auth_only and not session.secure then |
139 return; | 145 return; |
140 end | 146 end |
147 session.sasl_handler = new_sasl(session.host, default_authentication_profile); | |
141 features:tag("mechanisms", mechanisms_attr); | 148 features:tag("mechanisms", mechanisms_attr); |
142 -- TODO: Provide PLAIN only if TLS is active, this is a SHOULD from the introduction of RFC 4616. This behavior could be overridden via configuration but will issuing a warning or so. | 149 -- TODO: Provide PLAIN only if TLS is active, this is a SHOULD from the introduction of RFC 4616. This behavior could be overridden via configuration but will issuing a warning or so. |
143 if config.get(session.host or "*", "core", "anonymous_login") then | 150 if config.get(session.host or "*", "core", "anonymous_login") then |
144 features:tag("mechanism"):text("ANONYMOUS"):up(); | 151 features:tag("mechanism"):text("ANONYMOUS"):up(); |
145 else | 152 else |
146 mechanisms = usermanager_get_supported_methods(session.host or "*"); | 153 for k, v in pairs(session.sasl_handler:mechanisms()) do |
147 for k, v in pairs(mechanisms) do | 154 features:tag("mechanism"):text(v):up(); |
148 features:tag("mechanism"):text(k):up(); | |
149 end | 155 end |
150 end | 156 end |
151 features:up(); | 157 features:up(); |
152 else | 158 else |
153 features:tag("bind", bind_attr):tag("required"):up():up(); | 159 features:tag("bind", bind_attr):tag("required"):up():up(); |