Mercurial > pidgin
annotate src/proxy.c @ 14097:7ded3834168f
[gaim-migrate @ 16726]
Use the GaimProxyConnectInfo typedef instead of
struct _GaimProxyConnectInfo. Sorry, I should have done this in one
of my other commits
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Sat, 12 Aug 2006 21:07:34 +0000 |
| parents | a70c6011dc81 |
| 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 } |
