core/stanza_router.lua

Sun, 26 Oct 2008 21:22:59 +0500

author
Waqas Hussain <waqas20@gmail.com>
date
Sun, 26 Oct 2008 21:22:59 +0500
changeset 185
a67c88ce1c6a
parent 178
8315cf03f304
child 186
bfa8a30ea488
permissions
-rw-r--r--

Added support for XEP-0049: Private XML Storage (mod_private)

30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 -- The code in this file should be self-explanatory, though the logic is horrible
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 -- for more info on that, see doc/stanza_routing.txt, which attempts to condense
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 -- the rules from the RFCs (mainly 3921)
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 require "core.servermanager"
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 local log = require "util.logger".init("stanzarouter")
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
10 local st = require "util.stanza";
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
11 local _send = require "core.sessionmanager".send_to_session;
144
ed78c1a0401e No need to comment out s2s in this branch
Matthew Wild <mwild1@gmail.com>
parents: 127
diff changeset
12 local send_s2s = require "core.s2smanager".send_to_host;
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
13 function send(session, stanza)
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
14 if session.type == "c2s" then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
15 _send(session, stanza);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
16 else
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
17 local xmlns = stanza.attr.xmlns;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
18 --stanza.attr.xmlns = "jabber:server";
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
19 stanza.attr.xmlns = nil;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
20 log("debug", "sending s2s stanza: %s", tostring(stanza));
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
21 send_s2s(session.host, host, stanza); -- TODO handle remote routing errors
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
22 stanza.attr.xmlns = xmlns; -- reset
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
23 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
24 end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
25 local user_exists = require "core.usermanager".user_exists;
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
26
171
28f420d057a0 Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents: 170
diff changeset
27 local rostermanager = require "core.rostermanager";
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
28 local sessionmanager = require "core.sessionmanager";
171
28f420d057a0 Inbound subscription approval
Waqas Hussain <waqas20@gmail.com>
parents: 170
diff changeset
29
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
30 local s2s_verify_dialback = require "core.s2smanager".verify_dialback;
146
3826ca244eb6 working outgoing s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
31 local s2s_make_authenticated = require "core.s2smanager".make_authenticated;
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
32 local format = string.format;
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
33 local tostring = tostring;
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
34
105
b099f0f80775 Removed an unnecessary line
Waqas Hussain <waqas20@gmail.com>
parents: 83
diff changeset
35 local jid_split = require "util.jid".split;
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
36 local print = print;
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 function core_process_stanza(origin, stanza)
66
018705d57f09 Working TLS!
Matthew Wild <mwild1@gmail.com>
parents: 31
diff changeset
39 log("debug", "Received: "..tostring(stanza))
73
937448005121 Added to a comment
Waqas Hussain <waqas20@gmail.com>
parents: 72
diff changeset
40 -- TODO verify validity of stanza (as well as JID validity)
83
79608fc8f98d Fixed routing for IQs to bare JIDs, and added a simple IQ validity check
Waqas Hussain <waqas20@gmail.com>
parents: 78
diff changeset
41 if stanza.name == "iq" and not(#stanza.tags == 1 and stanza.tags[1].attr.xmlns) then
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
42 if stanza.attr.type == "set" or stanza.attr.type == "get" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
43 error("Invalid IQ");
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
44 elseif #stanza.tags > 1 and not(stanza.attr.type == "error" or stanza.attr.type == "result") then
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
45 error("Invalid IQ");
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
46 end
83
79608fc8f98d Fixed routing for IQs to bare JIDs, and added a simple IQ validity check
Waqas Hussain <waqas20@gmail.com>
parents: 78
diff changeset
47 end
78
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
48
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
49 if origin.type == "c2s" and not origin.full_jid
83
79608fc8f98d Fixed routing for IQs to bare JIDs, and added a simple IQ validity check
Waqas Hussain <waqas20@gmail.com>
parents: 78
diff changeset
50 and not(stanza.name == "iq" and stanza.tags[1].name == "bind"
78
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
51 and stanza.tags[1].attr.xmlns == "urn:ietf:params:xml:ns:xmpp-bind") then
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
52 error("Client MUST bind resource after auth");
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
53 end
972e31cc91e8 Fized: Added check to ensure that resource binding is done after auth.
Waqas Hussain <waqas20@gmail.com>
parents: 73
diff changeset
54
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 local to = stanza.attr.to;
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
56 -- TODO also, stazas should be returned to their original state before the function ends
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
57 if origin.type == "c2s" then
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
58 stanza.attr.from = origin.full_jid; -- quick fix to prevent impersonation (FIXME this would be incorrect when the origin is not c2s)
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
59 end
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
61 if not to then
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
62 core_handle_stanza(origin, stanza);
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
63 elseif origin.type == "c2s" and stanza.name == "presence" and stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" then
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
64 local node, host = jid_split(stanza.attr.to);
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
65 local to_bare = node and (node.."@"..host) or host; -- bare JID
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
66 local from_node, from_host = jid_split(stanza.attr.from);
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
67 local from_bare = from_node and (from_node.."@"..from_host) or from_host; -- bare JID
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
68 handle_outbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare);
119
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
69 elseif hosts[to] and hosts[to].type == "local" then
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
70 core_handle_stanza(origin, stanza);
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
71 elseif stanza.name == "iq" and not select(3, jid_split(to)) then
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
72 core_handle_stanza(origin, stanza);
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
73 elseif origin.type == "c2s" or origin.type == "s2sin" then
119
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
74 core_route_stanza(origin, stanza);
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
75 end
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
76 end
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
77
121
74e5919e4737 Added a comment, removed all the old code
Matthew Wild <mwild1@gmail.com>
parents: 119
diff changeset
78 -- This function handles stanzas which are not routed any further,
74e5919e4737 Added a comment, removed all the old code
Matthew Wild <mwild1@gmail.com>
parents: 119
diff changeset
79 -- that is, they are handled by this server
119
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
80 function core_handle_stanza(origin, stanza)
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
81 -- Handlers
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
82 if origin.type == "c2s" or origin.type == "c2s_unauthed" then
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
83 local session = origin;
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
84
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
85 if stanza.name == "presence" and origin.roster then
152
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
86 if stanza.attr.type == nil or stanza.attr.type == "unavailable" then
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
87 for jid in pairs(origin.roster) do -- broadcast to all interested contacts
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
88 local subscription = origin.roster[jid].subscription;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
89 if subscription == "both" or subscription == "from" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
90 stanza.attr.to = jid;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
91 core_route_stanza(origin, stanza);
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
92 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
93 end
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
94 local node, host = jid_split(stanza.attr.from);
152
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
95 for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast to all resources
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
96 if res ~= origin and res.full_jid then -- to resource. FIXME is res.full_jid the correct check? Maybe it should be res.presence
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
97 stanza.attr.to = res.full_jid;
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
98 core_route_stanza(origin, stanza);
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
99 end
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
100 end
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
101 if not origin.presence then -- presence probes on initial presence -- FIXME does unavailable qualify as initial presence?
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
102 local probe = st.presence({from = origin.full_jid, type = "probe"});
152
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
103 for jid in pairs(origin.roster) do -- probe all contacts we are subscribed to
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
104 local subscription = origin.roster[jid].subscription;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
105 if subscription == "both" or subscription == "to" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
106 probe.attr.to = jid;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
107 core_route_stanza(origin, probe);
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
108 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
109 end
152
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
110 for _, res in pairs(hosts[host].sessions[node].sessions) do -- broadcast from all resources
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
111 if res ~= origin and stanza.attr.type ~= "unavailable" and res.presence then -- FIXME does unavailable qualify as initial presence?
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
112 res.presence.attr.to = origin.full_jid;
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
113 core_route_stanza(res, res.presence);
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
114 res.presence.attr.to = nil;
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
115 end
6b8e2bd82ac5 Moved some code and removed unnecessary checks.
Waqas Hussain <waqas20@gmail.com>
parents: 151
diff changeset
116 end
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
117 -- TODO resend subscription requests
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
118 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
119 origin.presence = stanza;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
120 stanza.attr.to = nil; -- reset it
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
121 else
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
122 -- TODO error, bad type
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
123 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
124 else
119
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
125 log("debug", "Routing stanza to local");
b48a573608e8 Relocate presence broadcast to core_handle_stanza()
Matthew Wild <mwild1@gmail.com>
parents: 113
diff changeset
126 handle_stanza(session, stanza);
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
127 end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
128 elseif origin.type == "s2sin_unauthed" or origin.type == "s2sin" then
147
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
129 if stanza.attr.xmlns == "jabber:server:dialback" then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
130 if stanza.name == "verify" then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
131 -- We are being asked to verify the key, to ensure it was generated by us
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
132 log("debug", "verifying dialback key...");
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
133 local attr = stanza.attr;
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
134 print(tostring(attr.to), tostring(attr.from))
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
135 print(tostring(origin.to_host), tostring(origin.from_host))
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
136 -- FIXME: Grr, ejabberd breaks this one too?? it is black and white in XEP-220 example 34
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
137 --if attr.from ~= origin.to_host then error("invalid-from"); end
168
744fafa8b700 Log when an incoming dialback verification request is an invalid key for our domain
Matthew Wild <mwild1@gmail.com>
parents: 160
diff changeset
138 local type;
147
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
139 if s2s_verify_dialback(attr.id, attr.from, attr.to, stanza[1]) then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
140 type = "valid"
168
744fafa8b700 Log when an incoming dialback verification request is an invalid key for our domain
Matthew Wild <mwild1@gmail.com>
parents: 160
diff changeset
141 else
744fafa8b700 Log when an incoming dialback verification request is an invalid key for our domain
Matthew Wild <mwild1@gmail.com>
parents: 160
diff changeset
142 type = "invalid"
744fafa8b700 Log when an incoming dialback verification request is an invalid key for our domain
Matthew Wild <mwild1@gmail.com>
parents: 160
diff changeset
143 log("warn", "Asked to verify a dialback key that was incorrect. An imposter is claiming to be %s?", attr.to);
147
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
144 end
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
145 origin.send(format("<db:verify from='%s' to='%s' id='%s' type='%s'>%s</db:verify>", attr.to, attr.from, attr.id, type, stanza[1]));
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
146 elseif stanza.name == "result" and origin.type == "s2sin_unauthed" then
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
147 -- he wants to be identified through dialback
147
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
148 -- We need to check the key with the Authoritative server
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
149 local attr = stanza.attr;
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
150 origin.from_host = attr.from;
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
151 origin.to_host = attr.to;
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
152 origin.dialback_key = stanza[1];
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
153 log("debug", "asking %s if key %s belongs to them", attr.from, stanza[1]);
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
154 send_s2s(attr.to, attr.from, format("<db:verify from='%s' to='%s' id='%s'>%s</db:verify>", attr.to, attr.from, origin.streamid, stanza[1]));
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
155 hosts[attr.from].dialback_verifying = origin;
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
156 end
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
157 end
147
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
158 elseif origin.type == "s2sout_unauthed" or origin.type == "s2sout" then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
159 if stanza.attr.xmlns == "jabber:server:dialback" then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
160 if stanza.name == "result" then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
161 if stanza.attr.type == "valid" then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
162 s2s_make_authenticated(origin);
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
163 else
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
164 -- FIXME
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
165 error("dialback failed!");
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
166 end
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
167 elseif stanza.name == "verify" and origin.dialback_verifying then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
168 local valid;
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
169 local attr = stanza.attr;
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
170 if attr.type == "valid" then
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
171 s2s_make_authenticated(origin.dialback_verifying);
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
172 valid = "valid";
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
173 else
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
174 -- Warn the original connection that is was not verified successfully
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
175 log("warn", "dialback for "..(origin.dialback_verifying.from_host or "(unknown)").." failed");
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
176 valid = "invalid";
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
177 end
ccebb2720741 working incoming s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 146
diff changeset
178 origin.dialback_verifying.send(format("<db:result from='%s' to='%s' id='%s' type='%s'>%s</db:result>", attr.from, attr.to, attr.id, valid, origin.dialback_verifying.dialback_key));
146
3826ca244eb6 working outgoing s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
179 end
3826ca244eb6 working outgoing s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
180 end
145
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
181 else
fbb3a4ff9cf1 dialback keys now verified
Matthew Wild <mwild1@gmail.com>
parents: 144
diff changeset
182 log("warn", "Unhandled origin: %s", origin.type);
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
183 end
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
184 end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
185
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
186 function send_presence_of_available_resources(user, host, jid, recipient_session)
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
187 local h = hosts[host];
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
188 local count = 0;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
189 if h and h.type == "local" then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
190 local u = h.sessions[user];
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
191 if u then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
192 for k, session in pairs(u.sessions) do
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
193 local pres = session.presence;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
194 if pres then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
195 pres.attr.to = jid;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
196 pres.attr.from = session.full_jid;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
197 send(recipient_session, pres);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
198 pres.attr.to = nil;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
199 pres.attr.from = nil;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
200 count = count + 1;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
201 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
202 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
203 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
204 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
205 return count;
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
206 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
207
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
208 function handle_outbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare)
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
209 local node, host = jid_split(from_bare);
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
210 local st_from, st_to = stanza.attr.from, stanza.attr.to;
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
211 stanza.attr.from, stanza.attr.to = from_bare, to_bare;
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
212 if stanza.attr.type == "subscribe" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
213 log("debug", "outbound subscribe from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
214 -- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
215 -- 2. roster push (subscription = none, ask = subscribe)
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
216 if rostermanager.set_contact_pending_out(node, host, to_bare) then
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
217 rostermanager.roster_push(node, host, to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
218 end -- else file error
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
219 core_route_stanza(origin, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
220 elseif stanza.attr.type == "unsubscribe" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
221 log("debug", "outbound unsubscribe from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
222 -- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
223 -- 2. roster push (subscription = none or from)
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
224 if rostermanager.unsubscribe(node, host, to_bare) then
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
225 rostermanager.roster_push(node, host, to_bare); -- FIXME do roster push when roster has in fact not changed?
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
226 end -- else file error
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
227 core_route_stanza(origin, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
228 elseif stanza.attr.type == "subscribed" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
229 log("debug", "outbound subscribed from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
230 -- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
231 -- 2. roster_push ()
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
232 -- 3. send_presence_of_available_resources
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
233 if rostermanager.subscribed(node, host, to_bare) then
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
234 rostermanager.roster_push(node, host, to_bare);
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
235 core_route_stanza(origin, stanza);
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
236 send_presence_of_available_resources(node, host, to_bare, origin);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
237 end
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
238 elseif stanza.attr.type == "unsubscribed" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
239 log("debug", "outbound unsubscribed from "..from_bare.." for "..to_bare);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
240 -- 1. route stanza
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
241 -- 2. roster push (subscription = none or to)
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
242 if rostermanager.unsubscribed(node, host, to_bare) then
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
243 rostermanager.roster_push(node, host, to_bare);
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
244 core_route_stanza(origin, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
245 end
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
246 end
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
247 stanza.attr.from, stanza.attr.to = st_from, st_to;
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
248 end
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
249
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
250 function handle_inbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare)
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
251 local node, host = jid_split(to_bare);
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
252 local st_from, st_to = stanza.attr.from, stanza.attr.to;
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
253 stanza.attr.from, stanza.attr.to = from_bare, to_bare;
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
254 if stanza.attr.type == "probe" then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
255 if rostermanager.is_contact_subscribed(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
256 if 0 == send_presence_of_available_resources(node, host, from_bare, origin) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
257 -- TODO send last recieved unavailable presence (or we MAY do nothing, which is fine too)
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
258 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
259 else
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
260 core_route_stanza(origin, st.presence({from=to_bare, to=from_bare, type="unsubscribed"}));
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
261 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
262 elseif stanza.attr.type == "subscribe" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
263 log("debug", "inbound subscribe from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
264 if rostermanager.is_contact_subscribed(node, host, from_bare) then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
265 core_route_stanza(origin, st.presence({from=to_bare, to=from_bare, type="subscribed"})); -- already subscribed
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
266 else
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
267 if not rostermanager.is_contact_pending_in(node, host, from_bare) then
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
268 if rostermanager.set_contact_pending_in(node, host, from_bare) then
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
269 sessionmanager.send_to_available_resources(node, host, stanza);
176
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
270 end -- TODO else return error, unable to save
e5cd2a03891d Outbound presence subscription
Waqas Hussain <waqas20@gmail.com>
parents: 175
diff changeset
271 end
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
272 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
273 elseif stanza.attr.type == "unsubscribe" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
274 log("debug", "inbound unsubscribe from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
275 if rostermanager.process_inbound_unsubscribe(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
276 rostermanager.roster_push(node, host, from_bare);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
277 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
278 elseif stanza.attr.type == "subscribed" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
279 log("debug", "inbound subscribed from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
280 if rostermanager.process_inbound_subscription_approval(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
281 rostermanager.roster_push(node, host, from_bare);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
282 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
283 elseif stanza.attr.type == "unsubscribed" then
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
284 log("debug", "inbound unsubscribed from "..from_bare.." for "..to_bare);
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
285 if rostermanager.process_inbound_subscription_approval(node, host, from_bare) then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
286 rostermanager.roster_push(node, host, from_bare);
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
287 end
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
288 end -- discard any other type
177
606c433955e7 Bug fixes and checks for presence subscriptions, etc
Waqas Hussain <waqas20@gmail.com>
parents: 176
diff changeset
289 stanza.attr.from, stanza.attr.to = st_from, st_to;
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
290 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
291
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
292 function core_route_stanza(origin, stanza)
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
293 -- Hooks
68
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
294 --- ...later
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
295
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
296 -- Deliver
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
297 local to = stanza.attr.to;
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
298 local node, host, resource = jid_split(to);
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
299 local to_bare = node and (node.."@"..host) or host; -- bare JID
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
300 local from = stanza.attr.from;
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
301 local from_node, from_host, from_resource = jid_split(from);
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
302 local from_bare = from_node and (from_node.."@"..from_host) or from_host; -- bare JID
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
303
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
304 if stanza.name == "presence" and (stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable") then resource = nil; end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
305
68
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
306 local host_session = hosts[host]
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
307 if host_session and host_session.type == "local" then
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
308 -- Local host
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
309 local user = host_session.sessions[node];
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
310 if user then
72
e78db62beebc Code cleanup
Waqas Hussain <waqas20@gmail.com>
parents: 71
diff changeset
311 local res = user.sessions[resource];
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
312 if not res then
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
313 -- if we get here, resource was not specified or was unavailable
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
314 if stanza.name == "presence" then
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
315 if stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" then
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
316 handle_inbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare);
151
096c7b9374fc Presence fixes (again)
Waqas Hussain <waqas20@gmail.com>
parents: 143
diff changeset
317 else -- sender is available or unavailable
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
318 for k in pairs(user.sessions) do -- presence broadcast to all user resources. FIXME should this be just for available resources? Do we need to check subscription?
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
319 if user.sessions[k].full_jid then
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
320 stanza.attr.to = user.sessions[k].full_jid; -- reset at the end of function
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
321 send(user.sessions[k], stanza);
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
322 end
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
323 end
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
324 end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
325 elseif stanza.name == "message" then -- select a resource to recieve message
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
326 for k in pairs(user.sessions) do
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
327 if user.sessions[k].full_jid then
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
328 res = user.sessions[k];
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
329 break;
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
330 end
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
331 end
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
332 -- TODO find resource with greatest priority
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
333 send(res, stanza);
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
334 else
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
335 -- TODO send IQ error
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
336 end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
337 else
121
74e5919e4737 Added a comment, removed all the old code
Matthew Wild <mwild1@gmail.com>
parents: 119
diff changeset
338 -- User + resource is online...
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
339 stanza.attr.to = res.full_jid; -- reset at the end of function
106
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
340 send(res, stanza); -- Yay \o/
f2a3d204a76a Added: presence broadcast
Waqas Hussain <waqas20@gmail.com>
parents: 105
diff changeset
341 end
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
342 else
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
343 -- user not online
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
344 if user_exists(node, host) then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
345 if stanza.name == "presence" then
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
346 if stanza.attr.type ~= nil and stanza.attr.type ~= "unavailable" then
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
347 handle_inbound_presence_subscriptions_and_probes(origin, stanza, from_bare, to_bare);
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
348 else
175
5f71d290bb44 Routing code reorganization
Waqas Hussain <waqas20@gmail.com>
parents: 174
diff changeset
349 -- TODO send unavailable presence or unsubscribed
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
350 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
351 elseif stanza.name == "message" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
352 -- TODO send message error, or store offline messages
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
353 elseif stanza.name == "iq" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
354 -- TODO send IQ error
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
355 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
356 else -- user does not exist
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
357 -- TODO we would get here for nodeless JIDs too. Do something fun maybe? Echo service? Let plugins use xmpp:server/resource addresses?
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
358 if stanza.name == "presence" then
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
359 if stanza.attr.type == "probe" then
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
360 send(origin, st.presence({from = to_bare, to = from_bare, type = "unsubscribed"}));
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
361 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
362 -- else ignore
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
363 else
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
364 send(origin, st.error_reply(stanza, "cancel", "service-unavailable"));
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
365 end
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
366 end
71
fbb4ef1da82e Added: Local stanza routing
Waqas Hussain <waqas20@gmail.com>
parents: 68
diff changeset
367 end
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
368 elseif origin.type == "c2s" then
68
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
369 -- Remote host
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
370 local xmlns = stanza.attr.xmlns;
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
371 --stanza.attr.xmlns = "jabber:server";
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
372 stanza.attr.xmlns = nil;
146
3826ca244eb6 working outgoing s2s \o/
Matthew Wild <mwild1@gmail.com>
parents: 145
diff changeset
373 log("debug", "sending s2s stanza: %s", tostring(stanza));
170
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
374 send_s2s(origin.host, host, stanza); -- TODO handle remote routing errors
e7bff9cfbb65 Minor fixes, comments
Waqas Hussain <waqas20@gmail.com>
parents: 160
diff changeset
375 stanza.attr.xmlns = xmlns; -- reset
148
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
376 else
4c0dcd245d34 s2s works! \o/ \o/
Matthew Wild <mwild1@gmail.com>
parents: 147
diff changeset
377 log("warn", "received stanza from unhandled connection type: %s", origin.type);
68
ceb7a55676a4 Beginnings of real stanza routing
Matthew Wild <mwild1@gmail.com>
parents: 66
diff changeset
378 end
113
9026fdad1531 Working presence, presence probes and other fixes
Waqas Hussain <waqas20@gmail.com>
parents: 106
diff changeset
379 stanza.attr.to = to; -- reset
30
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
380 end
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
381
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
382 function handle_stanza_toremote(stanza)
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
383 log("error", "Stanza bound for remote host, but s2s is not implemented");
bcf539295f2d Huge commit to:
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
384 end

mercurial