Re: [PATCH] Improve WPAD proxy handling



On Wed, 2013-06-12 at 15:26 +0100, David Woodhouse wrote:
We already request WPAD information from the DHCP server (bug 368423)
but we don't do anything useful with it at all.

Well, except provide it to dispatcher clients.  This was sort of waiting
on more coherent proxy support including connection-specific user
overrides; see TODO.

The same information can also come from a VPN server, but we don't even
*collect* that.

This patch fixes the latter, and exposes the information in a coherent
fashion. There's no need at this point to overcomplicate matters by
pretending to support complicated manual proxy setups (as discussed in
TODO); this is just for what we can glean automatically, which is *only*
PAC files.

Tested with a local DHCP server that tells me where the proxy is, and
with a slightly modified nm-openconnect-service-openconnect-helper[sic].

This is based largely on the existing handling of NIS domainname.

Which isn't a great example, unfortunately.

I see that it's considered acceptable to (ab)use nm-dns-manager to
configure the NIS domain. I'll look at making it prod the PacRunner

Only grudgingly.

dæmon with proxy information too, but this part stands alone.

I think instead of stuffing into the IPv4 config we should probably have
per-interface proxy config instead, like we have ip4_config and
ip6_config.  Anyone else have comments on that?

There are any number of proxy options, and I don't think they really are
IPv4 or IPv6 specific, are they?  I mean, whether you get a PAC file
from DHCPv4 or DHCPv6 or VPNv4 or VPNv6 doesn't really make a
difference, it's just a URL.  And I have no idea how a client would make
a decision on which PAC URL to use if they had more than one?

Dan

diff --git a/include/NetworkManagerVPN.h b/include/NetworkManagerVPN.h
index 6e654b3..9b6e5f7 100644
--- a/include/NetworkManagerVPN.h
+++ b/include/NetworkManagerVPN.h
@@ -176,6 +176,9 @@ typedef enum {
 /* boolean: prevent this VPN connection from ever getting the default route */
 #define NM_VPN_PLUGIN_IP4_CONFIG_NEVER_DEFAULT "never-default"
 
+/* string: Location of PAC file for HTTP proxy */
+#define NM_VPN_PLUGIN_IP4_CONFIG_PROXY_PAC   "proxy-pac"
+
 /* Deprecated */
 #define NM_VPN_PLUGIN_IP4_CONFIG_GATEWAY   NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY
 
diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c
index f4e94a6..ebe9a69 100644
--- a/src/dhcp-manager/nm-dhcp-client.c
+++ b/src/dhcp-manager/nm-dhcp-client.c
@@ -1292,6 +1292,12 @@ ip4_options_to_config (NMDHCPClient *self)
              nm_ip4_config_set_nis_domain (ip4_config, str);
      }
 
+     str = g_hash_table_lookup (priv->options, "new_wpad");
+     if (str) {
+             nm_log_info (LOGD_DHCP4, "  Proxy PAC '%s'", str);
+             nm_ip4_config_set_proxy_pac (ip4_config, str);
+     }
+
      str = g_hash_table_lookup (priv->options, "new_nis_servers");
      if (str) {
              char **searches = g_strsplit (str, " ", 0);
diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c
index 0722981..8f86996 100644
--- a/src/nm-ip4-config.c
+++ b/src/nm-ip4-config.c
@@ -59,6 +59,8 @@ typedef struct {
      GArray *nis;
      char * nis_domain;
 
+     char * proxy_pac;
+
      GSList *routes;
 
      gboolean never_default;
@@ -569,6 +571,26 @@ nm_ip4_config_get_nis_domain (NMIP4Config *config)
      return NM_IP4_CONFIG_GET_PRIVATE (config)->nis_domain;
 }
 
+void
+nm_ip4_config_set_proxy_pac (NMIP4Config *config, const char *uri)
+{
+     NMIP4ConfigPrivate *priv;
+
+     g_return_if_fail (NM_IS_IP4_CONFIG (config));
+
+     priv = NM_IP4_CONFIG_GET_PRIVATE (config);
+     g_free (priv->proxy_pac);
+     priv->proxy_pac = g_strdup (uri);
+}
+
+const char *
+nm_ip4_config_get_proxy_pac (NMIP4Config *config)
+{
+     g_return_val_if_fail (NM_IS_IP4_CONFIG (config), 0);
+
+     return NM_IP4_CONFIG_GET_PRIVATE (config)->proxy_pac;
+}
+
 /* libnl convenience/conversion functions */
 
 static int ip4_addr_to_rtnl_local (guint32 ip4_address, struct rtnl_addr *addr)
@@ -790,6 +812,10 @@ nm_ip4_config_diff (NMIP4Config *a, NMIP4Config *b)
              && (g_strcmp0 (a_priv->nis_domain, b_priv->nis_domain) != 0))
              flags |= NM_IP4_COMPARE_FLAG_NIS_DOMAIN;
 
+     if (   (a_priv->proxy_pac || b_priv->proxy_pac)
+             && (g_strcmp0 (a_priv->proxy_pac, b_priv->proxy_pac) != 0))
+             flags |= NM_IP4_COMPARE_FLAG_PROXY_PAC;
+
      if (   !route_slist_compare (a_priv->routes, b_priv->routes)
          || !route_slist_compare (b_priv->routes, a_priv->routes))
              flags |= NM_IP4_COMPARE_FLAG_ROUTES;
@@ -856,6 +882,10 @@ nm_ip4_config_hash (NMIP4Config *config, GChecksum *sum, gboolean dns_only)
              s = nm_ip4_config_get_nis_domain (config);
              if (s)
                      g_checksum_update (sum, (const guint8 *) s, strlen (s));
+
+             s = nm_ip4_config_get_proxy_pac (config);
+             if (s)
+                     g_checksum_update (sum, (const guint8 *) s, strlen (s));
      }
 
      for (i = 0; i < nm_ip4_config_get_num_nameservers (config); i++)
@@ -900,6 +930,7 @@ finalize (GObject *object)
      g_ptr_array_free (priv->searches, TRUE);
      g_array_free (priv->nis, TRUE);
      g_free (priv->nis_domain);
+     g_free (priv->proxy_pac);
 
      G_OBJECT_CLASS (nm_ip4_config_parent_class)->finalize (object);
 }
diff --git a/src/nm-ip4-config.h b/src/nm-ip4-config.h
index 5433768..c66aece 100644
--- a/src/nm-ip4-config.h
+++ b/src/nm-ip4-config.h
@@ -107,6 +107,9 @@ void          nm_ip4_config_reset_nis_servers   (NMIP4Config *config);
 void          nm_ip4_config_set_nis_domain      (NMIP4Config *config, const char *domain);
 const char *  nm_ip4_config_get_nis_domain      (NMIP4Config *config);
 
+void          nm_ip4_config_set_proxy_pac       (NMIP4Config *config, const char *uri);
+const char *  nm_ip4_config_get_proxy_pac       (NMIP4Config *config);
+
 
 /* Flags for nm_ip4_config_to_rtnl_addr() */
 #define NM_RTNL_ADDR_NONE            0x0000
@@ -133,6 +136,7 @@ typedef enum {
      NM_IP4_COMPARE_FLAG_WINS_SERVERS= 0x00000100,
      NM_IP4_COMPARE_FLAG_NIS_SERVERS = 0x00000200,
      NM_IP4_COMPARE_FLAG_NIS_DOMAIN  = 0x00000400,
+     NM_IP4_COMPARE_FLAG_PROXY_PAC   = 0x00000800,
      NM_IP4_COMPARE_FLAG_ALL         = 0xFFFFFFFF   /* match everything */
 } NMIP4ConfigCompareFlags;
 
diff --git a/src/vpn-manager/nm-vpn-connection.c b/src/vpn-manager/nm-vpn-connection.c
index f2e31a8..bb9c710 100644
--- a/src/vpn-manager/nm-vpn-connection.c
+++ b/src/vpn-manager/nm-vpn-connection.c
@@ -493,6 +493,7 @@ print_vpn_config (NMVPNConnection *connection)
      NMIP4Address *addr;
      NMIP6Address *addr6;
      char *dns_domain = NULL;
+     const char *proxy_pac = NULL;
      guint32 num, i;
 
      if (priv->ip4_external_gw) {
@@ -542,6 +543,10 @@ print_vpn_config (NMVPNConnection *connection)
                      dns_domain = (char *) nm_ip4_config_get_domain (priv->ip4_config, 0);
 
              nm_log_info (LOGD_VPN, "  DNS Domain: '%s'", dns_domain ? dns_domain : "(none)");
+
+             proxy_pac = nm_ip4_config_get_proxy_pac (priv->ip4_config);
+             if (proxy_pac)
+                     nm_log_info (LOGD_VPN, "  Proxy PAC: '%s'", proxy_pac);
      } else
              nm_log_info (LOGD_VPN, "No IPv4 configuration");
 
@@ -898,6 +903,10 @@ nm_vpn_connection_ip4_config_get (DBusGProxy *proxy,
      if (val && G_VALUE_HOLDS_BOOLEAN (val))
              nm_ip4_config_set_never_default (config, g_value_get_boolean (val));
 
+     val = (GValue *) g_hash_table_lookup (config_hash, NM_VPN_PLUGIN_IP4_CONFIG_PROXY_PAC);
+     if (val)
+             nm_ip4_config_set_proxy_pac (config, g_value_get_string (val));
+
      /* Merge in user overrides from the NMConnection's IPv4 setting */
      s_ip4 = nm_connection_get_setting_ip4_config (priv->connection);
      nm_utils_merge_ip4_config (config, s_ip4);



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




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]