Sat, 21 Aug 2010 14:37:10 +0100
verse.client: Update stream:close() to use base stream:close(), and not add an XMPP-specific :close() to the base stream
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); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 | stream:hook("disco-result", function (result) |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
15 | -- Fill list with available proxies |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 | end); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 | 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
|
18 | 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
|
19 | 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
|
20 | streamhosts = {}, |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 | current_host = 0; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 | }); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 | -- 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
|
25 | 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
|
26 | 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
|
27 | 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
|
28 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 | --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
|
32 | 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
|
33 | -- 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
|
34 | 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
|
35 | 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
|
36 | conn:connect( |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 | 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
|
38 | 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
|
39 | ); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 | 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
|
41 | 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
|
42 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 | -- 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
|
44 | 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
|
45 | 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
|
46 | -- 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
|
47 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 | function conn:accept() |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
50 | 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
|
51 | -- 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
|
52 | 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
|
53 | 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
|
54 | -- 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
|
55 | 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
|
56 | :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
|
57 | :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
|
58 | stream:send(reply); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 | end, 100); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 | attempt_next_streamhost(); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
61 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 | function conn:refuse() |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 | -- 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
|
64 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 | 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
|
66 | end); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 | 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
|
70 | 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
|
71 | 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
|
72 | 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
|
73 | }); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 | 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
|
76 | :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
|
77 | 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
|
78 | 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
|
79 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 | 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
|
83 | 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
|
84 | 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
|
85 | 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
|
86 | else |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 | -- 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
|
88 | 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
|
89 | 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
|
90 | --FIXME: Emit error |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 | 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
|
93 | local host, port; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 | 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
|
95 | 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
|
96 | 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
|
97 | break; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 | 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
|
101 | --FIXME: Emit error |
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 | 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
|
105 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 | 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
|
107 | 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
|
108 | -- 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
|
109 | 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
|
110 | :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
|
111 | :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
|
112 | 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
|
113 | 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
|
114 | -- 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
|
115 | 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
|
116 | else |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 | --FIXME: Emit error |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
119 | end); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 | return true; |
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 | 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
|
123 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
124 | 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
|
125 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 | end); |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 | return conn; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
128 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
129 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
130 | 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
|
131 | 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
|
132 | 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
|
133 | 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
|
134 | return true; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
136 | 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
|
137 | 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
|
138 | |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
139 | 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
|
140 | 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
|
141 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
142 | conn:event("connected"); |
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 | 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
|
146 | 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
|
147 | 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
|
148 | -- 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
|
149 | 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
|
150 | 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
|
151 | err = "authentication-failure"; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
152 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
153 | 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
|
154 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
155 | -- Request SOCKS5 connection |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
156 | 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
|
157 | 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
|
158 | return true; |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
159 | end |
014bdb4154e9
verse.plugins.proxy65: XEP-0065 plugin for file transfer through a proxy
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
160 | 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
|
161 | 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
|
162 | 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
|
163 | end |