Mercurial > prosody-modules
annotate mod_bidi/mod_bidi.lua @ 1121:c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 02 Aug 2013 17:35:39 +0200 |
parents | 4e235e565693 |
children | 6094d57c5387 |
rev | line source |
---|---|
892
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 -- Bidirectional Server-to-Server Connections |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 -- http://xmpp.org/extensions/xep-0288.html |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 -- Copyright (C) 2013 Kim Alvefur |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 -- |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 -- This file is MIT/X11 licensed. |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 -- |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 local add_filter = require "util.filters".add_filter; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 local st = require "util.stanza"; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 local jid_split = require"util.jid".prepped_split; |
1121
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
10 local core_process_stanza = prosody.core_process_stanza; |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
11 local traceback = debug.traceback; |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
12 local hosts = hosts; |
892
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 local xmlns_bidi_feature = "urn:xmpp:features:bidi" |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 local xmlns_bidi = "urn:xmpp:bidi"; |
1121
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
15 local bidi_sessions = module:shared"sessions"; |
892
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 local function handleerr(err) log("error", "Traceback[s2s]: %s: %s", tostring(err), traceback()); end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 local function handlestanza(session, stanza) |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 if stanza.attr.xmlns == "jabber:client" then --COMPAT: Prosody pre-0.6.2 may send jabber:client |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 stanza.attr.xmlns = nil; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 -- stanza = session.filter("stanzas/in", stanza); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 if stanza then |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 return xpcall(function () return core_process_stanza(session, stanza) end, handleerr); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 local function new_bidi(origin) |
1121
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
29 if origin.type == "s2sin" then -- then we create an "outgoing" bidirectional session |
893
602e4c509095
mod_bidi: Close conflicting outgoing sessions when bidi is initiated, not requested.
Kim Alvefur <zash@zash.se>
parents:
892
diff
changeset
|
30 local conflicting_session = hosts[origin.to_host].s2sout[origin.from_host] |
602e4c509095
mod_bidi: Close conflicting outgoing sessions when bidi is initiated, not requested.
Kim Alvefur <zash@zash.se>
parents:
892
diff
changeset
|
31 if conflicting_session then |
894
d066987e00b7
mod_bidi: Lower severity of notice about outgoing stream being replaced by bidi
Kim Alvefur <zash@zash.se>
parents:
893
diff
changeset
|
32 conflicting_session.log("info", "We already have an outgoing connection to %s, closing it...", origin.from_host); |
893
602e4c509095
mod_bidi: Close conflicting outgoing sessions when bidi is initiated, not requested.
Kim Alvefur <zash@zash.se>
parents:
892
diff
changeset
|
33 conflicting_session:close{ condition = "conflict", text = "Replaced by bidirectional stream" } |
602e4c509095
mod_bidi: Close conflicting outgoing sessions when bidi is initiated, not requested.
Kim Alvefur <zash@zash.se>
parents:
892
diff
changeset
|
34 s2smanager.destroy_session(conflicting_session); |
602e4c509095
mod_bidi: Close conflicting outgoing sessions when bidi is initiated, not requested.
Kim Alvefur <zash@zash.se>
parents:
892
diff
changeset
|
35 end |
1121
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
36 bidi_sessions[origin.from_host] = origin; |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
37 elseif origin.type == "s2sout" then -- handle incoming stanzas correctly |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
38 local bidi_session = { |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
39 type = "s2sin"; |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
40 is_bidi = true; orig_session = origin; |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
41 to_host = origin.from_host; |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
42 from_host = origin.to_host; |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
43 hosts = {}; |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
44 } |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
45 origin.bidi_session = bidi_session; |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
46 setmetatable(bidi_session, { __index = origin }); |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
47 module:fire_event("s2s-authenticated", { session = bidi_session, host = origin.to_host }); |
892
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 remote_host = origin.to_host; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 add_filter(origin, "stanzas/in", function(stanza) |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 if stanza.attr.xmlns ~= nil then return stanza end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 local _, host = jid_split(stanza.attr.from); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 if host ~= remote_host then return stanza end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 handlestanza(bidi_session, stanza); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 end, 1); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
55 end |
1121
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
56 end |
892
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
57 |
1121
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
58 module:hook("route/remote", function(event) |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
59 local from_host, to_host, stanza = event.from_host, event.to_host, event.stanza; |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
60 if from_host ~= module.host then return end |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
61 local to_session = bidi_sessions[to_host] |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
62 if not to_session then return end |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
63 return to_session.sends2s(stanza); |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
64 end, -2); |
892
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
66 -- Incoming s2s |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
67 module:hook("s2s-stream-features", function(event) |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
68 local origin, features = event.origin, event.features; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 if not origin.is_bidi and not hosts[module.host].s2sout[origin.from_host] then |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
70 module:log("debug", "Announcing support for bidirectional streams"); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 features:tag("bidi", { xmlns = xmlns_bidi_feature }):up(); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
72 end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
73 end); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
74 |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
75 module:hook("stanza/urn:xmpp:bidi:bidi", function(event) |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 local origin = event.session or event.origin; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
77 if not origin.is_bidi and not origin.bidi_session then |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 module:log("debug", "%s requested bidirectional stream", origin.from_host); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
79 origin.do_bidi = true; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
80 return true; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
81 end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 end); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 -- Outgoing s2s |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 module:hook("stanza/http://etherx.jabber.org/streams:features", function(event) |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 local origin = event.session or event.origin; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 if not ( origin.bidi_session or origin.is_bidi or origin.do_bidi) |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 and event.stanza:get_child("bidi", xmlns_bidi_feature) then |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 module:log("debug", "%s supports bidirectional streams", origin.to_host); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 origin.sends2s(st.stanza("bidi", { xmlns = xmlns_bidi })); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
91 origin.do_bidi = true; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
92 end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
93 end, 160); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
94 |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
95 function enable_bidi(event) |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
96 local session = event.session; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
97 if session.do_bidi and not ( session.is_bidi or session.bidi_session ) then |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 session.do_bidi = nil; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
99 new_bidi(session); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
100 end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
102 |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
103 module:hook("s2sin-established", enable_bidi); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
104 module:hook("s2sout-established", enable_bidi); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
105 |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
106 function disable_bidi(event) |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 local session = event.session; |
1121
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
108 if session.type == "s2sin" then -- then we create an "outgoing" bidirectional session |
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
109 bidi_sessions[session.from_host] = nil; |
892
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
110 end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
111 end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
112 |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
113 module:hook("s2sin-destroyed", disable_bidi); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
114 module:hook("s2sout-destroyed", disable_bidi); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
115 |