Fields for storing ProxyConfig added to store proxy details
for that Object.
---
 src/devices/nm-device.c             | 51 +++++++++++++++++++++++++++++++++++++
 src/devices/nm-device.h             |  3 +++
 src/vpn-manager/nm-vpn-connection.c | 24 +++++++++++++++++
 src/vpn-manager/nm-vpn-connection.h |  2 ++
 4 files changed, 80 insertions(+)

diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index 5fd0bf3..cc99bd1 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -45,6 +45,7 @@
 #include "nm-lndp-rdisc.h"
 #include "nm-dhcp-manager.h"
 #include "nm-activation-request.h"
+#include "nm-proxy-config.h"
 #include "nm-ip4-config.h"
 #include "nm-ip6-config.h"
 #include "nm-dnsmasq-manager.h"
@@ -111,6 +112,7 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMDevice,
        PROP_CARRIER,
        PROP_MTU,
        PROP_IP4_ADDRESS,
+       PROP_PROXY_CONFIG,
        PROP_IP4_CONFIG,
        PROP_DHCP4_CONFIG,
        PROP_IP6_CONFIG,
@@ -288,6 +290,9 @@ typedef struct _NMDevicePrivate {
        guint32         dhcp_timeout;
        char *          dhcp_anycast_address;
 
+       /* Proxy Configuration */
+       NMProxyConfig * proxy_config;
+
        /* IP4 configuration info */
        NMIP4Config *   ip4_config;     /* Combined config from VPN, settings, 
and device */
        IpState         ip4_state;
@@ -396,6 +401,8 @@ typedef struct _NMDevicePrivate {
        guint check_delete_unrealized_id;
 } NMDevicePrivate;
 
+static void nm_device_set_proxy_config (NMDevice *self, GHashTable *options);
+
 static gboolean nm_device_set_ip4_config (NMDevice *self,
                                           NMIP4Config *config,
                                           guint32 default_route_metric,
@@ -4790,6 +4797,8 @@ dhcp4_state_changed (NMDhcpClient *client,
                        break;
                }
 
+               nm_device_set_proxy_config (self, options);
+
                nm_dhcp4_config_set_options (priv->dhcp4.config, options);
                _notify (self, PROP_DHCP4_CONFIG);
                priv->dhcp4.num_tries_left = DHCP_NUM_TRIES_MAX;
@@ -8223,6 +8232,39 @@ nm_device_get_dhcp4_config (NMDevice *self)
        return NM_DEVICE_GET_PRIVATE (self)->dhcp4.config;
 }
 
+NMProxyConfig *
+nm_device_get_proxy_config (NMDevice *self)
+{
+       g_return_val_if_fail (NM_IS_DEVICE (self), NULL);
+
+       return NM_DEVICE_GET_PRIVATE (self)->proxy_config;
+}
+
+static void
+nm_device_set_proxy_config (NMDevice *self, GHashTable *options)
+{
+       NMDevicePrivate *priv;
+       char *pac = NULL;
+
+       g_return_if_fail (NM_IS_DEVICE (self));
+
+       priv = NM_DEVICE_GET_PRIVATE (self);
+       if (!options)
+               _LOGI (LOGD_DEVICE, "Failed to get DHCP options");
+
+       priv->proxy_config = nm_proxy_config_new ();
+
+       pac = g_hash_table_lookup (options, "wpad");
+       if (pac) {
+               nm_proxy_config_set_method (priv->proxy_config, 
NM_PROXY_CONFIG_METHOD_AUTO);
+               nm_proxy_config_set_pac_url (priv->proxy_config, pac);
+               _LOGD (LOGD_PROXY, "Device's proxy config method: AUTO");
+       } else {
+               nm_proxy_config_set_method (priv->proxy_config, 
NM_PROXY_CONFIG_METHOD_NONE);
+               _LOGI (LOGD_PROXY, "PAC url not obtained from DHCP server");
+       }
+}
+
 NMIP4Config *
 nm_device_get_ip4_config (NMDevice *self)
 {
@@ -10477,6 +10519,7 @@ _cleanup_generic_post (NMDevice *self, CleanupType 
cleanup_type)
         */
        nm_device_set_ip4_config (self, NULL, 0, TRUE, TRUE, NULL);
        nm_device_set_ip6_config (self, NULL, TRUE, TRUE, NULL);
+       g_clear_object (&priv->proxy_config);
        g_clear_object (&priv->con_ip4_config);
        g_clear_object (&priv->dev_ip4_config);
        g_clear_object (&priv->ext_ip4_config);
@@ -11889,6 +11932,9 @@ get_property (GObject *object, guint prop_id,
        case PROP_MTU:
                g_value_set_uint (value, priv->mtu);
                break;
+       case PROP_PROXY_CONFIG:
+               nm_utils_g_value_set_object_path (value, ip_config_valid 
(priv->state) ? priv->proxy_config : NULL);
+               break;
        case PROP_IP4_CONFIG:
                nm_utils_g_value_set_object_path (value, ip_config_valid 
(priv->state) ? priv->ip4_config : NULL);
                break;
@@ -12093,6 +12139,11 @@ nm_device_class_init (NMDeviceClass *klass)
                               0, G_MAXUINT32, 0, /* FIXME */
                               G_PARAM_READWRITE |
                               G_PARAM_STATIC_STRINGS);
+       obj_properties[PROP_PROXY_CONFIG] =
+               g_param_spec_string (NM_DEVICE_PROXY_CONFIG, "", "",
+                                    NULL,
+                                    G_PARAM_READWRITE |
+                                    G_PARAM_STATIC_STRINGS);
        obj_properties[PROP_IP4_CONFIG] =
            g_param_spec_string (NM_DEVICE_IP4_CONFIG, "", "",
                                 NULL,
diff --git a/src/devices/nm-device.h b/src/devices/nm-device.h
index 4b365d6..f058eea 100644
--- a/src/devices/nm-device.h
+++ b/src/devices/nm-device.h
@@ -40,6 +40,7 @@
 #define NM_DEVICE_CAPABILITIES     "capabilities"
 #define NM_DEVICE_CARRIER          "carrier"
 #define NM_DEVICE_IP4_ADDRESS      "ip4-address"
+#define NM_DEVICE_PROXY_CONFIG     "proxy-config"
 #define NM_DEVICE_IP4_CONFIG       "ip4-config"
 #define NM_DEVICE_DHCP4_CONFIG     "dhcp4-config"
 #define NM_DEVICE_IP6_CONFIG       "ip6-config"
@@ -359,6 +360,8 @@ const char *    nm_device_get_initial_hw_address (NMDevice 
*dev);
 NMDhcp4Config * nm_device_get_dhcp4_config      (NMDevice *dev);
 NMDhcp6Config * nm_device_get_dhcp6_config      (NMDevice *dev);
 
+NMProxyConfig * nm_device_get_proxy_config      (NMDevice *dev);
+
 NMIP4Config *   nm_device_get_ip4_config        (NMDevice *dev);
 void            nm_device_replace_vpn4_config   (NMDevice *dev,
                                                  NMIP4Config *old,
diff --git a/src/vpn-manager/nm-vpn-connection.c 
b/src/vpn-manager/nm-vpn-connection.c
index b2aa8f6..6ed79cd 100644
--- a/src/vpn-manager/nm-vpn-connection.c
+++ b/src/vpn-manager/nm-vpn-connection.c
@@ -31,6 +31,7 @@
 #include <syslog.h>
 
 #include "nm-vpn-connection.h"
+#include "nm-proxy-config.h"
 #include "nm-ip4-config.h"
 #include "nm-ip6-config.h"
 #include "nm-platform.h"
@@ -107,6 +108,7 @@ typedef struct {
        GCancellable *cancellable;
        GVariant *connect_hash;
        guint connect_timeout;
+       NMProxyConfig *proxy_config;
        gboolean has_ip4;
        NMIP4Config *ip4_config;
        guint32 ip4_internal_gw;
@@ -511,6 +513,7 @@ _set_vpn_state (NMVpnConnection *self,
                                             _get_applied_connection (self),
                                             parent_dev,
                                             priv->ip_iface,
+                                            priv->proxy_config,
                                             priv->ip4_config,
                                             priv->ip6_config,
                                             dispatcher_pre_up_done,
@@ -530,6 +533,7 @@ _set_vpn_state (NMVpnConnection *self,
                                        _get_applied_connection (self),
                                        parent_dev,
                                        priv->ip_iface,
+                                       priv->proxy_config,
                                        priv->ip4_config,
                                        priv->ip6_config,
                                        NULL,
@@ -543,6 +547,7 @@ _set_vpn_state (NMVpnConnection *self,
                                                     _get_applied_connection 
(self),
                                                     parent_dev,
                                                     priv->ip_iface,
+                                                    priv->proxy_config,
                                                     priv->ip4_config,
                                                     priv->ip6_config);
                } else {
@@ -551,6 +556,7 @@ _set_vpn_state (NMVpnConnection *self,
                                                     _get_applied_connection 
(self),
                                                     parent_dev,
                                                     priv->ip_iface,
+                                                    priv->proxy_config,
                                                     priv->ip4_config,
                                                     priv->ip6_config,
                                                     dispatcher_pre_down_done,
@@ -573,6 +579,7 @@ _set_vpn_state (NMVpnConnection *self,
                                                             parent_dev,
                                                             priv->ip_iface,
                                                             NULL,
+                                                            NULL,
                                                             NULL);
                        } else {
                                nm_dispatcher_call_vpn 
(DISPATCHER_ACTION_VPN_DOWN,
@@ -584,6 +591,7 @@ _set_vpn_state (NMVpnConnection *self,
                                                        NULL,
                                                        NULL,
                                                        NULL,
+                                                       NULL,
                                                        NULL);
                        }
                }
@@ -1251,6 +1259,12 @@ process_generic_config (NMVpnConnection *self, GVariant 
*dict)
                g_object_notify (G_OBJECT (self), NM_VPN_CONNECTION_BANNER);
        }
 
+       if (g_variant_lookup (dict, NM_VPN_PLUGIN_CONFIG_PROXY_PAC, "&s", 
&str)) {
+               nm_proxy_config_set_method (priv->proxy_config, 
NM_PROXY_CONFIG_METHOD_AUTO);
+               nm_proxy_config_set_pac_url (priv->proxy_config, str);
+       } else
+               nm_proxy_config_set_method (priv->proxy_config, 
NM_PROXY_CONFIG_METHOD_NONE);
+
        /* External world-visible address of the VPN server */
        priv->ip4_external_gw = 0;
        g_clear_pointer (&priv->ip6_external_gw, g_free);
@@ -2135,6 +2149,14 @@ nm_vpn_connection_get_banner (NMVpnConnection *self)
        return NM_VPN_CONNECTION_GET_PRIVATE (self)->banner;
 }
 
+NMProxyConfig *
+nm_vpn_connection_get_proxy_config (NMVpnConnection *self)
+{
+       g_return_val_if_fail (NM_IS_VPN_CONNECTION (self), NULL);
+
+       return NM_VPN_CONNECTION_GET_PRIVATE (self)->proxy_config;
+}
+
 NMIP4Config *
 nm_vpn_connection_get_ip4_config (NMVpnConnection *self)
 {
@@ -2509,6 +2531,7 @@ nm_vpn_connection_init (NMVpnConnection *self)
 
        priv->vpn_state = STATE_WAITING;
        priv->secrets_idx = SECRETS_REQ_SYSTEM;
+       priv->proxy_config = g_object_ref (nm_proxy_config_new ());
        priv->default_route_manager = g_object_ref 
(nm_default_route_manager_get ());
        priv->route_manager = g_object_ref (nm_route_manager_get ());
 }
@@ -2533,6 +2556,7 @@ dispose (GObject *object)
                g_cancellable_cancel (priv->cancellable);
                g_clear_object (&priv->cancellable);
        }
+       g_clear_object (&priv->proxy_config);
        nm_exported_object_clear_and_unexport (&priv->ip4_config);
        nm_exported_object_clear_and_unexport (&priv->ip6_config);
        g_clear_object (&priv->proxy);
diff --git a/src/vpn-manager/nm-vpn-connection.h 
b/src/vpn-manager/nm-vpn-connection.h
index 6837432..09a0379 100644
--- a/src/vpn-manager/nm-vpn-connection.h
+++ b/src/vpn-manager/nm-vpn-connection.h
@@ -89,6 +89,8 @@ void                 nm_vpn_connection_disconnect      
(NMVpnConnection *self,
                                                         
NMVpnConnectionStateReason reason,
                                                         gboolean quitting);
 
+NMProxyConfig *      nm_vpn_connection_get_proxy_config (NMVpnConnection 
*self);
+
 NMIP4Config *        nm_vpn_connection_get_ip4_config  (NMVpnConnection *self);
 NMIP6Config *        nm_vpn_connection_get_ip6_config  (NMVpnConnection *self);
 const char *         nm_vpn_connection_get_ip_iface    (NMVpnConnection *self, 
gboolean fallback_device);
-- 
2.5.5

_______________________________________________
networkmanager-list mailing list
networkmanager-list@gnome.org
https://mail.gnome.org/mailman/listinfo/networkmanager-list

Reply via email to