Mon, 05 Dec 2011 15:44:17 +0000
doc/example*.lua: Update to use new .init() method
56
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
1 | local events = require "util.events"; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 | local uuid = require "util.uuid"; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 | local sha1 = require "util.sha1"; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
4 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
5 | local proxy65_mt = {}; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
6 | proxy65_mt.__index = proxy65_mt; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 | local xmlns_bytestreams = "http://jabber.org/protocol/bytestreams"; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 | local negotiate_socks5; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 | function verse.plugins.proxy65(stream) |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 | stream.proxy65 = setmetatable({ stream = stream }, proxy65_mt); |
103
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
14 | stream.proxy65.available_streamhosts = {}; |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
15 | local outstanding_proxies = 0; |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
16 | stream:hook("disco/service-discovered/proxy", function (service) |
56
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 | -- Fill list with available proxies |
103
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
18 | if service.type == "bytestreams" then |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
19 | outstanding_proxies = outstanding_proxies + 1; |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
20 | stream:send_iq(verse.iq({ to = service.jid, type = "get" }) |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
21 | :tag("query", { xmlns = xmlns_bytestreams }), function (result) |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
22 | |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
23 | outstanding_proxies = outstanding_proxies - 1; |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
24 | if result.attr.type == "result" then |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
25 | local streamhost = result:get_child("query", xmlns_bytestreams) |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
26 | :get_child("streamhost").attr; |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
27 | |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
28 | stream.proxy65.available_streamhosts[streamhost.jid] = { |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
29 | jid = streamhost.jid; |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
30 | host = streamhost.host; |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
31 | port = tonumber(streamhost.port); |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
32 | }; |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
33 | end |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
34 | if outstanding_proxies == 0 then |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
35 | stream:event("proxy65/discovered-proxies", stream.proxy65.available_streamhosts); |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
36 | end |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
37 | end); |
6cc0ca4aa664
verse.plugins.proxy65: Add proxies discovered by disco plugin to proxy65.available_streamhosts
Matthew Wild <mwild1@gmail.com>
parents:
56
diff
changeset
|
38 | end |
56
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 | end); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 | stream:hook("iq/"..xmlns_bytestreams, function (request) |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 | local conn = verse.new(nil, { |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 | initiator_jid = request.attr.from, |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 | streamhosts = {}, |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 | current_host = 0; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 | }); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 | -- Parse hosts from request |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 | for tag in request.tags[1]:childtags() do |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 | if tag.name == "streamhost" then |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 | table.insert(conn.streamhosts, tag.attr); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 | --Attempt to connect to the next host |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 | local function attempt_next_streamhost() |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 | -- First connect, or the last connect failed |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 | if conn.current_host < #conn.streamhosts then |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 | conn.current_host = conn.current_host + 1; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 | conn:connect( |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 | conn.streamhosts[conn.current_host].host, |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 | conn.streamhosts[conn.current_host].port |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 | ); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 | negotiate_socks5(stream, conn, request.tags[1].attr.sid, request.attr.from, stream.jid); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 | return true; -- Halt processing of disconnected event |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 | -- All streamhosts tried, none successful |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 | conn:unhook("disconnected", attempt_next_streamhost); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 | stream:send(verse.error_reply(request, "cancel", "item-not-found")); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 | -- Let disconnected event fall through to user handlers... |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 | function conn:accept() |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 | conn:hook("disconnected", attempt_next_streamhost, 100); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 | -- When this event fires, we're connected to a streamhost |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 | conn:hook("connected", function () |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 | conn:unhook("disconnected", attempt_next_streamhost); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 | -- Send XMPP success notification |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 | local reply = verse.reply(request) |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 | :tag("query", request.tags[1].attr) |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 | :tag("streamhost-used", { jid = conn.streamhosts[conn.current_host].jid }); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 | stream:send(reply); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 | end, 100); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 | attempt_next_streamhost(); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 | function conn:refuse() |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
86 | -- FIXME: XMPP refused reply |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 | stream:event("proxy65/request", conn); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 | end); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 | function proxy65_mt:new(target_jid, proxies) |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
93 | local conn = verse.new(nil, { |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 | target_jid = target_jid; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
95 | bytestream_sid = uuid.generate(); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 | }); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 | local request = verse.iq{type="set", to = target_jid} |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 | :tag("query", { xmlns = xmlns_bytestreams, mode = "tcp", sid = conn.bytestream_sid }); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 | for _, proxy in ipairs(proxies or self.proxies) do |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 | request:tag("streamhost", proxy):up(); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 | self.stream:send_iq(request, function (reply) |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 | if reply.attr.type == "error" then |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
107 | local type, condition, text = reply:get_error(); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 | conn:event("connection-failed", { conn = conn, type = type, condition = condition, text = text }); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 | else |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 | -- Target connected to streamhost, connect ourselves |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 | local streamhost_used = reply.tags[1]:get_child("streamhost-used"); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 | if not streamhost_used then |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
113 | --FIXME: Emit error |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 | conn.streamhost_jid = streamhost_used.attr.jid; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 | local host, port; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 | for _, proxy in ipairs(proxies or self.proxies) do |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 | if proxy.jid == conn.streamhost_jid then |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
119 | host, port = proxy.host, proxy.port; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 | break; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 | if not (host and port) then |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
124 | --FIXME: Emit error |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
125 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 | conn:connect(host, port); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
128 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
129 | local function handle_proxy_connected() |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
130 | conn:unhook("connected", handle_proxy_connected); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
131 | -- Both of us connected, tell proxy to activate connection |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
132 | local request = verse.iq{to = conn.streamhost_jid, type="set"} |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
133 | :tag("query", { xmlns = xmlns_bytestreams, sid = conn.bytestream_sid }) |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
134 | :tag("activate"):text(target_jid); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 | self.stream:send_iq(request, function (reply) |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
136 | if reply.attr.type == "result" then |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
137 | -- Connection activated, ready to use |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
138 | conn:event("connected", conn); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
139 | else |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
140 | --FIXME: Emit error |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
141 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
142 | end); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
143 | return true; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
144 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
145 | conn:hook("connected", handle_proxy_connected, 100); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
146 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
147 | negotiate_socks5(self.stream, conn, conn.bytestream_sid, self.stream.jid, target_jid); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
148 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
149 | end); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
150 | return conn; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
151 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
152 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
153 | function negotiate_socks5(stream, conn, sid, requester_jid, target_jid) |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
154 | local hash = sha1.sha1(sid..requester_jid..target_jid); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
155 | local function suppress_connected() |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
156 | conn:unhook("connected", suppress_connected); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
157 | return true; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
158 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
159 | local function receive_connection_response(data) |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
160 | conn:unhook("incoming-raw", receive_connection_response); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
161 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
162 | if data:sub(1, 2) ~= "\005\000" then |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
163 | return conn:event("error", "connection-failure"); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
164 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
165 | conn:event("connected"); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
166 | return true; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
167 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
168 | local function receive_auth_response(data) |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
169 | conn:unhook("incoming-raw", receive_auth_response); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
170 | if data ~= "\005\000" then -- SOCKSv5; "NO AUTHENTICATION" |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
171 | -- Server is not SOCKSv5, or does not allow no auth |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
172 | local err = "version-mismatch"; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
173 | if data:sub(1,1) == "\005" then |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
174 | err = "authentication-failure"; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
175 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
176 | return conn:event("error", err); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
177 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
178 | -- Request SOCKS5 connection |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
179 | conn:send(string.char(0x05, 0x01, 0x00, 0x03, #hash)..hash.."\0\0"); --FIXME: Move to "connected"? |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
180 | conn:hook("incoming-raw", receive_connection_response, 100); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
181 | return true; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
182 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
183 | conn:hook("connected", suppress_connected, 200); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
184 | conn:hook("incoming-raw", receive_auth_response, 100); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
185 | conn:send("\005\001\000"); -- SOCKSv5; 1 mechanism; "NO AUTHENTICATION" |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
186 | end |