Software / code / prosody
Comparison
plugins/mod_s2s/mod_s2s.lua @ 5362:612467e263af
s2smanager, mod_s2s, mod_dialback, mod_saslauth: Move s2smanager.make_authenticated() to mod_s2s, and plugins now signal authentication via the s2s-authenticated event
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 22 Mar 2013 14:18:23 +0000 |
| parent | 5351:901ed253bbf7 |
| child | 5363:f29c26da7ecc |
comparison
equal
deleted
inserted
replaced
| 5361:38e7a5fafb28 | 5362:612467e263af |
|---|---|
| 22 local nameprep = require "util.encodings".stringprep.nameprep; | 22 local nameprep = require "util.encodings".stringprep.nameprep; |
| 23 local new_xmpp_stream = require "util.xmppstream".new; | 23 local new_xmpp_stream = require "util.xmppstream".new; |
| 24 local s2s_new_incoming = require "core.s2smanager".new_incoming; | 24 local s2s_new_incoming = require "core.s2smanager".new_incoming; |
| 25 local s2s_new_outgoing = require "core.s2smanager".new_outgoing; | 25 local s2s_new_outgoing = require "core.s2smanager".new_outgoing; |
| 26 local s2s_destroy_session = require "core.s2smanager".destroy_session; | 26 local s2s_destroy_session = require "core.s2smanager".destroy_session; |
| 27 local s2s_mark_connected = require "core.s2smanager".mark_connected; | |
| 28 local uuid_gen = require "util.uuid".generate; | 27 local uuid_gen = require "util.uuid".generate; |
| 29 local cert_verify_identity = require "util.x509".verify_identity; | 28 local cert_verify_identity = require "util.x509".verify_identity; |
| 29 local fire_global_event = prosody.events.fire_event; | |
| 30 | 30 |
| 31 local s2sout = module:require("s2sout"); | 31 local s2sout = module:require("s2sout"); |
| 32 | 32 |
| 33 local connect_timeout = module:get_option_number("s2s_timeout", 90); | 33 local connect_timeout = module:get_option_number("s2s_timeout", 90); |
| 34 local stream_close_timeout = module:get_option_number("s2s_close_timeout", 5); | 34 local stream_close_timeout = module:get_option_number("s2s_close_timeout", 5); |
| 35 | |
| 36 local require_encryption = module:get_option_boolean("s2s_require_encryption", secure_auth); | |
| 35 | 37 |
| 36 local sessions = module:shared("sessions"); | 38 local sessions = module:shared("sessions"); |
| 37 | 39 |
| 38 local log = module._log; | 40 local log = module._log; |
| 39 | 41 |
| 130 module:log("warn", "The 'disallow_s2s' config option is deprecated, please see http://prosody.im/doc/s2s#disabling"); | 132 module:log("warn", "The 'disallow_s2s' config option is deprecated, please see http://prosody.im/doc/s2s#disabling"); |
| 131 return nil, "This host has disallow_s2s set"; | 133 return nil, "This host has disallow_s2s set"; |
| 132 end | 134 end |
| 133 module:hook("route/remote", route_to_existing_session, 200); | 135 module:hook("route/remote", route_to_existing_session, 200); |
| 134 module:hook("route/remote", route_to_new_session, 100); | 136 module:hook("route/remote", route_to_new_session, 100); |
| 137 module:hook("s2s-authenticated", make_authenticated, -1); | |
| 138 end | |
| 139 | |
| 140 -- Stream is authorised, and ready for normal stanzas | |
| 141 function mark_connected(session) | |
| 142 local sendq, send = session.sendq, session.sends2s; | |
| 143 | |
| 144 local from, to = session.from_host, session.to_host; | |
| 145 | |
| 146 session.log("info", "%s s2s connection %s->%s complete", session.direction, from, to); | |
| 147 | |
| 148 local event_data = { session = session }; | |
| 149 if session.type == "s2sout" then | |
| 150 fire_global_event("s2sout-established", event_data); | |
| 151 hosts[from].events.fire_event("s2sout-established", event_data); | |
| 152 else | |
| 153 local host_session = hosts[to]; | |
| 154 session.send = function(stanza) | |
| 155 return host_session.events.fire_event("route/remote", { from_host = to, to_host = from, stanza = stanza }); | |
| 156 end; | |
| 157 | |
| 158 fire_global_event("s2sin-established", event_data); | |
| 159 hosts[to].events.fire_event("s2sin-established", event_data); | |
| 160 end | |
| 161 | |
| 162 if session.direction == "outgoing" then | |
| 163 if sendq then | |
| 164 session.log("debug", "sending %d queued stanzas across new outgoing connection to %s", #sendq, session.to_host); | |
| 165 for i, data in ipairs(sendq) do | |
| 166 send(data[1]); | |
| 167 sendq[i] = nil; | |
| 168 end | |
| 169 session.sendq = nil; | |
| 170 end | |
| 171 | |
| 172 session.ip_hosts = nil; | |
| 173 session.srv_hosts = nil; | |
| 174 end | |
| 175 end | |
| 176 | |
| 177 function make_authenticated(event) | |
| 178 local session, host = event.session, event.host; | |
| 179 if not session.secure then | |
| 180 if require_encryption or secure_auth or secure_domains[host] then | |
| 181 session:close({ | |
| 182 condition = "policy-violation", | |
| 183 text = "Encrypted server-to-server communication is required but was not " | |
| 184 ..((session.direction == "outgoing" and "offered") or "used") | |
| 185 }); | |
| 186 end | |
| 187 end | |
| 188 if session.type == "s2sout_unauthed" then | |
| 189 session.type = "s2sout"; | |
| 190 elseif session.type == "s2sin_unauthed" then | |
| 191 session.type = "s2sin"; | |
| 192 if host then | |
| 193 if not session.hosts[host] then session.hosts[host] = {}; end | |
| 194 session.hosts[host].authed = true; | |
| 195 end | |
| 196 elseif session.type == "s2sin" and host then | |
| 197 if not session.hosts[host] then session.hosts[host] = {}; end | |
| 198 session.hosts[host].authed = true; | |
| 199 else | |
| 200 return false; | |
| 201 end | |
| 202 session.log("debug", "connection %s->%s is now authenticated for %s", session.from_host, session.to_host, host); | |
| 203 | |
| 204 mark_connected(session); | |
| 205 | |
| 206 return true; | |
| 135 end | 207 end |
| 136 | 208 |
| 137 --- Helper to check that a session peer's certificate is valid | 209 --- Helper to check that a session peer's certificate is valid |
| 138 local function check_cert_status(session) | 210 local function check_cert_status(session) |
| 139 local host = session.direction == "incoming" and session.from_host or session.to_host | 211 local host = session.direction == "incoming" and session.from_host or session.to_host |
| 285 -- If server is pre-1.0, don't wait for features, just do dialback | 357 -- If server is pre-1.0, don't wait for features, just do dialback |
| 286 if session.version < 1.0 then | 358 if session.version < 1.0 then |
| 287 if not session.dialback_verifying then | 359 if not session.dialback_verifying then |
| 288 hosts[session.from_host].events.fire_event("s2sout-authenticate-legacy", { origin = session }); | 360 hosts[session.from_host].events.fire_event("s2sout-authenticate-legacy", { origin = session }); |
| 289 else | 361 else |
| 290 s2s_mark_connected(session); | 362 mark_connected(session); |
| 291 end | 363 end |
| 292 end | 364 end |
| 293 end | 365 end |
| 294 session.notopen = nil; | 366 session.notopen = nil; |
| 295 end | 367 end |