author | Kim Alvefur <zash@zash.se> |
Sat, 03 Aug 2013 00:35:20 +0200 | |
changeset 1125 | 901e361af918 |
parent 1124 | 689e69df1cc4 |
child 1126 | 6fd328b8e136 |
permissions | -rw-r--r-- |
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); |
1121
c714ed7de4ee
mod_bidi: Clean up and use 0.9+ routing APIs
Kim Alvefur <zash@zash.se>
parents:
932
diff
changeset
|
16 |
local bidi_sessions = module:shared"sessions"; |
892
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 |
|
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 |
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
|
19 |
local function handlestanza(session, stanza) |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 |
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
|
21 |
stanza.attr.xmlns = nil; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 |
end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 |
-- stanza = session.filter("stanzas/in", stanza); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 |
if stanza then |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 |
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
|
26 |
end |
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 |
|
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 |
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
|
30 |
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
|
31 |
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
|
32 |
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
|
33 |
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
|
34 |
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
|
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 = { |
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
|
39 |
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
|
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 }); |
1125
901e361af918
mod_bidi: Fix accidentally module-global value
Kim Alvefur <zash@zash.se>
parents:
1124
diff
changeset
|
48 |
local remote_host = origin.to_host; |
892
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; |
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
|
69 |
if not origin.is_bidi and not hosts[module.host].s2sout[origin.from_host] |
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
|
70 |
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
|
71 |
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
|
72 |
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
|
73 |
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
|
74 |
end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
75 |
end); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 |
|
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
77 |
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
|
78 |
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
|
79 |
if not origin.is_bidi and not origin.bidi_session |
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
|
80 |
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
|
81 |
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
|
82 |
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
|
83 |
origin.do_bidi = true; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 |
return true; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 |
end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 |
end); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 |
|
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 |
-- Outgoing s2s |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 |
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
|
90 |
local origin = event.session or event.origin; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
91 |
if not ( origin.bidi_session or origin.is_bidi or origin.do_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
|
92 |
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
|
93 |
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
|
94 |
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
|
95 |
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
|
96 |
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
|
97 |
origin.do_bidi = true; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
98 |
end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
99 |
end, 160); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
100 |
|
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 |
function enable_bidi(event) |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
102 |
local session = event.session; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
103 |
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
|
104 |
session.do_bidi = nil; |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
105 |
new_bidi(session); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
106 |
end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
107 |
end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
108 |
|
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
109 |
module:hook("s2sin-established", enable_bidi); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
110 |
module:hook("s2sout-established", enable_bidi); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
111 |
|
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
112 |
function disable_bidi(event) |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
113 |
local session = event.session; |
1122 | 114 |
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
|
115 |
bidi_sessions[session.from_host] = nil; |
892
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
116 |
end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
117 |
end |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
118 |
|
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
119 |
module:hook("s2sin-destroyed", disable_bidi); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
120 |
module:hook("s2sout-destroyed", disable_bidi); |
148865199003
mod_bidi: Initial commit of XEP-0288 implementation
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
121 |