summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAtul Anand <atulhjp@gmail.com>2016-08-16 05:55:55 +0530
committerThomas Haller <thaller@redhat.com>2016-10-04 11:44:13 +0200
commit2a40112ebe9e153f7431e817a0c5f6229e642215 (patch)
tree587062cf5b3485feb10e54f9a968b3616a44b930
parenta5a36d6dfe0b3b4c69d25fae8c70ee07093d3f7b (diff)
downloadNetworkManager-2a40112ebe9e153f7431e817a0c5f6229e642215.tar.gz
libnm: API for Proxy Feature
libnm-core has been expanded to include proxy settings which clients like nmcli, nm-connection-editor use to configure proxy in PacRunner. It offers three modes i.e 'auto', 'manual'and 'none' and accordingly take data to configure PacRunner. The modes matches on the PacRunner side too.
-rw-r--r--libnm-core/Makefile.libnm-core2
-rw-r--r--libnm-core/nm-connection.c18
-rw-r--r--libnm-core/nm-connection.h2
-rw-r--r--libnm-core/nm-core-internal.h1
-rw-r--r--libnm-core/nm-core-types.h1
-rw-r--r--libnm-core/nm-setting-proxy.c890
-rw-r--r--libnm-core/nm-setting-proxy.h123
-rw-r--r--libnm-core/nm-vpn-dbus-interface.h3
-rw-r--r--libnm/NetworkManager.h1
-rw-r--r--libnm/libnm.ver19
10 files changed, 1060 insertions, 0 deletions
diff --git a/libnm-core/Makefile.libnm-core b/libnm-core/Makefile.libnm-core
index 52c71da5b7..72bfcae860 100644
--- a/libnm-core/Makefile.libnm-core
+++ b/libnm-core/Makefile.libnm-core
@@ -32,6 +32,7 @@ libnm_core_headers = \
$(core)/nm-setting-olpc-mesh.h \
$(core)/nm-setting-ppp.h \
$(core)/nm-setting-pppoe.h \
+ $(core)/nm-setting-proxy.h \
$(core)/nm-setting-serial.h \
$(core)/nm-setting-team-port.h \
$(core)/nm-setting-team.h \
@@ -94,6 +95,7 @@ libnm_core_sources = \
$(core)/nm-setting-olpc-mesh.c \
$(core)/nm-setting-ppp.c \
$(core)/nm-setting-pppoe.c \
+ $(core)/nm-setting-proxy.c \
$(core)/nm-setting-serial.c \
$(core)/nm-setting-team-port.c \
$(core)/nm-setting-team.c \
diff --git a/libnm-core/nm-connection.c b/libnm-core/nm-connection.c
index 5632b1883e..9e9ab930ef 100644
--- a/libnm-core/nm-connection.c
+++ b/libnm-core/nm-connection.c
@@ -2181,6 +2181,24 @@ nm_connection_get_setting_pppoe (NMConnection *connection)
}
/**
+ * nm_connection_get_setting_proxy:
+ * @connection: the #NMConnection
+ *
+ * A shortcut to return any #NMSettingProxy the connection might contain.
+ *
+ * Returns:an #NMSettingProxy if the connection contains one, otherwise %NULL
+ *
+ * Since: 1.6
+ **/
+NMSettingProxy *
+nm_connection_get_setting_proxy (NMConnection *connection)
+{
+ g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
+
+ return (NMSettingProxy *) nm_connection_get_setting (connection, NM_TYPE_SETTING_PROXY);
+}
+
+/**
* nm_connection_get_setting_serial:
* @connection: the #NMConnection
*
diff --git a/libnm-core/nm-connection.h b/libnm-core/nm-connection.h
index 21e30422c8..4de15c9263 100644
--- a/libnm-core/nm-connection.h
+++ b/libnm-core/nm-connection.h
@@ -211,6 +211,8 @@ NMSettingMacvlan * nm_connection_get_setting_macvlan (NMConnec
NMSettingOlpcMesh * nm_connection_get_setting_olpc_mesh (NMConnection *connection);
NMSettingPpp * nm_connection_get_setting_ppp (NMConnection *connection);
NMSettingPppoe * nm_connection_get_setting_pppoe (NMConnection *connection);
+NM_AVAILABLE_IN_1_6
+NMSettingProxy * nm_connection_get_setting_proxy (NMConnection *connection);
NMSettingSerial * nm_connection_get_setting_serial (NMConnection *connection);
NMSettingTun * nm_connection_get_setting_tun (NMConnection *connection);
NMSettingVpn * nm_connection_get_setting_vpn (NMConnection *connection);
diff --git a/libnm-core/nm-core-internal.h b/libnm-core/nm-core-internal.h
index d7ad49b0f7..0ea59e4f08 100644
--- a/libnm-core/nm-core-internal.h
+++ b/libnm-core/nm-core-internal.h
@@ -49,6 +49,7 @@
#include "nm-setting-gsm.h"
#include "nm-setting-infiniband.h"
#include "nm-setting-ip-tunnel.h"
+#include "nm-setting-proxy.h"
#include "nm-setting-ip4-config.h"
#include "nm-setting-ip6-config.h"
#include "nm-setting-macvlan.h"
diff --git a/libnm-core/nm-core-types.h b/libnm-core/nm-core-types.h
index cd19923b7e..8e7c0ce8c6 100644
--- a/libnm-core/nm-core-types.h
+++ b/libnm-core/nm-core-types.h
@@ -43,6 +43,7 @@ typedef struct _NMSettingGsm NMSettingGsm;
typedef struct _NMSettingInfiniband NMSettingInfiniband;
typedef struct _NMSettingIPConfig NMSettingIPConfig;
typedef struct _NMSettingIPTunnel NMSettingIPTunnel;
+typedef struct _NMSettingProxy NMSettingProxy;
typedef struct _NMSettingIP4Config NMSettingIP4Config;
typedef struct _NMSettingIP6Config NMSettingIP6Config;
typedef struct _NMSettingMacvlan NMSettingMacvlan;
diff --git a/libnm-core/nm-setting-proxy.c b/libnm-core/nm-setting-proxy.c
new file mode 100644
index 0000000000..d2ec32ef80
--- /dev/null
+++ b/libnm-core/nm-setting-proxy.c
@@ -0,0 +1,890 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+
+/*
+ * 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 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, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * (C) Copyright 2016 Atul Anand <atulhjp@gmail.com>.
+ */
+
+#include "nm-default.h"
+
+#include "nm-setting-proxy.h"
+#include "nm-utils.h"
+#include "nm-setting-private.h"
+
+/**
+ * SECTION:nm-setting-proxy
+ * @short_description: Describes Proxy Url, Script and other related properties
+ *
+ * The #NMSettingProxy object is a #NMSetting subclass that describes properties
+ * related to Proxy settings like Pac Url, Pac Script etc.
+ *
+ * NetworkManager support 3 values for the #NMSettingProxy:method property for
+ * proxy. If "auto" is specified then WPAD takes places and the appropriate details
+ * are pushed into PacRunner or user can override this URL with a new PAC url or a
+ * PAC Script. If "manual" is selected then users can specify different proxy servers
+ * for different protocols. If "none" is selected then no proxy configuration is given
+ * to PacRunner to fulfill client queries.
+ **/
+
+G_DEFINE_TYPE_WITH_CODE (NMSettingProxy, nm_setting_proxy, NM_TYPE_SETTING,
+ _nm_register_setting (PROXY, 4))
+NM_SETTING_REGISTER_TYPE (NM_TYPE_SETTING_PROXY)
+
+#define NM_SETTING_PROXY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_PROXY, NMSettingProxyPrivate))
+
+typedef struct {
+ NMSettingProxyMethod method;
+ char *http_proxy;
+ guint32 http_port;
+ gboolean http_default;
+ char *ssl_proxy;
+ guint32 ssl_port;
+ char *ftp_proxy;
+ guint32 ftp_port;
+ char *socks_proxy;
+ guint32 socks_port;
+ gboolean socks_version_5;
+ char **no_proxy_for;
+ gboolean browser_only;
+ char *pac_url;
+ char *pac_script;
+} NMSettingProxyPrivate;
+
+enum {
+ PROP_0,
+ PROP_METHOD,
+ PROP_HTTP_PROXY,
+ PROP_HTTP_PORT,
+ PROP_HTTP_DEFAULT,
+ PROP_SSL_PROXY,
+ PROP_SSL_PORT,
+ PROP_FTP_PROXY,
+ PROP_FTP_PORT,
+ PROP_SOCKS_PROXY,
+ PROP_SOCKS_PORT,
+ PROP_SOCKS_VERSION_5,
+ PROP_NO_PROXY_FOR,
+ PROP_BROWSER_ONLY,
+ PROP_PAC_URL,
+ PROP_PAC_SCRIPT,
+
+ LAST_PROP
+};
+
+/**
+ * nm_setting_proxy_new:
+ *
+ * Creates a new #NMSettingProxy object.
+ *
+ * Returns: the new empty #NMSettingProxy object
+ *
+ * Since: 1.6
+ **/
+NMSetting *
+nm_setting_proxy_new (void)
+{
+ return (NMSetting *) g_object_new (NM_TYPE_SETTING_PROXY, NULL);
+}
+
+/**
+ * nm_setting_proxy_get_method:
+ * @setting: the #NMSettingProxy
+ *
+ * Returns the proxy configuration method. By default the value is "NONE".
+ * "NONE" should be selected for a connection intended for direct network
+ * access.
+ *
+ * Returns: the proxy configuration method
+ *
+ * Since: 1.6
+ **/
+NMSettingProxyMethod
+nm_setting_proxy_get_method (NMSettingProxy *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), NM_SETTING_PROXY_METHOD_NONE);
+
+ return NM_SETTING_PROXY_GET_PRIVATE (setting)->method;
+}
+
+/**
+ * nm_setting_proxy_get_http_proxy:
+ * @setting: the #NMSettingProxy
+ *
+ * Returns: the HTTP proxy
+ *
+ * Since: 1.6
+ **/
+const char *
+nm_setting_proxy_get_http_proxy (NMSettingProxy *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), NULL);
+
+ return NM_SETTING_PROXY_GET_PRIVATE (setting)->http_proxy;
+}
+
+/**
+ * nm_setting_proxy_get_http_port:
+ * @setting: the #NMSettingProxy
+ *
+ * Returns: the HTTP port number
+ *
+ * Since: 1.6
+ **/
+guint32
+nm_setting_proxy_get_http_port (NMSettingProxy *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), 0);
+
+ return NM_SETTING_PROXY_GET_PRIVATE (setting)->http_port;
+}
+
+/**
+ * nm_setting_proxy_get_http_default:
+ * @setting: the #NMSettingProxy
+ *
+ * Returns: TRUE if HTTP Proxy is default for all
+ * protocols. FALSE if not.
+ *
+ * Since: 1.6
+ **/
+gboolean
+nm_setting_proxy_get_http_default (NMSettingProxy *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), FALSE);
+
+ return NM_SETTING_PROXY_GET_PRIVATE (setting)->http_default;
+}
+
+/**
+ * nm_setting_proxy_get_ssl_proxy:
+ * @setting: the #NMSettingProxy
+ *
+ * Returns: the SSL proxy
+ *
+ * Since: 1.6
+ **/
+const char *
+nm_setting_proxy_get_ssl_proxy (NMSettingProxy *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), NULL);
+
+ return NM_SETTING_PROXY_GET_PRIVATE (setting)->ssl_proxy;
+}
+
+/**
+ * nm_setting_proxy_get_ssl_port:
+ * @setting: the #NMSettingProxy
+ *
+ * Returns: the SSL port number
+ *
+ * Since: 1.6
+ **/
+guint32
+nm_setting_proxy_get_ssl_port (NMSettingProxy *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), 0);
+
+ return NM_SETTING_PROXY_GET_PRIVATE (setting)->ssl_port;
+}
+
+/**
+ * nm_setting_proxy_get_ftp_proxy:
+ * @setting: the #NMSettingProxy
+ *
+ * Returns: the FTP proxy
+ *
+ * Since: 1.6
+ **/
+const char *
+nm_setting_proxy_get_ftp_proxy (NMSettingProxy *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), NULL);
+
+ return NM_SETTING_PROXY_GET_PRIVATE (setting)->ftp_proxy;
+}
+
+/**
+ * nm_setting_proxy_get_ftp_port:
+ * @setting: the #NMSettingProxy
+ *
+ * Returns: the FTP port number
+ *
+ * Since: 1.6
+ **/
+guint32
+nm_setting_proxy_get_ftp_port (NMSettingProxy *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), 0);
+
+ return NM_SETTING_PROXY_GET_PRIVATE (setting)->ftp_port;
+}
+
+/**
+ * nm_setting_proxy_get_socks_proxy:
+ * @setting: the #NMSettingProxy
+ *
+ * Returns: the SOCKS proxy
+ *
+ * Since: 1.6
+ **/
+const char *
+nm_setting_proxy_get_socks_proxy (NMSettingProxy *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), NULL);
+
+ return NM_SETTING_PROXY_GET_PRIVATE (setting)->socks_proxy;
+}
+
+/**
+ * nm_setting_proxy_get_socks_port:
+ * @setting: the #NMSettingProxy
+ *
+ * Returns: the SOCKS port number
+ *
+ * Since: 1.6
+ **/
+guint32
+nm_setting_proxy_get_socks_port (NMSettingProxy *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), 0);
+
+ return NM_SETTING_PROXY_GET_PRIVATE (setting)->socks_port;
+}
+
+/**
+ * nm_setting_proxy_get_socks_version_5:
+ * @setting: the #NMSettingProxy
+ *
+ * Returns: TRUE if SOCKS version is 5.
+ * FALSE if SOCKS version is 4.
+ *
+ * Since: 1.6
+**/
+gboolean
+nm_setting_proxy_get_socks_version_5 (NMSettingProxy *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), FALSE);
+
+ return NM_SETTING_PROXY_GET_PRIVATE (setting)->socks_version_5;
+}
+
+/**
+ * nm_setting_proxy_get_no_proxy_for:
+ * @setting: the #NMSettingProxy
+ *
+ * Returns: (transfer none): the hosts to be excluded from proxy
+ *
+ * Since: 1.6
+ **/
+const char *const*
+nm_setting_proxy_get_no_proxy_for (NMSettingProxy *setting)
+{
+ NMSettingProxyPrivate *priv;
+
+ g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), NULL);
+
+ priv = NM_SETTING_PROXY_GET_PRIVATE (setting);
+
+ return ((const char *const*) priv->no_proxy_for)
+ ?: ((const char *const*) &priv->no_proxy_for);
+}
+
+/**
+ * nm_setting_proxy_get_browser_only:
+ * @setting: the #NMSettingProxy
+ *
+ * Returns: TRUE if this proxy configuration is only for Browser
+ * clients/schemes otherwise FALSE.
+ *
+ * Since: 1.6
+ **/
+gboolean
+nm_setting_proxy_get_browser_only (NMSettingProxy *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), FALSE);
+
+ return NM_SETTING_PROXY_GET_PRIVATE (setting)->browser_only;
+}
+
+/**
+ * nm_setting_proxy_get_pac_url:
+ * @setting: the #NMSettingProxy
+ *
+ * Returns: the PAC url for obtaining PAC file
+ *
+ * Since: 1.6
+ **/
+const char *
+nm_setting_proxy_get_pac_url (NMSettingProxy *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), NULL);
+
+ return NM_SETTING_PROXY_GET_PRIVATE (setting)->pac_url;
+}
+
+/**
+ * nm_setting_proxy_get_pac_script:
+ * @setting: the #NMSettingProxy
+ *
+ * Returns: the path to PAC Script
+ *
+ * Since: 1.6
+ **/
+const char *
+nm_setting_proxy_get_pac_script (NMSettingProxy *setting)
+{
+ g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), NULL);
+
+ return NM_SETTING_PROXY_GET_PRIVATE (setting)->pac_script;
+}
+
+static gboolean
+verify (NMSetting *setting, NMConnection *connection, GError **error)
+{
+ NMSettingProxyPrivate *priv = NM_SETTING_PROXY_GET_PRIVATE (setting);
+ NMSettingProxyMethod method;
+
+ method = priv->method;
+ if (method == NM_SETTING_PROXY_METHOD_AUTO || method == NM_SETTING_PROXY_METHOD_NONE) {
+ if (priv->http_proxy) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("this property is not allowed for method auto/none"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_HTTP_PROXY);
+ return FALSE;
+ }
+
+ if (priv->http_port) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("this property is not allowed for method auto/none"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_HTTP_PORT);
+ return FALSE;
+ }
+
+ if (priv->http_default) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("this property is not allowed for method auto/none"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_HTTP_DEFAULT);
+ return FALSE;
+ }
+
+ if (priv->ssl_proxy) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("this property is not allowed for method auto/none"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_SSL_PROXY);
+ return FALSE;
+ }
+
+ if (priv->ssl_port) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("this property is not allowed for method auto/none"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_SSL_PORT);
+ return FALSE;
+ }
+
+ if (priv->ftp_proxy) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("this property is not allowed for method auto/none"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_FTP_PROXY);
+ return FALSE;
+ }
+
+ if (priv->ftp_port) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("this property is not allowed for method auto/none"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_FTP_PORT);
+ return FALSE;
+ }
+
+ if (priv->socks_proxy) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("this property is not allowed for method auto/none"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_SOCKS_PROXY);
+ return FALSE;
+ }
+
+ if (priv->socks_port) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("this property is not allowed for method auto/none"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_SOCKS_PORT);
+ return FALSE;
+ }
+
+ if (priv->socks_version_5) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("this property is not allowed for method auto/none"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_SOCKS_VERSION_5);
+ return FALSE;
+ }
+
+ if (priv->no_proxy_for) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("this property is not allowed for method auto/none"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_NO_PROXY_FOR);
+ return FALSE;
+ }
+
+ if (method == NM_SETTING_PROXY_METHOD_NONE) {
+ if (priv->pac_url) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("this property is not allowed for method none"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_PAC_URL);
+ return FALSE;
+ }
+
+ if (priv->pac_script) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("this property is not allowed for method none"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_PAC_SCRIPT);
+ return FALSE;
+ }
+ }
+ } else if (method == NM_SETTING_PROXY_METHOD_MANUAL) {
+ if (priv->pac_url) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("this property is not allowed for method manual"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_PAC_URL);
+ return FALSE;
+ }
+
+ if (priv->pac_script) {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("this property is not allowed for method manual"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_PAC_SCRIPT);
+ return FALSE;
+ }
+ } else {
+ g_set_error (error,
+ NM_CONNECTION_ERROR,
+ NM_CONNECTION_ERROR_INVALID_PROPERTY,
+ _("unknown method"));
+ g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_METHOD);
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static void
+nm_setting_proxy_init (NMSettingProxy *setting)
+{
+ NMSettingProxyPrivate *priv = NM_SETTING_PROXY_GET_PRIVATE (setting);
+
+ priv->method = NM_SETTING_PROXY_METHOD_NONE;
+}
+
+static void
+finalize (GObject *object)
+{
+ NMSettingProxy *self = NM_SETTING_PROXY (object);
+ NMSettingProxyPrivate *priv = NM_SETTING_PROXY_GET_PRIVATE (self);
+
+ g_free (priv->http_proxy);
+ g_free (priv->ssl_proxy);
+ g_free (priv->ftp_proxy);
+ g_free (priv->socks_proxy);
+ g_free (priv->pac_url);
+ g_free (priv->pac_script);
+
+ g_strfreev (priv->no_proxy_for);
+
+ G_OBJECT_CLASS (nm_setting_proxy_parent_class)->finalize (object);
+}
+
+static void
+get_property (GObject *object, guint prop_id,
+ GValue *value, GParamSpec *pspec)
+{
+ NMSettingProxy *setting = NM_SETTING_PROXY (object);
+
+ switch (prop_id) {
+ case PROP_METHOD:
+ g_value_set_int (value, nm_setting_proxy_get_method (setting));
+ break;
+ case PROP_HTTP_PROXY:
+ g_value_set_string (value, nm_setting_proxy_get_http_proxy (setting));
+ break;
+ case PROP_HTTP_PORT:
+ g_value_set_uint (value, nm_setting_proxy_get_http_port (setting));
+ break;
+ case PROP_HTTP_DEFAULT:
+ g_value_set_boolean (value, nm_setting_proxy_get_http_default (setting));
+ break;
+ case PROP_SSL_PROXY:
+ g_value_set_string (value, nm_setting_proxy_get_ssl_proxy (setting));
+ break;
+ case PROP_SSL_PORT:
+ g_value_set_uint (value, nm_setting_proxy_get_ssl_port (setting));
+ break;
+ case PROP_FTP_PROXY:
+ g_value_set_string (value, nm_setting_proxy_get_ftp_proxy (setting));
+ break;
+ case PROP_FTP_PORT:
+ g_value_set_uint (value, nm_setting_proxy_get_ftp_port (setting));
+ break;
+ case PROP_SOCKS_PROXY:
+ g_value_set_string (value, nm_setting_proxy_get_socks_proxy (setting));
+ break;
+ case PROP_SOCKS_PORT:
+ g_value_set_uint (value, nm_setting_proxy_get_socks_port (setting));
+ break;
+ case PROP_SOCKS_VERSION_5:
+ g_value_set_boolean (value, nm_setting_proxy_get_socks_version_5 (setting));
+ break;
+ case PROP_NO_PROXY_FOR:
+ g_value_set_boxed (value, nm_setting_proxy_get_no_proxy_for (setting));
+ break;
+ case PROP_BROWSER_ONLY:
+ g_value_set_boolean (value, nm_setting_proxy_get_browser_only (setting));
+ break;
+ case PROP_PAC_URL:
+ g_value_set_string (value, nm_setting_proxy_get_pac_url (setting));
+ break;
+ case PROP_PAC_SCRIPT:
+ g_value_set_string (value, nm_setting_proxy_get_pac_script (setting));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+set_property (GObject *object, guint prop_id,
+ const GValue *value, GParamSpec *pspec)
+{
+ NMSettingProxyPrivate *priv = NM_SETTING_PROXY_GET_PRIVATE (object);
+
+ switch (prop_id) {
+ case PROP_METHOD:
+ priv->method = g_value_get_int (value);
+ break;
+ case PROP_HTTP_PROXY:
+ g_free (priv->http_proxy);
+ priv->http_proxy = g_value_dup_string (value);
+ break;
+ case PROP_HTTP_PORT:
+ priv->http_port = g_value_get_uint (value);
+ break;
+ case PROP_HTTP_DEFAULT:
+ priv->http_default = g_value_get_boolean (value);
+ break;
+ case PROP_SSL_PROXY:
+ g_free (priv->ssl_proxy);
+ priv->ssl_proxy = g_value_dup_string (value);
+ break;
+ case PROP_SSL_PORT:
+ priv->ssl_port = g_value_get_uint (value);
+ break;
+ case PROP_FTP_PROXY:
+ g_free (priv->ftp_proxy);
+ priv->ftp_proxy = g_value_dup_string (value);
+ break;
+ case PROP_FTP_PORT:
+ priv->ftp_port = g_value_get_uint (value);
+ break;
+ case PROP_SOCKS_PROXY:
+ g_free (priv->socks_proxy);
+ priv->socks_proxy = g_value_dup_string (value);
+ break;
+ case PROP_SOCKS_PORT:
+ priv->socks_port = g_value_get_uint (value);
+ break;
+ case PROP_SOCKS_VERSION_5:
+ priv->socks_version_5 = g_value_get_boolean (value);
+ break;
+ case PROP_NO_PROXY_FOR:
+ g_strfreev (priv->no_proxy_for);
+ priv->no_proxy_for = g_value_get_boxed (value);
+ if (priv->no_proxy_for) {
+ if (priv->no_proxy_for[0])
+ priv->no_proxy_for = g_strdupv (priv->no_proxy_for);
+ else
+ priv->no_proxy_for = NULL;
+ }
+ break;
+ case PROP_BROWSER_ONLY:
+ priv->browser_only = g_value_get_boolean (value);
+ break;
+ case PROP_PAC_URL:
+ g_free (priv->pac_url);
+ priv->pac_url = g_value_dup_string (value);
+ break;
+ case PROP_PAC_SCRIPT:
+ g_free (priv->pac_script);
+ priv->pac_script = g_value_dup_string (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+nm_setting_proxy_class_init (NMSettingProxyClass *setting_class)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (setting_class);
+ NMSettingClass *parent_class = NM_SETTING_CLASS (setting_class);
+
+ g_type_class_add_private (setting_class, sizeof (NMSettingProxyPrivate));
+
+ /* virtual methods */
+ object_class->set_property = set_property;
+ object_class->get_property = get_property;
+ object_class->finalize = finalize;
+ parent_class->verify = verify;
+
+ /**
+ * NMSettingProxy:method:
+ *
+ * Method for proxy configuration, Default is "NONE"
+ *
+ * Since: 1.6
+ **/
+ g_object_class_install_property
+ (object_class, PROP_METHOD,
+ g_param_spec_int (NM_SETTING_PROXY_METHOD, "", "",
+ G_MININT32, G_MAXINT32, NM_SETTING_PROXY_METHOD_NONE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMSettingProxy:http-proxy:
+ *
+ * HTTP proxy
+ *
+ * Since: 1.6
+ **/
+ g_object_class_install_property
+ (object_class, PROP_HTTP_PROXY,
+ g_param_spec_string (NM_SETTING_PROXY_HTTP_PROXY, "", "",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMSettingProxy:http-port:
+ *
+ * Port number for HTTP proxy
+ *
+ * Since: 1.6
+ **/
+ g_object_class_install_property
+ (object_class, PROP_HTTP_PORT,
+ g_param_spec_uint (NM_SETTING_PROXY_HTTP_PORT, "", "",
+ 0, G_MAXUINT32, 0,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMSettingProxy:http-default:
+ *
+ * Make HTTP proxy default for all protocols.
+ *
+ * Since: 1.6
+ **/
+ g_object_class_install_property
+ (object_class, PROP_HTTP_DEFAULT,
+ g_param_spec_boolean (NM_SETTING_PROXY_HTTP_DEFAULT, "", "",
+ FALSE,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMSettingProxy:ssl-proxy:
+ *
+ * SSL proxy.
+ *
+ * Since: 1.6
+ **/
+ g_object_class_install_property
+ (object_class, PROP_SSL_PROXY,
+ g_param_spec_string (NM_SETTING_PROXY_SSL_PROXY, "", "",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMSettingProxy:ssl-port:
+ *
+ * Port number for SSL proxy.
+ *
+ * Since: 1.6
+ **/
+ g_object_class_install_property
+ (object_class, PROP_SSL_PORT,
+ g_param_spec_uint (NM_SETTING_PROXY_SSL_PORT, "", "",
+ 0, G_MAXUINT32, 0,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMSettingProxy:ftp-proxy:
+ *
+ * FTP proxy.
+ *
+ * Since: 1.6
+ **/
+ g_object_class_install_property
+ (object_class, PROP_FTP_PROXY,
+ g_param_spec_string (NM_SETTING_PROXY_FTP_PROXY, "", "",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMSettingProxy:ftp-port:
+ *
+ * Port number for FTP proxy.
+ *
+ * Since: 1.6
+ **/
+ g_object_class_install_property
+ (object_class, PROP_FTP_PORT,
+ g_param_spec_uint (NM_SETTING_PROXY_FTP_PORT, "", "",
+ 0, G_MAXUINT32, 0,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMSettingProxy:socks-proxy:
+ *
+ * SOCKS proxy.
+ *
+ * Since: 1.6
+ **/
+ g_object_class_install_property
+ (object_class, PROP_SOCKS_PROXY,
+ g_param_spec_string (NM_SETTING_PROXY_SOCKS_PROXY, "", "",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMSettingProxy:socks-port:
+ *
+ * Port number for SOCKS proxy.
+ *
+ * Since: 1.6
+ **/
+ g_object_class_install_property
+ (object_class, PROP_SOCKS_PORT,
+ g_param_spec_uint (NM_SETTING_PROXY_SOCKS_PORT, "", "",
+ 0, G_MAXUINT32, 0,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMSettingProxy:socks-version-5:
+ *
+ * set %TRUE if SOCKS version is 5.
+ *
+ * Since: 1.6
+ **/
+ g_object_class_install_property
+ (object_class, PROP_SOCKS_VERSION_5,
+ g_param_spec_boolean (NM_SETTING_PROXY_SOCKS_VERSION_5, "", "",
+ FALSE,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMSettingProxy:nm-proxy-for:
+ *
+ * Array of host to be excluded from proxy.
+ *
+ * Since: 1.6
+ **/
+ g_object_class_install_property
+ (object_class, PROP_NO_PROXY_FOR,
+ g_param_spec_boxed (NM_SETTING_PROXY_NO_PROXY_FOR, "", "",
+ G_TYPE_STRV,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMSettingProxy:browser-only:
+ *
+ * TRUE if Proxy is for Browser Stuff.
+ *
+ * Since: 1.6
+ **/
+ g_object_class_install_property
+ (object_class, PROP_BROWSER_ONLY,
+ g_param_spec_boolean (NM_SETTING_PROXY_BROWSER_ONLY, "", "",
+ FALSE,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMSettingProxy:pac-url:
+ *
+ * PAC Url for obtaining PAC File.
+ *
+ * Since: 1.6
+ **/
+ g_object_class_install_property
+ (object_class, PROP_PAC_URL,
+ g_param_spec_string (NM_SETTING_PROXY_PAC_URL, "", "",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
+ * NMSettingProxy:pac-script:
+ *
+ * PAC Script location.
+ *
+ * Since: 1.6
+ **/
+ g_object_class_install_property
+ (object_class, PROP_PAC_SCRIPT,
+ g_param_spec_string (NM_SETTING_PROXY_PAC_SCRIPT, "", "",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+}
diff --git a/libnm-core/nm-setting-proxy.h b/libnm-core/nm-setting-proxy.h
new file mode 100644
index 0000000000..81c4906ac9
--- /dev/null
+++ b/libnm-core/nm-setting-proxy.h
@@ -0,0 +1,123 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+
+/*
+ * 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 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, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA.
+ *
+ * (C) Copyright 2016 Atul Anand <atulhjp@gmail.com>.
+ */
+
+#ifndef __NM_SETTING_PROXY_H__
+#define __NM_SETTING_PROXY_H__
+
+#if !defined (__NETWORKMANAGER_H_INSIDE__) && !defined (NETWORKMANAGER_COMPILATION)
+#error "Only <NetworkManager.h> can be included directly."
+#endif
+
+#include <nm-setting.h>
+
+G_BEGIN_DECLS
+
+/**
+ * NMSettingProxyMethod:
+ * @NM_SETTING_PROXY_METHOD_AUTO: DHCP obtained Proxy
+ * @NM_SETTING_PROXY_METHOD_MANUAL: Manual mode
+ * @NM_SETTING_PROXY_METHOD_NONE: No Proxy for the Connection
+ *
+ * The Proxy method.
+ *
+ * Since: 1.6
+ */
+typedef enum {
+ NM_SETTING_PROXY_METHOD_AUTO = 0,
+ NM_SETTING_PROXY_METHOD_MANUAL,
+ NM_SETTING_PROXY_METHOD_NONE
+} NMSettingProxyMethod;
+
+#define NM_TYPE_SETTING_PROXY (nm_setting_proxy_get_type ())
+#define NM_SETTING_PROXY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_SETTING_PROXY, NMSettingProxy))
+#define NM_SETTING_PROXY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_SETTING_PROXY, NMSettingProxyClass))
+#define NM_IS_SETTING_PROXY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_SETTING_PROXY))
+#define NM_IS_SETTING_PROXY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_SETTING_PROXY))
+#define NM_SETTING_PROXY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_SETTING_PROXY, NMSettingProxyClass))
+
+#define NM_SETTING_PROXY_SETTING_NAME "proxy"
+
+#define NM_SETTING_PROXY_METHOD "method"
+#define NM_SETTING_PROXY_HTTP_PROXY "http-proxy"
+#define NM_SETTING_PROXY_HTTP_PORT "http-port"
+#define NM_SETTING_PROXY_HTTP_DEFAULT "http-default"
+#define NM_SETTING_PROXY_SSL_PROXY "ssl-proxy"
+#define NM_SETTING_PROXY_SSL_PORT "ssl-port"
+#define NM_SETTING_PROXY_FTP_PROXY "ftp-proxy"
+#define NM_SETTING_PROXY_FTP_PORT "ftp-port"
+#define NM_SETTING_PROXY_SOCKS_PROXY "socks-proxy"
+#define NM_SETTING_PROXY_SOCKS_PORT "socks-port"
+#define NM_SETTING_PROXY_SOCKS_VERSION_5 "socks-version-5"
+#define NM_SETTING_PROXY_NO_PROXY_FOR "no-proxy-for"
+#define NM_SETTING_PROXY_BROWSER_ONLY "browser-only"
+#define NM_SETTING_PROXY_PAC_URL "pac-url"
+#define NM_SETTING_PROXY_PAC_SCRIPT "pac-script"
+
+struct _NMSettingProxy {
+ NMSetting parent;
+};
+
+typedef struct {
+ NMSettingClass parent;
+
+ gpointer padding[4];
+} NMSettingProxyClass;
+
+NM_AVAILABLE_IN_1_6
+GType nm_setting_proxy_get_type (void);
+
+NM_AVAILABLE_IN_1_6
+NMSetting *nm_setting_proxy_new (void);
+
+NM_AVAILABLE_IN_1_6
+NMSettingProxyMethod nm_setting_proxy_get_method (NMSettingProxy *setting);
+NM_AVAILABLE_IN_1_6
+const char *nm_setting_proxy_get_http_proxy (NMSettingProxy *setting);
+NM_AVAILABLE_IN_1_6
+guint32 nm_setting_proxy_get_http_port (NMSettingProxy *setting);
+NM_AVAILABLE_IN_1_6
+gboolean nm_setting_proxy_get_http_default (NMSettingProxy *setting);
+NM_AVAILABLE_IN_1_6
+const char *nm_setting_proxy_get_ssl_proxy (NMSettingProxy *setting);
+NM_AVAILABLE_IN_1_6
+guint32 nm_setting_proxy_get_ssl_port (NMSettingProxy *setting);
+NM_AVAILABLE_IN_1_6
+const char *nm_setting_proxy_get_ftp_proxy (NMSettingProxy *setting);
+NM_AVAILABLE_IN_1_6
+guint32 nm_setting_proxy_get_ftp_port (NMSettingProxy *setting);
+NM_AVAILABLE_IN_1_6
+const char *nm_setting_proxy_get_socks_proxy (NMSettingProxy *setting);
+NM_AVAILABLE_IN_1_6
+guint32 nm_setting_proxy_get_socks_port (NMSettingProxy *setting);
+NM_AVAILABLE_IN_1_6
+gboolean nm_setting_proxy_get_socks_version_5 (NMSettingProxy *setting);
+NM_AVAILABLE_IN_1_6
+const char *const*nm_setting_proxy_get_no_proxy_for (NMSettingProxy *setting);
+NM_AVAILABLE_IN_1_6
+gboolean nm_setting_proxy_get_browser_only (NMSettingProxy *setting);
+NM_AVAILABLE_IN_1_6
+const char *nm_setting_proxy_get_pac_url (NMSettingProxy *setting);
+NM_AVAILABLE_IN_1_6
+const char *nm_setting_proxy_get_pac_script (NMSettingProxy *setting);
+
+G_END_DECLS
+
+#endif /* __NM_SETTING_PROXY_H__ */
diff --git a/libnm-core/nm-vpn-dbus-interface.h b/libnm-core/nm-vpn-dbus-interface.h
index 3295a1aeaf..1495c95526 100644
--- a/libnm-core/nm-vpn-dbus-interface.h
+++ b/libnm-core/nm-vpn-dbus-interface.h
@@ -183,6 +183,9 @@ typedef enum {
/* string: VPN interface name (tun0, tap0, etc) */
#define NM_VPN_PLUGIN_CONFIG_TUNDEV "tundev"
+/* string: Proxy PAC */
+#define NM_VPN_PLUGIN_CONFIG_PROXY_PAC "pac"
+
/* string: Login message */
#define NM_VPN_PLUGIN_CONFIG_BANNER "banner"
diff --git a/libnm/NetworkManager.h b/libnm/NetworkManager.h
index b5dab8fd84..cca05cffdd 100644
--- a/libnm/NetworkManager.h
+++ b/libnm/NetworkManager.h
@@ -62,6 +62,7 @@
#include <nm-setting-infiniband.h>
#include <nm-setting-ip-config.h>
#include <nm-setting-ip-tunnel.h>
+#include <nm-setting-proxy.h>
#include <nm-setting-ip4-config.h>
#include <nm-setting-ip6-config.h>
#include <nm-setting-macvlan.h>
diff --git a/libnm/libnm.ver b/libnm/libnm.ver
index bfd15b0b9e..8c0e34f0d1 100644
--- a/libnm/libnm.ver
+++ b/libnm/libnm.ver
@@ -1087,5 +1087,24 @@ global:
libnm_1_6_0 {
global:
nm_capability_get_type;
+ nm_connection_get_setting_proxy;
+ nm_setting_proxy_get_type;
+ nm_setting_proxy_new;
+ nm_setting_proxy_get_method;
+ nm_setting_proxy_method_get_type;
+ nm_setting_proxy_get_http_proxy;
+ nm_setting_proxy_get_http_port;
+ nm_setting_proxy_get_http_default;
+ nm_setting_proxy_get_ssl_proxy;
+ nm_setting_proxy_get_ssl_port;
+ nm_setting_proxy_get_ftp_proxy;
+ nm_setting_proxy_get_ftp_port;
+ nm_setting_proxy_get_socks_proxy;
+ nm_setting_proxy_get_socks_port;
+ nm_setting_proxy_get_socks_version_5;
+ nm_setting_proxy_get_pac_script;
+ nm_setting_proxy_get_no_proxy_for;
+ nm_setting_proxy_get_browser_only;
+ nm_setting_proxy_get_pac_url;
nm_utils_is_json_object;
} libnm_1_4_0;