Software / code / verse
Annotate
plugins/jingle_s5b.lua @ 498:50d0bd035bb7
util.sasl.oauthbearer: Don't send authzid
It's not needed and not recommended in XMPP unless we want to act as
someone other than who we authenticate as. We find out the JID during
resource binding.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Fri, 23 Jun 2023 12:09:49 +0200 |
| parent | 490:6b2f31da9610 |
| rev | line source |
|---|---|
|
288
22544dcf0579
plugins.jingle_s5b: Add local verse
Kim Alvefur <zash@zash.se>
parents:
140
diff
changeset
|
1 local verse = require "verse"; |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
2 |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
3 local xmlns_s5b = "urn:xmpp:jingle:transports:s5b:1"; |
|
289
8bbe0d6dfd11
plugins.jingle_s5b: Add missing xmlns
Kim Alvefur <zash@zash.se>
parents:
288
diff
changeset
|
4 local xmlns_bytestreams = "http://jabber.org/protocol/bytestreams"; |
|
490
6b2f31da9610
Update for new Prosody module namespace
Kim Alvefur <zash@zash.se>
parents:
457
diff
changeset
|
5 local sha1 = require "prosody.util.hashes".sha1; |
|
6b2f31da9610
Update for new Prosody module namespace
Kim Alvefur <zash@zash.se>
parents:
457
diff
changeset
|
6 local new_id = require "prosody.util.id".short; |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
7 |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
8 local function negotiate_socks5(conn, hash) |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
9 local function suppress_connected() |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
10 conn:unhook("connected", suppress_connected); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
11 return true; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
12 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
13 local function receive_connection_response(data) |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
14 conn:unhook("incoming-raw", receive_connection_response); |
| 380 | 15 |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
16 if data:sub(1, 2) ~= "\005\000" then |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
17 return conn:event("error", "connection-failure"); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
18 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
19 conn:event("connected"); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
20 return true; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
21 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
22 local function receive_auth_response(data) |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
23 conn:unhook("incoming-raw", receive_auth_response); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
24 if data ~= "\005\000" then -- SOCKSv5; "NO AUTHENTICATION" |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
25 -- Server is not SOCKSv5, or does not allow no auth |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
26 local err = "version-mismatch"; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
27 if data:sub(1,1) == "\005" then |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
28 err = "authentication-failure"; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
29 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
30 return conn:event("error", err); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
31 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
32 -- Request SOCKS5 connection |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
33 conn:send(string.char(0x05, 0x01, 0x00, 0x03, #hash)..hash.."\0\0"); --FIXME: Move to "connected"? |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
34 conn:hook("incoming-raw", receive_connection_response, 100); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
35 return true; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
36 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
37 conn:hook("connected", suppress_connected, 200); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
38 conn:hook("incoming-raw", receive_auth_response, 100); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
39 conn:send("\005\001\000"); -- SOCKSv5; 1 mechanism; "NO AUTHENTICATION" |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
40 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
41 |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
42 local function connect_to_usable_streamhost(callback, streamhosts, auth_token) |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
43 local conn = verse.new(nil, { |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
44 streamhosts = streamhosts, |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
45 current_host = 0; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
46 }); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
47 --Attempt to connect to the next host |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
48 local function attempt_next_streamhost(event) |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
49 if event then |
| 380 | 50 return callback(nil, event.reason); |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
51 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
52 -- First connect, or the last connect failed |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
53 if conn.current_host < #conn.streamhosts then |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
54 conn.current_host = conn.current_host + 1; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
55 conn:debug("Attempting to connect to "..conn.streamhosts[conn.current_host].host..":"..conn.streamhosts[conn.current_host].port.."..."); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
56 local ok, err = conn:connect( |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
57 conn.streamhosts[conn.current_host].host, |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
58 conn.streamhosts[conn.current_host].port |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
59 ); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
60 if not ok then |
| 380 | 61 conn:debug("Error connecting to proxy (%s:%s): %s", |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
62 conn.streamhosts[conn.current_host].host, |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
63 conn.streamhosts[conn.current_host].port, |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
64 err |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
65 ); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
66 else |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
67 conn:debug("Connecting..."); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
68 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
69 negotiate_socks5(conn, auth_token); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
70 return true; -- Halt processing of disconnected event |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
71 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
72 -- All streamhosts tried, none successful |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
73 conn:unhook("disconnected", attempt_next_streamhost); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
74 return callback(nil); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
75 -- Let disconnected event fall through to user handlers... |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
76 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
77 conn:hook("disconnected", attempt_next_streamhost, 100); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
78 -- When this event fires, we're connected to a streamhost |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
79 conn:hook("connected", function () |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
80 conn:unhook("disconnected", attempt_next_streamhost); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
81 callback(conn.streamhosts[conn.current_host], conn); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
82 end, 100); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
83 attempt_next_streamhost(); -- Set it in motion |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
84 return conn; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
85 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
86 |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
87 function verse.plugins.jingle_s5b(stream) |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
88 stream:hook("ready", function () |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
89 stream:add_disco_feature(xmlns_s5b); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
90 end, 10); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
91 |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
92 local s5b = {}; |
| 380 | 93 |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
94 function s5b:generate_initiate() |
|
457
73d4eb93657b
Update to use util.id for random ids instead of counters (thanks Zash)
Matthew Wild <mwild1@gmail.com>
parents:
392
diff
changeset
|
95 self.s5b_sid = new_id(); |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
96 local transport = verse.stanza("transport", { xmlns = xmlns_s5b, |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
97 mode = "tcp", sid = self.s5b_sid }); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
98 local p = 0; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
99 for jid, streamhost in pairs(stream.proxy65.available_streamhosts) do |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
100 p = p + 1; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
101 transport:tag("candidate", { jid = jid, host = streamhost.host, |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
102 port = streamhost.port, cid=jid, priority = p, type = "proxy" }):up(); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
103 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
104 stream:debug("Have %d proxies", p) |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
105 return transport; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
106 end |
| 380 | 107 |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
108 function s5b:generate_accept(initiate_transport) |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
109 local candidates = {}; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
110 self.s5b_peer_candidates = candidates; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
111 self.s5b_mode = initiate_transport.attr.mode or "tcp"; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
112 self.s5b_sid = initiate_transport.attr.sid or self.jingle.sid; |
| 380 | 113 |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
114 -- Import the list of candidates the initiator offered us |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
115 for candidate in initiate_transport:childtags() do |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
116 --if candidate.attr.jid == "asterix4@jabber.lagaule.org/Gajim" |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
117 --and candidate.attr.host == "82.246.25.239" then |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
118 candidates[candidate.attr.cid] = { |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
119 type = candidate.attr.type; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
120 jid = candidate.attr.jid; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
121 host = candidate.attr.host; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
122 port = tonumber(candidate.attr.port) or 0; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
123 priority = tonumber(candidate.attr.priority) or 0; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
124 cid = candidate.attr.cid; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
125 }; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
126 --end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
127 end |
| 380 | 128 |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
129 -- Import our own candidates |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
130 -- TODO ^ |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
131 local transport = verse.stanza("transport", { xmlns = xmlns_s5b }); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
132 return transport; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
133 end |
| 380 | 134 |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
135 function s5b:connect(callback) |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
136 stream:warn("Connecting!"); |
| 380 | 137 |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
138 local streamhost_array = {}; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
139 for cid, streamhost in pairs(self.s5b_peer_candidates or {}) do |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
140 streamhost_array[#streamhost_array+1] = streamhost; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
141 end |
| 380 | 142 |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
143 if #streamhost_array > 0 then |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
144 self.connecting_peer_candidates = true; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
145 local function onconnect(streamhost, conn) |
|
140
97bf22d6ff96
plugins.jingle, plugins.jingle_s5b: API changes to allow not sending <reason> inside <content> when transfer succeeds
Matthew Wild <mwild1@gmail.com>
parents:
101
diff
changeset
|
146 self.jingle:send_command("transport-info", verse.stanza("content", { creator = self.creator, name = self.name }) |
|
97bf22d6ff96
plugins.jingle, plugins.jingle_s5b: API changes to allow not sending <reason> inside <content> when transfer succeeds
Matthew Wild <mwild1@gmail.com>
parents:
101
diff
changeset
|
147 :tag("transport", { xmlns = xmlns_s5b, sid = self.s5b_sid }) |
|
97bf22d6ff96
plugins.jingle, plugins.jingle_s5b: API changes to allow not sending <reason> inside <content> when transfer succeeds
Matthew Wild <mwild1@gmail.com>
parents:
101
diff
changeset
|
148 :tag("candidate-used", { cid = streamhost.cid })); |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
149 self.onconnect_callback = callback; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
150 self.conn = conn; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
151 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
152 local auth_token = sha1(self.s5b_sid..self.peer..stream.jid, true); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
153 connect_to_usable_streamhost(onconnect, streamhost_array, auth_token); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
154 else |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
155 stream:warn("Actually, I'm going to wait for my peer to tell me its streamhost..."); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
156 self.onconnect_callback = callback; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
157 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
158 end |
| 380 | 159 |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
160 function s5b:info_received(jingle_tag) |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
161 stream:warn("Info received"); |
|
140
97bf22d6ff96
plugins.jingle, plugins.jingle_s5b: API changes to allow not sending <reason> inside <content> when transfer succeeds
Matthew Wild <mwild1@gmail.com>
parents:
101
diff
changeset
|
162 local content_tag = jingle_tag:child_with_name("content"); |
|
97bf22d6ff96
plugins.jingle, plugins.jingle_s5b: API changes to allow not sending <reason> inside <content> when transfer succeeds
Matthew Wild <mwild1@gmail.com>
parents:
101
diff
changeset
|
163 local transport_tag = content_tag:child_with_name("transport"); |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
164 if transport_tag:get_child("candidate-used") and not self.connecting_peer_candidates then |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
165 local candidate_used = transport_tag:child_with_name("candidate-used"); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
166 if candidate_used then |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
167 -- Connect straight away to candidate used, we weren't trying any anyway |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
168 local function onconnect(streamhost, conn) |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
169 if self.jingle.role == "initiator" then -- More correct would be - "is this a candidate we offered?" |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
170 -- Activate the stream |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
171 self.jingle.stream:send_iq(verse.iq({ to = streamhost.jid, type = "set" }) |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
172 :tag("query", { xmlns = xmlns_bytestreams, sid = self.s5b_sid }) |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
173 :tag("activate"):text(self.jingle.peer), function (result) |
| 380 | 174 |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
175 if result.attr.type == "result" then |
|
140
97bf22d6ff96
plugins.jingle, plugins.jingle_s5b: API changes to allow not sending <reason> inside <content> when transfer succeeds
Matthew Wild <mwild1@gmail.com>
parents:
101
diff
changeset
|
176 self.jingle:send_command("transport-info", verse.stanza("content", content_tag.attr) |
|
97bf22d6ff96
plugins.jingle, plugins.jingle_s5b: API changes to allow not sending <reason> inside <content> when transfer succeeds
Matthew Wild <mwild1@gmail.com>
parents:
101
diff
changeset
|
177 :tag("transport", { xmlns = xmlns_s5b, sid = self.s5b_sid }) |
|
97bf22d6ff96
plugins.jingle, plugins.jingle_s5b: API changes to allow not sending <reason> inside <content> when transfer succeeds
Matthew Wild <mwild1@gmail.com>
parents:
101
diff
changeset
|
178 :tag("activated", { cid = candidate_used.attr.cid })); |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
179 self.conn = conn; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
180 self.onconnect_callback(conn); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
181 else |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
182 self.jingle.stream:error("Failed to activate bytestream"); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
183 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
184 end); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
185 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
186 end |
| 380 | 187 |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
188 -- FIXME: Another assumption that cid==jid, and that it was our candidate |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
189 self.jingle.stream:debug("CID: %s", self.jingle.stream.proxy65.available_streamhosts[candidate_used.attr.cid]); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
190 local streamhost_array = { |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
191 self.jingle.stream.proxy65.available_streamhosts[candidate_used.attr.cid]; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
192 }; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
193 |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
194 local auth_token = sha1(self.s5b_sid..stream.jid..self.peer, true); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
195 connect_to_usable_streamhost(onconnect, streamhost_array, auth_token); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
196 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
197 elseif transport_tag:get_child("activated") then |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
198 self.onconnect_callback(self.conn); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
199 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
200 end |
| 380 | 201 |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
202 function s5b:disconnect() |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
203 if self.conn then |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
204 self.conn:close(); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
205 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
206 end |
| 380 | 207 |
|
101
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
208 function s5b:handle_accepted(jingle_tag) |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
209 end |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
210 |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
211 local s5b_mt = { __index = s5b }; |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
212 stream:hook("jingle/transport/"..xmlns_s5b, function (jingle) |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
213 return setmetatable({ |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
214 role = jingle.role, |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
215 peer = jingle.peer, |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
216 stream = jingle.stream, |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
217 jingle = jingle, |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
218 }, s5b_mt); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
219 end); |
|
9c5362d393f0
verse.plugins.jingle_s5b: Jingle SOCKS5 Bytestreams transport
Matthew Wild <mwild1@gmail.com>
parents:
diff
changeset
|
220 end |