annotate src/proxy.c @ 14163:c3167a1dd817

[gaim-migrate @ 16811] Split the DNS query stuff out into it's own file. Eventually we should move the dnssrv code into this same file. Maybe even share some code? Also the first steps toward cancelable DNS queries. committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Thu, 17 Aug 2006 07:44:52 +0000
parents 7a205b430d19
children 879bb47cff8e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1 /**
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
2 * @file proxy.c Proxy API
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
3 * @ingroup core
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
4 *
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
5 * gaim
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
6 *
8046
fa6395637e2c [gaim-migrate @ 8730]
Sean Egan <seanegan@gmail.com>
parents: 7982
diff changeset
7 * Gaim is the legal property of its developers, whose names are too numerous
fa6395637e2c [gaim-migrate @ 8730]
Sean Egan <seanegan@gmail.com>
parents: 7982
diff changeset
8 * to list here. Please refer to the COPYRIGHT file distributed with this
fa6395637e2c [gaim-migrate @ 8730]
Sean Egan <seanegan@gmail.com>
parents: 7982
diff changeset
9 * source distribution.
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
10 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
11 * This program is free software; you can redistribute it and/or modify
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
12 * it under the terms of the GNU General Public License as published by
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
13 * the Free Software Foundation; either version 2 of the License, or
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
14 * (at your option) any later version.
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
15 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
16 * This program is distributed in the hope that it will be useful,
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
19 * GNU General Public License for more details.
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
20 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
21 * You should have received a copy of the GNU General Public License
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
22 * along with this program; if not, write to the Free Software
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
24 *
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
25 */
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
26
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
27 /* this is a little piece of code to handle proxy connection */
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
28 /* it is intended to : 1st handle http proxy, using the CONNECT command
6856
a14200b24371 [gaim-migrate @ 7401]
Mark Doliner <mark@kingant.net>
parents: 6621
diff changeset
29 , 2nd provide an easy way to add socks support
a14200b24371 [gaim-migrate @ 7401]
Mark Doliner <mark@kingant.net>
parents: 6621
diff changeset
30 , 3rd draw women to it like flies to honey */
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
31
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
32 #include "internal.h"
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
33 #include "cipher.h"
14163
c3167a1dd817 [gaim-migrate @ 16811]
Mark Doliner <mark@kingant.net>
parents: 14108
diff changeset
34 #include "dnsquery.h"
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
35 #include "debug.h"
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
36 #include "notify.h"
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
37 #include "ntlm.h"
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
38 #include "prefs.h"
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
39 #include "proxy.h"
5872
059d95c67cda [gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents: 5681
diff changeset
40 #include "util.h"
3630
9682c0e022c6 [gaim-migrate @ 3753]
Rob Flynn <gaim@robflynn.com>
parents: 3376
diff changeset
41
14090
983fbec46eb0 [gaim-migrate @ 16713]
Mark Doliner <mark@kingant.net>
parents: 14089
diff changeset
42 struct _GaimProxyConnectInfo {
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
43 GaimProxyConnectFunction connect_cb;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
44 gpointer data;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
45 char *host;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
46 int port;
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
47 int fd;
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
48 guint inpa;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
49 GaimProxyInfo *gpi;
14163
c3167a1dd817 [gaim-migrate @ 16811]
Mark Doliner <mark@kingant.net>
parents: 14108
diff changeset
50 GaimDnsqueryData *query_data;
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
51
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
52 /**
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
53 * This contains alternating length/char* values. The char*
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
54 * values need to be freed when removed from the linked list.
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
55 */
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
56 GSList *hosts;
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
57
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
58 /*
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
59 * All of the following variables are used when establishing a
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
60 * connection through a proxy.
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
61 */
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
62 guchar *write_buffer;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
63 gsize write_buf_len;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
64 gsize written_len;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
65 GaimInputFunction read_cb;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
66 guchar *read_buffer;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
67 gsize read_buf_len;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
68 gsize read_len;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
69 };
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
70
12246
b7a51e68d0b8 [gaim-migrate @ 14548]
Mark Doliner <mark@kingant.net>
parents: 12156
diff changeset
71 static const char *socks5errors[] = {
7982
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
72 "succeeded\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
73 "general SOCKS server failure\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
74 "connection not allowed by ruleset\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
75 "Network unreachable\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
76 "Host unreachable\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
77 "Connection refused\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
78 "TTL expired\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
79 "Command not supported\n",
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
80 "Address type not supported\n"
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
81 };
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
82
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
83 static GaimProxyInfo *global_proxy_info = NULL;
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
84
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
85 /*
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
86 * TODO: Once all callers of gaim_proxy_connect() are keeping track
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
87 * of the return value from that function this linked list
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
88 * will no longer be needed.
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
89 */
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
90 static GSList *connect_infos = NULL;
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
91
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
92 static void try_connect(GaimProxyConnectInfo *connect_info);
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
93
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
94 /**************************************************************************
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
95 * Proxy structure API
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
96 **************************************************************************/
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
97 GaimProxyInfo *
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
98 gaim_proxy_info_new(void)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
99 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
100 return g_new0(GaimProxyInfo, 1);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
101 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
102
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
103 void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
104 gaim_proxy_info_destroy(GaimProxyInfo *info)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
105 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
106 g_return_if_fail(info != NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
107
13968
6fc412e59214 [gaim-migrate @ 16525]
Mark Doliner <mark@kingant.net>
parents: 13929
diff changeset
108 g_free(info->host);
6fc412e59214 [gaim-migrate @ 16525]
Mark Doliner <mark@kingant.net>
parents: 13929
diff changeset
109 g_free(info->username);
6fc412e59214 [gaim-migrate @ 16525]
Mark Doliner <mark@kingant.net>
parents: 13929
diff changeset
110 g_free(info->password);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
111
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
112 g_free(info);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
113 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
114
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
115 void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
116 gaim_proxy_info_set_type(GaimProxyInfo *info, GaimProxyType type)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
117 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
118 g_return_if_fail(info != NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
119
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
120 info->type = type;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
121 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
122
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
123 void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
124 gaim_proxy_info_set_host(GaimProxyInfo *info, const char *host)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
125 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
126 g_return_if_fail(info != NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
127
13968
6fc412e59214 [gaim-migrate @ 16525]
Mark Doliner <mark@kingant.net>
parents: 13929
diff changeset
128 g_free(info->host);
14035
8bda65b88e49 [gaim-migrate @ 16638]
Mark Doliner <mark@kingant.net>
parents: 13968
diff changeset
129 info->host = g_strdup(host);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
130 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
131
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
132 void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
133 gaim_proxy_info_set_port(GaimProxyInfo *info, int port)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
134 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
135 g_return_if_fail(info != NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
136
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
137 info->port = port;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
138 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
139
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
140 void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
141 gaim_proxy_info_set_username(GaimProxyInfo *info, const char *username)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
142 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
143 g_return_if_fail(info != NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
144
13968
6fc412e59214 [gaim-migrate @ 16525]
Mark Doliner <mark@kingant.net>
parents: 13929
diff changeset
145 g_free(info->username);
14035
8bda65b88e49 [gaim-migrate @ 16638]
Mark Doliner <mark@kingant.net>
parents: 13968
diff changeset
146 info->username = g_strdup(username);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
147 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
148
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
149 void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
150 gaim_proxy_info_set_password(GaimProxyInfo *info, const char *password)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
151 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
152 g_return_if_fail(info != NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
153
13968
6fc412e59214 [gaim-migrate @ 16525]
Mark Doliner <mark@kingant.net>
parents: 13929
diff changeset
154 g_free(info->password);
14035
8bda65b88e49 [gaim-migrate @ 16638]
Mark Doliner <mark@kingant.net>
parents: 13968
diff changeset
155 info->password = g_strdup(password);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
156 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
157
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
158 GaimProxyType
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
159 gaim_proxy_info_get_type(const GaimProxyInfo *info)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
160 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
161 g_return_val_if_fail(info != NULL, GAIM_PROXY_NONE);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
162
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
163 return info->type;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
164 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
165
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
166 const char *
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
167 gaim_proxy_info_get_host(const GaimProxyInfo *info)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
168 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
169 g_return_val_if_fail(info != NULL, NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
170
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
171 return info->host;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
172 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
173
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
174 int
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
175 gaim_proxy_info_get_port(const GaimProxyInfo *info)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
176 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
177 g_return_val_if_fail(info != NULL, 0);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
178
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
179 return info->port;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
180 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
181
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
182 const char *
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
183 gaim_proxy_info_get_username(const GaimProxyInfo *info)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
184 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
185 g_return_val_if_fail(info != NULL, NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
186
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
187 return info->username;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
188 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
189
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
190 const char *
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
191 gaim_proxy_info_get_password(const GaimProxyInfo *info)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
192 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
193 g_return_val_if_fail(info != NULL, NULL);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
194
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
195 return info->password;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
196 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
197
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
198 /**************************************************************************
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
199 * Global Proxy API
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
200 **************************************************************************/
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
201 GaimProxyInfo *
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
202 gaim_global_proxy_get_info(void)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
203 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
204 return global_proxy_info;
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
205 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
206
12412
a88ca6da0b38 [gaim-migrate @ 14719]
Richard Laager <rlaager@wiktel.com>
parents: 12391
diff changeset
207 static GaimProxyInfo *
11878
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
208 gaim_gnome_proxy_get_info(void)
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
209 {
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
210 static GaimProxyInfo info = {0, NULL, 0, NULL, NULL};
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
211 gchar *path;
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
212 if ((path = g_find_program_in_path("gconftool-2"))) {
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
213 gchar *tmp;
12156
c5f12ada46d1 [gaim-migrate @ 14457]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11878
diff changeset
214
c5f12ada46d1 [gaim-migrate @ 14457]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11878
diff changeset
215 g_free(path);
c5f12ada46d1 [gaim-migrate @ 14457]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11878
diff changeset
216
11878
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
217 /* See whether to use a proxy. */
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
218 if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/use_http_proxy", &tmp,
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
219 NULL, NULL, NULL))
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
220 return gaim_global_proxy_get_info();
12811
ac41924f8bb0 [gaim-migrate @ 15159]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12765
diff changeset
221 if (!strcmp(tmp, "false\n")) {
11878
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
222 info.type = GAIM_PROXY_NONE;
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
223 g_free(tmp);
12811
ac41924f8bb0 [gaim-migrate @ 15159]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12765
diff changeset
224 return &info;
ac41924f8bb0 [gaim-migrate @ 15159]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12765
diff changeset
225 } else if (strcmp(tmp, "true\n")) {
ac41924f8bb0 [gaim-migrate @ 15159]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 12765
diff changeset
226 g_free(tmp);
11878
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
227 return gaim_global_proxy_get_info();
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
228 }
12156
c5f12ada46d1 [gaim-migrate @ 14457]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11878
diff changeset
229
11878
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
230 g_free(tmp);
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
231 info.type = GAIM_PROXY_HTTP;
12156
c5f12ada46d1 [gaim-migrate @ 14457]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11878
diff changeset
232
11878
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
233 /* Free the old fields */
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
234 if (info.host) {
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
235 g_free(info.host);
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
236 info.host = NULL;
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
237 }
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
238 if (info.username) {
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
239 g_free(info.username);
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
240 info.username = NULL;
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
241 }
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
242 if (info.password) {
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
243 g_free(info.password);
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
244 info.password = NULL;
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
245 }
12156
c5f12ada46d1 [gaim-migrate @ 14457]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11878
diff changeset
246
11878
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
247 /* Get the new ones */
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
248 if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/host", &info.host,
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
249 NULL, NULL, NULL))
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
250 return gaim_global_proxy_get_info();
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
251 g_strchomp(info.host);
12156
c5f12ada46d1 [gaim-migrate @ 14457]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11878
diff changeset
252
11878
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
253 if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/authentication_user", &info.username,
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
254 NULL, NULL, NULL))
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
255 return gaim_global_proxy_get_info();
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
256 g_strchomp(info.username);
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
257
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
258 if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/authentication_password", &info.password,
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
259 NULL, NULL, NULL))
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
260 return gaim_global_proxy_get_info();
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
261 g_strchomp(info.password);
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
262
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
263 if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/port", &tmp,
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
264 NULL, NULL, NULL))
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
265 return gaim_global_proxy_get_info();
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
266 info.port = atoi(tmp);
12156
c5f12ada46d1 [gaim-migrate @ 14457]
Stu Tomlinson <stu@nosnilmot.com>
parents: 11878
diff changeset
267 g_free(tmp);
11878
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
268
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
269 return &info;
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
270 }
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
271 return gaim_global_proxy_get_info();
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
272 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
273 /**************************************************************************
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
274 * Proxy API
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
275 **************************************************************************/
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
276
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
277 /*
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
278 * This is used when the connection attempt to one particular IP
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
279 * address fails. We close the socket, remove the watcher and get
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
280 * rid of input and output buffers. Normally try_connect() will
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
281 * be called immediately after this.
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
282 */
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
283 static void
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
284 gaim_proxy_connect_info_disconnect(GaimProxyConnectInfo *connect_info)
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
285 {
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
286 if (connect_info->inpa > 0)
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
287 {
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
288 gaim_input_remove(connect_info->inpa);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
289 connect_info->inpa = 0;
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
290 }
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
291
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
292 if (connect_info->fd >= 0)
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
293 {
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
294 close(connect_info->fd);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
295 connect_info->fd = -1;
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
296 }
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
297
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
298 g_free(connect_info->write_buffer);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
299 connect_info->write_buffer = NULL;
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
300
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
301 g_free(connect_info->read_buffer);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
302 connect_info->read_buffer = NULL;
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
303 }
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
304
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
305 static void
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
306 gaim_proxy_connect_info_destroy(GaimProxyConnectInfo *connect_info)
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
307 {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
308 gaim_proxy_connect_info_disconnect(connect_info);
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
309
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
310 connect_infos = g_slist_remove(connect_infos, connect_info);
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
311
14163
c3167a1dd817 [gaim-migrate @ 16811]
Mark Doliner <mark@kingant.net>
parents: 14108
diff changeset
312 /*
c3167a1dd817 [gaim-migrate @ 16811]
Mark Doliner <mark@kingant.net>
parents: 14108
diff changeset
313 if (connect_info->query_data != NULL)
c3167a1dd817 [gaim-migrate @ 16811]
Mark Doliner <mark@kingant.net>
parents: 14108
diff changeset
314 gaim_dnsquery_destroy(connect_info->query_data);
c3167a1dd817 [gaim-migrate @ 16811]
Mark Doliner <mark@kingant.net>
parents: 14108
diff changeset
315 */
c3167a1dd817 [gaim-migrate @ 16811]
Mark Doliner <mark@kingant.net>
parents: 14108
diff changeset
316
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
317 while (connect_info->hosts != NULL)
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
318 {
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
319 /* Discard the length... */
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
320 connect_info->hosts = g_slist_remove(connect_info->hosts, connect_info->hosts->data);
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
321 /* Free the address... */
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
322 g_free(connect_info->hosts->data);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
323 connect_info->hosts = g_slist_remove(connect_info->hosts, connect_info->hosts->data);
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
324 }
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
325
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
326 g_free(connect_info->host);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
327 g_free(connect_info);
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
328 }
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
329
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
330 static void
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
331 gaim_proxy_connect_info_connected(GaimProxyConnectInfo *connect_info)
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
332 {
14108
7a205b430d19 [gaim-migrate @ 16742]
Mark Doliner <mark@kingant.net>
parents: 14103
diff changeset
333 connect_info->connect_cb(connect_info->data, connect_info->fd, NULL);
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
334
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
335 /*
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
336 * We've passed the file descriptor to the protocol, so it's no longer
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
337 * our responsibility, and we should be careful not to free it when
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
338 * we destroy the connect_info.
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
339 */
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
340 connect_info->fd = -1;
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
341
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
342 gaim_proxy_connect_info_destroy(connect_info);
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
343 }
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
344
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
345 /**
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
346 * @param error An error message explaining why the connection
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
347 * failed. This will be passed to the callback function
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
348 * specified in the call to gaim_proxy_connect().
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
349 */
14099
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
350 /*
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
351 * TODO: Make sure all callers of this function pass a really really
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
352 * good error_message.
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
353 */
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
354 static void
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
355 gaim_proxy_connect_info_error(GaimProxyConnectInfo *connect_info, const gchar *error_message)
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
356 {
14108
7a205b430d19 [gaim-migrate @ 16742]
Mark Doliner <mark@kingant.net>
parents: 14103
diff changeset
357 connect_info->connect_cb(connect_info->data, -1, error_message);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
358 gaim_proxy_connect_info_destroy(connect_info);
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
359 }
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
360
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
361 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
362 no_one_calls(gpointer data, gint source, GaimInputCondition cond)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
363 {
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
364 GaimProxyConnectInfo *connect_info = data;
12991
c1b2ba353e85 [gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents: 12977
diff changeset
365 socklen_t len;
8273
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
366 int error=0, ret;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
367
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
368 gaim_debug_info("proxy", "Connected.\n");
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
369
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
370 len = sizeof(error);
4648
4bb99cdfd837 [gaim-migrate @ 4959]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 4634
diff changeset
371
8273
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
372 /*
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
373 * getsockopt after a non-blocking connect returns -1 if something is
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
374 * really messed up (bad descriptor, usually). Otherwise, it returns 0 and
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
375 * error holds what connect would have returned if it blocked until now.
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
376 * Thus, error == 0 is success, error == EINPROGRESS means "try again",
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
377 * and anything else is a real error.
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
378 *
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
379 * (error == EINPROGRESS can happen after a select because the kernel can
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
380 * be overly optimistic sometimes. select is just a hint that you might be
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
381 * able to do something.)
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
382 */
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
383 ret = getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len);
8273
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
384 if (ret == 0 && error == EINPROGRESS)
9863
0e3a84f18467 [gaim-migrate @ 10742]
Mark Doliner <mark@kingant.net>
parents: 9792
diff changeset
385 return; /* we'll be called again later */
8273
f24172f53650 [gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents: 8269
diff changeset
386 if (ret < 0 || error != 0) {
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
387 if (ret!=0)
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
388 error = errno;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
389
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
390 gaim_debug_error("proxy",
9100
4b3e5a5063f9 [gaim-migrate @ 9877]
Ethan Blanton <elb@pidgin.im>
parents: 8977
diff changeset
391 "getsockopt SO_ERROR check: %s\n", strerror(error));
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
392
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
393 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
394 try_connect(connect_info);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
395 return;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
396 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
397
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
398 gaim_input_remove(connect_info->inpa);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
399 connect_info->inpa = 0;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
400
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
401 gaim_proxy_connect_info_connected(connect_info);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
402 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
403
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
404 static gboolean
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
405 clean_connect(gpointer data)
1868
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
406 {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
407 GaimProxyConnectInfo *connect_info;
1868
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
408
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
409 connect_info = data;
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
410 gaim_proxy_connect_info_connected(connect_info);
1868
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
411
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
412 return FALSE;
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
413 }
a49ed23b3c02 [gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1844
diff changeset
414
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
415 static int
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
416 proxy_connect_none(GaimProxyConnectInfo *connect_info, struct sockaddr *addr, socklen_t addrlen)
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
417 {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
418 gaim_debug_info("proxy", "Connecting to %s:%d with no proxy\n",
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
419 connect_info->host, connect_info->port);
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
420
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
421 connect_info->fd = socket(addr->sa_family, SOCK_STREAM, 0);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
422 if (connect_info->fd < 0)
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
423 {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
424 gaim_debug_error("proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
425 "Unable to create socket: %s\n", strerror(errno));
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
426 return -1;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
427 }
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
428 fcntl(connect_info->fd, F_SETFL, O_NONBLOCK);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
429 #ifndef _WIN32
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
430 fcntl(connect_info->fd, F_SETFD, FD_CLOEXEC);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
431 #endif
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
432
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
433 if (connect(connect_info->fd, (struct sockaddr *)addr, addrlen) != 0)
14099
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
434 {
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
435 if ((errno == EINPROGRESS) || (errno == EINTR)) {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
436 gaim_debug_info("proxy", "Connection in progress\n");
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
437 connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, no_one_calls, connect_info);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
438 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
439 else {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
440 gaim_debug_error("proxy",
9100
4b3e5a5063f9 [gaim-migrate @ 9877]
Ethan Blanton <elb@pidgin.im>
parents: 8977
diff changeset
441 "Connect failed: %s\n", strerror(errno));
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
442 close(connect_info->fd);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
443 connect_info->fd = -1;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
444 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
445 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
446 }
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
447 else
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
448 {
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
449 /*
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
450 * The connection happened IMMEDIATELY... strange, but whatever.
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
451 */
12991
c1b2ba353e85 [gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents: 12977
diff changeset
452 socklen_t len;
2048
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
453 int error = ETIMEDOUT;
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
454 gaim_debug_info("proxy", "Connected immediately.\n");
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
455 len = sizeof(error);
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
456 if (getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len) != 0)
14099
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
457 {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
458 gaim_debug_error("proxy", "getsockopt failed.\n");
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
459 close(connect_info->fd);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
460 connect_info->fd = -1;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
461 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
462 }
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
463
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
464 /*
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
465 * We want to call the "connected" callback eventually, but we
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
466 * don't want to call it before we return, just in case.
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
467 */
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
468 gaim_timeout_add(10, clean_connect, connect_info);
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
469 }
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
470
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
471 return connect_info->fd;
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
472 }
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
473
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
474 static void
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
475 proxy_do_write(gpointer data, gint source, GaimInputCondition cond)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
476 {
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
477 GaimProxyConnectInfo *connect_info = data;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
478 const guchar *request = connect_info->write_buffer + connect_info->written_len;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
479 gsize request_len = connect_info->write_buf_len - connect_info->written_len;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
480
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
481 int ret = write(connect_info->fd, request, request_len);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
482
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
483 if(ret < 0 && errno == EAGAIN)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
484 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
485 else if(ret < 0) {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
486 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
487 try_connect(connect_info);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
488 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
489 } else if (ret < request_len) {
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
490 connect_info->written_len += ret;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
491 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
492 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
493
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
494 gaim_input_remove(connect_info->inpa);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
495 g_free(connect_info->write_buffer);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
496 connect_info->write_buffer = NULL;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
497
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
498 /* register the response handler for the response */
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
499 connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_READ, connect_info->read_cb, connect_info);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
500 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
501
3376
8d0fa912ecaf [gaim-migrate @ 3395]
Sean Egan <seanegan@gmail.com>
parents: 3283
diff changeset
502 #define HTTP_GOODSTRING "HTTP/1.0 200"
8d0fa912ecaf [gaim-migrate @ 3395]
Sean Egan <seanegan@gmail.com>
parents: 3283
diff changeset
503 #define HTTP_GOODSTRING2 "HTTP/1.1 200"
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
504
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
505 /* read the response to the CONNECT request, if we are requesting a non-port-80 tunnel */
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
506 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
507 http_canread(gpointer data, gint source, GaimInputCondition cond)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
508 {
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
509 int len, headers_len, status = 0;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
510 gboolean error;
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
511 GaimProxyConnectInfo *connect_info = data;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
512 guchar *p;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
513 gsize max_read;
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
514 gchar *msg;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
515
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
516 if(connect_info->read_buffer == NULL) {
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
517 connect_info->read_buf_len = 8192;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
518 connect_info->read_buffer = g_malloc(connect_info->read_buf_len);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
519 connect_info->read_len = 0;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
520 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
521
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
522 p = connect_info->read_buffer + connect_info->read_len;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
523 max_read = connect_info->read_buf_len - connect_info->read_len - 1;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
524
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
525 len = read(connect_info->fd, p, max_read);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
526 if(len < 0 && errno == EAGAIN)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
527 return;
13786
5ddde4ad1ca2 [gaim-migrate @ 16198]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13752
diff changeset
528 else if(len <= 0) {
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
529 gaim_proxy_connect_info_error(connect_info, _("Lost connection with server for an unknown reason."));
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
530 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
531 } else {
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
532 connect_info->read_len += len;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
533 }
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
534 p[len] = '\0';
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
535
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
536 if((p = (guchar *)g_strstr_len((const gchar *)connect_info->read_buffer, connect_info->read_len, "\r\n\r\n"))) {
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
537 *p = '\0';
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
538 headers_len = (p - connect_info->read_buffer) + 4;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
539 } else if(len == max_read)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
540 headers_len = len;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
541 else
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
542 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
543
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
544 error = strncmp((const char *)connect_info->read_buffer, "HTTP/", 5) != 0;
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
545 if (!error)
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
546 {
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
547 int major;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
548 p = connect_info->read_buffer + 5;
13386
54f679516b52 [gaim-migrate @ 15759]
Mark Doliner <mark@kingant.net>
parents: 13312
diff changeset
549 major = strtol((const char *)p, (char **)&p, 10);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
550 error = (major == 0) || (*p != '.');
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
551 if(!error) {
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
552 int minor;
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
553 p++;
13386
54f679516b52 [gaim-migrate @ 15759]
Mark Doliner <mark@kingant.net>
parents: 13312
diff changeset
554 minor = strtol((const char *)p, (char **)&p, 10);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
555 error = (*p != ' ');
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
556 if(!error) {
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
557 p++;
13386
54f679516b52 [gaim-migrate @ 15759]
Mark Doliner <mark@kingant.net>
parents: 13312
diff changeset
558 status = strtol((const char *)p, (char **)&p, 10);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
559 error = (*p != ' ');
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
560 }
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
561 }
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
562 }
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
563
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
564 /* Read the contents */
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
565 p = (guchar *)g_strrstr((const gchar *)connect_info->read_buffer, "Content-Length: ");
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
566 if (p != NULL)
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
567 {
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
568 gchar *tmp;
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
569 int len = 0;
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
570 char tmpc;
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
571 p += strlen("Content-Length: ");
13386
54f679516b52 [gaim-migrate @ 15759]
Mark Doliner <mark@kingant.net>
parents: 13312
diff changeset
572 tmp = strchr((const char *)p, '\r');
13404
c74401cfef23 [gaim-migrate @ 15779]
Thomas Butter <tbutter>
parents: 13386
diff changeset
573 if(tmp)
c74401cfef23 [gaim-migrate @ 15779]
Thomas Butter <tbutter>
parents: 13386
diff changeset
574 *tmp = '\0';
13386
54f679516b52 [gaim-migrate @ 15759]
Mark Doliner <mark@kingant.net>
parents: 13312
diff changeset
575 len = atoi((const char *)p);
13404
c74401cfef23 [gaim-migrate @ 15779]
Thomas Butter <tbutter>
parents: 13386
diff changeset
576 if(tmp)
c74401cfef23 [gaim-migrate @ 15779]
Thomas Butter <tbutter>
parents: 13386
diff changeset
577 *tmp = '\r';
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
578
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
579 /* Compensate for what has already been read */
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
580 len -= connect_info->read_len - headers_len;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
581 /* I'm assuming that we're doing this to prevent the server from
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
582 complaining / breaking since we don't read the whole page */
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
583 while(len--) {
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
584 /* TODO: deal with EAGAIN (and other errors) better */
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
585 if (read(connect_info->fd, &tmpc, 1) < 0 && errno != EAGAIN)
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
586 break;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
587 }
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
588 }
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
589
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
590 if (error)
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
591 {
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
592 msg = g_strdup_printf("Unable to parse response from HTTP proxy: %s\n",
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
593 connect_info->read_buffer);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
594 gaim_proxy_connect_info_error(connect_info, msg);
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
595 g_free(msg);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
596 return;
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
597 }
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
598 else if (status != 200)
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
599 {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
600 gaim_debug_error("proxy",
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
601 "Proxy server replied with:\n%s\n",
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
602 connect_info->read_buffer);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
603
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
604
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
605 if(status == 407 /* Proxy Auth */) {
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
606 gchar *ntlm;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
607 if((ntlm = g_strrstr((const gchar *)connect_info->read_buffer, "Proxy-Authenticate: NTLM "))) { /* Check for Type-2 */
13698
6bee2e80e42c [gaim-migrate @ 16101]
Mark Doliner <mark@kingant.net>
parents: 13648
diff changeset
608 gchar *tmp = ntlm;
6bee2e80e42c [gaim-migrate @ 16101]
Mark Doliner <mark@kingant.net>
parents: 13648
diff changeset
609 guint8 *nonce;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
610 gchar *domain = (gchar*)gaim_proxy_info_get_username(connect_info->gpi);
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
611 gchar *username;
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
612 gchar *request;
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
613 gchar *response;
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
614 username = strchr(domain, '\\');
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
615 if (username == NULL)
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
616 {
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
617 msg = g_strdup_printf(_("HTTP proxy connection error %d"), status);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
618 gaim_proxy_connect_info_error(connect_info, msg);
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
619 g_free(msg);
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
620 return;
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
621 }
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
622 *username = '\0';
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
623 username++;
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
624 ntlm += strlen("Proxy-Authenticate: NTLM ");
13698
6bee2e80e42c [gaim-migrate @ 16101]
Mark Doliner <mark@kingant.net>
parents: 13648
diff changeset
625 while(*tmp != '\r' && *tmp != '\0') tmp++;
6bee2e80e42c [gaim-migrate @ 16101]
Mark Doliner <mark@kingant.net>
parents: 13648
diff changeset
626 *tmp = '\0';
13084
31a3a9af1494 [gaim-migrate @ 15446]
Thomas Butter <tbutter>
parents: 13023
diff changeset
627 nonce = gaim_ntlm_parse_type2(ntlm, NULL);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
628 response = gaim_ntlm_gen_type3(username,
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
629 (gchar*) gaim_proxy_info_get_password(connect_info->gpi),
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
630 (gchar*) gaim_proxy_info_get_host(connect_info->gpi),
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
631 domain, nonce, NULL);
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
632 username--;
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
633 *username = '\\';
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
634 request = g_strdup_printf(
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
635 "CONNECT %s:%d HTTP/1.1\r\n"
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
636 "Host: %s:%d\r\n"
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
637 "Proxy-Authorization: NTLM %s\r\n"
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
638 "Proxy-Connection: Keep-Alive\r\n\r\n",
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
639 connect_info->host, connect_info->port, connect_info->host,
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
640 connect_info->port, response);
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
641 g_free(response);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
642
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
643 gaim_input_remove(connect_info->inpa);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
644 g_free(connect_info->read_buffer);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
645 connect_info->read_buffer = NULL;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
646
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
647 connect_info->write_buffer = (guchar *)request;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
648 connect_info->write_buf_len = strlen(request);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
649 connect_info->written_len = 0;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
650
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
651 connect_info->read_cb = http_canread;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
652
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
653 connect_info->inpa = gaim_input_add(connect_info->fd,
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
654 GAIM_INPUT_WRITE, proxy_do_write, connect_info);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
655
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
656 proxy_do_write(connect_info, connect_info->fd, cond);
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
657 return;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
658 } else if((ntlm = g_strrstr((const char *)connect_info->read_buffer, "Proxy-Authenticate: NTLM"))) { /* Empty message */
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
659 gchar request[2048];
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
660 gchar *domain = (gchar*) gaim_proxy_info_get_username(connect_info->gpi);
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
661 gchar *username;
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
662 int request_len;
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
663 username = strchr(domain, '\\');
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
664 if (username == NULL)
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
665 {
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
666 msg = g_strdup_printf(_("HTTP proxy connection error %d"), status);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
667 gaim_proxy_connect_info_error(connect_info, msg);
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
668 g_free(msg);
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
669 return;
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
670 }
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
671 *username = '\0';
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
672
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
673 request_len = g_snprintf(request, sizeof(request),
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
674 "CONNECT %s:%d HTTP/1.1\r\n"
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
675 "Host: %s:%d\r\n",
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
676 connect_info->host, connect_info->port,
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
677 connect_info->host, connect_info->port);
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
678
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
679 g_return_if_fail(request_len < sizeof(request));
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
680 request_len += g_snprintf(request + request_len,
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
681 sizeof(request) - request_len,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
682 "Proxy-Authorization: NTLM %s\r\n"
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
683 "Proxy-Connection: Keep-Alive\r\n\r\n",
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
684 gaim_ntlm_gen_type1(
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
685 (gchar*) gaim_proxy_info_get_host(connect_info->gpi),
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
686 domain));
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
687 *username = '\\';
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
688
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
689 gaim_input_remove(connect_info->inpa);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
690 g_free(connect_info->read_buffer);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
691 connect_info->read_buffer = NULL;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
692
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
693 connect_info->write_buffer = g_memdup(request, request_len);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
694 connect_info->write_buf_len = request_len;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
695 connect_info->written_len = 0;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
696
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
697 connect_info->read_cb = http_canread;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
698
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
699 connect_info->inpa = gaim_input_add(connect_info->fd,
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
700 GAIM_INPUT_WRITE, proxy_do_write, connect_info);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
701
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
702 proxy_do_write(connect_info, connect_info->fd, cond);
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
703 return;
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
704 } else {
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
705 msg = g_strdup_printf(_("HTTP proxy connection error %d"), status);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
706 gaim_proxy_connect_info_error(connect_info, msg);
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
707 g_free(msg);
13208
de4f1fb08088 [gaim-migrate @ 15572]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13200
diff changeset
708 return;
12391
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
709 }
804e335b7b62 [gaim-migrate @ 14698]
Ethan Blanton <elb@pidgin.im>
parents: 12273
diff changeset
710 }
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
711 if(status == 403 /* Forbidden */ ) {
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
712 msg = g_strdup_printf(_("Access denied: HTTP proxy server forbids port %d tunnelling."), connect_info->port);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
713 gaim_proxy_connect_info_error(connect_info, msg);
8917
189ee7356c59 [gaim-migrate @ 9687]
Mark Doliner <mark@kingant.net>
parents: 8889
diff changeset
714 g_free(msg);
189ee7356c59 [gaim-migrate @ 9687]
Mark Doliner <mark@kingant.net>
parents: 8889
diff changeset
715 } else {
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
716 msg = g_strdup_printf(_("HTTP proxy connection error %d"), status);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
717 gaim_proxy_connect_info_error(connect_info, msg);
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
718 g_free(msg);
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
719 }
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
720 } else {
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
721 gaim_input_remove(connect_info->inpa);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
722 connect_info->inpa = 0;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
723 g_free(connect_info->read_buffer);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
724 connect_info->read_buffer = NULL;
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
725 gaim_debug_info("proxy", "HTTP proxy connection established\n");
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
726 gaim_proxy_connect_info_connected(connect_info);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
727 return;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
728 }
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
729 }
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
730
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
731
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
732
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
733 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
734 http_canwrite(gpointer data, gint source, GaimInputCondition cond)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
735 {
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
736 char request[8192];
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
737 int request_len = 0;
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
738 GaimProxyConnectInfo *connect_info = data;
12991
c1b2ba353e85 [gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents: 12977
diff changeset
739 socklen_t len;
2048
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
740 int error = ETIMEDOUT;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
741
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
742 gaim_debug_info("http proxy", "Connected.\n");
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
743
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
744 if (connect_info->inpa > 0)
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
745 {
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
746 gaim_input_remove(connect_info->inpa);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
747 connect_info->inpa = 0;
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
748 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
749
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
750 len = sizeof(error);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
751
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
752 if (getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
753 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
754 try_connect(connect_info);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
755 return;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
756 }
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
757
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
758 gaim_debug_info("proxy", "using CONNECT tunnelling for %s:%d\n",
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
759 connect_info->host, connect_info->port);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
760 request_len = g_snprintf(request, sizeof(request),
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
761 "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n",
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
762 connect_info->host, connect_info->port, connect_info->host, connect_info->port);
1843
4dbd8533d209 [gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1840
diff changeset
763
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
764 if (gaim_proxy_info_get_username(connect_info->gpi) != NULL) {
1843
4dbd8533d209 [gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1840
diff changeset
765 char *t1, *t2;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
766 t1 = g_strdup_printf("%s:%s",
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
767 gaim_proxy_info_get_username(connect_info->gpi),
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
768 gaim_proxy_info_get_password(connect_info->gpi) ?
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
769 gaim_proxy_info_get_password(connect_info->gpi) : "");
11143
5c56223fa24f [gaim-migrate @ 13207]
Mark Doliner <mark@kingant.net>
parents: 11033
diff changeset
770 t2 = gaim_base64_encode((const guchar *)t1, strlen(t1));
1843
4dbd8533d209 [gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1840
diff changeset
771 g_free(t1);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
772 g_return_if_fail(request_len < sizeof(request));
13386
54f679516b52 [gaim-migrate @ 15759]
Mark Doliner <mark@kingant.net>
parents: 13312
diff changeset
773
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
774 request_len += g_snprintf(request + request_len,
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
775 sizeof(request) - request_len,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
776 "Proxy-Authorization: Basic %s\r\n"
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
777 "Proxy-Authorization: NTLM %s\r\n"
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
778 "Proxy-Connection: Keep-Alive\r\n", t2,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
779 gaim_ntlm_gen_type1(
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
780 (gchar*)gaim_proxy_info_get_host(connect_info->gpi),""));
1843
4dbd8533d209 [gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1840
diff changeset
781 g_free(t2);
4dbd8533d209 [gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1840
diff changeset
782 }
4dbd8533d209 [gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1840
diff changeset
783
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
784 g_return_if_fail(request_len < sizeof(request));
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
785 strcpy(request + request_len, "\r\n");
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
786 request_len += 2;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
787 connect_info->write_buffer = g_memdup(request, request_len);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
788 connect_info->write_buf_len = request_len;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
789 connect_info->written_len = 0;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
790
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
791 connect_info->read_cb = http_canread;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
792
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
793 connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, proxy_do_write,
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
794 connect_info);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
795
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
796 proxy_do_write(connect_info, connect_info->fd, cond);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
797 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
798
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
799 static int
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
800 proxy_connect_http(GaimProxyConnectInfo *connect_info, struct sockaddr *addr, socklen_t addrlen)
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
801 {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
802 gaim_debug_info("http proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
803 "Connecting to %s:%d via %s:%d using HTTP\n",
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
804 (connect_info->host ? connect_info->host : "(null)"), connect_info->port,
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
805 (gaim_proxy_info_get_host(connect_info->gpi) ? gaim_proxy_info_get_host(connect_info->gpi) : "(null)"),
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
806 gaim_proxy_info_get_port(connect_info->gpi));
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
807
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
808 connect_info->fd = socket(addr->sa_family, SOCK_STREAM, 0);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
809 if (connect_info->fd < 0)
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
810 return -1;
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
811
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
812 fcntl(connect_info->fd, F_SETFL, O_NONBLOCK);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
813 #ifndef _WIN32
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
814 fcntl(connect_info->fd, F_SETFD, FD_CLOEXEC);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
815 #endif
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
816
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
817 if (connect(connect_info->fd, addr, addrlen) != 0)
14099
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
818 {
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
819 if ((errno == EINPROGRESS) || (errno == EINTR)) {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
820 gaim_debug_info("http proxy", "Connection in progress\n");
9655
00f96f4cc775 [gaim-migrate @ 10503]
Luke Schierer <lschiere@pidgin.im>
parents: 9653
diff changeset
821
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
822 if (connect_info->port != 80) {
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
823 /* we need to do CONNECT first */
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
824 connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE,
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
825 http_canwrite, connect_info);
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
826 } else {
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
827 gaim_debug_info("proxy", "HTTP proxy connection established\n");
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
828 gaim_proxy_connect_info_connected(connect_info);
7834
99ffabc6ce73 [gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents: 7652
diff changeset
829 }
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
830 } else {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
831 close(connect_info->fd);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
832 connect_info->fd = -1;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
833 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
834 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
835 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
836 else {
12991
c1b2ba353e85 [gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents: 12977
diff changeset
837 socklen_t len;
2048
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
838 int error = ETIMEDOUT;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
839
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
840 gaim_debug_info("http proxy", "Connected immediately.\n");
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
841
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
842 len = sizeof(error);
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
843 if (getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len) != 0)
14099
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
844 {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
845 close(connect_info->fd);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
846 connect_info->fd = -1;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
847 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
848 }
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
849 http_canwrite(connect_info, connect_info->fd, GAIM_INPUT_WRITE);
1695
c0ab844d4790 [gaim-migrate @ 1705]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1451
diff changeset
850 }
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
851
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
852 return connect_info->fd;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
853 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
854
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
855
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
856 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
857 s4_canread(gpointer data, gint source, GaimInputCondition cond)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
858 {
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
859 GaimProxyConnectInfo *connect_info = data;
13386
54f679516b52 [gaim-migrate @ 15759]
Mark Doliner <mark@kingant.net>
parents: 13312
diff changeset
860 guchar *buf;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
861 int len, max_read;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
862
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
863 /* This is really not going to block under normal circumstances, but to
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
864 * be correct, we deal with the unlikely scenario */
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
865
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
866 if (connect_info->read_buffer == NULL) {
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
867 connect_info->read_buf_len = 12;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
868 connect_info->read_buffer = g_malloc(connect_info->read_buf_len);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
869 connect_info->read_len = 0;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
870 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
871
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
872 buf = connect_info->read_buffer + connect_info->read_len;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
873 max_read = connect_info->read_buf_len - connect_info->read_len;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
874
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
875 len = read(connect_info->fd, buf, max_read);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
876
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
877 if ((len < 0 && errno == EAGAIN) || (len > 0 && len + connect_info->read_len < 4))
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
878 return;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
879 else if (len + connect_info->read_len >= 4) {
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
880 if (connect_info->read_buffer[1] == 90) {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
881 gaim_proxy_connect_info_connected(connect_info);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
882 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
883 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
884 }
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
885
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
886 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
887 try_connect(connect_info);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
888 }
1705
b4d454e5ee31 [gaim-migrate @ 1715]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1695
diff changeset
889
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
890 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
891 s4_canwrite(gpointer data, gint source, GaimInputCondition cond)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
892 {
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
893 unsigned char packet[9];
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
894 struct hostent *hp;
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
895 GaimProxyConnectInfo *connect_info = data;
12991
c1b2ba353e85 [gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents: 12977
diff changeset
896 socklen_t len;
2048
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
897 int error = ETIMEDOUT;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
898
11033
50224ac8184d [gaim-migrate @ 12919]
Etan Reisner <pidgin@unreliablesource.net>
parents: 10917
diff changeset
899 gaim_debug_info("socks4 proxy", "Connected.\n");
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
900
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
901 if (connect_info->inpa > 0)
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
902 {
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
903 gaim_input_remove(connect_info->inpa);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
904 connect_info->inpa = 0;
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
905 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
906
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
907 len = sizeof(error);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
908
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
909 if (getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
910 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
911 try_connect(connect_info);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
912 return;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
913 }
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
914
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
915 /*
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
916 * The socks4 spec doesn't include support for doing host name
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
917 * lookups by the proxy. Some socks4 servers do this via
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
918 * extensions to the protocol. Since we don't know if a
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
919 * server supports this, it would need to be implemented
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
920 * with an option, or some detection mechanism - in the
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
921 * meantime, stick with plain old SOCKS4.
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
922 */
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
923 /* TODO: This needs to be non-blocking! */
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
924 hp = gethostbyname(connect_info->host);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
925 if (hp == NULL) {
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
926 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
927 try_connect(connect_info);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
928 return;
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
929 }
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
930
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
931 packet[0] = 4;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
932 packet[1] = 1;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
933 packet[2] = connect_info->port >> 8;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
934 packet[3] = connect_info->port & 0xff;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
935 packet[4] = (unsigned char)(hp->h_addr_list[0])[0];
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
936 packet[5] = (unsigned char)(hp->h_addr_list[0])[1];
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
937 packet[6] = (unsigned char)(hp->h_addr_list[0])[2];
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
938 packet[7] = (unsigned char)(hp->h_addr_list[0])[3];
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
939 packet[8] = 0;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
940
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
941 connect_info->write_buffer = g_memdup(packet, sizeof(packet));
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
942 connect_info->write_buf_len = sizeof(packet);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
943 connect_info->written_len = 0;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
944 connect_info->read_cb = s4_canread;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
945
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
946 connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, proxy_do_write, connect_info);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
947
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
948 proxy_do_write(connect_info, connect_info->fd, cond);
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
949 }
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
950
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
951 static int
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
952 proxy_connect_socks4(GaimProxyConnectInfo *connect_info, struct sockaddr *addr, socklen_t addrlen)
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
953 {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
954 gaim_debug_info("socks4 proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
955 "Connecting to %s:%d via %s:%d using SOCKS4\n",
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
956 connect_info->host, connect_info->port,
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
957 gaim_proxy_info_get_host(connect_info->gpi),
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
958 gaim_proxy_info_get_port(connect_info->gpi));
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
959
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
960 connect_info->fd = socket(addr->sa_family, SOCK_STREAM, 0);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
961 if (connect_info->fd < 0)
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
962 return -1;
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
963
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
964 fcntl(connect_info->fd, F_SETFL, O_NONBLOCK);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
965 #ifndef _WIN32
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
966 fcntl(connect_info->fd, F_SETFD, FD_CLOEXEC);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
967 #endif
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
968
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
969 if (connect(connect_info->fd, addr, addrlen) != 0)
14099
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
970 {
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
971 if ((errno == EINPROGRESS) || (errno == EINTR)) {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
972 gaim_debug_info("socks4 proxy", "Connection in progress.\n");
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
973 connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, s4_canwrite, connect_info);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
974 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
975 else {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
976 close(connect_info->fd);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
977 connect_info->fd = -1;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
978 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
979 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
980 } else {
12991
c1b2ba353e85 [gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents: 12977
diff changeset
981 socklen_t len;
2048
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
982 int error = ETIMEDOUT;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
983
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
984 gaim_debug_info("socks4 proxy", "Connected immediately.\n");
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
985
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
986 len = sizeof(error);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
987
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
988 if (getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len) != 0)
14099
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
989 {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
990 close(connect_info->fd);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
991 connect_info->fd = -1;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
992 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
993 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
994
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
995 s4_canwrite(connect_info, connect_info->fd, GAIM_INPUT_WRITE);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
996 }
670
9e51c1a4abba [gaim-migrate @ 680]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 664
diff changeset
997
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
998 return connect_info->fd;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
999 }
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1000
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1001 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1002 s5_canread_again(gpointer data, gint source, GaimInputCondition cond)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1003 {
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1004 guchar *dest, *buf;
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1005 GaimProxyConnectInfo *connect_info = data;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1006 int len;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1007
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1008 if (connect_info->read_buffer == NULL) {
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1009 connect_info->read_buf_len = 512;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1010 connect_info->read_buffer = g_malloc(connect_info->read_buf_len);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1011 connect_info->read_len = 0;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1012 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1013
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1014 dest = connect_info->read_buffer + connect_info->read_len;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1015 buf = connect_info->read_buffer;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1016
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1017 gaim_debug_info("socks5 proxy", "Able to read again.\n");
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1018
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1019 len = read(connect_info->fd, dest, (connect_info->read_buf_len - connect_info->read_len));
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1020 if(len < 0 && errno == EAGAIN)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1021 return;
13786
5ddde4ad1ca2 [gaim-migrate @ 16198]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13752
diff changeset
1022 else if(len <= 0) {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1023 gaim_debug_warning("socks5 proxy", "or not...\n");
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1024 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1025 try_connect(connect_info);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1026 return;
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1027 }
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1028 connect_info->read_len += len;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1029
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1030 if(connect_info->read_len < 4)
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1031 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1032
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1033 if ((buf[0] != 0x05) || (buf[1] != 0x00)) {
7982
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
1034 if ((buf[0] == 0x05) && (buf[1] < 0x09))
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1035 gaim_debug_error("socks5 proxy", socks5errors[buf[1]]);
7982
58af482c89f7 [gaim-migrate @ 8659]
Luke Schierer <lschiere@pidgin.im>
parents: 7834
diff changeset
1036 else
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1037 gaim_debug_error("socks5 proxy", "Bad data.\n");
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1038 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1039 try_connect(connect_info);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1040 return;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1041 }
670
9e51c1a4abba [gaim-migrate @ 680]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 664
diff changeset
1042
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1043 /* Skip past BND.ADDR */
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1044 switch(buf[3]) {
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1045 case 0x01: /* the address is a version-4 IP address, with a length of 4 octets */
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1046 if(connect_info->read_len < 4 + 4)
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1047 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1048 buf += 4 + 4;
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1049 break;
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1050 case 0x03: /* the address field contains a fully-qualified domain name. The first
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1051 octet of the address field contains the number of octets of name that
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1052 follow, there is no terminating NUL octet. */
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1053 if(connect_info->read_len < 4 + 1)
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1054 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1055 buf += 4 + 1;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1056 if(connect_info->read_len < 4 + 1 + buf[0])
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1057 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1058 buf += buf[0];
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1059 break;
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1060 case 0x04: /* the address is a version-6 IP address, with a length of 16 octets */
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1061 if(connect_info->read_len < 4 + 16)
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1062 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1063 buf += 4 + 16;
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1064 break;
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1065 }
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1066
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1067 if(connect_info->read_len < (buf - connect_info->read_buffer) + 2)
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1068 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1069
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1070 /* Skip past BND.PORT */
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1071 buf += 2;
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1072
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1073 gaim_proxy_connect_info_connected(connect_info);
1
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1074 }
2846a03bda67 [gaim-migrate @ 10]
Rob Flynn <gaim@robflynn.com>
parents:
diff changeset
1075
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1076 static void
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1077 s5_sendconnect(gpointer data, int source)
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1078 {
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1079 GaimProxyConnectInfo *connect_info = data;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1080 int hlen = strlen(connect_info->host);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1081 connect_info->write_buf_len = 5 + hlen + 2;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1082 connect_info->write_buffer = g_malloc(connect_info->write_buf_len);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1083 connect_info->written_len = 0;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1084
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1085 connect_info->write_buffer[0] = 0x05;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1086 connect_info->write_buffer[1] = 0x01; /* CONNECT */
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1087 connect_info->write_buffer[2] = 0x00; /* reserved */
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1088 connect_info->write_buffer[3] = 0x03; /* address type -- host name */
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1089 connect_info->write_buffer[4] = hlen;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1090 memcpy(connect_info->write_buffer + 5, connect_info->host, hlen);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1091 connect_info->write_buffer[5 + hlen] = connect_info->port >> 8;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1092 connect_info->write_buffer[5 + hlen + 1] = connect_info->port & 0xff;
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1093
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1094 connect_info->read_cb = s5_canread_again;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1095
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1096 connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, proxy_do_write, connect_info);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1097 proxy_do_write(connect_info, connect_info->fd, GAIM_INPUT_WRITE);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1098 }
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1099
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1100 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1101 s5_readauth(gpointer data, gint source, GaimInputCondition cond)
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1102 {
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1103 GaimProxyConnectInfo *connect_info = data;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1104 int len;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1105
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1106 if (connect_info->read_buffer == NULL) {
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1107 connect_info->read_buf_len = 2;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1108 connect_info->read_buffer = g_malloc(connect_info->read_buf_len);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1109 connect_info->read_len = 0;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1110 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1111
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1112 gaim_debug_info("socks5 proxy", "Got auth response.\n");
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1113
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1114 len = read(connect_info->fd, connect_info->read_buffer + connect_info->read_len,
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1115 connect_info->read_buf_len - connect_info->read_len);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1116 if(len < 0 && errno == EAGAIN)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1117 return;
13786
5ddde4ad1ca2 [gaim-migrate @ 16198]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13752
diff changeset
1118 else if(len <= 0) {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1119 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1120 try_connect(connect_info);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1121 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1122 }
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1123 connect_info->read_len += len;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1124
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1125 if (connect_info->read_len < 2)
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1126 return;
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1127
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1128 gaim_input_remove(connect_info->inpa);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1129 connect_info->inpa = 0;
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1130
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1131 if ((connect_info->read_buffer[0] != 0x01) || (connect_info->read_buffer[1] != 0x00)) {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1132 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1133 try_connect(connect_info);
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1134 return;
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1135 }
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1136
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1137 g_free(connect_info->read_buffer);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1138 connect_info->read_buffer = NULL;
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1139
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1140 s5_sendconnect(connect_info, connect_info->fd);
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1141 }
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1142
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1143 static void
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1144 hmacmd5_chap(const unsigned char * challenge, int challen, const char * passwd, unsigned char * response)
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1145 {
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1146 GaimCipher *cipher;
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1147 GaimCipherContext *ctx;
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1148 int i;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1149 unsigned char Kxoripad[65];
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1150 unsigned char Kxoropad[65];
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1151 int pwlen;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1152
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1153 cipher = gaim_ciphers_find_cipher("md5");
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1154 ctx = gaim_cipher_context_new(cipher, NULL);
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1155
12765
29594d4ccbb1 [gaim-migrate @ 15112]
Mark Doliner <mark@kingant.net>
parents: 12758
diff changeset
1156 memset(Kxoripad,0,sizeof(Kxoripad));
29594d4ccbb1 [gaim-migrate @ 15112]
Mark Doliner <mark@kingant.net>
parents: 12758
diff changeset
1157 memset(Kxoropad,0,sizeof(Kxoropad));
29594d4ccbb1 [gaim-migrate @ 15112]
Mark Doliner <mark@kingant.net>
parents: 12758
diff changeset
1158
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1159 pwlen=strlen(passwd);
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1160 if (pwlen>64) {
11183
8dca96cbcd64 [gaim-migrate @ 13295]
Mark Doliner <mark@kingant.net>
parents: 11143
diff changeset
1161 gaim_cipher_context_append(ctx, (const guchar *)passwd, strlen(passwd));
12765
29594d4ccbb1 [gaim-migrate @ 15112]
Mark Doliner <mark@kingant.net>
parents: 12758
diff changeset
1162 gaim_cipher_context_digest(ctx, sizeof(Kxoripad), Kxoripad, NULL);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1163 pwlen=16;
12765
29594d4ccbb1 [gaim-migrate @ 15112]
Mark Doliner <mark@kingant.net>
parents: 12758
diff changeset
1164 } else {
29594d4ccbb1 [gaim-migrate @ 15112]
Mark Doliner <mark@kingant.net>
parents: 12758
diff changeset
1165 memcpy(Kxoripad, passwd, pwlen);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1166 }
12765
29594d4ccbb1 [gaim-migrate @ 15112]
Mark Doliner <mark@kingant.net>
parents: 12758
diff changeset
1167 memcpy(Kxoropad,Kxoripad,pwlen);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1168
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1169 for (i=0;i<64;i++) {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1170 Kxoripad[i]^=0x36;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1171 Kxoropad[i]^=0x5c;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1172 }
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1173
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1174 gaim_cipher_context_reset(ctx, NULL);
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1175 gaim_cipher_context_append(ctx, Kxoripad, 64);
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1176 gaim_cipher_context_append(ctx, challenge, challen);
10687
b256ce6b85b8 [gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents: 10684
diff changeset
1177 gaim_cipher_context_digest(ctx, sizeof(Kxoripad), Kxoripad, NULL);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1178
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1179 gaim_cipher_context_reset(ctx, NULL);
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1180 gaim_cipher_context_append(ctx, Kxoropad, 64);
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1181 gaim_cipher_context_append(ctx, Kxoripad, 16);
12765
29594d4ccbb1 [gaim-migrate @ 15112]
Mark Doliner <mark@kingant.net>
parents: 12758
diff changeset
1182 gaim_cipher_context_digest(ctx, 16, response, NULL);
10684
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1183
72a5babfa8b4 [gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents: 10626
diff changeset
1184 gaim_cipher_context_destroy(ctx);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1185 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1186
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1187 static void
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1188 s5_readchap(gpointer data, gint source, GaimInputCondition cond)
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1189 {
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1190 guchar *cmdbuf, *buf;
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1191 GaimProxyConnectInfo *connect_info = data;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1192 int len, navas, currentav;
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1193
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1194 gaim_debug(GAIM_DEBUG_INFO, "socks5 proxy", "Got CHAP response.\n");
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1195
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1196 if (connect_info->read_buffer == NULL) {
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1197 connect_info->read_buf_len = 20;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1198 connect_info->read_buffer = g_malloc(connect_info->read_buf_len);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1199 connect_info->read_len = 0;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1200 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1201
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1202 len = read(connect_info->fd, connect_info->read_buffer + connect_info->read_len,
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1203 connect_info->read_buf_len - connect_info->read_len);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1204
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1205 if(len < 0 && errno == EAGAIN)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1206 return;
13786
5ddde4ad1ca2 [gaim-migrate @ 16198]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13752
diff changeset
1207 else if(len <= 0) {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1208 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1209 try_connect(connect_info);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1210 return;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1211 }
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1212 connect_info->read_len += len;
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1213
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1214 if (connect_info->read_len < 2)
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1215 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1216
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1217 cmdbuf = connect_info->read_buffer;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1218
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1219 if (*cmdbuf != 0x01) {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1220 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1221 try_connect(connect_info);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1222 return;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1223 }
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1224 cmdbuf++;
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1225
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1226 navas = *cmdbuf;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1227 cmdbuf++;
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1228
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1229 for (currentav = 0; currentav < navas; currentav++) {
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1230 if (connect_info->read_len - (cmdbuf - connect_info->read_buffer) < 2)
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1231 return;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1232 if (connect_info->read_len - (cmdbuf - connect_info->read_buffer) < cmdbuf[1])
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1233 return;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1234 buf = cmdbuf + 2;
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1235 switch (cmdbuf[0]) {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1236 case 0x00:
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1237 /* Did auth work? */
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1238 if (buf[0] == 0x00) {
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1239 gaim_input_remove(connect_info->inpa);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1240 connect_info->inpa = 0;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1241 g_free(connect_info->read_buffer);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1242 connect_info->read_buffer = NULL;
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1243 /* Success */
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1244 s5_sendconnect(connect_info, connect_info->fd);
10613
351449bb5a74 [gaim-migrate @ 12072]
Mark Doliner <mark@kingant.net>
parents: 10562
diff changeset
1245 return;
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1246 } else {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1247 /* Failure */
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1248 gaim_debug_warning("proxy",
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1249 "socks5 CHAP authentication "
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1250 "failed. Disconnecting...");
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1251 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1252 try_connect(connect_info);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1253 return;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1254 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1255 break;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1256 case 0x03:
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1257 /* Server wants our credentials */
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1258
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1259 connect_info->write_buf_len = 16 + 4;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1260 connect_info->write_buffer = g_malloc(connect_info->write_buf_len);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1261 connect_info->written_len = 0;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1262
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1263 hmacmd5_chap(buf, cmdbuf[1],
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1264 gaim_proxy_info_get_password(connect_info->gpi),
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1265 connect_info->write_buffer + 4);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1266 connect_info->write_buffer[0] = 0x01;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1267 connect_info->write_buffer[1] = 0x01;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1268 connect_info->write_buffer[2] = 0x04;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1269 connect_info->write_buffer[3] = 0x10;
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1270
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1271 gaim_input_remove(connect_info->inpa);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1272 g_free(connect_info->read_buffer);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1273 connect_info->read_buffer = NULL;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1274
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1275 connect_info->read_cb = s5_readchap;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1276
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1277 connect_info->inpa = gaim_input_add(connect_info->fd,
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1278 GAIM_INPUT_WRITE, proxy_do_write, connect_info);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1279
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1280 proxy_do_write(connect_info, connect_info->fd, GAIM_INPUT_WRITE);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1281 break;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1282 case 0x11:
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1283 /* Server wants to select an algorithm */
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1284 if (buf[0] != 0x85) {
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1285 /* Only currently support HMAC-MD5 */
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1286 gaim_debug_warning("proxy",
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1287 "Server tried to select an "
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1288 "algorithm that we did not advertise "
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1289 "as supporting. This is a violation "
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1290 "of the socks5 CHAP specification. "
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1291 "Disconnecting...");
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1292 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1293 try_connect(connect_info);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1294 return;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1295 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1296 break;
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1297 }
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1298 cmdbuf = buf + cmdbuf[1];
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1299 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1300 /* Fell through. We ran out of CHAP events to process, but haven't
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1301 * succeeded or failed authentication - there may be more to come.
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1302 * If this is the case, come straight back here. */
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1303 }
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1304
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1305 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1306 s5_canread(gpointer data, gint source, GaimInputCondition cond)
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1307 {
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1308 GaimProxyConnectInfo *connect_info = data;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1309 int len;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1310
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1311 if (connect_info->read_buffer == NULL) {
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1312 connect_info->read_buf_len = 2;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1313 connect_info->read_buffer = g_malloc(connect_info->read_buf_len);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1314 connect_info->read_len = 0;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1315 }
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1316
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1317 gaim_debug_info("socks5 proxy", "Able to read.\n");
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1318
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1319 len = read(connect_info->fd, connect_info->read_buffer + connect_info->read_len,
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1320 connect_info->read_buf_len - connect_info->read_len);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1321 if(len < 0 && errno == EAGAIN)
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1322 return;
13786
5ddde4ad1ca2 [gaim-migrate @ 16198]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13752
diff changeset
1323 else if(len <= 0) {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1324 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1325 try_connect(connect_info);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1326 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1327 }
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1328 connect_info->read_len += len;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1329
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1330 if (connect_info->read_len < 2)
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1331 return;
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1332
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1333 gaim_input_remove(connect_info->inpa);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1334 connect_info->inpa = 0;
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1335
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1336 if ((connect_info->read_buffer[0] != 0x05) || (connect_info->read_buffer[1] == 0xff)) {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1337 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1338 try_connect(connect_info);
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1339 return;
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1340 }
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1341
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1342 if (connect_info->read_buffer[1] == 0x02) {
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1343 gsize i, j;
10912
dcbc56eb3f37 [gaim-migrate @ 12667]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10711
diff changeset
1344 const char *u, *p;
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1345
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1346 u = gaim_proxy_info_get_username(connect_info->gpi);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1347 p = gaim_proxy_info_get_password(connect_info->gpi);
10912
dcbc56eb3f37 [gaim-migrate @ 12667]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10711
diff changeset
1348
dcbc56eb3f37 [gaim-migrate @ 12667]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10711
diff changeset
1349 i = (u == NULL) ? 0 : strlen(u);
dcbc56eb3f37 [gaim-migrate @ 12667]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10711
diff changeset
1350 j = (p == NULL) ? 0 : strlen(p);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1351
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1352 connect_info->write_buf_len = 1 + 1 + i + 1 + j;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1353 connect_info->write_buffer = g_malloc(connect_info->write_buf_len);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1354 connect_info->written_len = 0;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1355
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1356 connect_info->write_buffer[0] = 0x01; /* version 1 */
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1357 connect_info->write_buffer[1] = i;
10917
aca17634b9ab [gaim-migrate @ 12678]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10912
diff changeset
1358 if (u != NULL)
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1359 memcpy(connect_info->write_buffer + 2, u, i);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1360 connect_info->write_buffer[2 + i] = j;
10917
aca17634b9ab [gaim-migrate @ 12678]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10912
diff changeset
1361 if (p != NULL)
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1362 memcpy(connect_info->write_buffer + 2 + i + 1, p, j);
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1363
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1364 g_free(connect_info->read_buffer);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1365 connect_info->read_buffer = NULL;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1366
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1367 connect_info->read_cb = s5_readauth;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1368
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1369 connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE,
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1370 proxy_do_write, connect_info);
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1371
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1372 proxy_do_write(connect_info, connect_info->fd, GAIM_INPUT_WRITE);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1373
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1374 return;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1375 } else if (connect_info->read_buffer[1] == 0x03) {
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1376 gsize userlen;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1377 userlen = strlen(gaim_proxy_info_get_username(connect_info->gpi));
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1378
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1379 connect_info->write_buf_len = 7 + userlen;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1380 connect_info->write_buffer = g_malloc(connect_info->write_buf_len);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1381 connect_info->written_len = 0;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1382
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1383 connect_info->write_buffer[0] = 0x01;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1384 connect_info->write_buffer[1] = 0x02;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1385 connect_info->write_buffer[2] = 0x11;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1386 connect_info->write_buffer[3] = 0x01;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1387 connect_info->write_buffer[4] = 0x85;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1388 connect_info->write_buffer[5] = 0x02;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1389 connect_info->write_buffer[6] = userlen;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1390 memcpy(connect_info->write_buffer + 7,
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1391 gaim_proxy_info_get_username(connect_info->gpi), userlen);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1392
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1393 g_free(connect_info->read_buffer);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1394 connect_info->read_buffer = NULL;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1395
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1396 connect_info->read_cb = s5_readchap;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1397
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1398 connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE,
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1399 proxy_do_write, connect_info);
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1400
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1401 proxy_do_write(connect_info, connect_info->fd, GAIM_INPUT_WRITE);
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1402
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1403 return;
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1404 } else {
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1405 g_free(connect_info->read_buffer);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1406 connect_info->read_buffer = NULL;
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1407
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1408 s5_sendconnect(connect_info, connect_info->fd);
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1409 }
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1410 }
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1411
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1412 static void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1413 s5_canwrite(gpointer data, gint source, GaimInputCondition cond)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1414 {
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1415 unsigned char buf[5];
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1416 int i;
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1417 GaimProxyConnectInfo *connect_info = data;
12991
c1b2ba353e85 [gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents: 12977
diff changeset
1418 socklen_t len;
2048
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
1419 int error = ETIMEDOUT;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1420
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1421 gaim_debug_info("socks5 proxy", "Connected.\n");
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1422
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1423 if (connect_info->inpa > 0)
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1424 {
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1425 gaim_input_remove(connect_info->inpa);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1426 connect_info->inpa = 0;
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1427 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1428
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1429 len = sizeof(error);
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1430 if (getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1431 gaim_proxy_connect_info_disconnect(connect_info);
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1432 try_connect(connect_info);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1433 return;
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1434 }
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1435
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1436 i = 0;
1252
46c09828e929 [gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1087
diff changeset
1437 buf[0] = 0x05; /* SOCKS version 5 */
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1438
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1439 if (gaim_proxy_info_get_username(connect_info->gpi) != NULL) {
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1440 buf[1] = 0x03; /* three methods */
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1441 buf[2] = 0x00; /* no authentication */
10561
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1442 buf[3] = 0x03; /* CHAP authentication */
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1443 buf[4] = 0x02; /* username/password authentication */
1db4f49de0c6 [gaim-migrate @ 11939]
Mark Doliner <mark@kingant.net>
parents: 10534
diff changeset
1444 i = 5;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1445 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1446 else {
1844
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1447 buf[1] = 0x01;
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1448 buf[2] = 0x00;
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1449 i = 3;
9845deede1e9 [gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1843
diff changeset
1450 }
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1451
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1452 connect_info->write_buf_len = i;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1453 connect_info->write_buffer = g_malloc(connect_info->write_buf_len);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1454 memcpy(connect_info->write_buffer, buf, i);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1455
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1456 connect_info->read_cb = s5_canread;
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1457
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1458 connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, proxy_do_write, connect_info);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1459 proxy_do_write(connect_info, connect_info->fd, GAIM_INPUT_WRITE);
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1460 }
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1461
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1462 static int
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1463 proxy_connect_socks5(GaimProxyConnectInfo *connect_info, struct sockaddr *addr, socklen_t addrlen)
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1464 {
10309
19974fd2d61d [gaim-migrate @ 11501]
Mark Doliner <mark@kingant.net>
parents: 10307
diff changeset
1465 gaim_debug_info("socks5 proxy",
5211
0241d6b6702d [gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents: 4993
diff changeset
1466 "Connecting to %s:%d via %s:%d using SOCKS5\n",
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1467 connect_info->host, connect_info->port,
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1468 gaim_proxy_info_get_host(connect_info->gpi),
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1469 gaim_proxy_info_get_port(connect_info->gpi));
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1470
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1471 connect_info->fd = socket(addr->sa_family, SOCK_STREAM, 0);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1472 if (connect_info->fd < 0)
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1473 return -1;
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1474
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1475 fcntl(connect_info->fd, F_SETFL, O_NONBLOCK);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
1476 #ifndef _WIN32
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1477 fcntl(connect_info->fd, F_SETFD, FD_CLOEXEC);
10172
374d63326461 [gaim-migrate @ 11275]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10170
diff changeset
1478 #endif
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1479
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1480 if (connect(connect_info->fd, addr, addrlen) != 0)
14099
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1481 {
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1482 if ((errno == EINPROGRESS) || (errno == EINTR)) {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1483 gaim_debug_info("socks5 proxy", "Connection in progress\n");
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1484 connect_info->inpa = gaim_input_add(connect_info->fd, GAIM_INPUT_WRITE, s5_canwrite, connect_info);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1485 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1486 else {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1487 close(connect_info->fd);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1488 connect_info->fd = -1;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1489 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1490 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1491 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1492 else {
12991
c1b2ba353e85 [gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents: 12977
diff changeset
1493 socklen_t len;
2048
3366311426df [gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1881
diff changeset
1494 int error = ETIMEDOUT;
3717
988485669631 [gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 3630
diff changeset
1495
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1496 gaim_debug_info("socks5 proxy", "Connected immediately.\n");
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1497
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1498 len = sizeof(error);
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1499
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1500 if (getsockopt(connect_info->fd, SOL_SOCKET, SO_ERROR, &error, &len) != 0)
14099
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1501 {
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1502 close(connect_info->fd);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1503 connect_info->fd = -1;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1504 return -1;
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1505 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1506
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1507 s5_canwrite(connect_info, connect_info->fd, GAIM_INPUT_WRITE);
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1508 }
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1509
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1510 return connect_info->fd;
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1511 }
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1512
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1513 /**
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1514 * This function iterates through a list of IP addresses and attempts
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1515 * to connect to each one. This is called after the hostname is
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1516 * resolved, and if a connection attempt fails.
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1517 */
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1518 static void try_connect(GaimProxyConnectInfo *connect_info)
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1519 {
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1520 size_t addrlen;
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1521 struct sockaddr *addr;
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1522 int ret = -1;
4634
d19872836812 [gaim-migrate @ 4941]
Nathan Walp <nwalp@pidgin.im>
parents: 4499
diff changeset
1523
14099
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1524 if (connect_info->hosts == NULL)
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1525 {
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1526 gaim_proxy_connect_info_error(connect_info, _("Could not resolve host name"));
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1527 return;
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1528 }
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1529
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1530 while (connect_info->hosts)
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1531 {
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1532 addrlen = GPOINTER_TO_INT(connect_info->hosts->data);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1533 connect_info->hosts = g_slist_remove(connect_info->hosts, connect_info->hosts->data);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1534 addr = connect_info->hosts->data;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1535 connect_info->hosts = g_slist_remove(connect_info->hosts, connect_info->hosts->data);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1536
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1537 switch (gaim_proxy_info_get_type(connect_info->gpi)) {
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1538 case GAIM_PROXY_NONE:
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1539 ret = proxy_connect_none(connect_info, addr, addrlen);
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1540 break;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1541
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1542 case GAIM_PROXY_HTTP:
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1543 ret = proxy_connect_http(connect_info, addr, addrlen);
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1544 break;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1545
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1546 case GAIM_PROXY_SOCKS4:
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1547 ret = proxy_connect_socks4(connect_info, addr, addrlen);
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1548 break;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1549
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1550 case GAIM_PROXY_SOCKS5:
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1551 ret = proxy_connect_socks5(connect_info, addr, addrlen);
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1552 break;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1553
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1554 case GAIM_PROXY_USE_ENVVAR:
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1555 ret = proxy_connect_http(connect_info, addr, addrlen);
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1556 break;
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1557
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1558 default:
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1559 break;
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1560 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1561
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1562 g_free(addr);
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1563
14099
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1564 if (ret >= 0)
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1565 break;
4678
9ce3c698ff5e [gaim-migrate @ 4989]
Nathan Walp <nwalp@pidgin.im>
parents: 4648
diff changeset
1566 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1567
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1568 if (ret < 0) {
14099
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1569 gaim_proxy_connect_info_error(connect_info, _("Unable to establish a connection"));
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1570 }
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1571 }
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1572
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1573 static void
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1574 connection_host_resolved(GSList *hosts, gpointer data,
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1575 const char *error_message)
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1576 {
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1577 GaimProxyConnectInfo *connect_info;
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1578
14099
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1579 if (error_message != NULL)
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1580 {
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1581 gaim_debug_info("proxy", "Error while resolving hostname: %s\n", error_message);
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1582 /* TODO: Destroy connect_info and return? */
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1583 }
7b030f6ed1c3 [gaim-migrate @ 16728]
Mark Doliner <mark@kingant.net>
parents: 14097
diff changeset
1584
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1585 connect_info = data;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1586 connect_info->hosts = hosts;
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1587
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1588 try_connect(connect_info);
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1589 }
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1590
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1591 GaimProxyInfo *
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1592 gaim_proxy_get_setup(GaimAccount *account)
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1593 {
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1594 GaimProxyInfo *gpi;
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1595 const gchar *tmp;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1596
11878
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
1597 if (account && gaim_account_get_proxy_info(account) != NULL)
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1598 gpi = gaim_account_get_proxy_info(account);
11878
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
1599 else if (gaim_running_gnome())
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1600 gpi = gaim_gnome_proxy_get_info();
11878
f672349cfc1c [gaim-migrate @ 14169]
Sean Egan <seanegan@gmail.com>
parents: 11428
diff changeset
1601 else
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1602 gpi = gaim_global_proxy_get_info();
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1603
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1604 if (gaim_proxy_info_get_type(gpi) == GAIM_PROXY_USE_ENVVAR) {
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1605 if ((tmp = g_getenv("HTTP_PROXY")) != NULL ||
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1606 (tmp = g_getenv("http_proxy")) != NULL ||
10534
975c2e66cd53 [gaim-migrate @ 11866]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10320
diff changeset
1607 (tmp = g_getenv("HTTPPROXY")) != NULL) {
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1608 char *proxyhost,*proxypath,*proxyuser,*proxypasswd;
7652
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1609 int proxyport;
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1610
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1611 /* http_proxy-format:
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1612 * export http_proxy="http://user:passwd@your.proxy.server:port/"
7652
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1613 */
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1614 if(gaim_url_parse(tmp, &proxyhost, &proxyport, &proxypath, &proxyuser, &proxypasswd)) {
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1615 gaim_proxy_info_set_host(gpi, proxyhost);
7652
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1616 g_free(proxyhost);
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1617 g_free(proxypath);
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1618 if (proxyuser != NULL) {
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1619 gaim_proxy_info_set_username(gpi, proxyuser);
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1620 g_free(proxyuser);
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1621 }
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1622 if (proxypasswd != NULL) {
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1623 gaim_proxy_info_set_password(gpi, proxypasswd);
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1624 g_free(proxypasswd);
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1625 }
7652
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1626
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1627 /* only for backward compatibility */
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1628 if (proxyport == 80 &&
7652
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1629 ((tmp = g_getenv("HTTP_PROXY_PORT")) != NULL ||
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1630 (tmp = g_getenv("http_proxy_port")) != NULL ||
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1631 (tmp = g_getenv("HTTPPROXYPORT")) != NULL))
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1632 proxyport = atoi(tmp);
9129
3e94a77ee0c7 [gaim-migrate @ 9907]
Nathan Walp <nwalp@pidgin.im>
parents: 9100
diff changeset
1633
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1634 gaim_proxy_info_set_port(gpi, proxyport);
7652
ac6b2b3a9a1f [gaim-migrate @ 8296]
Luke Schierer <lschiere@pidgin.im>
parents: 7475
diff changeset
1635 }
10534
975c2e66cd53 [gaim-migrate @ 11866]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10320
diff changeset
1636 } else {
975c2e66cd53 [gaim-migrate @ 11866]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10320
diff changeset
1637 /* no proxy environment variable found, don't use a proxy */
975c2e66cd53 [gaim-migrate @ 11866]
Stu Tomlinson <stu@nosnilmot.com>
parents: 10320
diff changeset
1638 gaim_debug_info("proxy", "No environment settings found, not using a proxy\n");
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1639 gaim_proxy_info_set_type(gpi, GAIM_PROXY_NONE);
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1640 }
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1641
9227
9171e528d7e5 [gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents: 9148
diff changeset
1642 /* XXX: Do we want to skip this step if user/password were part of url? */
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1643 if ((tmp = g_getenv("HTTP_PROXY_USER")) != NULL ||
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1644 (tmp = g_getenv("http_proxy_user")) != NULL ||
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1645 (tmp = g_getenv("HTTPPROXYUSER")) != NULL)
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1646 gaim_proxy_info_set_username(gpi, tmp);
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1647
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1648 if ((tmp = g_getenv("HTTP_PROXY_PASS")) != NULL ||
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1649 (tmp = g_getenv("http_proxy_pass")) != NULL ||
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1650 (tmp = g_getenv("HTTPPROXYPASS")) != NULL)
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1651 gaim_proxy_info_set_password(gpi, tmp);
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1652 }
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1653
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1654 return gpi;
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1655 }
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1656
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1657 GaimProxyConnectInfo *
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1658 gaim_proxy_connect(GaimAccount *account, const char *host, int port,
14108
7a205b430d19 [gaim-migrate @ 16742]
Mark Doliner <mark@kingant.net>
parents: 14103
diff changeset
1659 GaimProxyConnectFunction connect_cb, gpointer data)
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1660 {
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1661 const char *connecthost = host;
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1662 int connectport = port;
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1663 GaimProxyConnectInfo *connect_info;
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1664
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1665 g_return_val_if_fail(host != NULL, NULL);
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1666 g_return_val_if_fail(port > 0, NULL);
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1667 g_return_val_if_fail(connect_cb != NULL, NULL);
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1668
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1669 connect_info = g_new0(GaimProxyConnectInfo, 1);
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1670 connect_info->fd = -1;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1671 connect_info->connect_cb = connect_cb;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1672 connect_info->data = data;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1673 connect_info->host = g_strdup(host);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1674 connect_info->port = port;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1675 connect_info->gpi = gaim_proxy_get_setup(account);
13514
6ad9d666e824 [gaim-migrate @ 15890]
Bartoz Oler <bartosz@pidgin.im>
parents: 13425
diff changeset
1676
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1677 if ((gaim_proxy_info_get_type(connect_info->gpi) != GAIM_PROXY_NONE) &&
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1678 (gaim_proxy_info_get_host(connect_info->gpi) == NULL ||
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1679 gaim_proxy_info_get_port(connect_info->gpi) <= 0)) {
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1680
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1681 gaim_notify_error(NULL, NULL, _("Invalid proxy settings"), _("Either the host name or port number specified for your given proxy type is invalid."));
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1682 gaim_proxy_connect_info_destroy(connect_info);
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1683 return NULL;
1840
00aef397a1fe [gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1705
diff changeset
1684 }
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1685
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1686 switch (gaim_proxy_info_get_type(connect_info->gpi))
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1687 {
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1688 case GAIM_PROXY_NONE:
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1689 break;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1690
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1691 case GAIM_PROXY_HTTP:
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1692 case GAIM_PROXY_SOCKS4:
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1693 case GAIM_PROXY_SOCKS5:
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1694 case GAIM_PROXY_USE_ENVVAR:
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1695 connecthost = gaim_proxy_info_get_host(connect_info->gpi);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1696 connectport = gaim_proxy_info_get_port(connect_info->gpi);
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1697 break;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1698
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1699 default:
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1700 gaim_proxy_connect_info_destroy(connect_info);
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1701 return NULL;
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1702 }
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1703
14163
c3167a1dd817 [gaim-migrate @ 16811]
Mark Doliner <mark@kingant.net>
parents: 14108
diff changeset
1704 connect_info->query_data = gaim_dnsquery_a(connecthost,
c3167a1dd817 [gaim-migrate @ 16811]
Mark Doliner <mark@kingant.net>
parents: 14108
diff changeset
1705 connectport, connection_host_resolved, connect_info);
c3167a1dd817 [gaim-migrate @ 16811]
Mark Doliner <mark@kingant.net>
parents: 14108
diff changeset
1706 if (connect_info->query_data == NULL)
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1707 {
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1708 gaim_proxy_connect_info_destroy(connect_info);
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1709 return NULL;
4366
7ba9b56a8796 [gaim-migrate @ 4632]
Sean Egan <seanegan@gmail.com>
parents: 3867
diff changeset
1710 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1711
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1712 connect_infos = g_slist_prepend(connect_infos, connect_info);
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1713
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1714 return connect_info;
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1715 }
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1716
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1717 /*
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1718 * Combine some of this code with gaim_proxy_connect()
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1719 */
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1720 GaimProxyConnectInfo *
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1721 gaim_proxy_connect_socks5(GaimProxyInfo *gpi, const char *host, int port,
14108
7a205b430d19 [gaim-migrate @ 16742]
Mark Doliner <mark@kingant.net>
parents: 14103
diff changeset
1722 GaimProxyConnectFunction connect_cb, gpointer data)
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1723 {
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1724 GaimProxyConnectInfo *connect_info;
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1725
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1726 g_return_val_if_fail(host != NULL, NULL);
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1727 g_return_val_if_fail(port > 0, NULL);
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1728 g_return_val_if_fail(connect_cb != NULL, NULL);
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1729
14097
7ded3834168f [gaim-migrate @ 16726]
Mark Doliner <mark@kingant.net>
parents: 14096
diff changeset
1730 connect_info = g_new0(GaimProxyConnectInfo, 1);
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1731 connect_info->fd = -1;
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1732 connect_info->connect_cb = connect_cb;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1733 connect_info->data = data;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1734 connect_info->host = g_strdup(host);
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1735 connect_info->port = port;
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1736 connect_info->gpi = gpi;
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1737
14163
c3167a1dd817 [gaim-migrate @ 16811]
Mark Doliner <mark@kingant.net>
parents: 14108
diff changeset
1738 connect_info->query_data = gaim_dnsquery_a(gaim_proxy_info_get_host(gpi),
c3167a1dd817 [gaim-migrate @ 16811]
Mark Doliner <mark@kingant.net>
parents: 14108
diff changeset
1739 gaim_proxy_info_get_port(gpi), connection_host_resolved, connect_info);
c3167a1dd817 [gaim-migrate @ 16811]
Mark Doliner <mark@kingant.net>
parents: 14108
diff changeset
1740 if (connect_info->query_data == NULL)
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1741 {
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1742 gaim_proxy_connect_info_destroy(connect_info);
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1743 return NULL;
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1744 }
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1745
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1746 connect_infos = g_slist_prepend(connect_infos, connect_info);
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1747
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1748 return connect_info;
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1749 }
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1750
14103
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1751 void
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1752 gaim_proxy_connect_cancel(GaimProxyConnectInfo *connect_info)
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1753 {
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1754 gaim_proxy_connect_info_destroy(connect_info);
eec0c7fd8529 [gaim-migrate @ 16734]
Mark Doliner <mark@kingant.net>
parents: 14099
diff changeset
1755 }
8262
b5dbd1839716 [gaim-migrate @ 8985]
Nathan Walp <nwalp@pidgin.im>
parents: 8231
diff changeset
1756
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1757 static void
12816
ff267281e882 [gaim-migrate @ 15164]
Mark Doliner <mark@kingant.net>
parents: 12811
diff changeset
1758 proxy_pref_cb(const char *name, GaimPrefType type,
ff267281e882 [gaim-migrate @ 15164]
Mark Doliner <mark@kingant.net>
parents: 12811
diff changeset
1759 gconstpointer value, gpointer data)
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1760 {
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1761 GaimProxyInfo *info = gaim_global_proxy_get_info();
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1762
6001
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1763 if (!strcmp(name, "/core/proxy/type")) {
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1764 int proxytype;
12816
ff267281e882 [gaim-migrate @ 15164]
Mark Doliner <mark@kingant.net>
parents: 12811
diff changeset
1765 const char *type = value;
6001
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1766
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1767 if (!strcmp(type, "none"))
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1768 proxytype = GAIM_PROXY_NONE;
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1769 else if (!strcmp(type, "http"))
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1770 proxytype = GAIM_PROXY_HTTP;
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1771 else if (!strcmp(type, "socks4"))
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1772 proxytype = GAIM_PROXY_SOCKS4;
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1773 else if (!strcmp(type, "socks5"))
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1774 proxytype = GAIM_PROXY_SOCKS5;
6621
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1775 else if (!strcmp(type, "envvar"))
42fdf16f1dad [gaim-migrate @ 7145]
Mark Doliner <mark@kingant.net>
parents: 6320
diff changeset
1776 proxytype = GAIM_PROXY_USE_ENVVAR;
6001
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1777 else
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1778 proxytype = -1;
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1779
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1780 gaim_proxy_info_set_type(info, proxytype);
5e9364e9b29e [gaim-migrate @ 6449]
Mark Doliner <mark@kingant.net>
parents: 5970
diff changeset
1781 } else if (!strcmp(name, "/core/proxy/host"))
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1782 gaim_proxy_info_set_host(info, value);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1783 else if (!strcmp(name, "/core/proxy/port"))
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1784 gaim_proxy_info_set_port(info, GPOINTER_TO_INT(value));
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1785 else if (!strcmp(name, "/core/proxy/username"))
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1786 gaim_proxy_info_set_username(info, value);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1787 else if (!strcmp(name, "/core/proxy/password"))
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1788 gaim_proxy_info_set_password(info, value);
1087
56c7ceb986a8 [gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents: 1057
diff changeset
1789 }
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1790
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1791 void *
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1792 gaim_proxy_get_handle()
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1793 {
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1794 static int handle;
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1795
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1796 return &handle;
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1797 }
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1798
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1799 void
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1800 gaim_proxy_init(void)
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1801 {
10087
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1802 void *handle;
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1803
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1804 /* Initialize a default proxy info struct. */
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1805 global_proxy_info = gaim_proxy_info_new();
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1806
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1807 /* Proxy */
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1808 gaim_prefs_add_none("/core/proxy");
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1809 gaim_prefs_add_string("/core/proxy/type", "none");
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1810 gaim_prefs_add_string("/core/proxy/host", "");
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1811 gaim_prefs_add_int("/core/proxy/port", 0);
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1812 gaim_prefs_add_string("/core/proxy/username", "");
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1813 gaim_prefs_add_string("/core/proxy/password", "");
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1814
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1815 /* Setup callbacks for the preferences. */
10087
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1816 handle = gaim_proxy_get_handle();
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1817 gaim_prefs_connect_callback(handle, "/core/proxy/type", proxy_pref_cb,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1818 NULL);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1819 gaim_prefs_connect_callback(handle, "/core/proxy/host", proxy_pref_cb,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1820 NULL);
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1821 gaim_prefs_connect_callback(handle, "/core/proxy/port", proxy_pref_cb,
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1822 NULL);
10087
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1823 gaim_prefs_connect_callback(handle, "/core/proxy/username",
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1824 proxy_pref_cb, NULL);
10087
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1825 gaim_prefs_connect_callback(handle, "/core/proxy/password",
13200
33bef17125c2 [gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13084
diff changeset
1826 proxy_pref_cb, NULL);
10626
06f5cc17cddc [gaim-migrate @ 12101]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10619
diff changeset
1827 #ifdef _WIN32
10237
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
1828 if(!g_thread_supported())
2f6dcbaaabe0 [gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents: 10172
diff changeset
1829 g_thread_init(NULL);
10626
06f5cc17cddc [gaim-migrate @ 12101]
Daniel Atallah <daniel.atallah@gmail.com>
parents: 10619
diff changeset
1830 #endif
5681
46d7ad0dfa26 [gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents: 5580
diff changeset
1831 }
10087
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1832
14089
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1833 void
10e8eb6a4910 [gaim-migrate @ 16712]
Mark Doliner <mark@kingant.net>
parents: 14035
diff changeset
1834 gaim_proxy_uninit(void)
10087
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1835 {
14096
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1836 while (connect_infos != NULL)
a70c6011dc81 [gaim-migrate @ 16725]
Mark Doliner <mark@kingant.net>
parents: 14095
diff changeset
1837 gaim_proxy_connect_info_destroy(connect_infos->data);
10087
9fdbfe832fac [gaim-migrate @ 11098]
Stu Tomlinson <stu@nosnilmot.com>
parents: 9863
diff changeset
1838 }