annotate mod_client_proxy/mod_client_proxy.lua @ 4730:1da4b815d2fe

mod_cloud_notify: Identify (and immediately push) urgent stanzas, e.g. calls This covers the following things: - A session that appears online, but has a broken TCP connection - Clients such as Siskin and Snikket iOS that require a push for calls to work It allows the stanza to be pushed immediately instead of waiting for the session to hibernate or an ack to timeout. It shouldn't break any existing cases.
author Matthew Wild <mwild1@gmail.com>
date Wed, 27 Oct 2021 19:12:03 +0100
parents a14a573d43ff
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3098
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
1 if module:get_host_type() ~= "component" then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
2 error("proxy_component should be loaded as component", 0);
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
3 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
4
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
5 local jid_split = require "util.jid".split;
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
6 local jid_bare = require "util.jid".bare;
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
7 local jid_prep = require "util.jid".prep;
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
8 local st = require "util.stanza";
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
9 local array = require "util.array";
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
10
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
11 local target_address = module:get_option_string("target_address");
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
12
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
13 sessions = array{};
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
14 local sessions = sessions;
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
15
3101
a14a573d43ff mod_client_proxy: fix warnings
Jonas Wielicki <jonas@wielicki.name>
parents: 3098
diff changeset
16 local function handle_target_presence(stanza)
3098
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
17 local type = stanza.attr.type;
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
18 module:log("debug", "received presence from destination: %s", type)
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
19 local _, _, resource = jid_split(stanza.attr.from);
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
20 if type == "error" then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
21 -- drop all known sessions
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
22 for k in pairs(sessions) do
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
23 sessions[k] = nil
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
24 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
25 module:log(
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
26 "debug",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
27 "received error presence, dropping all target sessions",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
28 resource
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
29 )
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
30 elseif type == "unavailable" then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
31 for k in pairs(sessions) do
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
32 if sessions[k] == resource then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
33 sessions[k] = nil
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
34 module:log(
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
35 "debug",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
36 "dropped target session: %s",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
37 resource
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
38 )
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
39 break
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
40 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
41 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
42 elseif not type then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
43 -- available
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
44 local found = false;
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
45 for k in pairs(sessions) do
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
46 if sessions[k] == resource then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
47 found = true;
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
48 break
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
49 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
50 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
51 if not found then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
52 module:log(
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
53 "debug",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
54 "registered new target session: %s",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
55 resource
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
56 )
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
57 sessions:push(resource)
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
58 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
59 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
60 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
61
3101
a14a573d43ff mod_client_proxy: fix warnings
Jonas Wielicki <jonas@wielicki.name>
parents: 3098
diff changeset
62 local function handle_from_target(stanza)
3098
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
63 local type = stanza.attr.type
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
64 module:log(
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
65 "debug",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
66 "non-presence stanza from target: name = %s, type = %s",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
67 stanza.name,
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
68 type
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
69 )
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
70 if stanza.name == "iq" then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
71 if type == "error" or type == "result" then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
72 -- de-NAT message
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
73 local _, _, denatted_to_unprepped = jid_split(stanza.attr.to);
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
74 local denatted_to = jid_prep(denatted_to_unprepped);
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
75 if not denatted_to then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
76 module:log(
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
77 "debug",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
78 "cannot de-NAT stanza, invalid to: %s",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
79 denatted_to_unprepped
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
80 )
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
81 return
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
82 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
83 local denatted_from = module:get_host();
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
84
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
85 module:log(
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
86 "debug",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
87 "de-NAT-ed stanza: from: %s -> %s, to: %s -> %s",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
88 stanza.attr.from,
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
89 denatted_from,
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
90 stanza.attr.to,
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
91 denatted_to
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
92 )
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
93
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
94 stanza.attr.from = denatted_from
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
95 stanza.attr.to = denatted_to
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
96
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
97 module:send(stanza)
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
98 else
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
99 -- FIXME: we don’t support NATing outbund requests atm.
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
100 module:send(st.error_reply(stanza, "cancel", "feature-not-implemented"))
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
101 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
102 elseif stanza.name == "message" then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
103 -- not implemented yet, we need a way to ensure that routing doesn’t
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
104 -- break
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
105 module:send(st.error_reply(stanza, "cancel", "feature-not-implemented"))
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
106 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
107 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
108
3101
a14a573d43ff mod_client_proxy: fix warnings
Jonas Wielicki <jonas@wielicki.name>
parents: 3098
diff changeset
109 local function handle_to_target(stanza)
3098
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
110 local type = stanza.attr.type;
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
111 module:log(
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
112 "debug",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
113 "stanza to target: name = %s, type = %s",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
114 stanza.name, type
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
115 )
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
116 if stanza.name == "presence" then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
117 if type ~= "error" then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
118 module:send(st.error_reply(stanza, "cancel", "bad-request"))
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
119 return
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
120 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
121 elseif stanza.name == "iq" then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
122 if type == "get" or type == "set" then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
123 if #sessions == 0 then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
124 -- no sessions available to send to
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
125 module:log("debug", "no sessions to send to!")
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
126 module:send(st.error_reply(stanza, "cancel", "service-unavailable"))
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
127 return
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
128 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
129
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
130 -- find a target session
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
131 local target_session = sessions:random()
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
132 local target = target_address .. "/" .. target_session
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
133
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
134 -- encode sender JID in resource
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
135 local natted_from = module:get_host() .. "/" .. stanza.attr.from;
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
136
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
137 module:log(
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
138 "debug",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
139 "NAT-ed stanza: from: %s -> %s, to: %s -> %s",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
140 stanza.attr.from,
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
141 natted_from,
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
142 stanza.attr.to,
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
143 target
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
144 )
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
145
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
146 stanza.attr.from = natted_from
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
147 stanza.attr.to = target
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
148
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
149 module:send(stanza)
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
150 end
3101
a14a573d43ff mod_client_proxy: fix warnings
Jonas Wielicki <jonas@wielicki.name>
parents: 3098
diff changeset
151 -- FIXME: handle and forward result/error correctly
3098
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
152 elseif stanza.name == "message" then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
153 -- not implemented yet, we need a way to ensure that routing doesn’t
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
154 -- break
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
155 module:send(st.error_reply(stanza, "cancel", "feature-not-implemented"))
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
156 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
157 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
158
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
159 local function stanza_handler(event)
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
160 local origin, stanza = event.origin, event.stanza
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
161 module:log("debug", "received stanza from %s session", origin.type)
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
162
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
163 local bare_from = jid_bare(stanza.attr.from);
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
164 local _, _, to = jid_split(stanza.attr.to);
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
165 if bare_from == target_address then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
166 -- from our target, to whom?
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
167 if not to then
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
168 -- directly to component
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
169 if stanza.name == "presence" then
3101
a14a573d43ff mod_client_proxy: fix warnings
Jonas Wielicki <jonas@wielicki.name>
parents: 3098
diff changeset
170 handle_target_presence(stanza)
3098
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
171 else
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
172 module:send(st.error_reply(stanza, "cancel", "bad-request"))
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
173 return true
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
174 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
175 else
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
176 -- to someone else
3101
a14a573d43ff mod_client_proxy: fix warnings
Jonas Wielicki <jonas@wielicki.name>
parents: 3098
diff changeset
177 handle_from_target(stanza)
3098
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
178 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
179 else
3101
a14a573d43ff mod_client_proxy: fix warnings
Jonas Wielicki <jonas@wielicki.name>
parents: 3098
diff changeset
180 handle_to_target(stanza)
3098
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
181 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
182 return true
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
183 end
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
184
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
185 module:hook("iq/bare", stanza_handler, -1);
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
186 module:hook("message/bare", stanza_handler, -1);
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
187 module:hook("presence/bare", stanza_handler, -1);
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
188 module:hook("iq/full", stanza_handler, -1);
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
189 module:hook("message/full", stanza_handler, -1);
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
190 module:hook("presence/full", stanza_handler, -1);
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
191 module:hook("iq/host", stanza_handler, -1);
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
192 module:hook("message/host", stanza_handler, -1);
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
193 module:hook("presence/host", stanza_handler, -1);
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
194
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
195 module:log("debug", "loaded proxy on %s", module:get_host())
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
196
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
197 subscription_request = st.presence({
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
198 type = "subscribe",
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
199 to = target_address,
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
200 from = module:get_host()}
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
201 )
a81456a13797 mod_client_proxy: a Jabber Address Translation implementation
Jonas Wielicki <jonas@wielicki.name>
parents:
diff changeset
202 module:send(subscription_request)