Mercurial > pidgin
annotate src/proxy.c @ 14098:a8c9d714658c
[gaim-migrate @ 16727]
I decided that it's probably not a good idea to enable_fatal_asserts
when --enable-debug is passed to autogen.sh/configure. However,
EVERY Gaim dev, summer of code student and crazy patch writer should
pass "--enable-fatal-asserts" to Gaim's autogen.sh/configure
(It causes Gaim to segfault when g_return_val_if_fail() fails)
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sat, 12 Aug 2006 21:13:25 +0000 |
parents | 7ded3834168f |
children | 7b030f6ed1c3 |
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 | 5 * gaim |
6 * | |
8046 | 7 * Gaim is the legal property of its developers, whose names are too numerous |
8 * to list here. Please refer to the COPYRIGHT file distributed with this | |
9 * source distribution. | |
1 | 10 * |
11 * This program is free software; you can redistribute it and/or modify | |
12 * it under the terms of the GNU General Public License as published by | |
13 * the Free Software Foundation; either version 2 of the License, or | |
14 * (at your option) any later version. | |
15 * | |
16 * This program is distributed in the hope that it will be useful, | |
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 * GNU General Public License for more details. | |
20 * | |
21 * You should have received a copy of the GNU General Public License | |
22 * along with this program; if not, write to the Free Software | |
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
24 * | |
25 */ | |
26 | |
27 /* this is a little piece of code to handle proxy connection */ | |
28 /* it is intended to : 1st handle http proxy, using the CONNECT command | |
6856 | 29 , 2nd provide an easy way to add socks support |
30 , 3rd draw women to it like flies to honey */ | |
1 | 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" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
34 #include "debug.h" |
6621 | 35 #include "notify.h" |
12391 | 36 #include "ntlm.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
37 #include "prefs.h" |
1 | 38 #include "proxy.h" |
5872
059d95c67cda
[gaim-migrate @ 6304]
Christian Hammond <chipx86@chipx86.com>
parents:
5681
diff
changeset
|
39 #include "util.h" |
3630 | 40 |
14090 | 41 struct _GaimProxyConnectInfo { |
14089 | 42 GaimProxyConnectFunction connect_cb; |
43 GaimProxyErrorFunction error_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; |
14089 | 47 guint inpa; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
48 GaimProxyInfo *gpi; |
14097 | 49 |
50 /** | |
51 * This contains alternating length/char* values. The char* | |
52 * values need to be freed when removed from the linked list. | |
53 */ | |
9129 | 54 GSList *hosts; |
14097 | 55 |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
56 guchar *write_buffer; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
57 gsize write_buf_len; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
58 gsize written_len; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
59 GaimInputFunction read_cb; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
60 guchar *read_buffer; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
61 gsize read_buf_len; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
62 gsize read_len; |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
63 }; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
64 |
12246 | 65 static const char *socks5errors[] = { |
7982 | 66 "succeeded\n", |
67 "general SOCKS server failure\n", | |
68 "connection not allowed by ruleset\n", | |
69 "Network unreachable\n", | |
70 "Host unreachable\n", | |
71 "Connection refused\n", | |
72 "TTL expired\n", | |
73 "Command not supported\n", | |
74 "Address type not supported\n" | |
75 }; | |
76 | |
14089 | 77 static GaimProxyInfo *global_proxy_info = NULL; |
14096 | 78 static GSList *connect_infos = NULL; |
14089 | 79 |
14097 | 80 static void try_connect(GaimProxyConnectInfo *); |
14089 | 81 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
82 /************************************************************************** |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
83 * Proxy structure API |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
84 **************************************************************************/ |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
85 GaimProxyInfo * |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
86 gaim_proxy_info_new(void) |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
87 { |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
88 return g_new0(GaimProxyInfo, 1); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
89 } |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
90 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
91 void |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
92 gaim_proxy_info_destroy(GaimProxyInfo *info) |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
93 { |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
94 g_return_if_fail(info != NULL); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
95 |
13968 | 96 g_free(info->host); |
97 g_free(info->username); | |
98 g_free(info->password); | |
5681
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 g_free(info); |
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_set_type(GaimProxyInfo *info, GaimProxyType type) |
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 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
108 info->type = type; |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
109 } |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
110 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
111 void |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
112 gaim_proxy_info_set_host(GaimProxyInfo *info, const char *host) |
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 g_return_if_fail(info != NULL); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
115 |
13968 | 116 g_free(info->host); |
14035 | 117 info->host = g_strdup(host); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
118 } |
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 void |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
121 gaim_proxy_info_set_port(GaimProxyInfo *info, int port) |
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 g_return_if_fail(info != NULL); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
124 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
125 info->port = port; |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
126 } |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
127 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
128 void |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
129 gaim_proxy_info_set_username(GaimProxyInfo *info, const char *username) |
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 g_return_if_fail(info != NULL); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
132 |
13968 | 133 g_free(info->username); |
14035 | 134 info->username = g_strdup(username); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
135 } |
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 void |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
138 gaim_proxy_info_set_password(GaimProxyInfo *info, const char *password) |
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 g_return_if_fail(info != NULL); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
141 |
13968 | 142 g_free(info->password); |
14035 | 143 info->password = g_strdup(password); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
144 } |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
145 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
146 GaimProxyType |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
147 gaim_proxy_info_get_type(const GaimProxyInfo *info) |
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 g_return_val_if_fail(info != NULL, GAIM_PROXY_NONE); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
150 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
151 return info->type; |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
152 } |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
153 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
154 const char * |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
155 gaim_proxy_info_get_host(const GaimProxyInfo *info) |
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 g_return_val_if_fail(info != NULL, NULL); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
158 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
159 return info->host; |
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 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
162 int |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
163 gaim_proxy_info_get_port(const GaimProxyInfo *info) |
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 g_return_val_if_fail(info != NULL, 0); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
166 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
167 return info->port; |
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 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
170 const char * |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
171 gaim_proxy_info_get_username(const GaimProxyInfo *info) |
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 g_return_val_if_fail(info != NULL, NULL); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
174 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
175 return info->username; |
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 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
178 const char * |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
179 gaim_proxy_info_get_password(const GaimProxyInfo *info) |
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 g_return_val_if_fail(info != NULL, NULL); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
182 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
183 return info->password; |
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 |
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 * Global Proxy API |
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 GaimProxyInfo * |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
190 gaim_global_proxy_get_info(void) |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
191 { |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
192 return global_proxy_info; |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
193 } |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
194 |
12412
a88ca6da0b38
[gaim-migrate @ 14719]
Richard Laager <rlaager@wiktel.com>
parents:
12391
diff
changeset
|
195 static GaimProxyInfo * |
11878 | 196 gaim_gnome_proxy_get_info(void) |
197 { | |
198 static GaimProxyInfo info = {0, NULL, 0, NULL, NULL}; | |
199 gchar *path; | |
200 if ((path = g_find_program_in_path("gconftool-2"))) { | |
201 gchar *tmp; | |
12156 | 202 |
203 g_free(path); | |
204 | |
11878 | 205 /* See whether to use a proxy. */ |
206 if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/use_http_proxy", &tmp, | |
207 NULL, NULL, NULL)) | |
208 return gaim_global_proxy_get_info(); | |
12811
ac41924f8bb0
[gaim-migrate @ 15159]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12765
diff
changeset
|
209 if (!strcmp(tmp, "false\n")) { |
11878 | 210 info.type = GAIM_PROXY_NONE; |
211 g_free(tmp); | |
12811
ac41924f8bb0
[gaim-migrate @ 15159]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12765
diff
changeset
|
212 return &info; |
ac41924f8bb0
[gaim-migrate @ 15159]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12765
diff
changeset
|
213 } else if (strcmp(tmp, "true\n")) { |
ac41924f8bb0
[gaim-migrate @ 15159]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12765
diff
changeset
|
214 g_free(tmp); |
11878 | 215 return gaim_global_proxy_get_info(); |
216 } | |
12156 | 217 |
11878 | 218 g_free(tmp); |
219 info.type = GAIM_PROXY_HTTP; | |
12156 | 220 |
11878 | 221 /* Free the old fields */ |
222 if (info.host) { | |
223 g_free(info.host); | |
224 info.host = NULL; | |
225 } | |
226 if (info.username) { | |
227 g_free(info.username); | |
228 info.username = NULL; | |
229 } | |
230 if (info.password) { | |
231 g_free(info.password); | |
232 info.password = NULL; | |
233 } | |
12156 | 234 |
11878 | 235 /* Get the new ones */ |
236 if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/host", &info.host, | |
237 NULL, NULL, NULL)) | |
238 return gaim_global_proxy_get_info(); | |
239 g_strchomp(info.host); | |
12156 | 240 |
11878 | 241 if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/authentication_user", &info.username, |
242 NULL, NULL, NULL)) | |
243 return gaim_global_proxy_get_info(); | |
244 g_strchomp(info.username); | |
245 | |
246 if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/authentication_password", &info.password, | |
247 NULL, NULL, NULL)) | |
248 return gaim_global_proxy_get_info(); | |
249 g_strchomp(info.password); | |
250 | |
251 if (!g_spawn_command_line_sync("gconftool-2 -g /system/http_proxy/port", &tmp, | |
252 NULL, NULL, NULL)) | |
253 return gaim_global_proxy_get_info(); | |
254 info.port = atoi(tmp); | |
12156 | 255 g_free(tmp); |
11878 | 256 |
257 return &info; | |
258 } | |
259 return gaim_global_proxy_get_info(); | |
260 } | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
261 /************************************************************************** |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
262 * Proxy API |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
263 **************************************************************************/ |
4366 | 264 |
14089 | 265 static void |
14097 | 266 gaim_proxy_connect_info_destroy(GaimProxyConnectInfo *connect_info) |
14089 | 267 { |
14096 | 268 connect_infos = g_slist_remove(connect_infos, connect_info); |
14089 | 269 |
14096 | 270 if (connect_info->inpa > 0) |
271 gaim_input_remove(connect_info->inpa); | |
14089 | 272 |
14096 | 273 while (connect_info->hosts != NULL) |
14089 | 274 { |
275 /* Discard the length... */ | |
14096 | 276 connect_info->hosts = g_slist_remove(connect_info->hosts, connect_info->hosts->data); |
14089 | 277 /* Free the address... */ |
14096 | 278 g_free(connect_info->hosts->data); |
279 connect_info->hosts = g_slist_remove(connect_info->hosts, connect_info->hosts->data); | |
14089 | 280 } |
281 | |
14096 | 282 g_free(connect_info->host); |
283 g_free(connect_info->write_buffer); | |
284 g_free(connect_info->read_buffer); | |
285 g_free(connect_info); | |
14089 | 286 } |
287 | |
288 static void | |
14097 | 289 gaim_proxy_connect_info_connected(GaimProxyConnectInfo *connect_info, int fd) |
14089 | 290 { |
14096 | 291 connect_info->connect_cb(connect_info->data, fd); |
292 gaim_proxy_connect_info_destroy(connect_info); | |
14089 | 293 } |
294 | |
295 /** | |
296 * @param error An error message explaining why the connection | |
297 * failed. This will be passed to the callback function | |
298 * specified in the call to gaim_proxy_connect(). | |
299 */ | |
300 static void | |
14097 | 301 gaim_proxy_connect_info_error(GaimProxyConnectInfo *connect_info, const gchar *error_message) |
14089 | 302 { |
14096 | 303 if (connect_info->error_cb == NULL) |
14089 | 304 { |
305 /* | |
306 * TODO | |
307 * While we're transitioning to the new gaim_proxy_connect() | |
308 * code, not all callers supply an error_cb. If this is the | |
309 * case then they're expecting connect_cb to be called with | |
310 * an fd of -1 in the case of an error. Once all callers have | |
311 * been changed this whole if statement should be removed. | |
312 */ | |
14096 | 313 connect_info->connect_cb(connect_info->data, -1); |
314 gaim_proxy_connect_info_destroy(connect_info); | |
14089 | 315 return; |
316 } | |
317 | |
14096 | 318 connect_info->error_cb(connect_info->data, error_message); |
319 gaim_proxy_connect_info_destroy(connect_info); | |
14089 | 320 } |
321 | |
13648
3eba1e7458c7
[gaim-migrate @ 16049]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13530
diff
changeset
|
322 #if defined(__unix__) || defined(__APPLE__) |
4366 | 323 |
10711 | 324 /* |
325 * This structure represents both a pending DNS request and | |
326 * a free child process. | |
4366 | 327 */ |
328 typedef struct { | |
329 char *host; | |
330 int port; | |
14089 | 331 GaimProxyDnsConnectFunction callback; |
4366 | 332 gpointer data; |
14089 | 333 guint inpa; |
4366 | 334 int fd_in, fd_out; |
335 pid_t dns_pid; | |
336 } pending_dns_request_t; | |
337 | |
338 static GSList *free_dns_children = NULL; | |
339 static GQueue *queued_requests = NULL; | |
340 | |
341 static int number_of_dns_children = 0; | |
342 | |
12246 | 343 static const int MAX_DNS_CHILDREN = 2; |
4366 | 344 |
345 typedef struct { | |
346 char hostname[512]; | |
347 int port; | |
348 } dns_params_t; | |
349 | |
350 typedef struct { | |
351 dns_params_t params; | |
14089 | 352 GaimProxyDnsConnectFunction callback; |
4366 | 353 gpointer data; |
354 } queued_dns_request_t; | |
355 | |
10711 | 356 /* |
357 * Begin the DNS resolver child process functions. | |
358 */ | |
359 #ifdef HAVE_SIGNAL_H | |
360 static void | |
361 trap_gdb_bug() | |
362 { | |
363 const char *message = | |
13968 | 364 "Gaim's DNS child got a SIGTRAP signal.\n" |
10711 | 365 "This can be caused by trying to run gaim inside gdb.\n" |
366 "There is a known gdb bug which prevents this. Supposedly gaim\n" | |
367 "should have detected you were using gdb and used an ugly hack,\n" | |
368 "check cope_with_gdb_brokenness() in proxy.c.\n\n" | |
369 "For more info about this bug, see http://sources.redhat.com/ml/gdb/2001-07/msg00349.html\n"; | |
370 fputs("\n* * *\n",stderr); | |
371 fputs(message,stderr); | |
372 fputs("* * *\n\n",stderr); | |
373 execlp("xmessage","xmessage","-center", message, NULL); | |
374 _exit(1); | |
375 } | |
376 #endif | |
377 | |
378 static void | |
379 cope_with_gdb_brokenness() | |
380 { | |
381 #ifdef __linux__ | |
382 static gboolean already_done = FALSE; | |
383 char s[256], e[512]; | |
384 int n; | |
385 pid_t ppid; | |
386 | |
387 if(already_done) | |
388 return; | |
389 already_done = TRUE; | |
390 ppid = getppid(); | |
391 snprintf(s, sizeof(s), "/proc/%d/exe", ppid); | |
392 n = readlink(s, e, sizeof(e)); | |
393 if(n < 0) | |
394 return; | |
395 | |
396 e[MIN(n,sizeof(e)-1)] = '\0'; | |
397 | |
398 if(strstr(e,"gdb")) { | |
399 gaim_debug_info("dns", | |
400 "Debugger detected, performing useless query...\n"); | |
401 gethostbyname("x.x.x.x.x"); | |
402 } | |
403 #endif | |
404 } | |
405 | |
406 static void | |
407 gaim_dns_resolverthread(int child_out, int child_in, gboolean show_debug) | |
408 { | |
409 dns_params_t dns_params; | |
410 const size_t zero = 0; | |
411 int rc; | |
13425
95cc25e78ef6
[gaim-migrate @ 15800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13404
diff
changeset
|
412 #ifdef HAVE_GETADDRINFO |
10711 | 413 struct addrinfo hints, *res, *tmp; |
414 char servname[20]; | |
415 #else | |
416 struct sockaddr_in sin; | |
417 const size_t addrlen = sizeof(sin); | |
418 #endif | |
419 | |
420 #ifdef HAVE_SIGNAL_H | |
421 signal(SIGHUP, SIG_DFL); | |
422 signal(SIGINT, SIG_DFL); | |
423 signal(SIGQUIT, SIG_DFL); | |
424 signal(SIGCHLD, SIG_DFL); | |
425 signal(SIGTERM, SIG_DFL); | |
426 signal(SIGTRAP, trap_gdb_bug); | |
427 #endif | |
428 | |
429 /* | |
430 * We resolve 1 host name for each iteration of this | |
431 * while loop. | |
432 * | |
433 * The top half of this reads in the hostname and port | |
434 * number from the socket with our parent. The bottom | |
435 * half of this resolves the IP (blocking) and sends | |
436 * the result back to our parent, when finished. | |
437 */ | |
438 while (1) { | |
439 const char ch = 'Y'; | |
440 fd_set fds; | |
441 struct timeval tv = { .tv_sec = 40 , .tv_usec = 0 }; | |
442 FD_ZERO(&fds); | |
443 FD_SET(child_in, &fds); | |
444 rc = select(child_in + 1, &fds, NULL, NULL, &tv); | |
445 if (!rc) { | |
446 if (show_debug) | |
13798
24b768639db5
[gaim-migrate @ 16210]
Richard Laager <rlaager@wiktel.com>
parents:
13786
diff
changeset
|
447 printf("dns[%d]: nobody needs me... =(\n", getpid()); |
10711 | 448 break; |
449 } | |
450 rc = read(child_in, &dns_params, sizeof(dns_params_t)); | |
451 if (rc < 0) { | |
452 perror("read()"); | |
453 break; | |
454 } | |
455 if (rc == 0) { | |
456 if (show_debug) | |
13798
24b768639db5
[gaim-migrate @ 16210]
Richard Laager <rlaager@wiktel.com>
parents:
13786
diff
changeset
|
457 printf("dns[%d]: Oops, father has gone, wait for me, wait...!\n", getpid()); |
10711 | 458 _exit(0); |
459 } | |
460 if (dns_params.hostname[0] == '\0') { | |
13798
24b768639db5
[gaim-migrate @ 16210]
Richard Laager <rlaager@wiktel.com>
parents:
13786
diff
changeset
|
461 printf("dns[%d]: hostname = \"\" (port = %d)!!!\n", getpid(), dns_params.port); |
10711 | 462 _exit(1); |
463 } | |
464 /* Tell our parent that we read the data successfully */ | |
465 write(child_out, &ch, sizeof(ch)); | |
466 | |
467 /* We have the hostname and port, now resolve the IP */ | |
468 | |
13425
95cc25e78ef6
[gaim-migrate @ 15800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13404
diff
changeset
|
469 #ifdef HAVE_GETADDRINFO |
10711 | 470 g_snprintf(servname, sizeof(servname), "%d", dns_params.port); |
471 memset(&hints, 0, sizeof(hints)); | |
472 | |
473 /* This is only used to convert a service | |
474 * name to a port number. As we know we are | |
475 * passing a number already, we know this | |
476 * value will not be really used by the C | |
477 * library. | |
478 */ | |
479 hints.ai_socktype = SOCK_STREAM; | |
480 rc = getaddrinfo(dns_params.hostname, servname, &hints, &res); | |
481 write(child_out, &rc, sizeof(rc)); | |
482 if (rc != 0) { | |
483 close(child_out); | |
484 if (show_debug) | |
13798
24b768639db5
[gaim-migrate @ 16210]
Richard Laager <rlaager@wiktel.com>
parents:
13786
diff
changeset
|
485 printf("dns[%d] Error: getaddrinfo returned %d\n", |
10711 | 486 getpid(), rc); |
487 dns_params.hostname[0] = '\0'; | |
488 continue; | |
489 } | |
490 tmp = res; | |
491 while (res) { | |
492 size_t ai_addrlen = res->ai_addrlen; | |
493 write(child_out, &ai_addrlen, sizeof(ai_addrlen)); | |
494 write(child_out, res->ai_addr, res->ai_addrlen); | |
495 res = res->ai_next; | |
496 } | |
497 freeaddrinfo(tmp); | |
498 write(child_out, &zero, sizeof(zero)); | |
499 #else | |
500 if (!inet_aton(dns_params.hostname, &sin.sin_addr)) { | |
501 struct hostent *hp; | |
502 if (!(hp = gethostbyname(dns_params.hostname))) { | |
503 write(child_out, &h_errno, sizeof(int)); | |
504 close(child_out); | |
505 if (show_debug) | |
13798
24b768639db5
[gaim-migrate @ 16210]
Richard Laager <rlaager@wiktel.com>
parents:
13786
diff
changeset
|
506 printf("DNS Error: %d\n", h_errno); |
10711 | 507 _exit(0); |
508 } | |
509 memset(&sin, 0, sizeof(struct sockaddr_in)); | |
510 memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length); | |
511 sin.sin_family = hp->h_addrtype; | |
512 } else | |
513 sin.sin_family = AF_INET; | |
514 | |
515 sin.sin_port = htons(dns_params.port); | |
516 write(child_out, &addrlen, sizeof(addrlen)); | |
517 write(child_out, &sin, addrlen); | |
518 write(child_out, &zero, sizeof(zero)); | |
519 #endif | |
520 dns_params.hostname[0] = '\0'; | |
521 } | |
522 | |
523 close(child_out); | |
524 close(child_in); | |
525 | |
526 _exit(0); | |
527 } | |
528 | |
529 static pending_dns_request_t * | |
530 gaim_dns_new_resolverthread(gboolean show_debug) | |
531 { | |
532 pending_dns_request_t *req; | |
533 int child_out[2], child_in[2]; | |
534 | |
535 /* Create pipes for communicating with the child process */ | |
536 if (pipe(child_out) || pipe(child_in)) { | |
537 gaim_debug_error("dns", | |
538 "Could not create pipes: %s\n", strerror(errno)); | |
539 return NULL; | |
540 } | |
541 | |
542 req = g_new(pending_dns_request_t, 1); | |
543 | |
544 cope_with_gdb_brokenness(); | |
545 | |
546 /* Fork! */ | |
547 req->dns_pid = fork(); | |
548 | |
549 /* If we are the child process... */ | |
550 if (req->dns_pid == 0) { | |
551 /* We should not access the parent's side of the pipes, so close them */ | |
552 close(child_out[0]); | |
553 close(child_in[1]); | |
554 | |
555 gaim_dns_resolverthread(child_out[1], child_in[0], show_debug); | |
556 /* The thread calls _exit() rather than returning, so we never get here */ | |
557 } | |
558 | |
559 /* We should not access the child's side of the pipes, so close them */ | |
560 close(child_out[1]); | |
561 close(child_in[0]); | |
562 if (req->dns_pid == -1) { | |
563 gaim_debug_error("dns", | |
564 "Could not create child process for DNS: %s\n", | |
565 strerror(errno)); | |
566 g_free(req); | |
567 return NULL; | |
568 } | |
569 | |
570 req->fd_out = child_out[0]; | |
571 req->fd_in = child_in[1]; | |
572 number_of_dns_children++; | |
573 gaim_debug_info("dns", | |
574 "Created new DNS child %d, there are now %d children.\n", | |
575 req->dns_pid, number_of_dns_children); | |
576 | |
577 return req; | |
578 } | |
579 /* | |
580 * End the DNS resolver child process functions. | |
581 */ | |
582 | |
583 /* | |
584 * Begin the functions for dealing with the DNS child processes. | |
585 */ | |
586 static void | |
587 req_free(pending_dns_request_t *req) | |
4434 | 588 { |
589 g_return_if_fail(req != NULL); | |
10707 | 590 |
4434 | 591 close(req->fd_in); |
592 close(req->fd_out); | |
10707 | 593 |
594 g_free(req->host); | |
4434 | 595 g_free(req); |
10707 | 596 |
4434 | 597 number_of_dns_children--; |
598 } | |
599 | |
10711 | 600 static int |
601 send_dns_request_to_child(pending_dns_request_t *req, dns_params_t *dns_params) | |
4366 | 602 { |
603 char ch; | |
604 int rc; | |
13530 | 605 pid_t pid; |
4366 | 606 |
13530 | 607 /* This waitpid might return the child's PID if it has recently |
608 * exited, or it might return an error if it exited "long | |
609 * enough" ago that it has already been reaped; in either | |
610 * instance, we can't use it. */ | |
611 if ((pid = waitpid (req->dns_pid, NULL, WNOHANG)) > 0) { | |
10309 | 612 gaim_debug_warning("dns", |
5218
4ee151ad8233
[gaim-migrate @ 5588]
Christian Hammond <chipx86@chipx86.com>
parents:
5211
diff
changeset
|
613 "DNS child %d no longer exists\n", req->dns_pid); |
4366 | 614 return -1; |
13530 | 615 } else if (pid < 0) { |
616 gaim_debug_warning("dns", | |
617 "Wait for DNS child %d failed: %s\n", | |
618 req->dns_pid, strerror(errno)); | |
619 return -1; | |
4366 | 620 } |
9129 | 621 |
4366 | 622 /* Let's contact this lost child! */ |
623 rc = write(req->fd_in, dns_params, sizeof(*dns_params)); | |
10707 | 624 if (rc < 0) { |
10309 | 625 gaim_debug_error("dns", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
626 "Unable to write to DNS child %d: %d\n", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
627 req->dns_pid, strerror(errno)); |
4434 | 628 close(req->fd_in); |
4366 | 629 return -1; |
630 } | |
9129 | 631 |
4366 | 632 g_return_val_if_fail(rc == sizeof(*dns_params), -1); |
9129 | 633 |
4366 | 634 /* Did you hear me? (This avoids some race conditions) */ |
10707 | 635 rc = read(req->fd_out, &ch, sizeof(ch)); |
636 if (rc != 1 || ch != 'Y') | |
637 { | |
10309 | 638 gaim_debug_warning("dns", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
639 "DNS child %d not responding. Killing it!\n", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
640 req->dns_pid); |
4366 | 641 kill(req->dns_pid, SIGKILL); |
642 return -1; | |
643 } | |
9655 | 644 |
10309 | 645 gaim_debug_info("dns", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
646 "Successfully sent DNS request to child %d\n", req->dns_pid); |
10707 | 647 |
4366 | 648 return 0; |
649 } | |
650 | |
10711 | 651 static void |
652 host_resolved(gpointer data, gint source, GaimInputCondition cond); | |
4366 | 653 |
10711 | 654 static void |
655 release_dns_child(pending_dns_request_t *req) | |
2911
4790fb1272a1
[gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2907
diff
changeset
|
656 { |
4366 | 657 g_free(req->host); |
10707 | 658 req->host = NULL; |
4366 | 659 |
10707 | 660 if (queued_requests && !g_queue_is_empty(queued_requests)) { |
4366 | 661 queued_dns_request_t *r = g_queue_pop_head(queued_requests); |
662 req->host = g_strdup(r->params.hostname); | |
663 req->port = r->params.port; | |
664 req->callback = r->callback; | |
665 req->data = r->data; | |
666 | |
10309 | 667 gaim_debug_info("dns", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
668 "Processing queued DNS query for '%s' with child %d\n", |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
669 req->host, req->dns_pid); |
4366 | 670 |
10707 | 671 if (send_dns_request_to_child(req, &(r->params)) != 0) { |
4434 | 672 req_free(req); |
4366 | 673 req = NULL; |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
674 |
10309 | 675 gaim_debug_warning("dns", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
676 "Intent of process queued query of '%s' failed, " |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
677 "requeueing...\n", r->params.hostname); |
4366 | 678 g_queue_push_head(queued_requests, r); |
679 } else { | |
680 req->inpa = gaim_input_add(req->fd_out, GAIM_INPUT_READ, host_resolved, req); | |
681 g_free(r); | |
682 } | |
9655 | 683 |
4366 | 684 } else { |
685 req->host = NULL; | |
686 req->callback = NULL; | |
687 req->data = NULL; | |
688 free_dns_children = g_slist_append(free_dns_children, req); | |
689 } | |
690 } | |
691 | |
10711 | 692 static void |
693 host_resolved(gpointer data, gint source, GaimInputCondition cond) | |
4366 | 694 { |
695 pending_dns_request_t *req = (pending_dns_request_t*)data; | |
696 int rc, err; | |
4678 | 697 GSList *hosts = NULL; |
4366 | 698 struct sockaddr *addr = NULL; |
8436 | 699 size_t addrlen; |
4366 | 700 |
13023 | 701 gaim_debug_info("dns", "Got response for '%s'\n", req->host); |
4366 | 702 gaim_input_remove(req->inpa); |
703 | |
10707 | 704 rc = read(req->fd_out, &err, sizeof(err)); |
705 if ((rc == 4) && (err != 0)) | |
706 { | |
4366 | 707 char message[1024]; |
13425
95cc25e78ef6
[gaim-migrate @ 15800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13404
diff
changeset
|
708 #ifdef HAVE_GETADDRINFO |
4366 | 709 g_snprintf(message, sizeof(message), "DNS error: %s (pid=%d)", |
8977 | 710 gai_strerror(err), req->dns_pid); |
4366 | 711 #else |
8977 | 712 g_snprintf(message, sizeof(message), "DNS error: %d (pid=%d)", |
713 err, req->dns_pid); | |
4366 | 714 #endif |
10309 | 715 gaim_debug_error("dns", "%s\n", message); |
4678 | 716 req->callback(NULL, req->data, message); |
717 release_dns_child(req); | |
4366 | 718 return; |
719 } | |
10707 | 720 if (rc > 0) |
721 { | |
722 while (rc > 0) { | |
723 rc = read(req->fd_out, &addrlen, sizeof(addrlen)); | |
724 if (rc > 0 && addrlen > 0) { | |
725 addr = g_malloc(addrlen); | |
726 rc = read(req->fd_out, addr, addrlen); | |
4678 | 727 hosts = g_slist_append(hosts, GINT_TO_POINTER(addrlen)); |
728 hosts = g_slist_append(hosts, addr); | |
729 } else { | |
730 break; | |
731 } | |
4366 | 732 } |
10707 | 733 } else if (rc == -1) { |
4366 | 734 char message[1024]; |
735 g_snprintf(message, sizeof(message), "Error reading from DNS child: %s",strerror(errno)); | |
10309 | 736 gaim_debug_error("dns", "%s\n", message); |
4678 | 737 req->callback(NULL, req->data, message); |
4434 | 738 req_free(req); |
4366 | 739 return; |
10707 | 740 } else if (rc == 0) { |
4366 | 741 char message[1024]; |
742 g_snprintf(message, sizeof(message), "EOF reading from DNS child"); | |
743 close(req->fd_out); | |
10309 | 744 gaim_debug_error("dns", "%s\n", message); |
4678 | 745 req->callback(NULL, req->data, message); |
4434 | 746 req_free(req); |
4366 | 747 return; |
748 } | |
749 | |
750 /* wait4(req->dns_pid, NULL, WNOHANG, NULL); */ | |
751 | |
4678 | 752 req->callback(hosts, req->data, NULL); |
4366 | 753 |
4678 | 754 release_dns_child(req); |
4366 | 755 } |
10711 | 756 /* |
757 * End the functions for dealing with the DNS child processes. | |
758 */ | |
9657 | 759 |
10711 | 760 int |
14089 | 761 gaim_gethostbyname_async(const char *hostname, int port, GaimProxyDnsConnectFunction callback, gpointer data) |
4366 | 762 { |
763 pending_dns_request_t *req = NULL; | |
764 dns_params_t dns_params; | |
9656 | 765 gchar *host_temp; |
10307 | 766 gboolean show_debug; |
767 | |
768 show_debug = gaim_debug_is_enabled(); | |
9655 | 769 |
9656 | 770 host_temp = g_strstrip(g_strdup(hostname)); |
771 strncpy(dns_params.hostname, host_temp, sizeof(dns_params.hostname) - 1); | |
9655 | 772 g_free(host_temp); |
9656 | 773 dns_params.hostname[sizeof(dns_params.hostname) - 1] = '\0'; |
4366 | 774 dns_params.port = port; |
9129 | 775 |
9656 | 776 /* |
777 * If we have any children, attempt to have them perform the DNS | |
778 * query. If we're able to send the query to a child, then req | |
779 * will be set to the pending_dns_request_t. Otherwise, req will | |
780 * be NULL and we'll need to create a new DNS request child. | |
781 */ | |
782 while (free_dns_children != NULL) { | |
783 req = free_dns_children->data; | |
784 free_dns_children = g_slist_remove(free_dns_children, req); | |
9129 | 785 |
9656 | 786 if (send_dns_request_to_child(req, &dns_params) == 0) |
787 /* We found an acceptable child, yay */ | |
788 break; | |
9129 | 789 |
9656 | 790 req_free(req); |
9657 | 791 req = NULL; |
4366 | 792 } |
793 | |
9657 | 794 /* We need to create a new DNS request child */ |
9656 | 795 if (req == NULL) { |
796 if (number_of_dns_children >= MAX_DNS_CHILDREN) { | |
4366 | 797 queued_dns_request_t *r = g_new(queued_dns_request_t, 1); |
798 memcpy(&(r->params), &dns_params, sizeof(dns_params)); | |
799 r->callback = callback; | |
800 r->data = data; | |
9656 | 801 if (!queued_requests) |
4366 | 802 queued_requests = g_queue_new(); |
803 g_queue_push_tail(queued_requests, r); | |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
804 |
10309 | 805 gaim_debug_info("dns", |
9656 | 806 "DNS query for '%s' queued\n", dns_params.hostname); |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
807 |
4366 | 808 return 0; |
809 } | |
810 | |
10711 | 811 req = gaim_dns_new_resolverthread(show_debug); |
12977 | 812 if (req == NULL) |
813 { | |
814 gaim_debug_error("proxy", "oh dear, this is going to explode, I give up\n"); | |
815 return -1; | |
816 } | |
10711 | 817 send_dns_request_to_child(req, &dns_params); |
4366 | 818 } |
9656 | 819 |
9657 | 820 req->host = g_strdup(hostname); |
9656 | 821 req->port = port; |
822 req->callback = callback; | |
823 req->data = data; | |
4366 | 824 req->inpa = gaim_input_add(req->fd_out, GAIM_INPUT_READ, host_resolved, req); |
9656 | 825 |
4366 | 826 return 0; |
827 } | |
10237
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
828 |
13648
3eba1e7458c7
[gaim-migrate @ 16049]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13530
diff
changeset
|
829 #elif defined _WIN32 /* end __unix__ || __APPLE__ */ |
10237
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
830 |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
831 typedef struct _dns_tdata { |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
832 char *hostname; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
833 int port; |
14089 | 834 GaimProxyDnsConnectFunction callback; |
10237
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
835 gpointer data; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
836 GSList *hosts; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
837 char *errmsg; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
838 } dns_tdata; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
839 |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
840 static gboolean dns_main_thread_cb(gpointer data) { |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
841 dns_tdata *td = (dns_tdata*)data; |
10562
e06da39b467c
[gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10561
diff
changeset
|
842 if (td->errmsg != NULL) { |
e06da39b467c
[gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10561
diff
changeset
|
843 gaim_debug_info("dns", "%s\n", td->errmsg); |
e06da39b467c
[gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10561
diff
changeset
|
844 } |
10237
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
845 td->callback(td->hosts, td->data, td->errmsg); |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
846 g_free(td->hostname); |
10562
e06da39b467c
[gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10561
diff
changeset
|
847 g_free(td->errmsg); |
10237
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
848 g_free(td); |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
849 return FALSE; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
850 } |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
851 |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
852 static gpointer dns_thread(gpointer data) { |
10619
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
853 |
13425
95cc25e78ef6
[gaim-migrate @ 15800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13404
diff
changeset
|
854 #ifdef HAVE_GETADDRINFO |
10619
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
855 int rc; |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
856 struct addrinfo hints, *res, *tmp; |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
857 char servname[20]; |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
858 #else |
10237
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
859 struct sockaddr_in sin; |
10619
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
860 struct hostent *hp; |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
861 #endif |
10237
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
862 dns_tdata *td = (dns_tdata*)data; |
10619
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
863 |
13425
95cc25e78ef6
[gaim-migrate @ 15800]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13404
diff
changeset
|
864 #ifdef HAVE_GETADDRINFO |
10619
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
865 g_snprintf(servname, sizeof(servname), "%d", td->port); |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
866 memset(&hints,0,sizeof(hints)); |
10237
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
867 |
10619
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
868 /* This is only used to convert a service |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
869 * name to a port number. As we know we are |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
870 * passing a number already, we know this |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
871 * value will not be really used by the C |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
872 * library. |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
873 */ |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
874 hints.ai_socktype = SOCK_STREAM; |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
875 if ((rc = getaddrinfo(td->hostname, servname, &hints, &res)) == 0) { |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
876 tmp = res; |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
877 while(res) { |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
878 td->hosts = g_slist_append(td->hosts, |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
879 GSIZE_TO_POINTER(res->ai_addrlen)); |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
880 td->hosts = g_slist_append(td->hosts, |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
881 g_memdup(res->ai_addr, res->ai_addrlen)); |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
882 res = res->ai_next; |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
883 } |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
884 freeaddrinfo(tmp); |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
885 } else { |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
886 td->errmsg = g_strdup_printf("DNS getaddrinfo(\"%s\", \"%s\") error: %d", td->hostname, servname, rc); |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
887 } |
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
888 #else |
10562
e06da39b467c
[gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10561
diff
changeset
|
889 if ((hp = gethostbyname(td->hostname))) { |
e06da39b467c
[gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10561
diff
changeset
|
890 memset(&sin, 0, sizeof(struct sockaddr_in)); |
e06da39b467c
[gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10561
diff
changeset
|
891 memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length); |
e06da39b467c
[gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10561
diff
changeset
|
892 sin.sin_family = hp->h_addrtype; |
e06da39b467c
[gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10561
diff
changeset
|
893 sin.sin_port = htons(td->port); |
10305 | 894 |
10562
e06da39b467c
[gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10561
diff
changeset
|
895 td->hosts = g_slist_append(td->hosts, |
10619
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
896 GSIZE_TO_POINTER(sizeof(sin))); |
10562
e06da39b467c
[gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10561
diff
changeset
|
897 td->hosts = g_slist_append(td->hosts, |
e06da39b467c
[gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10561
diff
changeset
|
898 g_memdup(&sin, sizeof(sin))); |
e06da39b467c
[gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10561
diff
changeset
|
899 } else { |
10619
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
900 td->errmsg = g_strdup_printf("DNS gethostbyname(\"%s\") error: %d", td->hostname, h_errno); |
10562
e06da39b467c
[gaim-migrate @ 11942]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10561
diff
changeset
|
901 } |
10619
4ab7dec04c38
[gaim-migrate @ 12086]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10613
diff
changeset
|
902 #endif |
10237
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
903 /* back to main thread */ |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
904 g_idle_add(dns_main_thread_cb, td); |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
905 return 0; |
10305 | 906 } |
10237
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
907 |
10711 | 908 int |
909 gaim_gethostbyname_async(const char *hostname, int port, | |
14089 | 910 GaimProxyDnsConnectFunction callback, gpointer data) |
10711 | 911 { |
10237
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
912 dns_tdata *td; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
913 struct sockaddr_in sin; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
914 GError* err = NULL; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
915 |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
916 if(inet_aton(hostname, &sin.sin_addr)) { |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
917 GSList *hosts = NULL; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
918 sin.sin_family = AF_INET; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
919 sin.sin_port = htons(port); |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
920 hosts = g_slist_append(hosts, GINT_TO_POINTER(sizeof(sin))); |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
921 hosts = g_slist_append(hosts, g_memdup(&sin, sizeof(sin))); |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
922 callback(hosts, data, NULL); |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
923 return 0; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
924 } |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
925 |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
926 gaim_debug_info("dns", "DNS Lookup for: %s\n", hostname); |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
927 td = g_new0(dns_tdata, 1); |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
928 td->hostname = g_strdup(hostname); |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
929 td->port = port; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
930 td->callback = callback; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
931 td->data = data; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
932 |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
933 if(!g_thread_create(dns_thread, td, FALSE, &err)) { |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
934 gaim_debug_error("dns", "DNS thread create failure: %s\n", err?err->message:""); |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
935 g_error_free(err); |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
936 g_free(td->hostname); |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
937 g_free(td); |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
938 return -1; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
939 } |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
940 return 0; |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
941 } |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
942 |
13648
3eba1e7458c7
[gaim-migrate @ 16049]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13530
diff
changeset
|
943 #else /* not __unix__ or __APPLE__ or _WIN32 */ |
4366 | 944 |
945 typedef struct { | |
946 gpointer data; | |
947 size_t addrlen; | |
948 struct sockaddr *addr; | |
14089 | 949 GaimProxyDnsConnectFunction callback; |
4366 | 950 } pending_dns_request_t; |
951 | |
952 static gboolean host_resolved(gpointer data) | |
953 { | |
954 pending_dns_request_t *req = (pending_dns_request_t*)data; | |
4678 | 955 GSList *hosts = NULL; |
956 hosts = g_slist_append(hosts, GINT_TO_POINTER(req->addrlen)); | |
957 hosts = g_slist_append(hosts, req->addr); | |
958 req->callback(hosts, req->data, NULL); | |
4366 | 959 g_free(req); |
960 return FALSE; | |
961 } | |
962 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
963 int |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
964 gaim_gethostbyname_async(const char *hostname, int port, |
14089 | 965 GaimProxyDnsConnectFunction callback, gpointer data) |
4366 | 966 { |
967 struct sockaddr_in sin; | |
968 pending_dns_request_t *req; | |
969 | |
970 if (!inet_aton(hostname, &sin.sin_addr)) { | |
2911
4790fb1272a1
[gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2907
diff
changeset
|
971 struct hostent *hp; |
4366 | 972 if(!(hp = gethostbyname(hostname))) { |
10309 | 973 gaim_debug_error("dns", |
8977 | 974 "gaim_gethostbyname(\"%s\", %d) failed: %d\n", |
975 hostname, port, h_errno); | |
4366 | 976 return -1; |
2911
4790fb1272a1
[gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2907
diff
changeset
|
977 } |
4790fb1272a1
[gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2907
diff
changeset
|
978 memset(&sin, 0, sizeof(struct sockaddr_in)); |
4790fb1272a1
[gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2907
diff
changeset
|
979 memcpy(&sin.sin_addr.s_addr, hp->h_addr, hp->h_length); |
4790fb1272a1
[gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2907
diff
changeset
|
980 sin.sin_family = hp->h_addrtype; |
4790fb1272a1
[gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2907
diff
changeset
|
981 } else |
4790fb1272a1
[gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2907
diff
changeset
|
982 sin.sin_family = AF_INET; |
4790fb1272a1
[gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2907
diff
changeset
|
983 sin.sin_port = htons(port); |
4790fb1272a1
[gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2907
diff
changeset
|
984 |
4366 | 985 req = g_new(pending_dns_request_t, 1); |
986 req->addr = (struct sockaddr*) g_memdup(&sin, sizeof(sin)); | |
987 req->addrlen = sizeof(sin); | |
988 req->data = data; | |
989 req->callback = callback; | |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8269
diff
changeset
|
990 gaim_timeout_add(10, host_resolved, req); |
4366 | 991 return 0; |
2911
4790fb1272a1
[gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2907
diff
changeset
|
992 } |
4790fb1272a1
[gaim-migrate @ 2924]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2907
diff
changeset
|
993 |
13648
3eba1e7458c7
[gaim-migrate @ 16049]
Evan Schoenberg <evan.s@dreskin.net>
parents:
13530
diff
changeset
|
994 #endif /* not __unix__ or __APPLE__ or _WIN32 */ |
4366 | 995 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
996 static void |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
997 no_one_calls(gpointer data, gint source, GaimInputCondition cond) |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
998 { |
14097 | 999 GaimProxyConnectInfo *connect_info = data; |
12991
c1b2ba353e85
[gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents:
12977
diff
changeset
|
1000 socklen_t len; |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8269
diff
changeset
|
1001 int error=0, ret; |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
1002 |
10309 | 1003 gaim_debug_info("proxy", "Connected.\n"); |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
1004 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1005 len = sizeof(error); |
4648
4bb99cdfd837
[gaim-migrate @ 4959]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
4634
diff
changeset
|
1006 |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8269
diff
changeset
|
1007 /* |
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8269
diff
changeset
|
1008 * getsockopt after a non-blocking connect returns -1 if something is |
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8269
diff
changeset
|
1009 * really messed up (bad descriptor, usually). Otherwise, it returns 0 and |
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8269
diff
changeset
|
1010 * 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
|
1011 * Thus, error == 0 is success, error == EINPROGRESS means "try again", |
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8269
diff
changeset
|
1012 * and anything else is a real error. |
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8269
diff
changeset
|
1013 * |
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8269
diff
changeset
|
1014 * (error == EINPROGRESS can happen after a select because the kernel can |
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8269
diff
changeset
|
1015 * 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
|
1016 * able to do something.) |
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8269
diff
changeset
|
1017 */ |
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8269
diff
changeset
|
1018 ret = getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len); |
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8269
diff
changeset
|
1019 if (ret == 0 && error == EINPROGRESS) |
9863 | 1020 return; /* we'll be called again later */ |
8273
f24172f53650
[gaim-migrate @ 8997]
Christian Hammond <chipx86@chipx86.com>
parents:
8269
diff
changeset
|
1021 if (ret < 0 || error != 0) { |
14089 | 1022 if (ret!=0) |
1023 error = errno; | |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1024 close(source); |
14096 | 1025 gaim_input_remove(connect_info->inpa); |
1026 connect_info->inpa = 0; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1027 |
10309 | 1028 gaim_debug_error("proxy", |
9100 | 1029 "getsockopt SO_ERROR check: %s\n", strerror(error)); |
9129 | 1030 |
14096 | 1031 try_connect(connect_info); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1032 return; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1033 } |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1034 |
14096 | 1035 gaim_input_remove(connect_info->inpa); |
1036 connect_info->inpa = 0; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1037 |
14096 | 1038 gaim_proxy_connect_info_connected(connect_info, source); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1039 } |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1040 |
1868
a49ed23b3c02
[gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1844
diff
changeset
|
1041 static gboolean clean_connect(gpointer data) |
a49ed23b3c02
[gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1844
diff
changeset
|
1042 { |
14097 | 1043 GaimProxyConnectInfo *connect_info = data; |
1868
a49ed23b3c02
[gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1844
diff
changeset
|
1044 |
14096 | 1045 gaim_proxy_connect_info_connected(connect_info, connect_info->port); |
1868
a49ed23b3c02
[gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1844
diff
changeset
|
1046 |
a49ed23b3c02
[gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1844
diff
changeset
|
1047 return FALSE; |
a49ed23b3c02
[gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1844
diff
changeset
|
1048 } |
a49ed23b3c02
[gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1844
diff
changeset
|
1049 |
a49ed23b3c02
[gaim-migrate @ 1878]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1844
diff
changeset
|
1050 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1051 static int |
14097 | 1052 proxy_connect_none(GaimProxyConnectInfo *connect_info, struct sockaddr *addr, socklen_t addrlen) |
1 | 1053 { |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1054 int fd = -1; |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
1055 |
10309 | 1056 gaim_debug_info("proxy", |
14096 | 1057 "Connecting to %s:%d with no proxy\n", connect_info->host, connect_info->port); |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1058 |
4366 | 1059 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) { |
10309 | 1060 gaim_debug_error("proxy", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
1061 "Unable to create socket: %s\n", strerror(errno)); |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1062 return -1; |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1063 } |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1064 fcntl(fd, F_SETFL, O_NONBLOCK); |
10172 | 1065 #ifndef _WIN32 |
10170 | 1066 fcntl(fd, F_SETFD, FD_CLOEXEC); |
10172 | 1067 #endif |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
1068 |
4366 | 1069 if (connect(fd, (struct sockaddr *)addr, addrlen) < 0) { |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1070 if ((errno == EINPROGRESS) || (errno == EINTR)) { |
13929 | 1071 /* This just confuses people. */ |
1072 /* gaim_debug_warning("proxy", | |
1073 "Connect would have blocked.\n"); */ | |
14096 | 1074 connect_info->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, no_one_calls, connect_info); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1075 } |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1076 else { |
10309 | 1077 gaim_debug_error("proxy", |
9100 | 1078 "Connect failed: %s\n", strerror(errno)); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1079 close(fd); |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1080 return -1; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1081 } |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1082 } |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1083 else { |
12991
c1b2ba353e85
[gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents:
12977
diff
changeset
|
1084 socklen_t len; |
2048
3366311426df
[gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1881
diff
changeset
|
1085 int error = ETIMEDOUT; |
10309 | 1086 gaim_debug_misc("proxy", "Connect didn't block.\n"); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1087 len = sizeof(error); |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1088 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { |
10309 | 1089 gaim_debug_error("proxy", "getsockopt failed.\n"); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1090 close(fd); |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1091 return -1; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1092 } |
14089 | 1093 /* TODO: Why is the following line so strange? */ |
14096 | 1094 connect_info->port = fd; /* bleh */ |
1095 gaim_timeout_add(10, clean_connect, connect_info); /* we do this because we never | |
2372
2927c2c26fe6
[gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2306
diff
changeset
|
1096 want to call our callback |
2927c2c26fe6
[gaim-migrate @ 2385]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2306
diff
changeset
|
1097 before we return. */ |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1098 } |
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1099 |
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1100 return fd; |
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1101 } |
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1102 |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1103 static void |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1104 proxy_do_write(gpointer data, gint source, GaimInputCondition cond) |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1105 { |
14097 | 1106 GaimProxyConnectInfo *connect_info = data; |
14096 | 1107 const guchar *request = connect_info->write_buffer + connect_info->written_len; |
1108 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
|
1109 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1110 int ret = write(source, request, request_len); |
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 if(ret < 0 && errno == EAGAIN) |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1113 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1114 else if(ret < 0) { |
14096 | 1115 gaim_input_remove(connect_info->inpa); |
1116 connect_info->inpa = 0; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1117 close(source); |
14096 | 1118 g_free(connect_info->write_buffer); |
1119 connect_info->write_buffer = NULL; | |
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 } else if (ret < request_len) { |
14096 | 1123 connect_info->written_len += ret; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1124 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1125 } |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1126 |
14096 | 1127 gaim_input_remove(connect_info->inpa); |
1128 g_free(connect_info->write_buffer); | |
1129 connect_info->write_buffer = NULL; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1130 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1131 /* register the response handler for the response */ |
14096 | 1132 connect_info->inpa = gaim_input_add(source, GAIM_INPUT_READ, connect_info->read_cb, connect_info); |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1133 } |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1134 |
3376 | 1135 #define HTTP_GOODSTRING "HTTP/1.0 200" |
1136 #define HTTP_GOODSTRING2 "HTTP/1.1 200" | |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1137 |
7834
99ffabc6ce73
[gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents:
7652
diff
changeset
|
1138 /* 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
|
1139 static void |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1140 http_canread(gpointer data, gint source, GaimInputCondition cond) |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1141 { |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1142 int len, headers_len, status = 0; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1143 gboolean error; |
14097 | 1144 GaimProxyConnectInfo *connect_info = data; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1145 guchar *p; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1146 gsize max_read; |
14089 | 1147 gchar *msg; |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1148 |
14096 | 1149 if(connect_info->read_buffer == NULL) { |
1150 connect_info->read_buf_len = 8192; | |
1151 connect_info->read_buffer = g_malloc(connect_info->read_buf_len); | |
1152 connect_info->read_len = 0; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1153 } |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1154 |
14096 | 1155 p = connect_info->read_buffer + connect_info->read_len; |
1156 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
|
1157 |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1158 len = read(source, p, max_read); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1159 if(len < 0 && errno == EAGAIN) |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1160 return; |
13786
5ddde4ad1ca2
[gaim-migrate @ 16198]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13752
diff
changeset
|
1161 else if(len <= 0) { |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1162 close(source); |
14096 | 1163 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
|
1164 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1165 } else { |
14096 | 1166 connect_info->read_len += len; |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1167 } |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1168 p[len] = '\0'; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1169 |
14096 | 1170 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
|
1171 *p = '\0'; |
14096 | 1172 headers_len = (p - connect_info->read_buffer) + 4; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1173 } else if(len == max_read) |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1174 headers_len = len; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1175 else |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1176 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1177 |
14096 | 1178 error = strncmp((const char *)connect_info->read_buffer, "HTTP/", 5) != 0; |
14089 | 1179 if (!error) |
1180 { | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1181 int major; |
14096 | 1182 p = connect_info->read_buffer + 5; |
13386 | 1183 major = strtol((const char *)p, (char **)&p, 10); |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1184 error = (major == 0) || (*p != '.'); |
4366 | 1185 if(!error) { |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1186 int minor; |
4366 | 1187 p++; |
13386 | 1188 minor = strtol((const char *)p, (char **)&p, 10); |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1189 error = (*p != ' '); |
4366 | 1190 if(!error) { |
1191 p++; | |
13386 | 1192 status = strtol((const char *)p, (char **)&p, 10); |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1193 error = (*p != ' '); |
4366 | 1194 } |
1195 } | |
1196 } | |
9129 | 1197 |
12391 | 1198 /* Read the contents */ |
14096 | 1199 p = (guchar *)g_strrstr((const gchar *)connect_info->read_buffer, "Content-Length: "); |
14089 | 1200 if (p != NULL) |
1201 { | |
12391 | 1202 gchar *tmp; |
1203 int len = 0; | |
1204 char tmpc; | |
1205 p += strlen("Content-Length: "); | |
13386 | 1206 tmp = strchr((const char *)p, '\r'); |
13404 | 1207 if(tmp) |
1208 *tmp = '\0'; | |
13386 | 1209 len = atoi((const char *)p); |
13404 | 1210 if(tmp) |
1211 *tmp = '\r'; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1212 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1213 /* Compensate for what has already been read */ |
14096 | 1214 len -= connect_info->read_len - headers_len; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1215 /* 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
|
1216 complaining / breaking since we don't read the whole page */ |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1217 while(len--) { |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1218 /* TODO: deal with EAGAIN (and other errors) better */ |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1219 if (read(source, &tmpc, 1) < 0 && errno != EAGAIN) |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1220 break; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1221 } |
12391 | 1222 } |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1223 |
14089 | 1224 if (error) |
1225 { | |
4366 | 1226 close(source); |
14089 | 1227 msg = g_strdup_printf("Unable to parse response from HTTP proxy: %s\n", |
14096 | 1228 connect_info->read_buffer); |
1229 gaim_proxy_connect_info_error(connect_info, msg); | |
14089 | 1230 g_free(msg); |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1231 return; |
14089 | 1232 } |
1233 else if (status != 200) | |
1234 { | |
10309 | 1235 gaim_debug_error("proxy", |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1236 "Proxy server replied with:\n%s\n", |
14096 | 1237 connect_info->read_buffer); |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1238 |
9129 | 1239 |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1240 if(status == 407 /* Proxy Auth */) { |
12391 | 1241 gchar *ntlm; |
14096 | 1242 if((ntlm = g_strrstr((const gchar *)connect_info->read_buffer, "Proxy-Authenticate: NTLM "))) { /* Check for Type-2 */ |
13698 | 1243 gchar *tmp = ntlm; |
1244 guint8 *nonce; | |
14096 | 1245 gchar *domain = (gchar*)gaim_proxy_info_get_username(connect_info->gpi); |
12391 | 1246 gchar *username; |
1247 gchar *request; | |
1248 gchar *response; | |
14089 | 1249 username = strchr(domain, '\\'); |
1250 if (username == NULL) | |
1251 { | |
12391 | 1252 close(source); |
14089 | 1253 msg = g_strdup_printf(_("HTTP proxy connection error %d"), status); |
14096 | 1254 gaim_proxy_connect_info_error(connect_info, msg); |
12391 | 1255 g_free(msg); |
1256 return; | |
1257 } | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1258 *username = '\0'; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1259 username++; |
12391 | 1260 ntlm += strlen("Proxy-Authenticate: NTLM "); |
13698 | 1261 while(*tmp != '\r' && *tmp != '\0') tmp++; |
1262 *tmp = '\0'; | |
13084 | 1263 nonce = gaim_ntlm_parse_type2(ntlm, NULL); |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1264 response = gaim_ntlm_gen_type3(username, |
14096 | 1265 (gchar*) gaim_proxy_info_get_password(connect_info->gpi), |
1266 (gchar*) gaim_proxy_info_get_host(connect_info->gpi), | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1267 domain, nonce, NULL); |
12391 | 1268 username--; |
1269 *username = '\\'; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1270 request = g_strdup_printf( |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1271 "CONNECT %s:%d HTTP/1.1\r\n" |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1272 "Host: %s:%d\r\n" |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1273 "Proxy-Authorization: NTLM %s\r\n" |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1274 "Proxy-Connection: Keep-Alive\r\n\r\n", |
14096 | 1275 connect_info->host, connect_info->port, connect_info->host, |
1276 connect_info->port, response); | |
12391 | 1277 g_free(response); |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1278 |
14096 | 1279 gaim_input_remove(connect_info->inpa); |
1280 g_free(connect_info->read_buffer); | |
1281 connect_info->read_buffer = NULL; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1282 |
14096 | 1283 connect_info->write_buffer = (guchar *)request; |
1284 connect_info->write_buf_len = strlen(request); | |
1285 connect_info->written_len = 0; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1286 |
14096 | 1287 connect_info->read_cb = http_canread; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1288 |
14096 | 1289 connect_info->inpa = gaim_input_add(source, |
1290 GAIM_INPUT_WRITE, proxy_do_write, connect_info); | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1291 |
14096 | 1292 proxy_do_write(connect_info, source, cond); |
12391 | 1293 return; |
14096 | 1294 } else if((ntlm = g_strrstr((const char *)connect_info->read_buffer, "Proxy-Authenticate: NTLM"))) { /* Empty message */ |
12391 | 1295 gchar request[2048]; |
14096 | 1296 gchar *domain = (gchar*) gaim_proxy_info_get_username(connect_info->gpi); |
12391 | 1297 gchar *username; |
1298 int request_len; | |
14089 | 1299 username = strchr(domain, '\\'); |
1300 if (username == NULL) | |
1301 { | |
12391 | 1302 close(source); |
14089 | 1303 msg = g_strdup_printf(_("HTTP proxy connection error %d"), status); |
14096 | 1304 gaim_proxy_connect_info_error(connect_info, msg); |
12391 | 1305 g_free(msg); |
1306 return; | |
1307 } | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1308 *username = '\0'; |
12391 | 1309 |
1310 request_len = g_snprintf(request, sizeof(request), | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1311 "CONNECT %s:%d HTTP/1.1\r\n" |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1312 "Host: %s:%d\r\n", |
14096 | 1313 connect_info->host, connect_info->port, |
1314 connect_info->host, connect_info->port); | |
12391 | 1315 |
1316 g_return_if_fail(request_len < sizeof(request)); | |
1317 request_len += g_snprintf(request + request_len, | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1318 sizeof(request) - request_len, |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1319 "Proxy-Authorization: NTLM %s\r\n" |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1320 "Proxy-Connection: Keep-Alive\r\n\r\n", |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1321 gaim_ntlm_gen_type1( |
14096 | 1322 (gchar*) gaim_proxy_info_get_host(connect_info->gpi), |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1323 domain)); |
12391 | 1324 *username = '\\'; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1325 |
14096 | 1326 gaim_input_remove(connect_info->inpa); |
1327 g_free(connect_info->read_buffer); | |
1328 connect_info->read_buffer = NULL; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1329 |
14096 | 1330 connect_info->write_buffer = g_memdup(request, request_len); |
1331 connect_info->write_buf_len = request_len; | |
1332 connect_info->written_len = 0; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1333 |
14096 | 1334 connect_info->read_cb = http_canread; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1335 |
14096 | 1336 connect_info->inpa = gaim_input_add(source, |
1337 GAIM_INPUT_WRITE, proxy_do_write, connect_info); | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1338 |
14096 | 1339 proxy_do_write(connect_info, source, cond); |
12391 | 1340 return; |
1341 } else { | |
1342 close(source); | |
14089 | 1343 msg = g_strdup_printf(_("HTTP proxy connection error %d"), status); |
14096 | 1344 gaim_proxy_connect_info_error(connect_info, msg); |
12391 | 1345 g_free(msg); |
13208
de4f1fb08088
[gaim-migrate @ 15572]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13200
diff
changeset
|
1346 return; |
12391 | 1347 } |
1348 } | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1349 if(status == 403 /* Forbidden */ ) { |
14096 | 1350 msg = g_strdup_printf(_("Access denied: HTTP proxy server forbids port %d tunnelling."), connect_info->port); |
1351 gaim_proxy_connect_info_error(connect_info, msg); | |
8917 | 1352 g_free(msg); |
1353 } else { | |
14089 | 1354 msg = g_strdup_printf(_("HTTP proxy connection error %d"), status); |
14096 | 1355 gaim_proxy_connect_info_error(connect_info, msg); |
7834
99ffabc6ce73
[gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents:
7652
diff
changeset
|
1356 g_free(msg); |
99ffabc6ce73
[gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents:
7652
diff
changeset
|
1357 } |
99ffabc6ce73
[gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents:
7652
diff
changeset
|
1358 } else { |
14096 | 1359 gaim_input_remove(connect_info->inpa); |
1360 connect_info->inpa = 0; | |
1361 g_free(connect_info->read_buffer); | |
1362 connect_info->read_buffer = NULL; | |
14089 | 1363 gaim_debug_info("proxy", "HTTP proxy connection established\n"); |
14096 | 1364 gaim_proxy_connect_info_connected(connect_info, source); |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1365 return; |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1366 } |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1367 } |
9129 | 1368 |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1369 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1370 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1371 static void |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1372 http_canwrite(gpointer data, gint source, GaimInputCondition cond) |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1373 { |
4366 | 1374 char request[8192]; |
1375 int request_len = 0; | |
14097 | 1376 GaimProxyConnectInfo *connect_info = data; |
12991
c1b2ba353e85
[gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents:
12977
diff
changeset
|
1377 socklen_t len; |
2048
3366311426df
[gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1881
diff
changeset
|
1378 int error = ETIMEDOUT; |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
1379 |
10309 | 1380 gaim_debug_info("http proxy", "Connected.\n"); |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
1381 |
14096 | 1382 if (connect_info->inpa > 0) |
14089 | 1383 { |
14096 | 1384 gaim_input_remove(connect_info->inpa); |
1385 connect_info->inpa = 0; | |
14089 | 1386 } |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1387 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1388 len = sizeof(error); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1389 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1390 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1391 close(source); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1392 |
14096 | 1393 try_connect(connect_info); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1394 return; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1395 } |
7834
99ffabc6ce73
[gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents:
7652
diff
changeset
|
1396 |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1397 gaim_debug_info("proxy", "using CONNECT tunnelling for %s:%d\n", |
14096 | 1398 connect_info->host, connect_info->port); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1399 request_len = g_snprintf(request, sizeof(request), |
7834
99ffabc6ce73
[gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents:
7652
diff
changeset
|
1400 "CONNECT %s:%d HTTP/1.1\r\nHost: %s:%d\r\n", |
14096 | 1401 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
|
1402 |
14096 | 1403 if (gaim_proxy_info_get_username(connect_info->gpi) != NULL) { |
1843
4dbd8533d209
[gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1840
diff
changeset
|
1404 char *t1, *t2; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1405 t1 = g_strdup_printf("%s:%s", |
14096 | 1406 gaim_proxy_info_get_username(connect_info->gpi), |
1407 gaim_proxy_info_get_password(connect_info->gpi) ? | |
1408 gaim_proxy_info_get_password(connect_info->gpi) : ""); | |
11143 | 1409 t2 = gaim_base64_encode((const guchar *)t1, strlen(t1)); |
1843
4dbd8533d209
[gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1840
diff
changeset
|
1410 g_free(t1); |
4366 | 1411 g_return_if_fail(request_len < sizeof(request)); |
13386 | 1412 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1413 request_len += g_snprintf(request + request_len, |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1414 sizeof(request) - request_len, |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1415 "Proxy-Authorization: Basic %s\r\n" |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1416 "Proxy-Authorization: NTLM %s\r\n" |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1417 "Proxy-Connection: Keep-Alive\r\n", t2, |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1418 gaim_ntlm_gen_type1( |
14096 | 1419 (gchar*)gaim_proxy_info_get_host(connect_info->gpi),"")); |
1843
4dbd8533d209
[gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1840
diff
changeset
|
1420 g_free(t2); |
4dbd8533d209
[gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1840
diff
changeset
|
1421 } |
4dbd8533d209
[gaim-migrate @ 1853]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1840
diff
changeset
|
1422 |
4366 | 1423 g_return_if_fail(request_len < sizeof(request)); |
1424 strcpy(request + request_len, "\r\n"); | |
1425 request_len += 2; | |
14096 | 1426 connect_info->write_buffer = g_memdup(request, request_len); |
1427 connect_info->write_buf_len = request_len; | |
1428 connect_info->written_len = 0; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1429 |
14096 | 1430 connect_info->read_cb = http_canread; |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1431 |
14096 | 1432 connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, |
1433 connect_info); | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1434 |
14096 | 1435 proxy_do_write(connect_info, source, cond); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1436 } |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1437 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1438 static int |
14097 | 1439 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
|
1440 { |
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1441 int fd = -1; |
1 | 1442 |
10309 | 1443 gaim_debug_info("http proxy", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
1444 "Connecting to %s:%d via %s:%d using HTTP\n", |
14096 | 1445 (connect_info->host ? connect_info->host : "(null)"), connect_info->port, |
1446 (gaim_proxy_info_get_host(connect_info->gpi) ? gaim_proxy_info_get_host(connect_info->gpi) : "(null)"), | |
1447 gaim_proxy_info_get_port(connect_info->gpi)); | |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1448 |
4366 | 1449 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) { |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1450 return -1; |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1451 } |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1452 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1453 fcntl(fd, F_SETFL, O_NONBLOCK); |
10172 | 1454 #ifndef _WIN32 |
10170 | 1455 fcntl(fd, F_SETFD, FD_CLOEXEC); |
10172 | 1456 #endif |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
1457 |
4366 | 1458 if (connect(fd, addr, addrlen) < 0) { |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1459 if ((errno == EINPROGRESS) || (errno == EINTR)) { |
10309 | 1460 gaim_debug_warning("http proxy", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
1461 "Connect would have blocked.\n"); |
9655 | 1462 |
14096 | 1463 if (connect_info->port != 80) { |
7834
99ffabc6ce73
[gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents:
7652
diff
changeset
|
1464 /* we need to do CONNECT first */ |
14096 | 1465 connect_info->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, |
1466 http_canwrite, connect_info); | |
7834
99ffabc6ce73
[gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents:
7652
diff
changeset
|
1467 } else { |
14089 | 1468 gaim_debug_info("proxy", "HTTP proxy connection established\n"); |
14096 | 1469 gaim_proxy_connect_info_connected(connect_info, fd); |
7834
99ffabc6ce73
[gaim-migrate @ 8487]
Christian Hammond <chipx86@chipx86.com>
parents:
7652
diff
changeset
|
1470 } |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1471 } else { |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1472 close(fd); |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1473 return -1; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1474 } |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1475 } |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1476 else { |
12991
c1b2ba353e85
[gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents:
12977
diff
changeset
|
1477 socklen_t len; |
2048
3366311426df
[gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1881
diff
changeset
|
1478 int error = ETIMEDOUT; |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
1479 |
10309 | 1480 gaim_debug_misc("http proxy", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
1481 "Connect didn't block.\n"); |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
1482 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1483 len = sizeof(error); |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1484 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1485 close(fd); |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1486 return -1; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1487 } |
14096 | 1488 http_canwrite(connect_info, fd, GAIM_INPUT_WRITE); |
1695
c0ab844d4790
[gaim-migrate @ 1705]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1451
diff
changeset
|
1489 } |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1490 |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1491 return fd; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1492 } |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1493 |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1494 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1495 static void |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1496 s4_canread(gpointer data, gint source, GaimInputCondition cond) |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1497 { |
14097 | 1498 GaimProxyConnectInfo *connect_info = data; |
13386 | 1499 guchar *buf; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1500 int len, max_read; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1501 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1502 /* 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
|
1503 * be correct, we deal with the unlikely scenario */ |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1504 |
14096 | 1505 if (connect_info->read_buffer == NULL) { |
1506 connect_info->read_buf_len = 12; | |
1507 connect_info->read_buffer = g_malloc(connect_info->read_buf_len); | |
1508 connect_info->read_len = 0; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1509 } |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1510 |
14096 | 1511 buf = connect_info->read_buffer + connect_info->read_len; |
1512 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
|
1513 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1514 len = read(source, buf, max_read); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1515 |
14096 | 1516 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
|
1517 return; |
14096 | 1518 else if (len + connect_info->read_len >= 4) { |
1519 if (connect_info->read_buffer[1] == 90) { | |
1520 gaim_proxy_connect_info_connected(connect_info, source); | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1521 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1522 } |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1523 } |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1524 |
14096 | 1525 gaim_input_remove(connect_info->inpa); |
1526 connect_info->inpa = 0; | |
1527 g_free(connect_info->read_buffer); | |
1528 connect_info->read_buffer = NULL; | |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1529 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1530 close(source); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1531 |
14096 | 1532 try_connect(connect_info); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1533 } |
1705
b4d454e5ee31
[gaim-migrate @ 1715]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1695
diff
changeset
|
1534 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1535 static void |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1536 s4_canwrite(gpointer data, gint source, GaimInputCondition cond) |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1537 { |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1538 unsigned char packet[9]; |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1539 struct hostent *hp; |
14097 | 1540 GaimProxyConnectInfo *connect_info = data; |
12991
c1b2ba353e85
[gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents:
12977
diff
changeset
|
1541 socklen_t len; |
2048
3366311426df
[gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1881
diff
changeset
|
1542 int error = ETIMEDOUT; |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
1543 |
11033
50224ac8184d
[gaim-migrate @ 12919]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10917
diff
changeset
|
1544 gaim_debug_info("socks4 proxy", "Connected.\n"); |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
1545 |
14096 | 1546 if (connect_info->inpa > 0) |
14089 | 1547 { |
14096 | 1548 gaim_input_remove(connect_info->inpa); |
1549 connect_info->inpa = 0; | |
14089 | 1550 } |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1551 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1552 len = sizeof(error); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1553 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1554 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1555 close(source); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1556 |
14096 | 1557 try_connect(connect_info); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1558 return; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1559 } |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
1560 |
10561 | 1561 /* |
1562 * The socks4 spec doesn't include support for doing host name | |
1563 * lookups by the proxy. Some socks4 servers do this via | |
1564 * extensions to the protocol. Since we don't know if a | |
1565 * server supports this, it would need to be implemented | |
1566 * with an option, or some detection mechanism - in the | |
1567 * meantime, stick with plain old SOCKS4. | |
1568 */ | |
14096 | 1569 if (!(hp = gethostbyname(connect_info->host))) { |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1570 close(source); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1571 |
14096 | 1572 try_connect(connect_info); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1573 return; |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1574 } |
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1575 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1576 packet[0] = 4; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1577 packet[1] = 1; |
14096 | 1578 packet[2] = connect_info->port >> 8; |
1579 packet[3] = connect_info->port & 0xff; | |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1580 packet[4] = (unsigned char)(hp->h_addr_list[0])[0]; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1581 packet[5] = (unsigned char)(hp->h_addr_list[0])[1]; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1582 packet[6] = (unsigned char)(hp->h_addr_list[0])[2]; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1583 packet[7] = (unsigned char)(hp->h_addr_list[0])[3]; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1584 packet[8] = 0; |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
1585 |
14096 | 1586 connect_info->write_buffer = g_memdup(packet, sizeof(packet)); |
1587 connect_info->write_buf_len = sizeof(packet); | |
1588 connect_info->written_len = 0; | |
1589 connect_info->read_cb = s4_canread; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1590 |
14096 | 1591 connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, connect_info); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1592 |
14096 | 1593 proxy_do_write(connect_info, source, cond); |
1 | 1594 } |
1595 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1596 static int |
14097 | 1597 proxy_connect_socks4(GaimProxyConnectInfo *connect_info, struct sockaddr *addr, socklen_t addrlen) |
1 | 1598 { |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1599 int fd = -1; |
1 | 1600 |
10309 | 1601 gaim_debug_info("socks4 proxy", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
1602 "Connecting to %s:%d via %s:%d using SOCKS4\n", |
14096 | 1603 connect_info->host, connect_info->port, |
1604 gaim_proxy_info_get_host(connect_info->gpi), | |
1605 gaim_proxy_info_get_port(connect_info->gpi)); | |
1 | 1606 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1607 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1608 return -1; |
1 | 1609 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1610 fcntl(fd, F_SETFL, O_NONBLOCK); |
10172 | 1611 #ifndef _WIN32 |
10170 | 1612 fcntl(fd, F_SETFD, FD_CLOEXEC); |
10172 | 1613 #endif |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1614 |
4366 | 1615 if (connect(fd, addr, addrlen) < 0) { |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1616 if ((errno == EINPROGRESS) || (errno == EINTR)) { |
10309 | 1617 gaim_debug_warning("socks4 proxy", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
1618 "Connect would have blocked.\n"); |
14096 | 1619 connect_info->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s4_canwrite, connect_info); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1620 } |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1621 else { |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1622 close(fd); |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1623 return -1; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1624 } |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1625 } else { |
12991
c1b2ba353e85
[gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents:
12977
diff
changeset
|
1626 socklen_t len; |
2048
3366311426df
[gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1881
diff
changeset
|
1627 int error = ETIMEDOUT; |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
1628 |
10309 | 1629 gaim_debug_misc("socks4 proxy", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
1630 "Connect didn't block.\n"); |
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
1631 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1632 len = sizeof(error); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1633 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1634 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1635 close(fd); |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1636 return -1; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1637 } |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1638 |
14096 | 1639 s4_canwrite(connect_info, fd, GAIM_INPUT_WRITE); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1640 } |
670
9e51c1a4abba
[gaim-migrate @ 680]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
664
diff
changeset
|
1641 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1642 return fd; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1643 } |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1644 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1645 static void |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1646 s5_canread_again(gpointer data, gint source, GaimInputCondition cond) |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1647 { |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1648 guchar *dest, *buf; |
14097 | 1649 GaimProxyConnectInfo *connect_info = data; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1650 int len; |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1651 |
14096 | 1652 if (connect_info->read_buffer == NULL) { |
1653 connect_info->read_buf_len = 512; | |
1654 connect_info->read_buffer = g_malloc(connect_info->read_buf_len); | |
1655 connect_info->read_len = 0; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1656 } |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1657 |
14096 | 1658 dest = connect_info->read_buffer + connect_info->read_len; |
1659 buf = connect_info->read_buffer; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1660 |
10309 | 1661 gaim_debug_info("socks5 proxy", "Able to read again.\n"); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1662 |
14096 | 1663 len = read(source, 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
|
1664 if(len < 0 && errno == EAGAIN) |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1665 return; |
13786
5ddde4ad1ca2
[gaim-migrate @ 16198]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13752
diff
changeset
|
1666 else if(len <= 0) { |
10309 | 1667 gaim_debug_warning("socks5 proxy", "or not...\n"); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1668 close(source); |
14096 | 1669 gaim_input_remove(connect_info->inpa); |
1670 connect_info->inpa = 0; | |
1671 g_free(connect_info->read_buffer); | |
1672 connect_info->read_buffer = NULL; | |
1673 try_connect(connect_info); | |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1674 return; |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1675 } |
14096 | 1676 connect_info->read_len += len; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1677 |
14096 | 1678 if(connect_info->read_len < 4) |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1679 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1680 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1681 if ((buf[0] != 0x05) || (buf[1] != 0x00)) { |
7982 | 1682 if ((buf[0] == 0x05) && (buf[1] < 0x09)) |
10309 | 1683 gaim_debug_error("socks5 proxy", socks5errors[buf[1]]); |
7982 | 1684 else |
10309 | 1685 gaim_debug_error("socks5 proxy", "Bad data.\n"); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1686 close(source); |
14096 | 1687 gaim_input_remove(connect_info->inpa); |
1688 connect_info->inpa = 0; | |
1689 g_free(connect_info->read_buffer); | |
1690 connect_info->read_buffer = NULL; | |
1691 try_connect(connect_info); | |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1692 return; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1693 } |
670
9e51c1a4abba
[gaim-migrate @ 680]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
664
diff
changeset
|
1694 |
8262 | 1695 /* Skip past BND.ADDR */ |
1696 switch(buf[3]) { | |
1697 case 0x01: /* the address is a version-4 IP address, with a length of 4 octets */ | |
14096 | 1698 if(connect_info->read_len < 4 + 4) |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1699 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1700 buf += 4 + 4; |
8262 | 1701 break; |
1702 case 0x03: /* the address field contains a fully-qualified domain name. The first | |
1703 octet of the address field contains the number of octets of name that | |
1704 follow, there is no terminating NUL octet. */ | |
14096 | 1705 if(connect_info->read_len < 4 + 1) |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1706 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1707 buf += 4 + 1; |
14096 | 1708 if(connect_info->read_len < 4 + 1 + buf[0]) |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1709 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1710 buf += buf[0]; |
8262 | 1711 break; |
1712 case 0x04: /* the address is a version-6 IP address, with a length of 16 octets */ | |
14096 | 1713 if(connect_info->read_len < 4 + 16) |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1714 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1715 buf += 4 + 16; |
8262 | 1716 break; |
1717 } | |
1718 | |
14096 | 1719 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
|
1720 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1721 |
8262 | 1722 /* Skip past BND.PORT */ |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1723 buf += 2; |
8262 | 1724 |
14096 | 1725 gaim_proxy_connect_info_connected(connect_info, source); |
1 | 1726 } |
1727 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1728 static void |
14089 | 1729 s5_sendconnect(gpointer data, int source) |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1730 { |
14097 | 1731 GaimProxyConnectInfo *connect_info = data; |
14096 | 1732 int hlen = strlen(connect_info->host); |
1733 connect_info->write_buf_len = 5 + hlen + 2; | |
1734 connect_info->write_buffer = g_malloc(connect_info->write_buf_len); | |
1735 connect_info->written_len = 0; | |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1736 |
14096 | 1737 connect_info->write_buffer[0] = 0x05; |
1738 connect_info->write_buffer[1] = 0x01; /* CONNECT */ | |
1739 connect_info->write_buffer[2] = 0x00; /* reserved */ | |
1740 connect_info->write_buffer[3] = 0x03; /* address type -- host name */ | |
1741 connect_info->write_buffer[4] = hlen; | |
1742 memcpy(connect_info->write_buffer + 5, connect_info->host, hlen); | |
1743 connect_info->write_buffer[5 + hlen] = connect_info->port >> 8; | |
1744 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
|
1745 |
14096 | 1746 connect_info->read_cb = s5_canread_again; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1747 |
14096 | 1748 connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, connect_info); |
1749 proxy_do_write(connect_info, source, GAIM_INPUT_WRITE); | |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
1750 } |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
1751 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1752 static void |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1753 s5_readauth(gpointer data, gint source, GaimInputCondition cond) |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
1754 { |
14097 | 1755 GaimProxyConnectInfo *connect_info = data; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1756 int len; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1757 |
14096 | 1758 if (connect_info->read_buffer == NULL) { |
1759 connect_info->read_buf_len = 2; | |
1760 connect_info->read_buffer = g_malloc(connect_info->read_buf_len); | |
1761 connect_info->read_len = 0; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1762 } |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1763 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1764 gaim_debug_info("socks5 proxy", "Got auth response.\n"); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1765 |
14096 | 1766 len = read(source, connect_info->read_buffer + connect_info->read_len, |
1767 connect_info->read_buf_len - connect_info->read_len); | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1768 if(len < 0 && errno == EAGAIN) |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1769 return; |
13786
5ddde4ad1ca2
[gaim-migrate @ 16198]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13752
diff
changeset
|
1770 else if(len <= 0) { |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1771 close(source); |
14096 | 1772 gaim_input_remove(connect_info->inpa); |
1773 connect_info->inpa = 0; | |
1774 g_free(connect_info->read_buffer); | |
1775 connect_info->read_buffer = NULL; | |
1776 try_connect(connect_info); | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1777 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1778 } |
14096 | 1779 connect_info->read_len += len; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1780 |
14096 | 1781 if (connect_info->read_len < 2) |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1782 return; |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
1783 |
14096 | 1784 gaim_input_remove(connect_info->inpa); |
1785 connect_info->inpa = 0; | |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
1786 |
14096 | 1787 if ((connect_info->read_buffer[0] != 0x01) || (connect_info->read_buffer[1] != 0x00)) { |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
1788 close(source); |
14096 | 1789 g_free(connect_info->read_buffer); |
1790 connect_info->read_buffer = NULL; | |
1791 try_connect(connect_info); | |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
1792 return; |
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
1793 } |
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
1794 |
14096 | 1795 g_free(connect_info->read_buffer); |
1796 connect_info->read_buffer = NULL; | |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
1797 |
14096 | 1798 s5_sendconnect(connect_info, source); |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
1799 } |
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
1800 |
14097 | 1801 static void |
1802 hmacmd5_chap(const unsigned char * challenge, int challen, const char * passwd, unsigned char * response) | |
10561 | 1803 { |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10626
diff
changeset
|
1804 GaimCipher *cipher; |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10626
diff
changeset
|
1805 GaimCipherContext *ctx; |
10561 | 1806 int i; |
1807 unsigned char Kxoripad[65]; | |
1808 unsigned char Kxoropad[65]; | |
1809 int pwlen; | |
1810 | |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10626
diff
changeset
|
1811 cipher = gaim_ciphers_find_cipher("md5"); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10626
diff
changeset
|
1812 ctx = gaim_cipher_context_new(cipher, NULL); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10626
diff
changeset
|
1813 |
12765 | 1814 memset(Kxoripad,0,sizeof(Kxoripad)); |
1815 memset(Kxoropad,0,sizeof(Kxoropad)); | |
1816 | |
10561 | 1817 pwlen=strlen(passwd); |
1818 if (pwlen>64) { | |
11183 | 1819 gaim_cipher_context_append(ctx, (const guchar *)passwd, strlen(passwd)); |
12765 | 1820 gaim_cipher_context_digest(ctx, sizeof(Kxoripad), Kxoripad, NULL); |
10561 | 1821 pwlen=16; |
12765 | 1822 } else { |
1823 memcpy(Kxoripad, passwd, pwlen); | |
10561 | 1824 } |
12765 | 1825 memcpy(Kxoropad,Kxoripad,pwlen); |
10561 | 1826 |
1827 for (i=0;i<64;i++) { | |
1828 Kxoripad[i]^=0x36; | |
1829 Kxoropad[i]^=0x5c; | |
1830 } | |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10626
diff
changeset
|
1831 |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10626
diff
changeset
|
1832 gaim_cipher_context_reset(ctx, NULL); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10626
diff
changeset
|
1833 gaim_cipher_context_append(ctx, Kxoripad, 64); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10626
diff
changeset
|
1834 gaim_cipher_context_append(ctx, challenge, challen); |
10687
b256ce6b85b8
[gaim-migrate @ 12235]
Etan Reisner <pidgin@unreliablesource.net>
parents:
10684
diff
changeset
|
1835 gaim_cipher_context_digest(ctx, sizeof(Kxoripad), Kxoripad, NULL); |
10561 | 1836 |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10626
diff
changeset
|
1837 gaim_cipher_context_reset(ctx, NULL); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10626
diff
changeset
|
1838 gaim_cipher_context_append(ctx, Kxoropad, 64); |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10626
diff
changeset
|
1839 gaim_cipher_context_append(ctx, Kxoripad, 16); |
12765 | 1840 gaim_cipher_context_digest(ctx, 16, response, NULL); |
10684
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10626
diff
changeset
|
1841 |
72a5babfa8b4
[gaim-migrate @ 12231]
Luke Schierer <lschiere@pidgin.im>
parents:
10626
diff
changeset
|
1842 gaim_cipher_context_destroy(ctx); |
10561 | 1843 } |
1844 | |
1845 static void | |
1846 s5_readchap(gpointer data, gint source, GaimInputCondition cond) | |
1847 { | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1848 guchar *cmdbuf, *buf; |
14097 | 1849 GaimProxyConnectInfo *connect_info = data; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1850 int len, navas, currentav; |
10561 | 1851 |
1852 gaim_debug(GAIM_DEBUG_INFO, "socks5 proxy", "Got CHAP response.\n"); | |
1853 | |
14096 | 1854 if (connect_info->read_buffer == NULL) { |
1855 connect_info->read_buf_len = 20; | |
1856 connect_info->read_buffer = g_malloc(connect_info->read_buf_len); | |
1857 connect_info->read_len = 0; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1858 } |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1859 |
14096 | 1860 len = read(source, connect_info->read_buffer + connect_info->read_len, |
1861 connect_info->read_buf_len - connect_info->read_len); | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1862 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1863 if(len < 0 && errno == EAGAIN) |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1864 return; |
13786
5ddde4ad1ca2
[gaim-migrate @ 16198]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13752
diff
changeset
|
1865 else if(len <= 0) { |
10561 | 1866 close(source); |
14096 | 1867 gaim_input_remove(connect_info->inpa); |
1868 connect_info->inpa = 0; | |
1869 g_free(connect_info->read_buffer); | |
1870 connect_info->read_buffer = NULL; | |
1871 try_connect(connect_info); | |
10561 | 1872 return; |
1873 } | |
14096 | 1874 connect_info->read_len += len; |
10561 | 1875 |
14096 | 1876 if (connect_info->read_len < 2) |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1877 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1878 |
14096 | 1879 cmdbuf = connect_info->read_buffer; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1880 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1881 if (*cmdbuf != 0x01) { |
10561 | 1882 close(source); |
14096 | 1883 gaim_input_remove(connect_info->inpa); |
1884 connect_info->inpa = 0; | |
1885 g_free(connect_info->read_buffer); | |
1886 connect_info->read_buffer = NULL; | |
1887 try_connect(connect_info); | |
10561 | 1888 return; |
1889 } | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1890 cmdbuf++; |
10561 | 1891 |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1892 navas = *cmdbuf; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1893 cmdbuf++; |
10561 | 1894 |
1895 for (currentav = 0; currentav < navas; currentav++) { | |
14096 | 1896 if (connect_info->read_len - (cmdbuf - connect_info->read_buffer) < 2) |
10561 | 1897 return; |
14096 | 1898 if (connect_info->read_len - (cmdbuf - connect_info->read_buffer) < cmdbuf[1]) |
10561 | 1899 return; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1900 buf = cmdbuf + 2; |
10561 | 1901 switch (cmdbuf[0]) { |
1902 case 0x00: | |
1903 /* Did auth work? */ | |
1904 if (buf[0] == 0x00) { | |
14096 | 1905 gaim_input_remove(connect_info->inpa); |
1906 connect_info->inpa = 0; | |
1907 g_free(connect_info->read_buffer); | |
1908 connect_info->read_buffer = NULL; | |
10561 | 1909 /* Success */ |
14096 | 1910 s5_sendconnect(connect_info, source); |
10613 | 1911 return; |
10561 | 1912 } else { |
1913 /* Failure */ | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1914 gaim_debug_warning("proxy", |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1915 "socks5 CHAP authentication " |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1916 "failed. Disconnecting..."); |
10561 | 1917 close(source); |
14096 | 1918 gaim_input_remove(connect_info->inpa); |
1919 connect_info->inpa = 0; | |
1920 g_free(connect_info->read_buffer); | |
1921 connect_info->read_buffer = NULL; | |
1922 try_connect(connect_info); | |
10561 | 1923 return; |
1924 } | |
1925 break; | |
1926 case 0x03: | |
1927 /* Server wants our credentials */ | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1928 |
14096 | 1929 connect_info->write_buf_len = 16 + 4; |
1930 connect_info->write_buffer = g_malloc(connect_info->write_buf_len); | |
1931 connect_info->written_len = 0; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1932 |
10561 | 1933 hmacmd5_chap(buf, cmdbuf[1], |
14096 | 1934 gaim_proxy_info_get_password(connect_info->gpi), |
1935 connect_info->write_buffer + 4); | |
1936 connect_info->write_buffer[0] = 0x01; | |
1937 connect_info->write_buffer[1] = 0x01; | |
1938 connect_info->write_buffer[2] = 0x04; | |
1939 connect_info->write_buffer[3] = 0x10; | |
10561 | 1940 |
14096 | 1941 gaim_input_remove(connect_info->inpa); |
1942 g_free(connect_info->read_buffer); | |
1943 connect_info->read_buffer = NULL; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1944 |
14096 | 1945 connect_info->read_cb = s5_readchap; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1946 |
14096 | 1947 connect_info->inpa = gaim_input_add(source, |
1948 GAIM_INPUT_WRITE, proxy_do_write, connect_info); | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1949 |
14096 | 1950 proxy_do_write(connect_info, source, GAIM_INPUT_WRITE); |
10561 | 1951 break; |
1952 case 0x11: | |
1953 /* Server wants to select an algorithm */ | |
1954 if (buf[0] != 0x85) { | |
1955 /* Only currently support HMAC-MD5 */ | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1956 gaim_debug_warning("proxy", |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1957 "Server tried to select an " |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1958 "algorithm that we did not advertise " |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1959 "as supporting. This is a violation " |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1960 "of the socks5 CHAP specification. " |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1961 "Disconnecting..."); |
10561 | 1962 close(source); |
14096 | 1963 gaim_input_remove(connect_info->inpa); |
1964 connect_info->inpa = 0; | |
1965 g_free(connect_info->read_buffer); | |
1966 connect_info->read_buffer = NULL; | |
1967 try_connect(connect_info); | |
10561 | 1968 return; |
1969 } | |
1970 break; | |
1971 } | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1972 cmdbuf = buf + cmdbuf[1]; |
10561 | 1973 } |
1974 /* Fell through. We ran out of CHAP events to process, but haven't | |
1975 * succeeded or failed authentication - there may be more to come. | |
1976 * If this is the case, come straight back here. */ | |
1977 } | |
1978 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1979 static void |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
1980 s5_canread(gpointer data, gint source, GaimInputCondition cond) |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
1981 { |
14097 | 1982 GaimProxyConnectInfo *connect_info = data; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1983 int len; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1984 |
14096 | 1985 if (connect_info->read_buffer == NULL) { |
1986 connect_info->read_buf_len = 2; | |
1987 connect_info->read_buffer = g_malloc(connect_info->read_buf_len); | |
1988 connect_info->read_len = 0; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1989 } |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1990 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1991 gaim_debug_info("socks5 proxy", "Able to read.\n"); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1992 |
14096 | 1993 len = read(source, connect_info->read_buffer + connect_info->read_len, |
1994 connect_info->read_buf_len - connect_info->read_len); | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1995 if(len < 0 && errno == EAGAIN) |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1996 return; |
13786
5ddde4ad1ca2
[gaim-migrate @ 16198]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13752
diff
changeset
|
1997 else if(len <= 0) { |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
1998 close(source); |
14096 | 1999 gaim_input_remove(connect_info->inpa); |
2000 connect_info->inpa = 0; | |
2001 g_free(connect_info->read_buffer); | |
2002 connect_info->read_buffer = NULL; | |
2003 try_connect(connect_info); | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2004 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2005 } |
14096 | 2006 connect_info->read_len += len; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2007 |
14096 | 2008 if (connect_info->read_len < 2) |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2009 return; |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
2010 |
14096 | 2011 gaim_input_remove(connect_info->inpa); |
2012 connect_info->inpa = 0; | |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
2013 |
14096 | 2014 if ((connect_info->read_buffer[0] != 0x05) || (connect_info->read_buffer[1] == 0xff)) { |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
2015 close(source); |
14096 | 2016 g_free(connect_info->read_buffer); |
2017 connect_info->read_buffer = NULL; | |
2018 try_connect(connect_info); | |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
2019 return; |
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
2020 } |
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
2021 |
14096 | 2022 if (connect_info->read_buffer[1] == 0x02) { |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2023 gsize i, j; |
10912 | 2024 const char *u, *p; |
9129 | 2025 |
14096 | 2026 u = gaim_proxy_info_get_username(connect_info->gpi); |
2027 p = gaim_proxy_info_get_password(connect_info->gpi); | |
10912 | 2028 |
2029 i = (u == NULL) ? 0 : strlen(u); | |
2030 j = (p == NULL) ? 0 : strlen(p); | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2031 |
14096 | 2032 connect_info->write_buf_len = 1 + 1 + i + 1 + j; |
2033 connect_info->write_buffer = g_malloc(connect_info->write_buf_len); | |
2034 connect_info->written_len = 0; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2035 |
14096 | 2036 connect_info->write_buffer[0] = 0x01; /* version 1 */ |
2037 connect_info->write_buffer[1] = i; | |
10917 | 2038 if (u != NULL) |
14096 | 2039 memcpy(connect_info->write_buffer + 2, u, i); |
2040 connect_info->write_buffer[2 + i] = j; | |
10917 | 2041 if (p != NULL) |
14096 | 2042 memcpy(connect_info->write_buffer + 2 + i + 1, p, j); |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
2043 |
14096 | 2044 g_free(connect_info->read_buffer); |
2045 connect_info->read_buffer = NULL; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2046 |
14096 | 2047 connect_info->read_cb = s5_readauth; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2048 |
14096 | 2049 connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, |
2050 proxy_do_write, connect_info); | |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
2051 |
14096 | 2052 proxy_do_write(connect_info, source, GAIM_INPUT_WRITE); |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2053 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2054 return; |
14096 | 2055 } else if (connect_info->read_buffer[1] == 0x03) { |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2056 gsize userlen; |
14096 | 2057 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
|
2058 |
14096 | 2059 connect_info->write_buf_len = 7 + userlen; |
2060 connect_info->write_buffer = g_malloc(connect_info->write_buf_len); | |
2061 connect_info->written_len = 0; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2062 |
14096 | 2063 connect_info->write_buffer[0] = 0x01; |
2064 connect_info->write_buffer[1] = 0x02; | |
2065 connect_info->write_buffer[2] = 0x11; | |
2066 connect_info->write_buffer[3] = 0x01; | |
2067 connect_info->write_buffer[4] = 0x85; | |
2068 connect_info->write_buffer[5] = 0x02; | |
2069 connect_info->write_buffer[6] = userlen; | |
2070 memcpy(connect_info->write_buffer + 7, | |
2071 gaim_proxy_info_get_username(connect_info->gpi), userlen); | |
10561 | 2072 |
14096 | 2073 g_free(connect_info->read_buffer); |
2074 connect_info->read_buffer = NULL; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2075 |
14096 | 2076 connect_info->read_cb = s5_readchap; |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2077 |
14096 | 2078 connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, |
2079 proxy_do_write, connect_info); | |
10561 | 2080 |
14096 | 2081 proxy_do_write(connect_info, source, GAIM_INPUT_WRITE); |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2082 |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2083 return; |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2084 } else { |
14096 | 2085 g_free(connect_info->read_buffer); |
2086 connect_info->read_buffer = NULL; | |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2087 |
14096 | 2088 s5_sendconnect(connect_info, source); |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
2089 } |
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
2090 } |
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
2091 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2092 static void |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2093 s5_canwrite(gpointer data, gint source, GaimInputCondition cond) |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2094 { |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2095 unsigned char buf[5]; |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2096 int i; |
14097 | 2097 GaimProxyConnectInfo *connect_info = data; |
12991
c1b2ba353e85
[gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents:
12977
diff
changeset
|
2098 socklen_t len; |
2048
3366311426df
[gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1881
diff
changeset
|
2099 int error = ETIMEDOUT; |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
2100 |
10309 | 2101 gaim_debug_info("socks5 proxy", "Connected.\n"); |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
2102 |
14096 | 2103 if (connect_info->inpa > 0) |
14089 | 2104 { |
14096 | 2105 gaim_input_remove(connect_info->inpa); |
2106 connect_info->inpa = 0; | |
14089 | 2107 } |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2108 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2109 len = sizeof(error); |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2110 if (getsockopt(source, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2111 close(source); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2112 |
14096 | 2113 try_connect(connect_info); |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2114 return; |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
2115 } |
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
2116 |
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
2117 i = 0; |
1252
46c09828e929
[gaim-migrate @ 1262]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1087
diff
changeset
|
2118 buf[0] = 0x05; /* SOCKS version 5 */ |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2119 |
14096 | 2120 if (gaim_proxy_info_get_username(connect_info->gpi) != NULL) { |
10561 | 2121 buf[1] = 0x03; /* three methods */ |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
2122 buf[2] = 0x00; /* no authentication */ |
10561 | 2123 buf[3] = 0x03; /* CHAP authentication */ |
2124 buf[4] = 0x02; /* username/password authentication */ | |
2125 i = 5; | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2126 } |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2127 else { |
1844
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
2128 buf[1] = 0x01; |
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
2129 buf[2] = 0x00; |
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
2130 i = 3; |
9845deede1e9
[gaim-migrate @ 1854]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1843
diff
changeset
|
2131 } |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
2132 |
14096 | 2133 connect_info->write_buf_len = i; |
2134 connect_info->write_buffer = g_malloc(connect_info->write_buf_len); | |
2135 memcpy(connect_info->write_buffer, buf, i); | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2136 |
14096 | 2137 connect_info->read_cb = s5_canread; |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
2138 |
14096 | 2139 connect_info->inpa = gaim_input_add(source, GAIM_INPUT_WRITE, proxy_do_write, connect_info); |
2140 proxy_do_write(connect_info, source, GAIM_INPUT_WRITE); | |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2141 } |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
2142 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2143 static int |
14097 | 2144 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
|
2145 { |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2146 int fd = -1; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2147 |
10309 | 2148 gaim_debug_info("socks5 proxy", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
2149 "Connecting to %s:%d via %s:%d using SOCKS5\n", |
14096 | 2150 connect_info->host, connect_info->port, |
2151 gaim_proxy_info_get_host(connect_info->gpi), | |
2152 gaim_proxy_info_get_port(connect_info->gpi)); | |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2153 |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2154 if ((fd = socket(addr->sa_family, SOCK_STREAM, 0)) < 0) |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
2155 return -1; |
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
2156 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2157 fcntl(fd, F_SETFL, O_NONBLOCK); |
10172 | 2158 #ifndef _WIN32 |
10170 | 2159 fcntl(fd, F_SETFD, FD_CLOEXEC); |
10172 | 2160 #endif |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2161 |
4366 | 2162 if (connect(fd, addr, addrlen) < 0) { |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2163 if ((errno == EINPROGRESS) || (errno == EINTR)) { |
10309 | 2164 gaim_debug_warning("socks5 proxy", |
5211
0241d6b6702d
[gaim-migrate @ 5581]
Christian Hammond <chipx86@chipx86.com>
parents:
4993
diff
changeset
|
2165 "Connect would have blocked.\n"); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2166 |
14096 | 2167 connect_info->inpa = gaim_input_add(fd, GAIM_INPUT_WRITE, s5_canwrite, connect_info); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2168 } |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2169 else { |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2170 close(fd); |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2171 return -1; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2172 } |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2173 } |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2174 else { |
12991
c1b2ba353e85
[gaim-migrate @ 15344]
Richard Laager <rlaager@wiktel.com>
parents:
12977
diff
changeset
|
2175 socklen_t len; |
2048
3366311426df
[gaim-migrate @ 2058]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1881
diff
changeset
|
2176 int error = ETIMEDOUT; |
3717
988485669631
[gaim-migrate @ 3850]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
3630
diff
changeset
|
2177 |
14097 | 2178 gaim_debug_misc("socks5 proxy", "Connect didn't block.\n"); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2179 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2180 len = sizeof(error); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2181 |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2182 if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) { |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2183 close(fd); |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2184 return -1; |
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2185 } |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2186 |
14096 | 2187 s5_canwrite(connect_info, fd, GAIM_INPUT_WRITE); |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
2188 } |
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
2189 |
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
2190 return fd; |
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
2191 } |
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
2192 |
14097 | 2193 static void try_connect(GaimProxyConnectInfo *connect_info) |
4366 | 2194 { |
4678 | 2195 size_t addrlen; |
2196 struct sockaddr *addr; | |
2197 int ret = -1; | |
4634 | 2198 |
14096 | 2199 while (connect_info->hosts) { |
2200 addrlen = GPOINTER_TO_INT(connect_info->hosts->data); | |
2201 connect_info->hosts = g_slist_remove(connect_info->hosts, connect_info->hosts->data); | |
2202 addr = connect_info->hosts->data; | |
2203 connect_info->hosts = g_slist_remove(connect_info->hosts, connect_info->hosts->data); | |
4366 | 2204 |
14096 | 2205 switch (gaim_proxy_info_get_type(connect_info->gpi)) { |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2206 case GAIM_PROXY_NONE: |
14096 | 2207 ret = proxy_connect_none(connect_info, addr, addrlen); |
4678 | 2208 break; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2209 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2210 case GAIM_PROXY_HTTP: |
14096 | 2211 ret = proxy_connect_http(connect_info, addr, addrlen); |
4678 | 2212 break; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2213 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2214 case GAIM_PROXY_SOCKS4: |
14096 | 2215 ret = proxy_connect_socks4(connect_info, addr, addrlen); |
4678 | 2216 break; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2217 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2218 case GAIM_PROXY_SOCKS5: |
14096 | 2219 ret = proxy_connect_socks5(connect_info, addr, addrlen); |
4678 | 2220 break; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2221 |
6621 | 2222 case GAIM_PROXY_USE_ENVVAR: |
14096 | 2223 ret = proxy_connect_http(connect_info, addr, addrlen); |
6621 | 2224 break; |
2225 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2226 default: |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2227 break; |
4678 | 2228 } |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2229 |
9129 | 2230 g_free(addr); |
2231 | |
4678 | 2232 if (ret > 0) |
4366 | 2233 break; |
4678 | 2234 } |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2235 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2236 if (ret < 0) { |
14096 | 2237 gaim_proxy_connect_info_error(connect_info, _("TODO")); |
4366 | 2238 } |
2239 } | |
2240 | |
9129 | 2241 static void |
2242 connection_host_resolved(GSList *hosts, gpointer data, | |
2243 const char *error_message) | |
2244 { | |
14097 | 2245 GaimProxyConnectInfo *connect_info; |
9129 | 2246 |
14097 | 2247 connect_info = data; |
14096 | 2248 connect_info->hosts = hosts; |
9129 | 2249 |
14096 | 2250 try_connect(connect_info); |
9129 | 2251 } |
2252 | |
13514 | 2253 GaimProxyInfo * |
2254 gaim_proxy_get_setup(GaimAccount *account) | |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
2255 { |
13514 | 2256 GaimProxyInfo *gpi; |
6621 | 2257 const gchar *tmp; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2258 |
11878 | 2259 if (account && gaim_account_get_proxy_info(account) != NULL) |
13514 | 2260 gpi = gaim_account_get_proxy_info(account); |
11878 | 2261 else if (gaim_running_gnome()) |
13514 | 2262 gpi = gaim_gnome_proxy_get_info(); |
11878 | 2263 else |
13514 | 2264 gpi = gaim_global_proxy_get_info(); |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2265 |
13514 | 2266 if (gaim_proxy_info_get_type(gpi) == GAIM_PROXY_USE_ENVVAR) { |
6621 | 2267 if ((tmp = g_getenv("HTTP_PROXY")) != NULL || |
2268 (tmp = g_getenv("http_proxy")) != NULL || | |
10534 | 2269 (tmp = g_getenv("HTTPPROXY")) != NULL) { |
9227
9171e528d7e5
[gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents:
9148
diff
changeset
|
2270 char *proxyhost,*proxypath,*proxyuser,*proxypasswd; |
7652 | 2271 int proxyport; |
6621 | 2272 |
9129 | 2273 /* http_proxy-format: |
9227
9171e528d7e5
[gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents:
9148
diff
changeset
|
2274 * export http_proxy="http://user:passwd@your.proxy.server:port/" |
7652 | 2275 */ |
9227
9171e528d7e5
[gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents:
9148
diff
changeset
|
2276 if(gaim_url_parse(tmp, &proxyhost, &proxyport, &proxypath, &proxyuser, &proxypasswd)) { |
13514 | 2277 gaim_proxy_info_set_host(gpi, proxyhost); |
7652 | 2278 g_free(proxyhost); |
2279 g_free(proxypath); | |
9227
9171e528d7e5
[gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents:
9148
diff
changeset
|
2280 if (proxyuser != NULL) { |
13514 | 2281 gaim_proxy_info_set_username(gpi, proxyuser); |
9227
9171e528d7e5
[gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents:
9148
diff
changeset
|
2282 g_free(proxyuser); |
9171e528d7e5
[gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents:
9148
diff
changeset
|
2283 } |
9171e528d7e5
[gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents:
9148
diff
changeset
|
2284 if (proxypasswd != NULL) { |
13514 | 2285 gaim_proxy_info_set_password(gpi, proxypasswd); |
9227
9171e528d7e5
[gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents:
9148
diff
changeset
|
2286 g_free(proxypasswd); |
9171e528d7e5
[gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents:
9148
diff
changeset
|
2287 } |
7652 | 2288 |
2289 /* only for backward compatibility */ | |
9129 | 2290 if (proxyport == 80 && |
7652 | 2291 ((tmp = g_getenv("HTTP_PROXY_PORT")) != NULL || |
2292 (tmp = g_getenv("http_proxy_port")) != NULL || | |
2293 (tmp = g_getenv("HTTPPROXYPORT")) != NULL)) | |
2294 proxyport = atoi(tmp); | |
9129 | 2295 |
13514 | 2296 gaim_proxy_info_set_port(gpi, proxyport); |
7652 | 2297 } |
10534 | 2298 } else { |
2299 /* no proxy environment variable found, don't use a proxy */ | |
2300 gaim_debug_info("proxy", "No environment settings found, not using a proxy\n"); | |
13514 | 2301 gaim_proxy_info_set_type(gpi, GAIM_PROXY_NONE); |
6621 | 2302 } |
2303 | |
9227
9171e528d7e5
[gaim-migrate @ 10023]
Christian Hammond <chipx86@chipx86.com>
parents:
9148
diff
changeset
|
2304 /* XXX: Do we want to skip this step if user/password were part of url? */ |
6621 | 2305 if ((tmp = g_getenv("HTTP_PROXY_USER")) != NULL || |
2306 (tmp = g_getenv("http_proxy_user")) != NULL || | |
2307 (tmp = g_getenv("HTTPPROXYUSER")) != NULL) | |
13514 | 2308 gaim_proxy_info_set_username(gpi, tmp); |
6621 | 2309 |
2310 if ((tmp = g_getenv("HTTP_PROXY_PASS")) != NULL || | |
2311 (tmp = g_getenv("http_proxy_pass")) != NULL || | |
2312 (tmp = g_getenv("HTTPPROXYPASS")) != NULL) | |
13514 | 2313 gaim_proxy_info_set_password(gpi, tmp); |
6621 | 2314 } |
2315 | |
13514 | 2316 return gpi; |
2317 } | |
2318 | |
14089 | 2319 GaimProxyConnectInfo * |
13514 | 2320 gaim_proxy_connect(GaimAccount *account, const char *host, int port, |
14089 | 2321 GaimProxyConnectFunction connect_cb, |
2322 GaimProxyErrorFunction error_cb, gpointer data) | |
13514 | 2323 { |
2324 const char *connecthost = host; | |
2325 int connectport = port; | |
14097 | 2326 GaimProxyConnectInfo *connect_info; |
13514 | 2327 |
14089 | 2328 g_return_val_if_fail(host != NULL, NULL); |
2329 g_return_val_if_fail(port > 0, NULL); | |
2330 g_return_val_if_fail(connect_cb != NULL, NULL); | |
2331 /* g_return_val_if_fail(error_cb != NULL, NULL); *//* TODO: Soon! */ | |
13514 | 2332 |
14097 | 2333 connect_info = g_new0(GaimProxyConnectInfo, 1); |
14096 | 2334 connect_info->connect_cb = connect_cb; |
2335 connect_info->error_cb = error_cb; | |
2336 connect_info->data = data; | |
2337 connect_info->host = g_strdup(host); | |
2338 connect_info->port = port; | |
2339 connect_info->gpi = gaim_proxy_get_setup(account); | |
13514 | 2340 |
14096 | 2341 if ((gaim_proxy_info_get_type(connect_info->gpi) != GAIM_PROXY_NONE) && |
2342 (gaim_proxy_info_get_host(connect_info->gpi) == NULL || | |
2343 gaim_proxy_info_get_port(connect_info->gpi) <= 0)) { | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2344 |
6621 | 2345 gaim_notify_error(NULL, NULL, _("Invalid proxy settings"), _("Either the host name or port number specified for your given proxy type is invalid.")); |
14096 | 2346 gaim_proxy_connect_info_destroy(connect_info); |
14089 | 2347 return NULL; |
1840
00aef397a1fe
[gaim-migrate @ 1850]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1705
diff
changeset
|
2348 } |
4366 | 2349 |
14096 | 2350 switch (gaim_proxy_info_get_type(connect_info->gpi)) |
4366 | 2351 { |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2352 case GAIM_PROXY_NONE: |
4366 | 2353 break; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2354 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2355 case GAIM_PROXY_HTTP: |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2356 case GAIM_PROXY_SOCKS4: |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2357 case GAIM_PROXY_SOCKS5: |
6621 | 2358 case GAIM_PROXY_USE_ENVVAR: |
14096 | 2359 connecthost = gaim_proxy_info_get_host(connect_info->gpi); |
2360 connectport = gaim_proxy_info_get_port(connect_info->gpi); | |
4366 | 2361 break; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2362 |
4366 | 2363 default: |
14096 | 2364 gaim_proxy_connect_info_destroy(connect_info); |
14089 | 2365 return NULL; |
2366 } | |
2367 | |
2368 if (gaim_gethostbyname_async(connecthost, | |
14096 | 2369 connectport, connection_host_resolved, connect_info) != 0) |
14089 | 2370 { |
14096 | 2371 gaim_proxy_connect_info_destroy(connect_info); |
14089 | 2372 return NULL; |
4366 | 2373 } |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2374 |
14096 | 2375 connect_infos = g_slist_prepend(connect_infos, connect_info); |
14089 | 2376 |
14096 | 2377 return connect_info; |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2378 } |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2379 |
14089 | 2380 /* |
2381 * Combine some of this code with gaim_proxy_connect() | |
2382 */ | |
2383 GaimProxyConnectInfo * | |
8262 | 2384 gaim_proxy_connect_socks5(GaimProxyInfo *gpi, const char *host, int port, |
14089 | 2385 GaimProxyConnectFunction connect_cb, |
2386 GaimProxyErrorFunction error_cb, gpointer data) | |
8262 | 2387 { |
14097 | 2388 GaimProxyConnectInfo *connect_info; |
8262 | 2389 |
14089 | 2390 g_return_val_if_fail(host != NULL, NULL); |
2391 g_return_val_if_fail(port > 0, NULL); | |
2392 g_return_val_if_fail(connect_cb != NULL, NULL); | |
2393 /* g_return_val_if_fail(error_cb != NULL, NULL); *//* TODO: Soon! */ | |
2394 | |
14097 | 2395 connect_info = g_new0(GaimProxyConnectInfo, 1); |
14096 | 2396 connect_info->connect_cb = connect_cb; |
2397 connect_info->error_cb = error_cb; | |
2398 connect_info->data = data; | |
2399 connect_info->host = g_strdup(host); | |
2400 connect_info->port = port; | |
2401 connect_info->gpi = gpi; | |
8262 | 2402 |
14089 | 2403 if (gaim_gethostbyname_async(gaim_proxy_info_get_host(gpi), |
14096 | 2404 gaim_proxy_info_get_port(gpi), connection_host_resolved, connect_info) != 0) |
14089 | 2405 { |
14096 | 2406 gaim_proxy_connect_info_destroy(connect_info); |
14089 | 2407 return NULL; |
2408 } | |
2409 | |
14096 | 2410 connect_infos = g_slist_prepend(connect_infos, connect_info); |
14089 | 2411 |
14096 | 2412 return connect_info; |
8262 | 2413 } |
2414 | |
2415 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2416 static void |
12816 | 2417 proxy_pref_cb(const char *name, GaimPrefType type, |
2418 gconstpointer value, gpointer data) | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2419 { |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2420 GaimProxyInfo *info = gaim_global_proxy_get_info(); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2421 |
6001 | 2422 if (!strcmp(name, "/core/proxy/type")) { |
2423 int proxytype; | |
12816 | 2424 const char *type = value; |
6001 | 2425 |
2426 if (!strcmp(type, "none")) | |
2427 proxytype = GAIM_PROXY_NONE; | |
2428 else if (!strcmp(type, "http")) | |
2429 proxytype = GAIM_PROXY_HTTP; | |
2430 else if (!strcmp(type, "socks4")) | |
2431 proxytype = GAIM_PROXY_SOCKS4; | |
2432 else if (!strcmp(type, "socks5")) | |
2433 proxytype = GAIM_PROXY_SOCKS5; | |
6621 | 2434 else if (!strcmp(type, "envvar")) |
2435 proxytype = GAIM_PROXY_USE_ENVVAR; | |
6001 | 2436 else |
2437 proxytype = -1; | |
2438 | |
2439 gaim_proxy_info_set_type(info, proxytype); | |
2440 } else if (!strcmp(name, "/core/proxy/host")) | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2441 gaim_proxy_info_set_host(info, value); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2442 else if (!strcmp(name, "/core/proxy/port")) |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2443 gaim_proxy_info_set_port(info, GPOINTER_TO_INT(value)); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2444 else if (!strcmp(name, "/core/proxy/username")) |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2445 gaim_proxy_info_set_username(info, value); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2446 else if (!strcmp(name, "/core/proxy/password")) |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2447 gaim_proxy_info_set_password(info, value); |
1087
56c7ceb986a8
[gaim-migrate @ 1097]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
1057
diff
changeset
|
2448 } |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2449 |
14089 | 2450 void * |
2451 gaim_proxy_get_handle() | |
2452 { | |
2453 static int handle; | |
2454 | |
2455 return &handle; | |
2456 } | |
2457 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2458 void |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2459 gaim_proxy_init(void) |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2460 { |
10087 | 2461 void *handle; |
2462 | |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2463 /* Initialize a default proxy info struct. */ |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2464 global_proxy_info = gaim_proxy_info_new(); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2465 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2466 /* Proxy */ |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2467 gaim_prefs_add_none("/core/proxy"); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2468 gaim_prefs_add_string("/core/proxy/type", "none"); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2469 gaim_prefs_add_string("/core/proxy/host", ""); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2470 gaim_prefs_add_int("/core/proxy/port", 0); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2471 gaim_prefs_add_string("/core/proxy/username", ""); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2472 gaim_prefs_add_string("/core/proxy/password", ""); |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2473 |
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2474 /* Setup callbacks for the preferences. */ |
10087 | 2475 handle = gaim_proxy_get_handle(); |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2476 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
|
2477 NULL); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2478 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
|
2479 NULL); |
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2480 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
|
2481 NULL); |
10087 | 2482 gaim_prefs_connect_callback(handle, "/core/proxy/username", |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2483 proxy_pref_cb, NULL); |
10087 | 2484 gaim_prefs_connect_callback(handle, "/core/proxy/password", |
13200
33bef17125c2
[gaim-migrate @ 15563]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
13084
diff
changeset
|
2485 proxy_pref_cb, NULL); |
10626
06f5cc17cddc
[gaim-migrate @ 12101]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10619
diff
changeset
|
2486 #ifdef _WIN32 |
10237
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
2487 if(!g_thread_supported()) |
2f6dcbaaabe0
[gaim-migrate @ 11373]
Herman Bloggs <hermanator12002@yahoo.com>
parents:
10172
diff
changeset
|
2488 g_thread_init(NULL); |
10626
06f5cc17cddc
[gaim-migrate @ 12101]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
10619
diff
changeset
|
2489 #endif |
5681
46d7ad0dfa26
[gaim-migrate @ 6100]
Christian Hammond <chipx86@chipx86.com>
parents:
5580
diff
changeset
|
2490 } |
10087 | 2491 |
14089 | 2492 void |
2493 gaim_proxy_uninit(void) | |
10087 | 2494 { |
14096 | 2495 while (connect_infos != NULL) |
2496 gaim_proxy_connect_info_destroy(connect_infos->data); | |
10087 | 2497 } |