Annotate

plugins/proxy65.lua @ 255:be126fe7c4e7

Merge with MattJ & mva
author Kim Alvefur <zash@zash.se>
date Sat, 03 Dec 2011 19:46:47 +0100
parent 103:6cc0ca4aa664
child 380:0891b4e27766
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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