Blame libnm-core/nm-setting-proxy.c

Packit Service b23acc
// SPDX-License-Identifier: LGPL-2.1+
Packit Service b23acc
/*
Packit Service b23acc
 * Copyright (C) 2016 Atul Anand <atulhjp@gmail.com>.
Packit Service b23acc
 */
Packit Service b23acc
Packit Service b23acc
#include "nm-default.h"
Packit Service b23acc
Packit Service b23acc
#include "nm-setting-proxy.h"
Packit Service b23acc
Packit Service b23acc
#include "nm-utils.h"
Packit Service b23acc
#include "nm-setting-private.h"
Packit Service b23acc
Packit Service b23acc
/**
Packit Service b23acc
 * SECTION:nm-setting-proxy
Packit Service b23acc
 * @short_description: Describes proxy URL, script and other related properties
Packit Service b23acc
 *
Packit Service b23acc
 * The #NMSettingProxy object is a #NMSetting subclass that describes properties
Packit Service b23acc
 * related to Proxy settings like PAC URL, PAC script etc.
Packit Service b23acc
 *
Packit Service b23acc
 * NetworkManager support 2 values for the #NMSettingProxy:method property for
Packit Service b23acc
 * proxy. If "auto" is specified then WPAD takes place and the appropriate details
Packit Service b23acc
 * are pushed into PacRunner or user can override this URL with a new PAC URL or a
Packit Service b23acc
 * PAC script. If "none" is selected then no proxy configuration is given to PacRunner
Packit Service b23acc
 * to fulfill client queries.
Packit Service b23acc
 **/
Packit Service b23acc
Packit Service b23acc
/*****************************************************************************/
Packit Service b23acc
Packit Service b23acc
NM_GOBJECT_PROPERTIES_DEFINE_BASE (
Packit Service b23acc
	PROP_METHOD,
Packit Service b23acc
	PROP_BROWSER_ONLY,
Packit Service b23acc
	PROP_PAC_URL,
Packit Service b23acc
	PROP_PAC_SCRIPT,
Packit Service b23acc
);
Packit Service b23acc
Packit Service b23acc
typedef struct {
Packit Service b23acc
	char *pac_url;
Packit Service b23acc
	char *pac_script;
Packit Service b23acc
	int method;
Packit Service b23acc
	bool browser_only:1;
Packit Service b23acc
} NMSettingProxyPrivate;
Packit Service b23acc
Packit Service b23acc
G_DEFINE_TYPE (NMSettingProxy, nm_setting_proxy, NM_TYPE_SETTING)
Packit Service b23acc
Packit Service b23acc
#define NM_SETTING_PROXY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_SETTING_PROXY, NMSettingProxyPrivate))
Packit Service b23acc
Packit Service b23acc
/*****************************************************************************/
Packit Service b23acc
Packit Service b23acc
/**
Packit Service b23acc
 * nm_setting_proxy_get_method:
Packit Service b23acc
 * @setting: the #NMSettingProxy
Packit Service b23acc
 *
Packit Service b23acc
 * Returns the proxy configuration method. By default the value is %NM_SETTING_PROXY_METHOD_NONE.
Packit Service b23acc
 * %NM_SETTING_PROXY_METHOD_NONE should be selected for a connection intended for direct network
Packit Service b23acc
 * access.
Packit Service b23acc
 *
Packit Service b23acc
 * Returns: the proxy configuration method
Packit Service b23acc
 *
Packit Service b23acc
 * Since: 1.6
Packit Service b23acc
 **/
Packit Service b23acc
NMSettingProxyMethod
Packit Service b23acc
nm_setting_proxy_get_method (NMSettingProxy *setting)
Packit Service b23acc
{
Packit Service b23acc
	g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), NM_SETTING_PROXY_METHOD_NONE);
Packit Service b23acc
Packit Service b23acc
	return NM_SETTING_PROXY_GET_PRIVATE (setting)->method;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/**
Packit Service b23acc
 * nm_setting_proxy_get_browser_only:
Packit Service b23acc
 * @setting: the #NMSettingProxy
Packit Service b23acc
 *
Packit Service b23acc
 * Returns: %TRUE if this proxy configuration is only for browser
Packit Service b23acc
 * clients/schemes, %FALSE otherwise.
Packit Service b23acc
 *
Packit Service b23acc
 * Since: 1.6
Packit Service b23acc
 **/
Packit Service b23acc
gboolean
Packit Service b23acc
nm_setting_proxy_get_browser_only (NMSettingProxy *setting)
Packit Service b23acc
{
Packit Service b23acc
	g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), FALSE);
Packit Service b23acc
Packit Service b23acc
	return NM_SETTING_PROXY_GET_PRIVATE (setting)->browser_only;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/**
Packit Service b23acc
 * nm_setting_proxy_get_pac_url:
Packit Service b23acc
 * @setting: the #NMSettingProxy
Packit Service b23acc
 *
Packit Service b23acc
 * Returns: the PAC URL for obtaining PAC file
Packit Service b23acc
 *
Packit Service b23acc
 * Since: 1.6
Packit Service b23acc
 **/
Packit Service b23acc
const char *
Packit Service b23acc
nm_setting_proxy_get_pac_url (NMSettingProxy *setting)
Packit Service b23acc
{
Packit Service b23acc
	g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), NULL);
Packit Service b23acc
Packit Service b23acc
	return NM_SETTING_PROXY_GET_PRIVATE (setting)->pac_url;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/**
Packit Service b23acc
 * nm_setting_proxy_get_pac_script:
Packit Service b23acc
 * @setting: the #NMSettingProxy
Packit Service b23acc
 *
Packit Service b23acc
 * Returns: the PAC script
Packit Service b23acc
 *
Packit Service b23acc
 * Since: 1.6
Packit Service b23acc
 **/
Packit Service b23acc
const char *
Packit Service b23acc
nm_setting_proxy_get_pac_script (NMSettingProxy *setting)
Packit Service b23acc
{
Packit Service b23acc
	g_return_val_if_fail (NM_IS_SETTING_PROXY (setting), NULL);
Packit Service b23acc
Packit Service b23acc
	return NM_SETTING_PROXY_GET_PRIVATE (setting)->pac_script;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static gboolean
Packit Service b23acc
verify (NMSetting *setting, NMConnection *connection, GError **error)
Packit Service b23acc
{
Packit Service b23acc
	NMSettingProxyPrivate *priv = NM_SETTING_PROXY_GET_PRIVATE (setting);
Packit Service b23acc
Packit Service b23acc
	if (!NM_IN_SET (priv->method,
Packit Service b23acc
	                NM_SETTING_PROXY_METHOD_NONE,
Packit Service b23acc
	                NM_SETTING_PROXY_METHOD_AUTO)) {
Packit Service b23acc
		g_set_error (error,
Packit Service b23acc
		             NM_CONNECTION_ERROR,
Packit Service b23acc
		             NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
		             _("invalid proxy method"));
Packit Service b23acc
		g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_PAC_URL);
Packit Service b23acc
		return FALSE;
Packit Service b23acc
	}
Packit Service b23acc
Packit Service b23acc
	if (priv->method != NM_SETTING_PROXY_METHOD_AUTO) {
Packit Service b23acc
		if (priv->pac_url) {
Packit Service b23acc
			g_set_error (error,
Packit Service b23acc
			             NM_CONNECTION_ERROR,
Packit Service b23acc
			             NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
			             _("this property is not allowed for method none"));
Packit Service b23acc
			g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_PAC_URL);
Packit Service b23acc
			return FALSE;
Packit Service b23acc
		}
Packit Service b23acc
Packit Service b23acc
		if (priv->pac_script) {
Packit Service b23acc
			g_set_error (error,
Packit Service b23acc
			             NM_CONNECTION_ERROR,
Packit Service b23acc
			             NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
			             _("this property is not allowed for method none"));
Packit Service b23acc
			g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_PAC_SCRIPT);
Packit Service b23acc
			return FALSE;
Packit Service b23acc
		}
Packit Service b23acc
	}
Packit Service b23acc
Packit Service b23acc
	if (priv->pac_script) {
Packit Service b23acc
		if (strlen (priv->pac_script) > 1*1024*1024) {
Packit Service b23acc
			g_set_error (error,
Packit Service b23acc
			             NM_CONNECTION_ERROR,
Packit Service b23acc
			             NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
			             _("the script is too large"));
Packit Service b23acc
			g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_PAC_SCRIPT);
Packit Service b23acc
			return FALSE;
Packit Service b23acc
		}
Packit Service b23acc
		if (!g_utf8_validate (priv->pac_script, -1, NULL)) {
Packit Service b23acc
			g_set_error (error,
Packit Service b23acc
			             NM_CONNECTION_ERROR,
Packit Service b23acc
			             NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
			             _("the script is not valid utf8"));
Packit Service b23acc
			g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_PAC_SCRIPT);
Packit Service b23acc
			return FALSE;
Packit Service b23acc
		}
Packit Service b23acc
		if (!strstr (priv->pac_script, "FindProxyForURL")) {
Packit Service b23acc
			g_set_error (error,
Packit Service b23acc
			             NM_CONNECTION_ERROR,
Packit Service b23acc
			             NM_CONNECTION_ERROR_INVALID_PROPERTY,
Packit Service b23acc
			             _("the script lacks FindProxyForURL function"));
Packit Service b23acc
			g_prefix_error (error, "%s.%s: ", NM_SETTING_PROXY_SETTING_NAME, NM_SETTING_PROXY_PAC_SCRIPT);
Packit Service b23acc
			return FALSE;
Packit Service b23acc
		}
Packit Service b23acc
	}
Packit Service b23acc
Packit Service b23acc
	return TRUE;
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/*****************************************************************************/
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
get_property (GObject *object, guint prop_id,
Packit Service b23acc
              GValue *value, GParamSpec *pspec)
Packit Service b23acc
{
Packit Service b23acc
	NMSettingProxy *setting = NM_SETTING_PROXY (object);
Packit Service b23acc
Packit Service b23acc
	switch (prop_id) {
Packit Service b23acc
	case PROP_METHOD:
Packit Service b23acc
		g_value_set_int (value, nm_setting_proxy_get_method (setting));
Packit Service b23acc
		break;
Packit Service b23acc
	case PROP_BROWSER_ONLY:
Packit Service b23acc
		g_value_set_boolean (value, nm_setting_proxy_get_browser_only (setting));
Packit Service b23acc
		break;
Packit Service b23acc
	case PROP_PAC_URL:
Packit Service b23acc
		g_value_set_string (value, nm_setting_proxy_get_pac_url (setting));
Packit Service b23acc
		break;
Packit Service b23acc
	case PROP_PAC_SCRIPT:
Packit Service b23acc
		g_value_set_string (value, nm_setting_proxy_get_pac_script (setting));
Packit Service b23acc
		break;
Packit Service b23acc
	default:
Packit Service b23acc
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service b23acc
		break;
Packit Service b23acc
	}
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
set_property (GObject *object, guint prop_id,
Packit Service b23acc
              const GValue *value, GParamSpec *pspec)
Packit Service b23acc
{
Packit Service b23acc
	NMSettingProxyPrivate *priv = NM_SETTING_PROXY_GET_PRIVATE (object);
Packit Service b23acc
Packit Service b23acc
	switch (prop_id) {
Packit Service b23acc
	case PROP_METHOD:
Packit Service b23acc
		priv->method = g_value_get_int (value);
Packit Service b23acc
		break;
Packit Service b23acc
	case PROP_BROWSER_ONLY:
Packit Service b23acc
		priv->browser_only = g_value_get_boolean (value);
Packit Service b23acc
		break;
Packit Service b23acc
	case PROP_PAC_URL:
Packit Service b23acc
		g_free (priv->pac_url);
Packit Service b23acc
		priv->pac_url = g_value_dup_string (value);
Packit Service b23acc
		break;
Packit Service b23acc
	case PROP_PAC_SCRIPT:
Packit Service b23acc
		g_free (priv->pac_script);
Packit Service b23acc
		priv->pac_script = g_value_dup_string (value);
Packit Service b23acc
		break;
Packit Service b23acc
	default:
Packit Service b23acc
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service b23acc
		break;
Packit Service b23acc
	}
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/*****************************************************************************/
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
nm_setting_proxy_init (NMSettingProxy *self)
Packit Service b23acc
{
Packit Service b23acc
	nm_assert (NM_SETTING_PROXY_GET_PRIVATE (self)->method == NM_SETTING_PROXY_METHOD_NONE);
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/**
Packit Service b23acc
 * nm_setting_proxy_new:
Packit Service b23acc
 *
Packit Service b23acc
 * Creates a new #NMSettingProxy object.
Packit Service b23acc
 *
Packit Service b23acc
 * Returns: the new empty #NMSettingProxy object
Packit Service b23acc
 *
Packit Service b23acc
 * Since: 1.6
Packit Service b23acc
 **/
Packit Service b23acc
NMSetting *
Packit Service b23acc
nm_setting_proxy_new (void)
Packit Service b23acc
{
Packit Service b23acc
	return (NMSetting *) g_object_new (NM_TYPE_SETTING_PROXY, NULL);
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
finalize (GObject *object)
Packit Service b23acc
{
Packit Service b23acc
	NMSettingProxy *self = NM_SETTING_PROXY (object);
Packit Service b23acc
	NMSettingProxyPrivate *priv = NM_SETTING_PROXY_GET_PRIVATE (self);
Packit Service b23acc
Packit Service b23acc
	g_free (priv->pac_url);
Packit Service b23acc
	g_free (priv->pac_script);
Packit Service b23acc
Packit Service b23acc
	G_OBJECT_CLASS (nm_setting_proxy_parent_class)->finalize (object);
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
nm_setting_proxy_class_init (NMSettingProxyClass *klass)
Packit Service b23acc
{
Packit Service b23acc
	GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit Service b23acc
	NMSettingClass *setting_class = NM_SETTING_CLASS (klass);
Packit Service b23acc
Packit Service b23acc
	g_type_class_add_private (klass, sizeof (NMSettingProxyPrivate));
Packit Service b23acc
Packit Service b23acc
	object_class->get_property = get_property;
Packit Service b23acc
	object_class->set_property = set_property;
Packit Service b23acc
	object_class->finalize     = finalize;
Packit Service b23acc
Packit Service b23acc
	setting_class->verify = verify;
Packit Service b23acc
Packit Service b23acc
	/**
Packit Service b23acc
	 * NMSettingProxy:method:
Packit Service b23acc
	 *
Packit Service b23acc
	 * Method for proxy configuration, Default is %NM_SETTING_PROXY_METHOD_NONE
Packit Service b23acc
	 *
Packit Service b23acc
	 * Since: 1.6
Packit Service b23acc
	 **/
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: method
Packit Service b23acc
	 * variable: PROXY_METHOD(+)
Packit Service b23acc
	 * default: none
Packit Service b23acc
	 * description: Method for proxy configuration. For "auto", WPAD is used for
Packit Service b23acc
	 *   proxy configuration, or set the PAC file via PAC_URL or PAC_SCRIPT.
Packit Service b23acc
	 * values: none, auto
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
	obj_properties[PROP_METHOD] =
Packit Service b23acc
	    g_param_spec_int (NM_SETTING_PROXY_METHOD, "", "",
Packit Service b23acc
	                      G_MININT32, G_MAXINT32, NM_SETTING_PROXY_METHOD_NONE,
Packit Service b23acc
	                      G_PARAM_READWRITE |
Packit Service b23acc
	                      G_PARAM_STATIC_STRINGS);
Packit Service b23acc
Packit Service b23acc
	/**
Packit Service b23acc
	 * NMSettingProxy:browser-only:
Packit Service b23acc
	 *
Packit Service b23acc
	 * Whether the proxy configuration is for browser only.
Packit Service b23acc
	 *
Packit Service b23acc
	 * Since: 1.6
Packit Service b23acc
	 **/
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: browser-only
Packit Service b23acc
	 * variable: BROWSER_ONLY(+)
Packit Service b23acc
	 * default: no
Packit Service b23acc
	 * description: Whether the proxy configuration is for browser only.
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
	obj_properties[PROP_BROWSER_ONLY] =
Packit Service b23acc
	    g_param_spec_boolean (NM_SETTING_PROXY_BROWSER_ONLY, "", "",
Packit Service b23acc
	                          FALSE,
Packit Service b23acc
	                          G_PARAM_READWRITE |
Packit Service b23acc
	                          G_PARAM_STATIC_STRINGS);
Packit Service b23acc
Packit Service b23acc
	/**
Packit Service b23acc
	 * NMSettingProxy:pac-url:
Packit Service b23acc
	 *
Packit Service b23acc
	 * PAC URL for obtaining PAC file.
Packit Service b23acc
	 *
Packit Service b23acc
	 * Since: 1.6
Packit Service b23acc
	 **/
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: pac-url
Packit Service b23acc
	 * variable: PAC_URL(+)
Packit Service b23acc
	 * description: URL for PAC file.
Packit Service b23acc
	 * example: PAC_URL=http://wpad.mycompany.com/wpad.dat
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
	obj_properties[PROP_PAC_URL] =
Packit Service b23acc
	    g_param_spec_string (NM_SETTING_PROXY_PAC_URL, "", "",
Packit Service b23acc
	                         NULL,
Packit Service b23acc
	                         G_PARAM_READWRITE |
Packit Service b23acc
	                         G_PARAM_STATIC_STRINGS);
Packit Service b23acc
Packit Service b23acc
	/**
Packit Service b23acc
	 * NMSettingProxy:pac-script:
Packit Service b23acc
	 *
Packit Service b23acc
	 * PAC script for the connection.
Packit Service b23acc
	 *
Packit Service b23acc
	 * Since: 1.6
Packit Service b23acc
	 **/
Packit Service b23acc
	/* ---ifcfg-rh---
Packit Service b23acc
	 * property: pac-script
Packit Service b23acc
	 * variable: PAC_SCRIPT(+)
Packit Service b23acc
	 * description: Path of the PAC script.
Packit Service b23acc
	 * example: PAC_SCRIPT=/home/joe/proxy.pac
Packit Service b23acc
	 * ---end---
Packit Service b23acc
	 */
Packit Service b23acc
	obj_properties[PROP_PAC_SCRIPT] =
Packit Service b23acc
	    g_param_spec_string (NM_SETTING_PROXY_PAC_SCRIPT, "", "",
Packit Service b23acc
	                         NULL,
Packit Service b23acc
	                         G_PARAM_READWRITE |
Packit Service b23acc
	                         G_PARAM_STATIC_STRINGS);
Packit Service b23acc
Packit Service b23acc
	g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties);
Packit Service b23acc
Packit Service b23acc
	_nm_setting_class_commit (setting_class, NM_META_SETTING_TYPE_PROXY);
Packit Service b23acc
}