Software /
code /
verse
Annotate
client.lua @ 445:b119dc4d8bc2
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.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Thu, 10 Jun 2021 11:58:23 +0200 |
parent | 444:12c1be0044c6 |
child | 452:628896d39d8e |
rev | line source |
---|---|
26 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 |