Mercurial > prosody-hg
comparison plugins/mod_component.lua @ 5776:bd0ff8ae98a8
Remove all trailing whitespace
| author | Florian Zeitz <florob@babelmonkeys.de> |
|---|---|
| date | Fri, 09 Aug 2013 17:48:21 +0200 |
| parents | 2ecf400b194a |
| children | 6dc73be95213 |
comparison
equal
deleted
inserted
replaced
| 5775:a6c2b8933507 | 5776:bd0ff8ae98a8 |
|---|---|
| 1 -- Prosody IM | 1 -- Prosody IM |
| 2 -- Copyright (C) 2008-2010 Matthew Wild | 2 -- Copyright (C) 2008-2010 Matthew Wild |
| 3 -- Copyright (C) 2008-2010 Waqas Hussain | 3 -- Copyright (C) 2008-2010 Waqas Hussain |
| 4 -- | 4 -- |
| 5 -- This project is MIT/X11 licensed. Please see the | 5 -- This project is MIT/X11 licensed. Please see the |
| 6 -- COPYING file in the source package for more information. | 6 -- COPYING file in the source package for more information. |
| 7 -- | 7 -- |
| 8 | 8 |
| 9 module:set_global(); | 9 module:set_global(); |
| 29 | 29 |
| 30 function module.add_host(module) | 30 function module.add_host(module) |
| 31 if module:get_host_type() ~= "component" then | 31 if module:get_host_type() ~= "component" then |
| 32 error("Don't load mod_component manually, it should be for a component, please see http://prosody.im/doc/components", 0); | 32 error("Don't load mod_component manually, it should be for a component, please see http://prosody.im/doc/components", 0); |
| 33 end | 33 end |
| 34 | 34 |
| 35 local env = module.environment; | 35 local env = module.environment; |
| 36 env.connected = false; | 36 env.connected = false; |
| 37 | 37 |
| 38 local send; | 38 local send; |
| 39 | 39 |
| 40 local function on_destroy(session, err) | 40 local function on_destroy(session, err) |
| 41 env.connected = false; | 41 env.connected = false; |
| 42 send = nil; | 42 send = nil; |
| 43 session.on_destroy = nil; | 43 session.on_destroy = nil; |
| 44 end | 44 end |
| 45 | 45 |
| 46 -- Handle authentication attempts by component | 46 -- Handle authentication attempts by component |
| 47 local function handle_component_auth(event) | 47 local function handle_component_auth(event) |
| 48 local session, stanza = event.origin, event.stanza; | 48 local session, stanza = event.origin, event.stanza; |
| 49 | 49 |
| 50 if session.type ~= "component_unauthed" then return; end | 50 if session.type ~= "component_unauthed" then return; end |
| 51 | 51 |
| 52 if (not session.host) or #stanza.tags > 0 then | 52 if (not session.host) or #stanza.tags > 0 then |
| 53 (session.log or log)("warn", "Invalid component handshake for host: %s", session.host); | 53 (session.log or log)("warn", "Invalid component handshake for host: %s", session.host); |
| 54 session:close("not-authorized"); | 54 session:close("not-authorized"); |
| 55 return true; | 55 return true; |
| 56 end | 56 end |
| 57 | 57 |
| 58 local secret = module:get_option("component_secret"); | 58 local secret = module:get_option("component_secret"); |
| 59 if not secret then | 59 if not secret then |
| 60 (session.log or log)("warn", "Component attempted to identify as %s, but component_secret is not set", session.host); | 60 (session.log or log)("warn", "Component attempted to identify as %s, but component_secret is not set", session.host); |
| 61 session:close("not-authorized"); | 61 session:close("not-authorized"); |
| 62 return true; | 62 return true; |
| 63 end | 63 end |
| 64 | 64 |
| 65 local supplied_token = t_concat(stanza); | 65 local supplied_token = t_concat(stanza); |
| 66 local calculated_token = sha1(session.streamid..secret, true); | 66 local calculated_token = sha1(session.streamid..secret, true); |
| 67 if supplied_token:lower() ~= calculated_token:lower() then | 67 if supplied_token:lower() ~= calculated_token:lower() then |
| 68 module:log("info", "Component authentication failed for %s", session.host); | 68 module:log("info", "Component authentication failed for %s", session.host); |
| 69 session:close{ condition = "not-authorized", text = "Given token does not match calculated token" }; | 69 session:close{ condition = "not-authorized", text = "Given token does not match calculated token" }; |
| 70 return true; | 70 return true; |
| 71 end | 71 end |
| 72 | 72 |
| 73 if env.connected then | 73 if env.connected then |
| 74 module:log("error", "Second component attempted to connect, denying connection"); | 74 module:log("error", "Second component attempted to connect, denying connection"); |
| 75 session:close{ condition = "conflict", text = "Component already connected" }; | 75 session:close{ condition = "conflict", text = "Component already connected" }; |
| 76 return true; | 76 return true; |
| 77 end | 77 end |
| 78 | 78 |
| 79 env.connected = true; | 79 env.connected = true; |
| 80 send = session.send; | 80 send = session.send; |
| 81 session.on_destroy = on_destroy; | 81 session.on_destroy = on_destroy; |
| 82 session.component_validate_from = module:get_option_boolean("validate_from_addresses", true); | 82 session.component_validate_from = module:get_option_boolean("validate_from_addresses", true); |
| 83 session.type = "component"; | 83 session.type = "component"; |
| 84 module:log("info", "External component successfully authenticated"); | 84 module:log("info", "External component successfully authenticated"); |
| 85 session.send(st.stanza("handshake")); | 85 session.send(st.stanza("handshake")); |
| 86 | 86 |
| 87 return true; | 87 return true; |
| 88 end | 88 end |
| 89 module:hook("stanza/jabber:component:accept:handshake", handle_component_auth); | 89 module:hook("stanza/jabber:component:accept:handshake", handle_component_auth); |
| 90 | 90 |
| 91 -- Handle stanzas addressed to this component | 91 -- Handle stanzas addressed to this component |
| 112 event.origin.send(st.error_reply(stanza, "wait", "service-unavailable", "Component unavailable")); | 112 event.origin.send(st.error_reply(stanza, "wait", "service-unavailable", "Component unavailable")); |
| 113 end | 113 end |
| 114 end | 114 end |
| 115 return true; | 115 return true; |
| 116 end | 116 end |
| 117 | 117 |
| 118 module:hook("iq/bare", handle_stanza, -1); | 118 module:hook("iq/bare", handle_stanza, -1); |
| 119 module:hook("message/bare", handle_stanza, -1); | 119 module:hook("message/bare", handle_stanza, -1); |
| 120 module:hook("presence/bare", handle_stanza, -1); | 120 module:hook("presence/bare", handle_stanza, -1); |
| 121 module:hook("iq/full", handle_stanza, -1); | 121 module:hook("iq/full", handle_stanza, -1); |
| 122 module:hook("message/full", handle_stanza, -1); | 122 module:hook("message/full", handle_stanza, -1); |
| 267 | 267 |
| 268 -- Logging functions -- | 268 -- Logging functions -- |
| 269 local conn_name = "jcp"..tostring(session):match("[a-f0-9]+$"); | 269 local conn_name = "jcp"..tostring(session):match("[a-f0-9]+$"); |
| 270 session.log = logger.init(conn_name); | 270 session.log = logger.init(conn_name); |
| 271 session.close = session_close; | 271 session.close = session_close; |
| 272 | 272 |
| 273 session.log("info", "Incoming Jabber component connection"); | 273 session.log("info", "Incoming Jabber component connection"); |
| 274 | 274 |
| 275 local stream = new_xmpp_stream(session, stream_callbacks); | 275 local stream = new_xmpp_stream(session, stream_callbacks); |
| 276 session.stream = stream; | 276 session.stream = stream; |
| 277 | 277 |
| 278 session.notopen = true; | 278 session.notopen = true; |
| 279 | 279 |
| 280 function session.reset_stream() | 280 function session.reset_stream() |
| 281 session.notopen = true; | 281 session.notopen = true; |
| 282 session.stream:reset(); | 282 session.stream:reset(); |
| 283 end | 283 end |
| 284 | 284 |
| 286 local ok, err = stream:feed(data); | 286 local ok, err = stream:feed(data); |
| 287 if ok then return; end | 287 if ok then return; end |
| 288 module:log("debug", "Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " "):gsub("[%z\1-\31]", "_")); | 288 module:log("debug", "Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " "):gsub("[%z\1-\31]", "_")); |
| 289 session:close("not-well-formed"); | 289 session:close("not-well-formed"); |
| 290 end | 290 end |
| 291 | 291 |
| 292 session.dispatch_stanza = stream_callbacks.handlestanza; | 292 session.dispatch_stanza = stream_callbacks.handlestanza; |
| 293 | 293 |
| 294 sessions[conn] = session; | 294 sessions[conn] = session; |
| 295 end | 295 end |
| 296 function listener.onincoming(conn, data) | 296 function listener.onincoming(conn, data) |
