annotate mod_bidi/mod_bidi.lua @ 3532:85c357b69eec

mod_csi_muc_priorities: Reduce importance of group chat messages This helps if you are in more noisy public channels than small private group chats. The short term plan is to give users the ability to set MUC JIDs as either high or low priority and use that. Long term it would be great to be able to automatically classify MUCs as public channels vs private group chats.
author Kim Alvefur <zash@zash.se>
date Mon, 01 Apr 2019 00:15:13 +0200
parents db2ff8f29472
children 8e7d400d4db3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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";
1123
0e16e5e2f410 mod_bidi: Only allow or offer bidi on secure connections, with an option to revert to previous behaviour
Kim Alvefur <zash@zash.se>
parents: 1122
diff changeset
15 local secure_only = module:get_option_boolean("secure_bidi_only", true);
1387
db2ff8f29472 mod_bidi: Add option for selectively not doing bidi with some hosts
Kim Alvefur <zash@zash.se>
parents: 1191
diff changeset
16 local disable_bidi_for = module:get_option_set("no_bidi_with", { });
1127
38e56be11584 mod_bidi: Make sessions table weak
Kim Alvefur <zash@zash.se>
parents: 1126
diff changeset
17 local bidi_sessions = module:shared"sessions-cache";
892
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 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
20 local function handlestanza(session, stanza)
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 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
22 stanza.attr.xmlns = nil;
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 end
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 -- stanza = session.filter("stanzas/in", stanza);
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 if stanza then
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 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
27 end
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 end
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 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
31 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
32 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
33 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
34 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
35 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
36 end
1121
c714ed7de4ee mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents: 932
diff changeset
37 bidi_sessions[origin.from_host] = origin;
1191
1818a7f08580 mod_bidi: Add missing 'is_bidi' flag for incoming s2s
Kim Alvefur <zash@zash.se>
parents: 1129
diff changeset
38 origin.is_bidi = true;
1121
c714ed7de4ee mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents: 932
diff changeset
39 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
40 local bidi_session = {
1124
689e69df1cc4 mod_bidi: Make sure context for stanzas coming from bidi-enabled s2sout connections have the correct direction attribute
Kim Alvefur <zash@zash.se>
parents: 1123
diff changeset
41 type = "s2sin"; direction = "incoming";
1121
c714ed7de4ee mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents: 932
diff changeset
42 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
43 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
44 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
45 hosts = {};
c714ed7de4ee mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents: 932
diff changeset
46 }
c714ed7de4ee mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents: 932
diff changeset
47 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
48 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
49 module:fire_event("s2s-authenticated", { session = bidi_session, host = origin.to_host });
1125
901e361af918 mod_bidi: Fix accidentally module-global value
Kim Alvefur <zash@zash.se>
parents: 1124
diff changeset
50 local remote_host = origin.to_host;
892
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
51 add_filter(origin, "stanzas/in", function(stanza)
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 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
53 local _, host = jid_split(stanza.attr.from);
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
54 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
55 handlestanza(bidi_session, stanza);
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56 end, 1);
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
57 end
1121
c714ed7de4ee mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents: 932
diff changeset
58 end
892
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59
1121
c714ed7de4ee mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents: 932
diff changeset
60 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
61 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
62 if from_host ~= module.host then return end
1128
6b344b7e4781 mod_bidi: Allow route/remote event to continue if we couldn't send a stanza (in case the session was destroyed)
Kim Alvefur <zash@zash.se>
parents: 1127
diff changeset
63 local to_session = bidi_sessions[to_host];
1126
6fd328b8e136 mod_bidi: Don't try to send on destroyed sessions
Kim Alvefur <zash@zash.se>
parents: 1125
diff changeset
64 if not to_session or to_session.type ~= "s2sin" then return end
1129
ae0fa4d2005d mod_bidi: Revert to sends2s (Go to sleep zash, you're too tired to code)
Kim Alvefur <zash@zash.se>
parents: 1128
diff changeset
65 if to_session.sends2s(stanza) then return true end
1121
c714ed7de4ee mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents: 932
diff changeset
66 end, -2);
892
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68 -- Incoming s2s
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
69 module:hook("s2s-stream-features", function(event)
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 local origin, features = event.origin, event.features;
1191
1818a7f08580 mod_bidi: Add missing 'is_bidi' flag for incoming s2s
Kim Alvefur <zash@zash.se>
parents: 1129
diff changeset
71 if not origin.is_bidi and not origin.bidi_session and not origin.do_bidi
1818a7f08580 mod_bidi: Add missing 'is_bidi' flag for incoming s2s
Kim Alvefur <zash@zash.se>
parents: 1129
diff changeset
72 and not hosts[module.host].s2sout[origin.from_host]
1387
db2ff8f29472 mod_bidi: Add option for selectively not doing bidi with some hosts
Kim Alvefur <zash@zash.se>
parents: 1191
diff changeset
73 and not disable_bidi_for:contains(origin.from_host)
1191
1818a7f08580 mod_bidi: Add missing 'is_bidi' flag for incoming s2s
Kim Alvefur <zash@zash.se>
parents: 1129
diff changeset
74 and (not secure_only or (origin.cert_chain_status == "valid"
1818a7f08580 mod_bidi: Add missing 'is_bidi' flag for incoming s2s
Kim Alvefur <zash@zash.se>
parents: 1129
diff changeset
75 and origin.cert_identity_status == "valid")) then
892
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
76 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
77 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
78 end
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
79 end);
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 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
82 local origin = event.session or event.origin;
1123
0e16e5e2f410 mod_bidi: Only allow or offer bidi on secure connections, with an option to revert to previous behaviour
Kim Alvefur <zash@zash.se>
parents: 1122
diff changeset
83 if not origin.is_bidi and not origin.bidi_session
1387
db2ff8f29472 mod_bidi: Add option for selectively not doing bidi with some hosts
Kim Alvefur <zash@zash.se>
parents: 1191
diff changeset
84 and not disable_bidi_for:contains(origin.from_host)
1123
0e16e5e2f410 mod_bidi: Only allow or offer bidi on secure connections, with an option to revert to previous behaviour
Kim Alvefur <zash@zash.se>
parents: 1122
diff changeset
85 and (not secure_only or origin.cert_chain_status == "valid"
0e16e5e2f410 mod_bidi: Only allow or offer bidi on secure connections, with an option to revert to previous behaviour
Kim Alvefur <zash@zash.se>
parents: 1122
diff changeset
86 and origin.cert_identity_status == "valid") then
892
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
87 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
88 origin.do_bidi = true;
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
89 return true;
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
90 end
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
91 end);
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
92
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
93 -- Outgoing s2s
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
94 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
95 local origin = event.session or event.origin;
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
96 if not ( origin.bidi_session or origin.is_bidi or origin.do_bidi)
1387
db2ff8f29472 mod_bidi: Add option for selectively not doing bidi with some hosts
Kim Alvefur <zash@zash.se>
parents: 1191
diff changeset
97 and not disable_bidi_for:contains(origin.to_host)
1123
0e16e5e2f410 mod_bidi: Only allow or offer bidi on secure connections, with an option to revert to previous behaviour
Kim Alvefur <zash@zash.se>
parents: 1122
diff changeset
98 and event.stanza:get_child("bidi", xmlns_bidi_feature)
0e16e5e2f410 mod_bidi: Only allow or offer bidi on secure connections, with an option to revert to previous behaviour
Kim Alvefur <zash@zash.se>
parents: 1122
diff changeset
99 and (not secure_only or origin.cert_chain_status == "valid"
0e16e5e2f410 mod_bidi: Only allow or offer bidi on secure connections, with an option to revert to previous behaviour
Kim Alvefur <zash@zash.se>
parents: 1122
diff changeset
100 and origin.cert_identity_status == "valid") then
892
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
101 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
102 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
103 origin.do_bidi = true;
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 end
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
105 end, 160);
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
107 function enable_bidi(event)
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108 local session = event.session;
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
109 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
110 session.do_bidi = nil;
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
111 new_bidi(session);
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
112 end
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
113 end
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
114
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
115 module:hook("s2sin-established", enable_bidi);
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
116 module:hook("s2sout-established", enable_bidi);
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
117
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
118 function disable_bidi(event)
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
119 local session = event.session;
1122
6094d57c5387 mod_bidi: Minor cleanup
Kim Alvefur <zash@zash.se>
parents: 1121
diff changeset
120 if session.type == "s2sin" then
1121
c714ed7de4ee mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents: 932
diff changeset
121 bidi_sessions[session.from_host] = nil;
892
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
122 end
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
123 end
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
124
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
125 module:hook("s2sin-destroyed", disable_bidi);
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
126 module:hook("s2sout-destroyed", disable_bidi);
148865199003 mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff changeset
127