mirror of https://gitee.com/openkylin/glib2.0.git
469 lines
11 KiB
C
469 lines
11 KiB
C
/* GIO - GLib Input, Output and Streaming Library
|
|
*
|
|
* Copyright (C) 2010 Collabora, Ltd.
|
|
*
|
|
* SPDX-License-Identifier: LGPL-2.1-or-later
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Authors: Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
|
|
*/
|
|
|
|
#include <config.h>
|
|
#include <glib.h>
|
|
#include <string.h>
|
|
|
|
#include <gio/gsocketaddress.h>
|
|
|
|
#include "gproxyaddress.h"
|
|
#include "glibintl.h"
|
|
|
|
/**
|
|
* GProxyAddress:
|
|
*
|
|
* A [class@Gio.InetSocketAddress] representing a connection via a proxy server.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
|
|
/**
|
|
* GProxyAddressClass:
|
|
*
|
|
* Class structure for #GProxyAddress.
|
|
*
|
|
* Since: 2.26
|
|
**/
|
|
|
|
enum
|
|
{
|
|
PROP_0,
|
|
PROP_PROTOCOL,
|
|
PROP_DESTINATION_PROTOCOL,
|
|
PROP_DESTINATION_HOSTNAME,
|
|
PROP_DESTINATION_PORT,
|
|
PROP_USERNAME,
|
|
PROP_PASSWORD,
|
|
PROP_URI
|
|
};
|
|
|
|
struct _GProxyAddressPrivate
|
|
{
|
|
gchar *uri;
|
|
gchar *protocol;
|
|
gchar *username;
|
|
gchar *password;
|
|
gchar *dest_protocol;
|
|
gchar *dest_hostname;
|
|
guint16 dest_port;
|
|
};
|
|
|
|
G_DEFINE_TYPE_WITH_PRIVATE (GProxyAddress, g_proxy_address, G_TYPE_INET_SOCKET_ADDRESS)
|
|
|
|
static void
|
|
g_proxy_address_finalize (GObject *object)
|
|
{
|
|
GProxyAddress *proxy = G_PROXY_ADDRESS (object);
|
|
|
|
g_free (proxy->priv->uri);
|
|
g_free (proxy->priv->protocol);
|
|
g_free (proxy->priv->username);
|
|
g_free (proxy->priv->password);
|
|
g_free (proxy->priv->dest_hostname);
|
|
g_free (proxy->priv->dest_protocol);
|
|
|
|
G_OBJECT_CLASS (g_proxy_address_parent_class)->finalize (object);
|
|
}
|
|
|
|
static void
|
|
g_proxy_address_set_property (GObject *object,
|
|
guint prop_id,
|
|
const GValue *value,
|
|
GParamSpec *pspec)
|
|
{
|
|
GProxyAddress *proxy = G_PROXY_ADDRESS (object);
|
|
|
|
switch (prop_id)
|
|
{
|
|
case PROP_PROTOCOL:
|
|
g_free (proxy->priv->protocol);
|
|
proxy->priv->protocol = g_value_dup_string (value);
|
|
break;
|
|
|
|
case PROP_DESTINATION_PROTOCOL:
|
|
g_free (proxy->priv->dest_protocol);
|
|
proxy->priv->dest_protocol = g_value_dup_string (value);
|
|
break;
|
|
|
|
case PROP_DESTINATION_HOSTNAME:
|
|
g_free (proxy->priv->dest_hostname);
|
|
proxy->priv->dest_hostname = g_value_dup_string (value);
|
|
break;
|
|
|
|
case PROP_DESTINATION_PORT:
|
|
proxy->priv->dest_port = g_value_get_uint (value);
|
|
break;
|
|
|
|
case PROP_USERNAME:
|
|
g_free (proxy->priv->username);
|
|
proxy->priv->username = g_value_dup_string (value);
|
|
break;
|
|
|
|
case PROP_PASSWORD:
|
|
g_free (proxy->priv->password);
|
|
proxy->priv->password = g_value_dup_string (value);
|
|
break;
|
|
|
|
case PROP_URI:
|
|
g_free (proxy->priv->uri);
|
|
proxy->priv->uri = g_value_dup_string (value);
|
|
break;
|
|
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
}
|
|
}
|
|
|
|
static void
|
|
g_proxy_address_get_property (GObject *object,
|
|
guint prop_id,
|
|
GValue *value,
|
|
GParamSpec *pspec)
|
|
{
|
|
GProxyAddress *proxy = G_PROXY_ADDRESS (object);
|
|
|
|
switch (prop_id)
|
|
{
|
|
case PROP_PROTOCOL:
|
|
g_value_set_string (value, proxy->priv->protocol);
|
|
break;
|
|
|
|
case PROP_DESTINATION_PROTOCOL:
|
|
g_value_set_string (value, proxy->priv->dest_protocol);
|
|
break;
|
|
|
|
case PROP_DESTINATION_HOSTNAME:
|
|
g_value_set_string (value, proxy->priv->dest_hostname);
|
|
break;
|
|
|
|
case PROP_DESTINATION_PORT:
|
|
g_value_set_uint (value, proxy->priv->dest_port);
|
|
break;
|
|
|
|
case PROP_USERNAME:
|
|
g_value_set_string (value, proxy->priv->username);
|
|
break;
|
|
|
|
case PROP_PASSWORD:
|
|
g_value_set_string (value, proxy->priv->password);
|
|
break;
|
|
|
|
case PROP_URI:
|
|
g_value_set_string (value, proxy->priv->uri);
|
|
break;
|
|
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
}
|
|
}
|
|
|
|
static void
|
|
g_proxy_address_class_init (GProxyAddressClass *klass)
|
|
{
|
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
|
|
gobject_class->finalize = g_proxy_address_finalize;
|
|
gobject_class->set_property = g_proxy_address_set_property;
|
|
gobject_class->get_property = g_proxy_address_get_property;
|
|
|
|
/**
|
|
* GProxyAddress:protocol:
|
|
*
|
|
* The proxy protocol.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
g_object_class_install_property (gobject_class,
|
|
PROP_PROTOCOL,
|
|
g_param_spec_string ("protocol", NULL, NULL,
|
|
NULL,
|
|
G_PARAM_READWRITE |
|
|
G_PARAM_CONSTRUCT_ONLY |
|
|
G_PARAM_STATIC_STRINGS));
|
|
|
|
/**
|
|
* GProxyAddress:username:
|
|
*
|
|
* The proxy username.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
g_object_class_install_property (gobject_class,
|
|
PROP_USERNAME,
|
|
g_param_spec_string ("username", NULL, NULL,
|
|
NULL,
|
|
G_PARAM_READWRITE |
|
|
G_PARAM_CONSTRUCT_ONLY |
|
|
G_PARAM_STATIC_STRINGS));
|
|
|
|
/**
|
|
* GProxyAddress:password:
|
|
*
|
|
* The proxy password.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
g_object_class_install_property (gobject_class,
|
|
PROP_PASSWORD,
|
|
g_param_spec_string ("password", NULL, NULL,
|
|
NULL,
|
|
G_PARAM_READWRITE |
|
|
G_PARAM_CONSTRUCT_ONLY |
|
|
G_PARAM_STATIC_STRINGS));
|
|
|
|
/**
|
|
* GProxyAddress:destination-protocol:
|
|
*
|
|
* The protocol being spoke to the destination host, or %NULL if
|
|
* the #GProxyAddress doesn't know.
|
|
*
|
|
* Since: 2.34
|
|
*/
|
|
g_object_class_install_property (gobject_class,
|
|
PROP_DESTINATION_PROTOCOL,
|
|
g_param_spec_string ("destination-protocol", NULL, NULL,
|
|
NULL,
|
|
G_PARAM_READWRITE |
|
|
G_PARAM_CONSTRUCT_ONLY |
|
|
G_PARAM_STATIC_STRINGS));
|
|
|
|
/**
|
|
* GProxyAddress:destination-hostname:
|
|
*
|
|
* The proxy destination hostname.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
g_object_class_install_property (gobject_class,
|
|
PROP_DESTINATION_HOSTNAME,
|
|
g_param_spec_string ("destination-hostname", NULL, NULL,
|
|
NULL,
|
|
G_PARAM_READWRITE |
|
|
G_PARAM_CONSTRUCT_ONLY |
|
|
G_PARAM_STATIC_STRINGS));
|
|
|
|
/**
|
|
* GProxyAddress:destination-port:
|
|
*
|
|
* The proxy destination port.
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
g_object_class_install_property (gobject_class,
|
|
PROP_DESTINATION_PORT,
|
|
g_param_spec_uint ("destination-port", NULL, NULL,
|
|
0, 65535, 0,
|
|
G_PARAM_READWRITE |
|
|
G_PARAM_CONSTRUCT_ONLY |
|
|
G_PARAM_STATIC_STRINGS));
|
|
|
|
/**
|
|
* GProxyAddress:uri:
|
|
*
|
|
* The URI string that the proxy was constructed from (or %NULL
|
|
* if the creator didn't specify this).
|
|
*
|
|
* Since: 2.34
|
|
*/
|
|
g_object_class_install_property (gobject_class,
|
|
PROP_URI,
|
|
g_param_spec_string ("uri", NULL, NULL,
|
|
NULL,
|
|
G_PARAM_READWRITE |
|
|
G_PARAM_CONSTRUCT_ONLY |
|
|
G_PARAM_STATIC_STRINGS));
|
|
}
|
|
|
|
static void
|
|
g_proxy_address_init (GProxyAddress *proxy)
|
|
{
|
|
proxy->priv = g_proxy_address_get_instance_private (proxy);
|
|
proxy->priv->protocol = NULL;
|
|
proxy->priv->username = NULL;
|
|
proxy->priv->password = NULL;
|
|
proxy->priv->dest_hostname = NULL;
|
|
proxy->priv->dest_port = 0;
|
|
}
|
|
|
|
/**
|
|
* g_proxy_address_new:
|
|
* @inetaddr: The proxy server #GInetAddress.
|
|
* @port: The proxy server port.
|
|
* @protocol: The proxy protocol to support, in lower case (e.g. socks, http).
|
|
* @dest_hostname: The destination hostname the proxy should tunnel to.
|
|
* @dest_port: The destination port to tunnel to.
|
|
* @username: (nullable): The username to authenticate to the proxy server
|
|
* (or %NULL).
|
|
* @password: (nullable): The password to authenticate to the proxy server
|
|
* (or %NULL).
|
|
*
|
|
* Creates a new #GProxyAddress for @inetaddr with @protocol that should
|
|
* tunnel through @dest_hostname and @dest_port.
|
|
*
|
|
* (Note that this method doesn't set the #GProxyAddress:uri or
|
|
* #GProxyAddress:destination-protocol fields; use g_object_new()
|
|
* directly if you want to set those.)
|
|
*
|
|
* Returns: a new #GProxyAddress
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
GSocketAddress *
|
|
g_proxy_address_new (GInetAddress *inetaddr,
|
|
guint16 port,
|
|
const gchar *protocol,
|
|
const gchar *dest_hostname,
|
|
guint16 dest_port,
|
|
const gchar *username,
|
|
const gchar *password)
|
|
{
|
|
return g_object_new (G_TYPE_PROXY_ADDRESS,
|
|
"address", inetaddr,
|
|
"port", port,
|
|
"protocol", protocol,
|
|
"destination-hostname", dest_hostname,
|
|
"destination-port", dest_port,
|
|
"username", username,
|
|
"password", password,
|
|
NULL);
|
|
}
|
|
|
|
|
|
/**
|
|
* g_proxy_address_get_protocol:
|
|
* @proxy: a #GProxyAddress
|
|
*
|
|
* Gets @proxy's protocol. eg, "socks" or "http"
|
|
*
|
|
* Returns: the @proxy's protocol
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
const gchar *
|
|
g_proxy_address_get_protocol (GProxyAddress *proxy)
|
|
{
|
|
return proxy->priv->protocol;
|
|
}
|
|
|
|
/**
|
|
* g_proxy_address_get_destination_protocol:
|
|
* @proxy: a #GProxyAddress
|
|
*
|
|
* Gets the protocol that is being spoken to the destination
|
|
* server; eg, "http" or "ftp".
|
|
*
|
|
* Returns: the @proxy's destination protocol
|
|
*
|
|
* Since: 2.34
|
|
*/
|
|
const gchar *
|
|
g_proxy_address_get_destination_protocol (GProxyAddress *proxy)
|
|
{
|
|
return proxy->priv->dest_protocol;
|
|
}
|
|
|
|
/**
|
|
* g_proxy_address_get_destination_hostname:
|
|
* @proxy: a #GProxyAddress
|
|
*
|
|
* Gets @proxy's destination hostname; that is, the name of the host
|
|
* that will be connected to via the proxy, not the name of the proxy
|
|
* itself.
|
|
*
|
|
* Returns: the @proxy's destination hostname
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
const gchar *
|
|
g_proxy_address_get_destination_hostname (GProxyAddress *proxy)
|
|
{
|
|
return proxy->priv->dest_hostname;
|
|
}
|
|
|
|
/**
|
|
* g_proxy_address_get_destination_port:
|
|
* @proxy: a #GProxyAddress
|
|
*
|
|
* Gets @proxy's destination port; that is, the port on the
|
|
* destination host that will be connected to via the proxy, not the
|
|
* port number of the proxy itself.
|
|
*
|
|
* Returns: the @proxy's destination port
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
guint16
|
|
g_proxy_address_get_destination_port (GProxyAddress *proxy)
|
|
{
|
|
return proxy->priv->dest_port;
|
|
}
|
|
|
|
/**
|
|
* g_proxy_address_get_username:
|
|
* @proxy: a #GProxyAddress
|
|
*
|
|
* Gets @proxy's username.
|
|
*
|
|
* Returns: (nullable): the @proxy's username
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
const gchar *
|
|
g_proxy_address_get_username (GProxyAddress *proxy)
|
|
{
|
|
return proxy->priv->username;
|
|
}
|
|
|
|
/**
|
|
* g_proxy_address_get_password:
|
|
* @proxy: a #GProxyAddress
|
|
*
|
|
* Gets @proxy's password.
|
|
*
|
|
* Returns: (nullable): the @proxy's password
|
|
*
|
|
* Since: 2.26
|
|
*/
|
|
const gchar *
|
|
g_proxy_address_get_password (GProxyAddress *proxy)
|
|
{
|
|
return proxy->priv->password;
|
|
}
|
|
|
|
|
|
/**
|
|
* g_proxy_address_get_uri:
|
|
* @proxy: a #GProxyAddress
|
|
*
|
|
* Gets the proxy URI that @proxy was constructed from.
|
|
*
|
|
* Returns: (nullable): the @proxy's URI, or %NULL if unknown
|
|
*
|
|
* Since: 2.34
|
|
*/
|
|
const gchar *
|
|
g_proxy_address_get_uri (GProxyAddress *proxy)
|
|
{
|
|
return proxy->priv->uri;
|
|
}
|