Branch data Line data Source code
1 : : /* GIO - GLib Input, Output and Streaming Library
2 : : *
3 : : * Copyright (C) 2010 Collabora, Ltd.
4 : : *
5 : : * SPDX-License-Identifier: LGPL-2.1-or-later
6 : : *
7 : : * This library is free software; you can redistribute it and/or
8 : : * modify it under the terms of the GNU Lesser General Public
9 : : * License as published by the Free Software Foundation; either
10 : : * version 2.1 of the License, or (at your option) any later version.
11 : : *
12 : : * This library is distributed in the hope that it will be useful,
13 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 : : * Lesser General Public License for more details.
16 : : *
17 : : * You should have received a copy of the GNU Lesser General
18 : : * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
19 : : *
20 : : * Authors: Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
21 : : */
22 : :
23 : : #include <config.h>
24 : : #include <glib.h>
25 : : #include <string.h>
26 : :
27 : : #include <gio/gsocketaddress.h>
28 : :
29 : : #include "gproxyaddress.h"
30 : : #include "glibintl.h"
31 : :
32 : : /**
33 : : * GProxyAddress:
34 : : *
35 : : * A [class@Gio.InetSocketAddress] representing a connection via a proxy server.
36 : : *
37 : : * Since: 2.26
38 : : */
39 : :
40 : : /**
41 : : * GProxyAddressClass:
42 : : *
43 : : * Class structure for #GProxyAddress.
44 : : *
45 : : * Since: 2.26
46 : : **/
47 : :
48 : : enum
49 : : {
50 : : PROP_0,
51 : : PROP_PROTOCOL,
52 : : PROP_DESTINATION_PROTOCOL,
53 : : PROP_DESTINATION_HOSTNAME,
54 : : PROP_DESTINATION_PORT,
55 : : PROP_USERNAME,
56 : : PROP_PASSWORD,
57 : : PROP_URI
58 : : };
59 : :
60 : : struct _GProxyAddressPrivate
61 : : {
62 : : gchar *uri;
63 : : gchar *protocol;
64 : : gchar *username;
65 : : gchar *password;
66 : : gchar *dest_protocol;
67 : : gchar *dest_hostname;
68 : : guint16 dest_port;
69 : : };
70 : :
71 : 2524 : G_DEFINE_TYPE_WITH_PRIVATE (GProxyAddress, g_proxy_address, G_TYPE_INET_SOCKET_ADDRESS)
72 : :
73 : : static void
74 : 24 : g_proxy_address_finalize (GObject *object)
75 : : {
76 : 24 : GProxyAddress *proxy = G_PROXY_ADDRESS (object);
77 : :
78 : 24 : g_free (proxy->priv->uri);
79 : 24 : g_free (proxy->priv->protocol);
80 : 24 : g_free (proxy->priv->username);
81 : 24 : g_free (proxy->priv->password);
82 : 24 : g_free (proxy->priv->dest_hostname);
83 : 24 : g_free (proxy->priv->dest_protocol);
84 : :
85 : 24 : G_OBJECT_CLASS (g_proxy_address_parent_class)->finalize (object);
86 : 24 : }
87 : :
88 : : static void
89 : 168 : g_proxy_address_set_property (GObject *object,
90 : : guint prop_id,
91 : : const GValue *value,
92 : : GParamSpec *pspec)
93 : : {
94 : 168 : GProxyAddress *proxy = G_PROXY_ADDRESS (object);
95 : :
96 : 168 : switch (prop_id)
97 : : {
98 : 24 : case PROP_PROTOCOL:
99 : 24 : g_free (proxy->priv->protocol);
100 : 24 : proxy->priv->protocol = g_value_dup_string (value);
101 : 24 : break;
102 : :
103 : 24 : case PROP_DESTINATION_PROTOCOL:
104 : 24 : g_free (proxy->priv->dest_protocol);
105 : 24 : proxy->priv->dest_protocol = g_value_dup_string (value);
106 : 24 : break;
107 : :
108 : 24 : case PROP_DESTINATION_HOSTNAME:
109 : 24 : g_free (proxy->priv->dest_hostname);
110 : 24 : proxy->priv->dest_hostname = g_value_dup_string (value);
111 : 24 : break;
112 : :
113 : 24 : case PROP_DESTINATION_PORT:
114 : 24 : proxy->priv->dest_port = g_value_get_uint (value);
115 : 24 : break;
116 : :
117 : 24 : case PROP_USERNAME:
118 : 24 : g_free (proxy->priv->username);
119 : 24 : proxy->priv->username = g_value_dup_string (value);
120 : 24 : break;
121 : :
122 : 24 : case PROP_PASSWORD:
123 : 24 : g_free (proxy->priv->password);
124 : 24 : proxy->priv->password = g_value_dup_string (value);
125 : 24 : break;
126 : :
127 : 24 : case PROP_URI:
128 : 24 : g_free (proxy->priv->uri);
129 : 24 : proxy->priv->uri = g_value_dup_string (value);
130 : 24 : break;
131 : :
132 : 0 : default:
133 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
134 : : }
135 : 168 : }
136 : :
137 : : static void
138 : 0 : g_proxy_address_get_property (GObject *object,
139 : : guint prop_id,
140 : : GValue *value,
141 : : GParamSpec *pspec)
142 : : {
143 : 0 : GProxyAddress *proxy = G_PROXY_ADDRESS (object);
144 : :
145 : 0 : switch (prop_id)
146 : : {
147 : 0 : case PROP_PROTOCOL:
148 : 0 : g_value_set_string (value, proxy->priv->protocol);
149 : 0 : break;
150 : :
151 : 0 : case PROP_DESTINATION_PROTOCOL:
152 : 0 : g_value_set_string (value, proxy->priv->dest_protocol);
153 : 0 : break;
154 : :
155 : 0 : case PROP_DESTINATION_HOSTNAME:
156 : 0 : g_value_set_string (value, proxy->priv->dest_hostname);
157 : 0 : break;
158 : :
159 : 0 : case PROP_DESTINATION_PORT:
160 : 0 : g_value_set_uint (value, proxy->priv->dest_port);
161 : 0 : break;
162 : :
163 : 0 : case PROP_USERNAME:
164 : 0 : g_value_set_string (value, proxy->priv->username);
165 : 0 : break;
166 : :
167 : 0 : case PROP_PASSWORD:
168 : 0 : g_value_set_string (value, proxy->priv->password);
169 : 0 : break;
170 : :
171 : 0 : case PROP_URI:
172 : 0 : g_value_set_string (value, proxy->priv->uri);
173 : 0 : break;
174 : :
175 : 0 : default:
176 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
177 : : }
178 : 0 : }
179 : :
180 : : static void
181 : 2 : g_proxy_address_class_init (GProxyAddressClass *klass)
182 : : {
183 : 2 : GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
184 : :
185 : 2 : gobject_class->finalize = g_proxy_address_finalize;
186 : 2 : gobject_class->set_property = g_proxy_address_set_property;
187 : 2 : gobject_class->get_property = g_proxy_address_get_property;
188 : :
189 : : /**
190 : : * GProxyAddress:protocol:
191 : : *
192 : : * The proxy protocol.
193 : : *
194 : : * Since: 2.26
195 : : */
196 : 2 : g_object_class_install_property (gobject_class,
197 : : PROP_PROTOCOL,
198 : : g_param_spec_string ("protocol", NULL, NULL,
199 : : NULL,
200 : : G_PARAM_READWRITE |
201 : : G_PARAM_CONSTRUCT_ONLY |
202 : : G_PARAM_STATIC_STRINGS));
203 : :
204 : : /**
205 : : * GProxyAddress:username:
206 : : *
207 : : * The proxy username.
208 : : *
209 : : * Since: 2.26
210 : : */
211 : 2 : g_object_class_install_property (gobject_class,
212 : : PROP_USERNAME,
213 : : g_param_spec_string ("username", NULL, NULL,
214 : : NULL,
215 : : G_PARAM_READWRITE |
216 : : G_PARAM_CONSTRUCT_ONLY |
217 : : G_PARAM_STATIC_STRINGS));
218 : :
219 : : /**
220 : : * GProxyAddress:password:
221 : : *
222 : : * The proxy password.
223 : : *
224 : : * Since: 2.26
225 : : */
226 : 2 : g_object_class_install_property (gobject_class,
227 : : PROP_PASSWORD,
228 : : g_param_spec_string ("password", NULL, NULL,
229 : : NULL,
230 : : G_PARAM_READWRITE |
231 : : G_PARAM_CONSTRUCT_ONLY |
232 : : G_PARAM_STATIC_STRINGS));
233 : :
234 : : /**
235 : : * GProxyAddress:destination-protocol:
236 : : *
237 : : * The protocol being spoke to the destination host, or %NULL if
238 : : * the #GProxyAddress doesn't know.
239 : : *
240 : : * Since: 2.34
241 : : */
242 : 2 : g_object_class_install_property (gobject_class,
243 : : PROP_DESTINATION_PROTOCOL,
244 : : g_param_spec_string ("destination-protocol", NULL, NULL,
245 : : NULL,
246 : : G_PARAM_READWRITE |
247 : : G_PARAM_CONSTRUCT_ONLY |
248 : : G_PARAM_STATIC_STRINGS));
249 : :
250 : : /**
251 : : * GProxyAddress:destination-hostname:
252 : : *
253 : : * The proxy destination hostname.
254 : : *
255 : : * Since: 2.26
256 : : */
257 : 2 : g_object_class_install_property (gobject_class,
258 : : PROP_DESTINATION_HOSTNAME,
259 : : g_param_spec_string ("destination-hostname", NULL, NULL,
260 : : NULL,
261 : : G_PARAM_READWRITE |
262 : : G_PARAM_CONSTRUCT_ONLY |
263 : : G_PARAM_STATIC_STRINGS));
264 : :
265 : : /**
266 : : * GProxyAddress:destination-port:
267 : : *
268 : : * The proxy destination port.
269 : : *
270 : : * Since: 2.26
271 : : */
272 : 2 : g_object_class_install_property (gobject_class,
273 : : PROP_DESTINATION_PORT,
274 : : g_param_spec_uint ("destination-port", NULL, NULL,
275 : : 0, 65535, 0,
276 : : G_PARAM_READWRITE |
277 : : G_PARAM_CONSTRUCT_ONLY |
278 : : G_PARAM_STATIC_STRINGS));
279 : :
280 : : /**
281 : : * GProxyAddress:uri:
282 : : *
283 : : * The URI string that the proxy was constructed from (or %NULL
284 : : * if the creator didn't specify this).
285 : : *
286 : : * Since: 2.34
287 : : */
288 : 2 : g_object_class_install_property (gobject_class,
289 : : PROP_URI,
290 : : g_param_spec_string ("uri", NULL, NULL,
291 : : NULL,
292 : : G_PARAM_READWRITE |
293 : : G_PARAM_CONSTRUCT_ONLY |
294 : : G_PARAM_STATIC_STRINGS));
295 : 2 : }
296 : :
297 : : static void
298 : 24 : g_proxy_address_init (GProxyAddress *proxy)
299 : : {
300 : 24 : proxy->priv = g_proxy_address_get_instance_private (proxy);
301 : 24 : proxy->priv->protocol = NULL;
302 : 24 : proxy->priv->username = NULL;
303 : 24 : proxy->priv->password = NULL;
304 : 24 : proxy->priv->dest_hostname = NULL;
305 : 24 : proxy->priv->dest_port = 0;
306 : 24 : }
307 : :
308 : : /**
309 : : * g_proxy_address_new:
310 : : * @inetaddr: The proxy server #GInetAddress.
311 : : * @port: The proxy server port.
312 : : * @protocol: The proxy protocol to support, in lower case (e.g. socks, http).
313 : : * @dest_hostname: The destination hostname the proxy should tunnel to.
314 : : * @dest_port: The destination port to tunnel to.
315 : : * @username: (nullable): The username to authenticate to the proxy server
316 : : * (or %NULL).
317 : : * @password: (nullable): The password to authenticate to the proxy server
318 : : * (or %NULL).
319 : : *
320 : : * Creates a new #GProxyAddress for @inetaddr with @protocol that should
321 : : * tunnel through @dest_hostname and @dest_port.
322 : : *
323 : : * (Note that this method doesn't set the #GProxyAddress:uri or
324 : : * #GProxyAddress:destination-protocol fields; use g_object_new()
325 : : * directly if you want to set those.)
326 : : *
327 : : * Returns: a new #GProxyAddress
328 : : *
329 : : * Since: 2.26
330 : : */
331 : : GSocketAddress *
332 : 0 : g_proxy_address_new (GInetAddress *inetaddr,
333 : : guint16 port,
334 : : const gchar *protocol,
335 : : const gchar *dest_hostname,
336 : : guint16 dest_port,
337 : : const gchar *username,
338 : : const gchar *password)
339 : : {
340 : 0 : return g_object_new (G_TYPE_PROXY_ADDRESS,
341 : : "address", inetaddr,
342 : : "port", port,
343 : : "protocol", protocol,
344 : : "destination-hostname", dest_hostname,
345 : : "destination-port", dest_port,
346 : : "username", username,
347 : : "password", password,
348 : : NULL);
349 : : }
350 : :
351 : :
352 : : /**
353 : : * g_proxy_address_get_protocol:
354 : : * @proxy: a #GProxyAddress
355 : : *
356 : : * Gets @proxy's protocol. eg, "socks" or "http"
357 : : *
358 : : * Returns: the @proxy's protocol
359 : : *
360 : : * Since: 2.26
361 : : */
362 : : const gchar *
363 : 16 : g_proxy_address_get_protocol (GProxyAddress *proxy)
364 : : {
365 : 16 : return proxy->priv->protocol;
366 : : }
367 : :
368 : : /**
369 : : * g_proxy_address_get_destination_protocol:
370 : : * @proxy: a #GProxyAddress
371 : : *
372 : : * Gets the protocol that is being spoken to the destination
373 : : * server; eg, "http" or "ftp".
374 : : *
375 : : * Returns: the @proxy's destination protocol
376 : : *
377 : : * Since: 2.34
378 : : */
379 : : const gchar *
380 : 16 : g_proxy_address_get_destination_protocol (GProxyAddress *proxy)
381 : : {
382 : 16 : return proxy->priv->dest_protocol;
383 : : }
384 : :
385 : : /**
386 : : * g_proxy_address_get_destination_hostname:
387 : : * @proxy: a #GProxyAddress
388 : : *
389 : : * Gets @proxy's destination hostname; that is, the name of the host
390 : : * that will be connected to via the proxy, not the name of the proxy
391 : : * itself.
392 : : *
393 : : * Returns: the @proxy's destination hostname
394 : : *
395 : : * Since: 2.26
396 : : */
397 : : const gchar *
398 : 0 : g_proxy_address_get_destination_hostname (GProxyAddress *proxy)
399 : : {
400 : 0 : return proxy->priv->dest_hostname;
401 : : }
402 : :
403 : : /**
404 : : * g_proxy_address_get_destination_port:
405 : : * @proxy: a #GProxyAddress
406 : : *
407 : : * Gets @proxy's destination port; that is, the port on the
408 : : * destination host that will be connected to via the proxy, not the
409 : : * port number of the proxy itself.
410 : : *
411 : : * Returns: the @proxy's destination port
412 : : *
413 : : * Since: 2.26
414 : : */
415 : : guint16
416 : 8 : g_proxy_address_get_destination_port (GProxyAddress *proxy)
417 : : {
418 : 8 : return proxy->priv->dest_port;
419 : : }
420 : :
421 : : /**
422 : : * g_proxy_address_get_username:
423 : : * @proxy: a #GProxyAddress
424 : : *
425 : : * Gets @proxy's username.
426 : : *
427 : : * Returns: (nullable): the @proxy's username
428 : : *
429 : : * Since: 2.26
430 : : */
431 : : const gchar *
432 : 0 : g_proxy_address_get_username (GProxyAddress *proxy)
433 : : {
434 : 0 : return proxy->priv->username;
435 : : }
436 : :
437 : : /**
438 : : * g_proxy_address_get_password:
439 : : * @proxy: a #GProxyAddress
440 : : *
441 : : * Gets @proxy's password.
442 : : *
443 : : * Returns: (nullable): the @proxy's password
444 : : *
445 : : * Since: 2.26
446 : : */
447 : : const gchar *
448 : 0 : g_proxy_address_get_password (GProxyAddress *proxy)
449 : : {
450 : 0 : return proxy->priv->password;
451 : : }
452 : :
453 : :
454 : : /**
455 : : * g_proxy_address_get_uri:
456 : : * @proxy: a #GProxyAddress
457 : : *
458 : : * Gets the proxy URI that @proxy was constructed from.
459 : : *
460 : : * Returns: (nullable): the @proxy's URI, or %NULL if unknown
461 : : *
462 : : * Since: 2.34
463 : : */
464 : : const gchar *
465 : 4 : g_proxy_address_get_uri (GProxyAddress *proxy)
466 : : {
467 : 4 : return proxy->priv->uri;
468 : : }
|