client.lua

Thu, 10 Jun 2021 11:58:23 +0200

author
Kim Alvefur <zash@zash.se>
date
Thu, 10 Jun 2021 11:58:23 +0200
changeset 445
b119dc4d8bc2
parent 444
12c1be0044c6
child 452
628896d39d8e
permissions
-rw-r--r--

plugins.smacks: Don't warn about zero stanzas acked

It's only if the count somehow goes backwards that something is really
wrong. An ack for zero stanzas is fine and we don't need to do anything.

26
6c5fab6c11cf Rename verse2 -> verse
Matthew Wild <mwild1@gmail.com>
parents: 25
diff changeset
1 local verse = require "verse";
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 local stream = verse.stream_mt;
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3
30
9c96318913f7 Revert module names throughout to their Prosody equivalents
Matthew Wild <mwild1@gmail.com>
parents: 28
diff changeset
4 local jid_split = require "util.jid".split;
137
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
5 local adns = require "net.adns";
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 local st = require "util.stanza";
22
e6fad7c411fe verse.client: Extend verse object with message/iq/presence/stanza methods from util.stanza
Matthew Wild <mwild1@gmail.com>
parents: 21
diff changeset
7
e6fad7c411fe verse.client: Extend verse object with message/iq/presence/stanza methods from util.stanza
Matthew Wild <mwild1@gmail.com>
parents: 21
diff changeset
8 -- Shortcuts to save having to load util.stanza
52
8416508bfeb4 verse.client: Add verse.error_reply() helper
Matthew Wild <mwild1@gmail.com>
parents: 50
diff changeset
9 verse.message, verse.presence, verse.iq, verse.stanza, verse.reply, verse.error_reply =
8416508bfeb4 verse.client: Add verse.error_reply() helper
Matthew Wild <mwild1@gmail.com>
parents: 50
diff changeset
10 st.message, st.presence, st.iq, st.stanza, st.reply, st.error_reply;
22
e6fad7c411fe verse.client: Extend verse object with message/iq/presence/stanza methods from util.stanza
Matthew Wild <mwild1@gmail.com>
parents: 21
diff changeset
11
161
b177bcea2006 squishy, verse.client, verse.component, verse.bosh: Port to util.xmppstream instead of xmlhandlers which has been removed from Prosody. Also remove util.ztact from squishy for the same reason.
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
12 local new_xmpp_stream = require "util.xmppstream".new;
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13
10
3a422606a040 verse.client: Fire events on stream features, errors, etc. and on non-stream tags such as SASL and TLS
Matthew Wild <mwild1@gmail.com>
parents: 1
diff changeset
14 local xmlns_stream = "http://etherx.jabber.org/streams";
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15
137
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
16 local function compare_srv_priorities(a,b)
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
17 return a.priority < b.priority or (a.priority == b.priority and a.weight > b.weight);
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
18 end
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
19
48
abccad4b8559 verse.client: Update stream_callbacks format for new xmlhandlers API (thanks to Bill Clark for the patch)
Matthew Wild <mwild1@gmail.com>
parents: 47
diff changeset
20 local stream_callbacks = {
abccad4b8559 verse.client: Update stream_callbacks format for new xmlhandlers API (thanks to Bill Clark for the patch)
Matthew Wild <mwild1@gmail.com>
parents: 47
diff changeset
21 stream_ns = xmlns_stream,
abccad4b8559 verse.client: Update stream_callbacks format for new xmlhandlers API (thanks to Bill Clark for the patch)
Matthew Wild <mwild1@gmail.com>
parents: 47
diff changeset
22 stream_tag = "stream",
abccad4b8559 verse.client: Update stream_callbacks format for new xmlhandlers API (thanks to Bill Clark for the patch)
Matthew Wild <mwild1@gmail.com>
parents: 47
diff changeset
23 default_ns = "jabber:client" };
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 400
diff changeset
24
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 function stream_callbacks.streamopened(stream, attr)
83
8221f3c25fd4 verse.client: Add stream_id property
Matthew Wild <mwild1@gmail.com>
parents: 81
diff changeset
26 stream.stream_id = attr.id;
8221f3c25fd4 verse.client: Add stream_id property
Matthew Wild <mwild1@gmail.com>
parents: 81
diff changeset
27 if not stream:event("opened", attr) then
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 stream.notopen = nil;
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 end
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 return true;
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 end
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 function stream_callbacks.streamclosed(stream)
329
2787e038bea2 verse.client: Use a different flag to indicate that our outgoing stream is closed
Kim Alvefur <zash@zash.se>
parents: 323
diff changeset
34 stream.notopen = true;
2787e038bea2 verse.client: Use a different flag to indicate that our outgoing stream is closed
Kim Alvefur <zash@zash.se>
parents: 323
diff changeset
35 if not stream.closed then
323
5bf3b13edb80 verse.client: Try to behave better when stream is closed gracefully
Kim Alvefur <zash@zash.se>
parents: 282
diff changeset
36 stream:send("</stream:stream>");
329
2787e038bea2 verse.client: Use a different flag to indicate that our outgoing stream is closed
Kim Alvefur <zash@zash.se>
parents: 323
diff changeset
37 stream.closed = true;
323
5bf3b13edb80 verse.client: Try to behave better when stream is closed gracefully
Kim Alvefur <zash@zash.se>
parents: 282
diff changeset
38 end
5bf3b13edb80 verse.client: Try to behave better when stream is closed gracefully
Kim Alvefur <zash@zash.se>
parents: 282
diff changeset
39 stream:event("closed");
5bf3b13edb80 verse.client: Try to behave better when stream is closed gracefully
Kim Alvefur <zash@zash.se>
parents: 282
diff changeset
40 return stream:close("stream closed")
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 end
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 function stream_callbacks.handlestanza(stream, stanza)
10
3a422606a040 verse.client: Fire events on stream features, errors, etc. and on non-stream tags such as SASL and TLS
Matthew Wild <mwild1@gmail.com>
parents: 1
diff changeset
44 if stanza.attr.xmlns == xmlns_stream then
3a422606a040 verse.client: Fire events on stream features, errors, etc. and on non-stream tags such as SASL and TLS
Matthew Wild <mwild1@gmail.com>
parents: 1
diff changeset
45 return stream:event("stream-"..stanza.name, stanza);
3a422606a040 verse.client: Fire events on stream features, errors, etc. and on non-stream tags such as SASL and TLS
Matthew Wild <mwild1@gmail.com>
parents: 1
diff changeset
46 elseif stanza.attr.xmlns then
3a422606a040 verse.client: Fire events on stream features, errors, etc. and on non-stream tags such as SASL and TLS
Matthew Wild <mwild1@gmail.com>
parents: 1
diff changeset
47 return stream:event("stream/"..stanza.attr.xmlns, stanza);
3a422606a040 verse.client: Fire events on stream features, errors, etc. and on non-stream tags such as SASL and TLS
Matthew Wild <mwild1@gmail.com>
parents: 1
diff changeset
48 end
28
afe9e6d6c87a verse.client: New stanza dispatcher to fire events based on the name (and in the case of iq, xmlns) of the stanza
Matthew Wild <mwild1@gmail.com>
parents: 26
diff changeset
49
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 return stream:event("stanza", stanza);
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 end
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52
336
658c62c9ecc4 verse.client: Fire stream error events, so they can be handled
Kim Alvefur <zash@zash.se>
parents: 329
diff changeset
53 function stream_callbacks.error(stream, e, stanza)
658c62c9ecc4 verse.client: Fire stream error events, so they can be handled
Kim Alvefur <zash@zash.se>
parents: 329
diff changeset
54 if stream:event(e, stanza) == nil then
364
69fc23b44819 client: Deal with eg no-stream errors where no stanza is passed
Kim Alvefur <zash@zash.se>
parents: 344
diff changeset
55 if stanza then
69fc23b44819 client: Deal with eg no-stream errors where no stanza is passed
Kim Alvefur <zash@zash.se>
parents: 344
diff changeset
56 local err = stanza:get_child(nil, "urn:ietf:params:xml:ns:xmpp-streams");
69fc23b44819 client: Deal with eg no-stream errors where no stanza is passed
Kim Alvefur <zash@zash.se>
parents: 344
diff changeset
57 local text = stanza:get_child_text("text", "urn:ietf:params:xml:ns:xmpp-streams");
69fc23b44819 client: Deal with eg no-stream errors where no stanza is passed
Kim Alvefur <zash@zash.se>
parents: 344
diff changeset
58 error(err.name..(text and ": "..text or ""));
69fc23b44819 client: Deal with eg no-stream errors where no stanza is passed
Kim Alvefur <zash@zash.se>
parents: 344
diff changeset
59 else
69fc23b44819 client: Deal with eg no-stream errors where no stanza is passed
Kim Alvefur <zash@zash.se>
parents: 344
diff changeset
60 error(stanza and stanza.name or e or "unknown-error");
69fc23b44819 client: Deal with eg no-stream errors where no stanza is passed
Kim Alvefur <zash@zash.se>
parents: 344
diff changeset
61 end
336
658c62c9ecc4 verse.client: Fire stream error events, so they can be handled
Kim Alvefur <zash@zash.se>
parents: 329
diff changeset
62 end
658c62c9ecc4 verse.client: Fire stream error events, so they can be handled
Kim Alvefur <zash@zash.se>
parents: 329
diff changeset
63 end
658c62c9ecc4 verse.client: Fire stream error events, so they can be handled
Kim Alvefur <zash@zash.se>
parents: 329
diff changeset
64
70
36d113fb0f3c verse.client: Add stream:reset(), keep self.data static between resets
Matthew Wild <mwild1@gmail.com>
parents: 62
diff changeset
65 function stream:reset()
161
b177bcea2006 squishy, verse.client, verse.component, verse.bosh: Port to util.xmppstream instead of xmlhandlers which has been removed from Prosody. Also remove util.ztact from squishy for the same reason.
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
66 if self.stream then
b177bcea2006 squishy, verse.client, verse.component, verse.bosh: Port to util.xmppstream instead of xmlhandlers which has been removed from Prosody. Also remove util.ztact from squishy for the same reason.
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
67 self.stream:reset();
b177bcea2006 squishy, verse.client, verse.component, verse.bosh: Port to util.xmppstream instead of xmlhandlers which has been removed from Prosody. Also remove util.ztact from squishy for the same reason.
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
68 else
b177bcea2006 squishy, verse.client, verse.component, verse.bosh: Port to util.xmppstream instead of xmlhandlers which has been removed from Prosody. Also remove util.ztact from squishy for the same reason.
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
69 self.stream = new_xmpp_stream(self, stream_callbacks);
b177bcea2006 squishy, verse.client, verse.component, verse.bosh: Port to util.xmppstream instead of xmlhandlers which has been removed from Prosody. Also remove util.ztact from squishy for the same reason.
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
70 end
70
36d113fb0f3c verse.client: Add stream:reset(), keep self.data static between resets
Matthew Wild <mwild1@gmail.com>
parents: 62
diff changeset
71 self.notopen = true;
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 return true;
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 end
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 function stream:connect_client(jid, pass)
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 self.jid, self.password = jid, pass;
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 self.username, self.host, self.resource = jid_split(jid);
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 400
diff changeset
78
62
d4b6f9e33c6e verse.client: Load TLS along with other core plugins
Matthew Wild <mwild1@gmail.com>
parents: 52
diff changeset
79 -- Required XMPP features
d4b6f9e33c6e verse.client: Load TLS along with other core plugins
Matthew Wild <mwild1@gmail.com>
parents: 52
diff changeset
80 self:add_plugin("tls");
38
c40cc28ac7df verse.client: Automatically load sasl and bind plugins
Matthew Wild <mwild1@gmail.com>
parents: 37
diff changeset
81 self:add_plugin("sasl");
c40cc28ac7df verse.client: Automatically load sasl and bind plugins
Matthew Wild <mwild1@gmail.com>
parents: 37
diff changeset
82 self:add_plugin("bind");
50
432ac110544f Add support for 3921 session negotiation (makes ejabberd happy), thanks Chris!
Matthew Wild <mwild1@gmail.com>
parents: 49
diff changeset
83 self:add_plugin("session");
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 400
diff changeset
84
70
36d113fb0f3c verse.client: Add stream:reset(), keep self.data static between resets
Matthew Wild <mwild1@gmail.com>
parents: 62
diff changeset
85 function self.data(conn, data)
161
b177bcea2006 squishy, verse.client, verse.component, verse.bosh: Port to util.xmppstream instead of xmlhandlers which has been removed from Prosody. Also remove util.ztact from squishy for the same reason.
Matthew Wild <mwild1@gmail.com>
parents: 137
diff changeset
86 local ok, err = self.stream:feed(data);
70
36d113fb0f3c verse.client: Add stream:reset(), keep self.data static between resets
Matthew Wild <mwild1@gmail.com>
parents: 62
diff changeset
87 if ok then return; end
400
0db9cb909cf1 client, component: Fix logging of invalid XML
Matthew Wild <mwild1@gmail.com>
parents: 364
diff changeset
88 self:debug("Received invalid XML (%s) %d bytes: %s", tostring(err), #data, data:sub(1, 300):gsub("[\r\n]+", " "));
171
741f5311d30c verse.client: Fix two cases where we called methods on the base stream object instead of the current one
Matthew Wild <mwild1@gmail.com>
parents: 166
diff changeset
89 self:close("xml-not-well-formed");
70
36d113fb0f3c verse.client: Add stream:reset(), keep self.data static between resets
Matthew Wild <mwild1@gmail.com>
parents: 62
diff changeset
90 end
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 400
diff changeset
91
199
33b54389ed9c verse.client: Reopen stream in response to 'connected' event
Matthew Wild <mwild1@gmail.com>
parents: 171
diff changeset
92 self:hook("connected", function () self:reopen(); end);
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 self:hook("incoming-raw", function (data) return self.data(self.conn, data); end);
444
12c1be0044c6 client: Send whitespace keeplives
Kim Alvefur <zash@zash.se>
parents: 430
diff changeset
94 self:hook("read-timeout", function () self:send(" "); return true; end, -1);
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 400
diff changeset
95
13
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
96 self.curr_id = 0;
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 400
diff changeset
97
13
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
98 self.tracked_iqs = {};
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
99 self:hook("stanza", function (stanza)
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
100 local id, type = stanza.attr.id, stanza.attr.type;
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
101 if id and stanza.name == "iq" and (type == "result" or type == "error") and self.tracked_iqs[id] then
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
102 self.tracked_iqs[id](stanza);
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
103 self.tracked_iqs[id] = nil;
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
104 return true;
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
105 end
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
106 end);
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 400
diff changeset
107
37
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
108 self:hook("stanza", function (stanza)
282
52b971d9ebc3 client, component: `ret` was probably meant to be a local
Kim Alvefur <zash@zash.se>
parents: 199
diff changeset
109 local ret;
37
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
110 if stanza.attr.xmlns == nil or stanza.attr.xmlns == "jabber:client" then
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
111 if stanza.name == "iq" and (stanza.attr.type == "get" or stanza.attr.type == "set") then
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
112 local xmlns = stanza.tags[1] and stanza.tags[1].attr.xmlns;
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
113 if xmlns then
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
114 ret = self:event("iq/"..xmlns, stanza);
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
115 if not ret then
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
116 ret = self:event("iq", stanza);
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
117 end
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
118 end
81
0924a3d05e40 Bounce service-unavailable on unhandled iq stanzas (thanks Kev, Florob and anyone else who poked me)
Matthew Wild <mwild1@gmail.com>
parents: 78
diff changeset
119 if ret == nil then
0924a3d05e40 Bounce service-unavailable on unhandled iq stanzas (thanks Kev, Florob and anyone else who poked me)
Matthew Wild <mwild1@gmail.com>
parents: 78
diff changeset
120 self:send(verse.error_reply(stanza, "cancel", "service-unavailable"));
0924a3d05e40 Bounce service-unavailable on unhandled iq stanzas (thanks Kev, Florob and anyone else who poked me)
Matthew Wild <mwild1@gmail.com>
parents: 78
diff changeset
121 return true;
0924a3d05e40 Bounce service-unavailable on unhandled iq stanzas (thanks Kev, Florob and anyone else who poked me)
Matthew Wild <mwild1@gmail.com>
parents: 78
diff changeset
122 end
37
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
123 else
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
124 ret = self:event(stanza.name, stanza);
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
125 end
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
126 end
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
127 return ret;
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
128 end, -1);
0ccd523e110a verse.client: Don't hook the stanza event every time a stanza comes in :)
Matthew Wild <mwild1@gmail.com>
parents: 30
diff changeset
129
166
3499b4ea3277 verse.client: Fire 'stanza-out' and {message,presence,iq}'-out' for outgoing stanzas
Matthew Wild <mwild1@gmail.com>
parents: 161
diff changeset
130 self:hook("outgoing", function (data)
3499b4ea3277 verse.client: Fire 'stanza-out' and {message,presence,iq}'-out' for outgoing stanzas
Matthew Wild <mwild1@gmail.com>
parents: 161
diff changeset
131 if data.name then
3499b4ea3277 verse.client: Fire 'stanza-out' and {message,presence,iq}'-out' for outgoing stanzas
Matthew Wild <mwild1@gmail.com>
parents: 161
diff changeset
132 self:event("stanza-out", data);
3499b4ea3277 verse.client: Fire 'stanza-out' and {message,presence,iq}'-out' for outgoing stanzas
Matthew Wild <mwild1@gmail.com>
parents: 161
diff changeset
133 end
3499b4ea3277 verse.client: Fire 'stanza-out' and {message,presence,iq}'-out' for outgoing stanzas
Matthew Wild <mwild1@gmail.com>
parents: 161
diff changeset
134 end);
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 400
diff changeset
135
166
3499b4ea3277 verse.client: Fire 'stanza-out' and {message,presence,iq}'-out' for outgoing stanzas
Matthew Wild <mwild1@gmail.com>
parents: 161
diff changeset
136 self:hook("stanza-out", function (stanza)
3499b4ea3277 verse.client: Fire 'stanza-out' and {message,presence,iq}'-out' for outgoing stanzas
Matthew Wild <mwild1@gmail.com>
parents: 161
diff changeset
137 if not stanza.attr.xmlns then
3499b4ea3277 verse.client: Fire 'stanza-out' and {message,presence,iq}'-out' for outgoing stanzas
Matthew Wild <mwild1@gmail.com>
parents: 161
diff changeset
138 self:event(stanza.name.."-out", stanza);
3499b4ea3277 verse.client: Fire 'stanza-out' and {message,presence,iq}'-out' for outgoing stanzas
Matthew Wild <mwild1@gmail.com>
parents: 161
diff changeset
139 end
3499b4ea3277 verse.client: Fire 'stanza-out' and {message,presence,iq}'-out' for outgoing stanzas
Matthew Wild <mwild1@gmail.com>
parents: 161
diff changeset
140 end);
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 400
diff changeset
141
76
927167321283 verse.client: Fire 'ready' event on stream when resource binding or session negotiation is complete, hook this instead of binding-success
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
142 local function stream_ready()
927167321283 verse.client: Fire 'ready' event on stream when resource binding or session negotiation is complete, hook this instead of binding-success
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
143 self:event("ready");
927167321283 verse.client: Fire 'ready' event on stream when resource binding or session negotiation is complete, hook this instead of binding-success
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
144 end
927167321283 verse.client: Fire 'ready' event on stream when resource binding or session negotiation is complete, hook this instead of binding-success
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
145 self:hook("session-success", stream_ready, -1)
78
f4188eff53a7 verse.client, verse.plugins.bind, verse.plugins.session: Rename binding-success and binding-failure to bind-success and bind-failure for consistency
Matthew Wild <mwild1@gmail.com>
parents: 76
diff changeset
146 self:hook("bind-success", stream_ready, -1);
76
927167321283 verse.client: Fire 'ready' event on stream when resource binding or session negotiation is complete, hook this instead of binding-success
Matthew Wild <mwild1@gmail.com>
parents: 70
diff changeset
147
97
ad6006779416 verse.client: Update stream:close() to use base stream:close(), and not add an XMPP-specific :close() to the base stream
Matthew Wild <mwild1@gmail.com>
parents: 83
diff changeset
148 local _base_close = self.close;
ad6006779416 verse.client: Update stream:close() to use base stream:close(), and not add an XMPP-specific :close() to the base stream
Matthew Wild <mwild1@gmail.com>
parents: 83
diff changeset
149 function self:close(reason)
323
5bf3b13edb80 verse.client: Try to behave better when stream is closed gracefully
Kim Alvefur <zash@zash.se>
parents: 282
diff changeset
150 self.close = _base_close;
329
2787e038bea2 verse.client: Use a different flag to indicate that our outgoing stream is closed
Kim Alvefur <zash@zash.se>
parents: 323
diff changeset
151 if not self.closed then
97
ad6006779416 verse.client: Update stream:close() to use base stream:close(), and not add an XMPP-specific :close() to the base stream
Matthew Wild <mwild1@gmail.com>
parents: 83
diff changeset
152 self:send("</stream:stream>");
329
2787e038bea2 verse.client: Use a different flag to indicate that our outgoing stream is closed
Kim Alvefur <zash@zash.se>
parents: 323
diff changeset
153 self.closed = true;
323
5bf3b13edb80 verse.client: Try to behave better when stream is closed gracefully
Kim Alvefur <zash@zash.se>
parents: 282
diff changeset
154 else
5bf3b13edb80 verse.client: Try to behave better when stream is closed gracefully
Kim Alvefur <zash@zash.se>
parents: 282
diff changeset
155 return self:close(reason);
97
ad6006779416 verse.client: Update stream:close() to use base stream:close(), and not add an XMPP-specific :close() to the base stream
Matthew Wild <mwild1@gmail.com>
parents: 83
diff changeset
156 end
ad6006779416 verse.client: Update stream:close() to use base stream:close(), and not add an XMPP-specific :close() to the base stream
Matthew Wild <mwild1@gmail.com>
parents: 83
diff changeset
157 end
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 400
diff changeset
158
137
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
159 local function start_connect()
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
160 -- Initialise connection
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
161 self:connect(self.connect_host or self.host, self.connect_port or 5222);
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
162 end
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 400
diff changeset
163
137
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
164 if not (self.connect_host or self.connect_port) then
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
165 -- Look up SRV records
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
166 adns.lookup(function (answer)
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
167 if answer then
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
168 local srv_hosts = {};
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
169 self.srv_hosts = srv_hosts;
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
170 for _, record in ipairs(answer) do
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
171 table.insert(srv_hosts, record.srv);
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
172 end
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
173 table.sort(srv_hosts, compare_srv_priorities);
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 400
diff changeset
174
137
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
175 local srv_choice = srv_hosts[1];
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
176 self.srv_choice = 1;
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
177 if srv_choice then
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
178 self.connect_host, self.connect_port = srv_choice.target, srv_choice.port;
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
179 self:debug("Best record found, will connect to %s:%d", self.connect_host or self.host, self.connect_port or 5222);
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
180 end
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 400
diff changeset
181
137
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
182 self:hook("disconnected", function ()
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
183 if self.srv_hosts and self.srv_choice < #self.srv_hosts then
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
184 self.srv_choice = self.srv_choice + 1;
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
185 local srv_choice = srv_hosts[self.srv_choice];
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
186 self.connect_host, self.connect_port = srv_choice.target, srv_choice.port;
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
187 start_connect();
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
188 return true;
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
189 end
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
190 end, 1000);
411
db462d4feb44 verse: trim trailing whitespace
Kim Alvefur <zash@zash.se>
parents: 400
diff changeset
191
137
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
192 self:hook("connected", function ()
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
193 self.srv_hosts = nil;
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
194 end, 1000);
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
195 end
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
196 start_connect();
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
197 end, "_xmpp-client._tcp."..(self.host)..".", "SRV");
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
198 else
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
199 start_connect();
e4b9d3c5332c verse.client: Support for SRV record lookups
Matthew Wild <mwild1@gmail.com>
parents: 97
diff changeset
200 end
1
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
201 end
7c8d0a2fc004 Break client-specific code into verse.client module
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
202
11
ce349990bd21 verse.client: Add stream:reopen()
Matthew Wild <mwild1@gmail.com>
parents: 10
diff changeset
203 function stream:reopen()
70
36d113fb0f3c verse.client: Add stream:reset(), keep self.data static between resets
Matthew Wild <mwild1@gmail.com>
parents: 62
diff changeset
204 self:reset();
49
9c10ff584e87 verse.client: Add missing version to stream header (thanks Bill Clark)
Matthew Wild <mwild1@gmail.com>
parents: 48
diff changeset
205 self:send(st.stanza("stream:stream", { to = self.host, ["xmlns:stream"]='http://etherx.jabber.org/streams',
9c10ff584e87 verse.client: Add missing version to stream header (thanks Bill Clark)
Matthew Wild <mwild1@gmail.com>
parents: 48
diff changeset
206 xmlns = "jabber:client", version = "1.0" }):top_tag());
11
ce349990bd21 verse.client: Add stream:reopen()
Matthew Wild <mwild1@gmail.com>
parents: 10
diff changeset
207 end
ce349990bd21 verse.client: Add stream:reopen()
Matthew Wild <mwild1@gmail.com>
parents: 10
diff changeset
208
13
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
209 function stream:send_iq(iq, callback)
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
210 local id = self:new_id();
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
211 self.tracked_iqs[id] = callback;
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
212 iq.attr.id = id;
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
213 self:send(iq);
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
214 end
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
215
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
216 function stream:new_id()
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
217 self.curr_id = self.curr_id + 1;
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
218 return tostring(self.curr_id);
c3d83b98fb4f verse.client: Add stream:send_iq() and stream:new_id() for sending iqs with response handlers, and for generating stream-unique ids respectively
Matthew Wild <mwild1@gmail.com>
parents: 12
diff changeset
219 end

mercurial