diff options
Diffstat (limited to 'src/settings/plugins/ifnet')
| -rw-r--r-- | src/settings/plugins/ifnet/Makefile.am | 16 | ||||
| -rw-r--r-- | src/settings/plugins/ifnet/Makefile.in | 25 | ||||
| -rw-r--r-- | src/settings/plugins/ifnet/connection_parser.c | 89 | ||||
| -rw-r--r-- | src/settings/plugins/ifnet/net_parser.c | 169 | ||||
| -rw-r--r-- | src/settings/plugins/ifnet/net_parser.h | 4 | ||||
| -rw-r--r-- | src/settings/plugins/ifnet/net_utils.c | 169 | ||||
| -rw-r--r-- | src/settings/plugins/ifnet/net_utils.h | 1 | ||||
| -rw-r--r-- | src/settings/plugins/ifnet/plugin.c | 85 | ||||
| -rw-r--r-- | src/settings/plugins/ifnet/plugin.h | 2 | ||||
| -rw-r--r-- | src/settings/plugins/ifnet/tests/Makefile.in | 9 | ||||
| -rw-r--r-- | src/settings/plugins/ifnet/tests/net | 11 | ||||
| -rw-r--r-- | src/settings/plugins/ifnet/tests/test_all.c | 43 | ||||
| -rw-r--r-- | src/settings/plugins/ifnet/tests/wpa_supplicant.conf | 7 | ||||
| -rw-r--r-- | src/settings/plugins/ifnet/wpa_parser.c | 19 | ||||
| -rw-r--r-- | src/settings/plugins/ifnet/wpa_parser.h | 5 |
15 files changed, 428 insertions, 226 deletions
diff --git a/src/settings/plugins/ifnet/Makefile.am b/src/settings/plugins/ifnet/Makefile.am index 9bf8a79a..84deda5b 100644 --- a/src/settings/plugins/ifnet/Makefile.am +++ b/src/settings/plugins/ifnet/Makefile.am @@ -45,13 +45,13 @@ lib_ifnet_io_la_SOURCES = \ wpa_parser.c lib_ifnet_io_la_CPPFLAGS = \ - $(GLIB_CFLAGS) \ - $(DBUS_CFLAGS) \ - -DG_DISABLE_DEPRECATED \ - -DSYSCONFDIR=\"$(sysconfdir)\" \ - -DSBINDIR=\"$(sbindir)\" + $(GLIB_CFLAGS) \ + $(DBUS_CFLAGS) \ + -DG_DISABLE_DEPRECATED \ + -DSYSCONFDIR=\"$(sysconfdir)\" \ + -DSBINDIR=\"$(sbindir)\" lib_ifnet_io_la_LIBADD = \ - $(top_builddir)/libnm-util/libnm-util.la \ - $(GLIB_LIBS)\ - $(GIO_LIBS) + $(top_builddir)/libnm-util/libnm-util.la \ + $(GLIB_LIBS)\ + $(GIO_LIBS) diff --git a/src/settings/plugins/ifnet/Makefile.in b/src/settings/plugins/ifnet/Makefile.in index 8218b85a..322adbf8 100644 --- a/src/settings/plugins/ifnet/Makefile.in +++ b/src/settings/plugins/ifnet/Makefile.in @@ -218,6 +218,8 @@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ +GLIB_MAKEFILE = @GLIB_MAKEFILE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ GMODULE_CFLAGS = @GMODULE_CFLAGS@ GMODULE_LIBS = @GMODULE_LIBS@ GMSGFMT = @GMSGFMT@ @@ -272,11 +274,15 @@ LIBNL2_LIBS = @LIBNL2_LIBS@ LIBNL3_CFLAGS = @LIBNL3_CFLAGS@ LIBNL3_LIBS = @LIBNL3_LIBS@ LIBNL_CFLAGS = @LIBNL_CFLAGS@ +LIBNL_GENL3_CFLAGS = @LIBNL_GENL3_CFLAGS@ +LIBNL_GENL3_LIBS = @LIBNL_GENL3_LIBS@ LIBNL_LIBS = @LIBNL_LIBS@ LIBNL_ROUTE3_CFLAGS = @LIBNL_ROUTE3_CFLAGS@ LIBNL_ROUTE3_LIBS = @LIBNL_ROUTE3_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ +LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@ +LIBSOUP_LIBS = @LIBSOUP_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ @@ -287,6 +293,7 @@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +MOC = @MOC@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ @@ -326,6 +333,8 @@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ +SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@ +SYSTEMD_LIBS = @SYSTEMD_LIBS@ SYSTEM_CA_PATH = @SYSTEM_CA_PATH@ UDEV_BASE_DIR = @UDEV_BASE_DIR@ USE_NLS = @USE_NLS@ @@ -433,16 +442,16 @@ lib_ifnet_io_la_SOURCES = \ wpa_parser.c lib_ifnet_io_la_CPPFLAGS = \ - $(GLIB_CFLAGS) \ - $(DBUS_CFLAGS) \ - -DG_DISABLE_DEPRECATED \ - -DSYSCONFDIR=\"$(sysconfdir)\" \ - -DSBINDIR=\"$(sbindir)\" + $(GLIB_CFLAGS) \ + $(DBUS_CFLAGS) \ + -DG_DISABLE_DEPRECATED \ + -DSYSCONFDIR=\"$(sysconfdir)\" \ + -DSBINDIR=\"$(sbindir)\" lib_ifnet_io_la_LIBADD = \ - $(top_builddir)/libnm-util/libnm-util.la \ - $(GLIB_LIBS)\ - $(GIO_LIBS) + $(top_builddir)/libnm-util/libnm-util.la \ + $(GLIB_LIBS)\ + $(GIO_LIBS) all: all-recursive diff --git a/src/settings/plugins/ifnet/connection_parser.c b/src/settings/plugins/ifnet/connection_parser.c index b4aaa8d2..78812f97 100644 --- a/src/settings/plugins/ifnet/connection_parser.c +++ b/src/settings/plugins/ifnet/connection_parser.c @@ -45,12 +45,6 @@ #include "connection_parser.h" #include "nm-ifnet-connection.h" -static const char * -get_prefix (void) -{ - return _("System"); -} - static void update_connection_id (NMConnection *connection, const char *conn_name) { @@ -62,16 +56,12 @@ update_connection_id (NMConnection *connection, const char *conn_name) name_len = strlen (conn_name); if ((name_len > 2) && (g_str_has_prefix (conn_name, "0x"))) { - gchar * conn_name_printable = utils_hexstr2bin (conn_name + 2, name_len - 2); - idstr = g_strdup_printf ("%s (%s)", get_prefix (), conn_name_printable); - g_free (conn_name_printable); + idstr = utils_hexstr2bin (conn_name + 2, name_len - 2); } else - idstr = g_strdup_printf ("%s (%s)", get_prefix (), conn_name); + idstr = g_strdup_printf ("%s", conn_name); uuid_base = idstr; uuid = nm_utils_uuid_generate_from_string (uuid_base); - setting = - (NMSettingConnection *) nm_connection_get_setting (connection, - NM_TYPE_SETTING_CONNECTION); + setting = nm_connection_get_setting_connection (connection); g_object_set (setting, NM_SETTING_CONNECTION_ID, idstr, NM_SETTING_CONNECTION_UUID, uuid, NULL); PLUGIN_PRINT (IFNET_PLUGIN_NAME, @@ -509,20 +499,17 @@ static gboolean read_mac_address (const char *conn_name, GByteArray **array, GError **error) { const char *value = ifnet_get_data (conn_name, "mac"); - struct ether_addr *mac; if (!value || !strlen (value)) return TRUE; - mac = ether_aton (value); - if (!mac) { + *array = nm_utils_hwaddr_atoba (value, ARPHRD_ETHER); + if (!*array) { g_set_error (error, ifnet_plugin_error_quark (), 0, - "The MAC address '%s' was invalid.", value); + "The MAC address '%s' was invalid.", value); return FALSE; } - *array = g_byte_array_sized_new (ETH_ALEN); - g_byte_array_append (*array, (guint8 *) mac->ether_addr_octet, ETH_ALEN); return TRUE; } @@ -567,7 +554,7 @@ make_wired_connection_setting (NMConnection *connection, nm_connection_add_setting (connection, NM_SETTING (s_wired)); } -/* add NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME, +/* add NM_SETTING_IP4_CONFIG_DHCP_HOSTNAME, * NM_SETTING_IP4_CONFIG_DHCP_CLIENT_ID in future*/ static void make_ip4_setting (NMConnection *connection, @@ -596,19 +583,19 @@ make_ip4_setting (NMConnection *connection, g_object_unref (ip4_setting); return; } - if (!strcmp (method, "dhcp")) + if (strstr (method, "dhcp")) g_object_set (ip4_setting, NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NM_SETTING_IP4_CONFIG_NEVER_DEFAULT, FALSE, NULL); - else if (!strcmp (method, "autoip")){ + else if (strstr (method, "autoip")) { g_object_set (ip4_setting, NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL, NM_SETTING_IP4_CONFIG_NEVER_DEFAULT, FALSE, NULL); nm_connection_add_setting (connection, NM_SETTING (ip4_setting)); return; - } else if (!strcmp (method, "shared")){ + } else if (strstr (method, "shared")) { g_object_set (ip4_setting, NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_SHARED, @@ -663,7 +650,7 @@ make_ip4_setting (NMConnection *connection, } /* add dhcp hostname and client id */ - if (!is_static_block && !strcmp (method, "dhcp")) { + if (!is_static_block && strstr (method, "dhcp")) { gchar *dhcp_hostname, *client_id; get_dhcp_hostname_and_client_id (&dhcp_hostname, &client_id); @@ -868,7 +855,7 @@ make_ip6_setting (NMConnection *connection, nm_ip6_route_set_dest (route, iblock->ip); nm_ip6_route_set_next_hop (route, iblock->next_hop); nm_ip6_route_set_prefix (route, iblock->prefix); - /* metric is not per routes configuration right now + /* metric is not per routes configuration right now * global metric is also supported (metric="x") */ if ((metric_str = ifnet_get_data (conn_name, "metric")) != NULL) { metric = strtol (metric_str, NULL, 10); @@ -995,7 +982,7 @@ make_wireless_connection_setting (const char *conn_name, goto error; } - /* mode=0: infrastructure + /* mode=0: infrastructure * mode=1: adhoc */ value = wpa_get_value (conn_name, "mode"); if (value) @@ -1012,18 +999,15 @@ make_wireless_connection_setting (const char *conn_name, /* BSSID setting */ value = wpa_get_value (conn_name, "bssid"); if (value) { - struct ether_addr *eth; GByteArray *bssid; - eth = ether_aton (value); - if (!eth) { + bssid = nm_utils_hwaddr_atoba (value, ARPHRD_ETHER); + if (!bssid) { g_set_error (error, ifnet_plugin_error_quark (), 0, - "Invalid BSSID '%s'", value); + "Invalid BSSID '%s'", value); goto error; } - bssid = g_byte_array_sized_new (ETH_ALEN); - g_byte_array_append (bssid, eth->ether_addr_octet, ETH_ALEN); g_object_set (wireless_setting, NM_SETTING_WIRELESS_BSSID, bssid, NULL); g_byte_array_free (bssid, TRUE); @@ -1666,9 +1650,7 @@ ifnet_update_connection_from_config_block (const char *conn_name, GError **error connection = nm_connection_new (); if (!connection) return NULL; - setting = - (NMSettingConnection *) nm_connection_get_setting (connection, - NM_TYPE_SETTING_CONNECTION); + setting = nm_connection_get_setting_connection (connection); if (!setting) { setting = NM_SETTING_CONNECTION (nm_setting_connection_new ()); g_assert (setting); @@ -2021,10 +2003,7 @@ write_8021x_setting (NMConnection *connection, GString *phase2_auth; GString *phase1; - s_8021x = - (NMSetting8021x *) nm_connection_get_setting (connection, - NM_TYPE_SETTING_802_1X); - + s_8021x = nm_connection_get_setting_802_1x (connection); if (!s_8021x) { return TRUE; } @@ -2119,9 +2098,7 @@ write_wireless_security_setting (NMConnection * connection, guint32 i, num; GString *str; - s_wsec = - (NMSettingWirelessSecurity *) nm_connection_get_setting (connection, - NM_TYPE_SETTING_WIRELESS_SECURITY); + s_wsec = nm_connection_get_setting_wireless_security (connection); if (!s_wsec) { g_set_error (error, ifnet_plugin_error_quark (), 0, "Missing '%s' setting", @@ -2171,7 +2148,6 @@ write_wireless_security_setting (NMConnection * connection, wpa_set_data (conn_name, "auth_alg", NULL); /* Default WEP TX key index */ - wpa_set_data (conn_name, "wep_tx_keyidx", NULL); if (wep) { tmp = g_strdup_printf ("%d", @@ -2179,7 +2155,8 @@ write_wireless_security_setting (NMConnection * connection, (s_wsec)); wpa_set_data (conn_name, "wep_tx_keyidx", tmp); g_free (tmp); - } + } else + wpa_set_data (conn_name, "wep_tx_keyidx", NULL); /* WEP keys */ for (i = 0; i < 4; i++) { @@ -2287,7 +2264,7 @@ write_wireless_setting (NMConnection *connection, gboolean adhoc = FALSE, hex_ssid = FALSE; gchar *ssid_str, *tmp; - s_wireless = (NMSettingWireless *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS); + s_wireless = nm_connection_get_setting_wireless (connection); if (!s_wireless) { g_set_error (error, ifnet_plugin_error_quark (), 0, "Missing '%s' setting", @@ -2406,9 +2383,7 @@ write_wired_setting (NMConnection *connection, char *tmp; guint32 mtu; - s_wired = - (NMSettingWired *) nm_connection_get_setting (connection, - NM_TYPE_SETTING_WIRED); + s_wired = nm_connection_get_setting_wired (connection); if (!s_wired) { g_set_error (error, ifnet_plugin_error_quark (), 0, "Missing '%s' setting", @@ -2462,9 +2437,7 @@ write_ip4_setting (NMConnection *connection, const char *conn_name, GError **err gboolean has_def_route = FALSE; gboolean success = FALSE; - s_ip4 = - (NMSettingIP4Config *) nm_connection_get_setting (connection, - NM_TYPE_SETTING_IP4_CONFIG); + s_ip4 = nm_connection_get_setting_ip4_config (connection); if (!s_ip4) { g_set_error (error, ifnet_plugin_error_quark (), 0, "Missing '%s' setting", @@ -2668,9 +2641,7 @@ write_ip6_setting (NMConnection *connection, const char *conn_name, GError **err NMIP6Address *addr; const struct in6_addr *ip; - s_ip6 = - (NMSettingIP6Config *) nm_connection_get_setting (connection, - NM_TYPE_SETTING_IP6_CONFIG); + s_ip6 = nm_connection_get_setting_ip6_config (connection); if (!s_ip6) { g_set_error (error, ifnet_plugin_error_quark (), 0, "Missing '%s' setting", @@ -2856,7 +2827,7 @@ ifnet_update_parsers_by_connection (NMConnection *connection, NMSettingPPPOE *s_pppoe; /* Writing pppoe setting */ - s_pppoe = NM_SETTING_PPPOE (nm_connection_get_setting (connection, NM_TYPE_SETTING_PPPOE)); + s_pppoe = nm_connection_get_setting_pppoe (connection); if (!write_pppoe_setting (conn_name, s_pppoe)) goto out; pppoe = TRUE; @@ -2884,7 +2855,7 @@ ifnet_update_parsers_by_connection (NMConnection *connection, if (!write_ip4_setting (connection, conn_name, error)) goto out; - s_ip6 = (NMSettingIP6Config *) nm_connection_get_setting (connection, NM_TYPE_SETTING_IP6_CONFIG); + s_ip6 = nm_connection_get_setting_ip6_config (connection); if (s_ip6) { /* IPv6 Setting */ if (!write_ip6_setting (connection, conn_name, error)) @@ -2972,9 +2943,7 @@ get_wireless_name (NMConnection * connection) char buf[33]; int i = 0; - s_wireless = - (NMSettingWireless *) nm_connection_get_setting (connection, - NM_TYPE_SETTING_WIRELESS); + s_wireless = nm_connection_get_setting_wireless (connection); if (!s_wireless) return NULL; @@ -3020,7 +2989,7 @@ ifnet_add_new_connection (NMConnection *connection, const char *type; gchar *new_type, *new_name = NULL; - s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION)); + s_con = nm_connection_get_setting_connection (connection); g_assert (s_con); type = nm_setting_connection_get_connection_type (s_con); g_assert (type); diff --git a/src/settings/plugins/ifnet/net_parser.c b/src/settings/plugins/ifnet/net_parser.c index a48103db..38765f5f 100644 --- a/src/settings/plugins/ifnet/net_parser.c +++ b/src/settings/plugins/ifnet/net_parser.c @@ -22,6 +22,7 @@ #include <string.h> #include <nm-system-config-interface.h> #include <stdio.h> +#include "plugin.h" #include "net_parser.h" #include "net_utils.h" @@ -106,7 +107,6 @@ ignore_connection_name (const char *name) if (strlen (name) == 12 && is_hex (name)) result = TRUE; return result; - } static gboolean @@ -169,12 +169,10 @@ init_block_by_line (gchar * buf) conn = add_new_connection_config ("wireless", pos); } data = g_strdup (key_value[1]); - tmp = strip_string (data, '('); - tmp = strip_string (tmp, ')'); - strip_string (tmp, '"'); + tmp = strip_string (data, '"'); strip_string (tmp, '\''); if (conn) - g_hash_table_insert (conn, g_strdup (key_value[0]), + g_hash_table_insert (conn, strip_string (g_strdup (key_value[0]), ' '), g_strdup (tmp)); g_free (data); g_strfreev (key_value); @@ -195,26 +193,31 @@ destroy_connection_config (GHashTable * conn) g_hash_table_destroy (conn); } -// read settings from /etc/NetworkManager/nm-system-settings.conf +/* Read settings from NetworkManager's config file */ const char * ifnet_get_global_setting (const char *group, const char *key) { GError *error = NULL; GKeyFile *keyfile = g_key_file_new (); gchar *result = NULL; + const char *conf_file; + + /* Get confing file name from plugin. */ + conf_file = ifnet_plugin_get_conf_file (); if (!g_key_file_load_from_file (keyfile, - IFNET_SYSTEM_SETTINGS_KEY_FILE, + conf_file, G_KEY_FILE_NONE, &error)) { PLUGIN_WARN (IFNET_PLUGIN_NAME, "loading system config file (%s) caused error: (%d) %s", - IFNET_SYSTEM_SETTINGS_KEY_FILE, + conf_file, error ? error->code : -1, error && error->message ? error->message : "(unknown)"); } else { result = g_key_file_get_string (keyfile, group, key, &error); } g_key_file_free (keyfile); + return result; } @@ -283,6 +286,20 @@ is_function (gchar * line) return FALSE; } +static void +append_line (GString *buf, gchar* line) +{ + gchar *pos = NULL; + + if ((pos = strchr (line, '#')) != NULL) + *pos = '\0'; + g_strstrip (line); + + if (line[0] != '\0') + g_string_append_printf (buf, " %s", line); + g_free (line); +} + gboolean ifnet_init (gchar * config_file) { @@ -292,6 +309,8 @@ ifnet_init (gchar * config_file) /* Handle multiple lines with brackets */ gboolean complete = TRUE; + gboolean openrc_style = TRUE; + /* line buffer */ GString *buf; @@ -319,36 +338,60 @@ ifnet_init (gchar * config_file) strip_function (channel, line); continue; } - if (line[0] != '#' && line[0] != '\0') { - gchar *pos = NULL; + // New openrc style, bash arrays are not allowed. We only care about '"' + if (openrc_style && line[0] != '#' && line[0] != '\0' + && !strchr (line, '(') && !strchr (line, ')')) { + gchar *tmp = line; + + while ((tmp = strchr (tmp, '"')) != NULL) { + complete = !complete; + ++tmp; + } + + append_line (buf, line); + // Add "(separator) for routes. It will be easier for later parsing + if (strstr (buf->str, "via")) + g_string_append_printf (buf, "\""); + + if (!complete) + continue; + + strip_string (buf->str, '"'); + + init_block_by_line (buf->str); + g_string_free (buf, TRUE); + buf = g_string_new (NULL); + } + // Old bash arrays for baselayout-1, to be deleted + else if (line[0] != '#' && line[0] != '\0') { if (!complete) { complete = g_strrstr (line, ")") == NULL ? FALSE : TRUE; - if ((pos = strchr (line, '#')) != NULL) - *pos = '\0'; - g_strstrip (line); - if (line[0] != '\0') { - g_string_append_printf (buf, - " %s", line); - } - g_free (line); - if (!complete) + + append_line (buf, line); + if (!complete) { + openrc_style = FALSE; continue; + } + else { + openrc_style = TRUE; + } } else { complete = (g_strrstr (line, "(") != NULL && g_strrstr (line, ")") != NULL) || g_strrstr (line, "(") == NULL; - if ((pos = strchr (line, '#')) != NULL) - *pos = '\0'; - g_strstrip (line); - if (line[0] != '\0') - g_string_append (buf, line); - g_free (line); + + append_line (buf, line); if (!complete) + { + openrc_style = FALSE; continue; + } else { + openrc_style = TRUE; + } } init_block_by_line (buf->str); g_string_free (buf, TRUE); @@ -374,6 +417,34 @@ ifnet_get_data (const char *conn_name, const char *key) return NULL; } +/* format ip values for comparison */ +static gchar* +format_ip_for_comparison (const gchar * value) +{ + gchar **ipset; + guint length, i; + GString *formated_string = g_string_new (NULL); + gchar *formatted = NULL; + + ipset = g_strsplit (value, "\"", 0); + length = g_strv_length (ipset); + + for (i = 0; i < length; i++) + { + strip_string (ipset[i], ' '); + if (ipset[i][0] != '\0') + g_string_append_printf (formated_string, + "%s ", ipset[i]); + } + formatted = g_strdup (formated_string->str); + formatted[formated_string->len - 1] = '\0'; + + g_string_free (formated_string, TRUE); + g_strfreev (ipset); + + return formatted; +} + void ifnet_set_data (const char *conn_name, const char *key, const char *value) { @@ -391,7 +462,31 @@ ifnet_set_data (const char *conn_name, const char *key, const char *value) } /* Remove existing key value pair */ if (g_hash_table_lookup_extended (conn, key, &old_key, &old_value)) { - if (stripped && !strcmp(old_value, stripped)){ + + /* This ugly hack is due to baselayout compatibility. We have to + * deal with different ip format. So sometimes we have the same ips + * but different strings. + */ + if (stripped && + (!strcmp (key, "config") + || !strcmp (key, "routes") + || !strcmp (key, "pppd") + || !strcmp (key, "chat"))) + { + gchar *old_ips = format_ip_for_comparison (old_value); + gchar *new_ips = format_ip_for_comparison (value); + if(!strcmp (old_ips, new_ips)) + { + g_free (stripped); + g_free (old_ips); + g_free (new_ips); + return; + } + g_free (old_ips); + g_free (new_ips); + } + + if (stripped && !strcmp (old_value, stripped)) { g_free (stripped); return; } @@ -436,22 +531,28 @@ format_ips (gchar * value, gchar ** out_line, gchar * key, gchar * name) guint length, i; GString *formated_string = g_string_new (NULL); + strip_string (value, '('); + strip_string (value, ')'); strip_string (value, '"'); - ipset = g_strsplit (value, "\" \"", 0); + ipset = g_strsplit (value, "\"", 0); length = g_strv_length (ipset); //only one line if (length < 2) { *out_line = - g_strdup_printf ("%s_%s=( \"%s\" )\n", key, name, value); + g_strdup_printf ("%s_%s=\"%s\"\n", key, name, value); goto done; } // Multiple lines - g_string_append_printf (formated_string, "%s_%s=(\n", key, name); + g_string_append_printf (formated_string, "%s_%s=\"\n", key, name); for (i = 0; i < length; i++) - g_string_append_printf (formated_string, - "\t\"%s\"\n", ipset[i]); - g_string_append (formated_string, ")\n"); + { + strip_string (ipset[i], ' '); + if (ipset[i][0] != '\0') + g_string_append_printf (formated_string, + "%s\n", ipset[i]); + } + g_string_append (formated_string, "\"\n"); *out_line = g_strdup (formated_string->str); done: g_string_free (formated_string, TRUE); @@ -466,7 +567,7 @@ ifnet_flush_to_file (const char *config_file) gpointer key, value, name, network; GHashTableIter iter, iter_network; GList *list_iter; - gchar *out_line; + gchar *out_line = NULL; gsize bytes_written; gboolean result = FALSE; @@ -475,6 +576,8 @@ ifnet_flush_to_file (const char *config_file) if (!conn_table || !global_settings_table) return FALSE; + backup_file (config_file); + channel = g_io_channel_new_file (config_file, "w", NULL); if (!channel) { PLUGIN_WARN (IFNET_PLUGIN_NAME, diff --git a/src/settings/plugins/ifnet/net_parser.h b/src/settings/plugins/ifnet/net_parser.h index 0411e939..5dcc7e25 100644 --- a/src/settings/plugins/ifnet/net_parser.h +++ b/src/settings/plugins/ifnet/net_parser.h @@ -24,8 +24,8 @@ #include <glib.h> -#define CONF_NET_FILE "/etc/conf.d/net" -#define IFNET_SYSTEM_SETTINGS_KEY_FILE "/etc/NetworkManager/nm-system-settings.conf" +#define CONF_NET_FILE SYSCONFDIR "/conf.d/net" +#define IFNET_SYSTEM_SETTINGS_KEY_FILE SYSCONFDIR "/NetworkManager/nm-system-settings.conf" #define IFNET_KEY_FILE_GROUP "ifnet" gboolean ifnet_init (gchar * config_file); diff --git a/src/settings/plugins/ifnet/net_utils.c b/src/settings/plugins/ifnet/net_utils.c index b533ae3f..f1687479 100644 --- a/src/settings/plugins/ifnet/net_utils.c +++ b/src/settings/plugins/ifnet/net_utils.c @@ -26,6 +26,7 @@ #include <errno.h> #include <nm-utils.h> #include <nm-system-config-interface.h> +#include <gio/gio.h> #include "net_utils.h" #include "wpa_parser.h" #include "net_parser.h" @@ -242,8 +243,7 @@ read_hostname (const char *path) if (g_str_has_prefix (all_lines[i], "hostname")) { tmp = strstr (all_lines[i], "="); tmp++; - tmp = strip_string (tmp, '"'); - result = g_strdup (tmp); + result = g_shell_unquote (tmp, NULL); break; } @@ -352,6 +352,49 @@ is_ip6_address (const char *in_address) } +// 'c' is only used for openrc style +static gchar ** +split_addresses_by_char (const gchar *addresses, const gchar *c) +{ + gchar **ipset; + + if (addresses == NULL) + return NULL; + + if (strchr (addresses, '(') != NULL) { // old baselayout style + gchar *tmp = g_strdup (addresses); + strip_string (tmp, '('); + strip_string (tmp, ')'); + strip_string (tmp, '"'); + strip_string (tmp, '\''); + ipset = g_strsplit (tmp, "\" \"", 0); + g_free(tmp); + } else { // openrc style + if (strstr (addresses, "netmask")) + // There is only one ip address if "netmask" is specified. + // '\n' is not used in config so there will be only one split. + ipset = g_strsplit (addresses, "\n", 0); + else + ipset = g_strsplit (addresses, c, 0); + } + + return ipset; +} + +static gchar ** +split_addresses (const gchar* addresses) +{ + // " " is only used by openrc style + return split_addresses_by_char (addresses, " "); +} + +static gchar ** +split_routes (const gchar* routes) +{ + // "\"" is only used by openrc style + return split_addresses_by_char (routes, "\""); +} + gboolean has_ip6_address (const char *conn_name) { @@ -360,7 +403,7 @@ has_ip6_address (const char *conn_name) guint i; g_return_val_if_fail (conn_name != NULL, FALSE); - ipset = g_strsplit (ifnet_get_data (conn_name, "config"), "\" \"", 0); + ipset = split_addresses (ifnet_get_data (conn_name, "config")); length = g_strv_length (ipset); for (i = 0; i < length; i++) { if (!is_ip6_address (ipset[i])) @@ -512,8 +555,11 @@ get_ip4_gateway (gchar * gateway) tmp = g_strdup (tmp); strip_string (tmp, ' '); strip_string (tmp, '"'); + + // Only one gateway is selected if ((split = strstr (tmp, "\"")) != NULL) *split = '\0'; + if (!inet_pton (AF_INET, tmp, &tmp_ip4_addr)) goto error; g_free (tmp); @@ -567,14 +613,11 @@ convert_ip4_config_block (const char *conn_name) gchar *ip; guint32 def_gateway = 0; const char *routes; - gchar *pos; ip_block *start = NULL, *current = NULL, *iblock = NULL; - const char *pattern = - "((\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.)\\{(\\d{1,3})\\.\\.(\\d{1,3})\\}(/\\d{1,2}))"; g_return_val_if_fail (conn_name != NULL, NULL); - ipset = g_strsplit (ifnet_get_data (conn_name, "config"), "\" \"", 0); + ipset = split_addresses (ifnet_get_data (conn_name, "config")); length = g_strv_length (ipset); routes = ifnet_get_data (conn_name, "routes"); @@ -584,73 +627,16 @@ convert_ip4_config_block (const char *conn_name) for (i = 0; i < length; i++) { ip = ipset[i]; ip = strip_string (ip, '"'); - //Handle ip like 192.168.4.{1..3} - if ((pos = strchr (ip, '{')) != NULL) { - gchar *ip_start, *ip_prefix; - gchar *begin_str, *end_str; - int begin, end, j; - GRegex *regex; - GMatchInfo *match_info; - - regex = g_regex_new (pattern, 0, 0, NULL); - g_regex_match (regex, ip, 0, &match_info); - g_regex_unref (regex); - - if (!g_match_info_matches (match_info)) { - g_match_info_free (match_info); - continue; - } - begin_str = g_match_info_fetch (match_info, 3); - end_str = g_match_info_fetch (match_info, 4); - begin = atoi (begin_str); - end = atoi (end_str); - ip_start = g_match_info_fetch (match_info, 2); - ip_prefix = g_match_info_fetch (match_info, 5); - if (end < begin || begin < 1 || end > 254) { - g_match_info_free (match_info); - continue; - } - - for (j = begin; j <= end; j++) { - char suf[4]; - gchar *newip; - - sprintf (suf, "%d", j); - newip = - g_strconcat (ip_start, suf, ip_prefix, - NULL); - iblock = create_ip4_block (newip); - if (iblock == NULL) { - g_free (newip); - continue; - } - if (!iblock->gateway && def_gateway != 0) - iblock->gateway = def_gateway; - if (start == NULL) - start = current = iblock; - else { - current->next = iblock; - current = iblock; - } - g_free (newip); - } - g_free (begin_str); - g_free (end_str); - g_free (ip_start); - g_free (ip_prefix); - g_match_info_free (match_info); - } else { - iblock = create_ip4_block (ip); - if (iblock == NULL) - continue; - if (!iblock->gateway && def_gateway != 0) - iblock->gateway = def_gateway; - if (start == NULL) - start = current = iblock; - else { - current->next = iblock; - current = iblock; - } + iblock = create_ip4_block (ip); + if (iblock == NULL) + continue; + if (!iblock->gateway && def_gateway != 0) + iblock->gateway = def_gateway; + if (start == NULL) + start = current = iblock; + else { + current->next = iblock; + current = iblock; } } g_strfreev (ipset); @@ -667,7 +653,7 @@ convert_ip6_config_block (const char *conn_name) ip6_block *start = NULL, *current = NULL, *iblock = NULL; g_return_val_if_fail (conn_name != NULL, NULL); - ipset = g_strsplit (ifnet_get_data (conn_name, "config"), "\" \"", 0); + ipset = split_addresses (ifnet_get_data (conn_name, "config")); length = g_strv_length (ipset); for (i = 0; i < length; i++) { ip = ipset[i]; @@ -693,15 +679,11 @@ convert_ip4_routes_block (const char *conn_name) guint length; guint i; gchar *ip; - const char *routes; ip_block *start = NULL, *current = NULL, *iblock = NULL; g_return_val_if_fail (conn_name != NULL, NULL); - routes = ifnet_get_data (conn_name, "routes"); - if (!routes) - return NULL; - ipset = g_strsplit (routes, "\" \"", 0); + ipset = split_routes (ifnet_get_data (conn_name, "routes")); length = g_strv_length (ipset); for (i = 0; i < length; i++) { ip = ipset[i]; @@ -731,15 +713,11 @@ convert_ip6_routes_block (const char *conn_name) guint length; guint i; gchar *ip, *tmp_addr; - const char *routes; ip6_block *start = NULL, *current = NULL, *iblock = NULL; struct in6_addr *tmp_ip6_addr; g_return_val_if_fail (conn_name != NULL, NULL); - routes = ifnet_get_data (conn_name, "routes"); - if (!routes) - return NULL; - ipset = g_strsplit (routes, "\" \"", 0); + ipset = split_routes (ifnet_get_data (conn_name, "routes")); length = g_strv_length (ipset); for (i = 0; i < length; i++) { ip = ipset[i]; @@ -897,8 +875,8 @@ void get_dhcp_hostname_and_client_id (char **hostname, char **client_id) { const char *dhcp_client; - const gchar *dhcpcd_conf = "/etc/dhcpcd.conf"; - const gchar *dhclient_conf = "/etc/dhcp/dhclient.conf"; + const gchar *dhcpcd_conf = SYSCONFDIR "/dhcpcd.conf"; + const gchar *dhclient_conf = SYSCONFDIR "/dhcp/dhclient.conf"; gchar *line = NULL, *tmp = NULL, *contents = NULL; gchar **all_lines; guint line_num, i; @@ -972,3 +950,20 @@ get_dhcp_hostname_and_client_id (char **hostname, char **client_id) g_strfreev (all_lines); g_free (contents); } + +void backup_file (const gchar* target) +{ + GFile *source, *backup; + gchar* backup_path; + GError **error = NULL; + + source = g_file_new_for_path (target); + backup_path = g_strdup_printf ("%s.bak", target); + backup = g_file_new_for_path (backup_path); + + g_file_copy (source, backup, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, error); + if (error && *error) + PLUGIN_WARN (IFNET_PLUGIN_NAME, "Backup failed: %s", (*error)->message); + + g_free (backup_path); +} diff --git a/src/settings/plugins/ifnet/net_utils.h b/src/settings/plugins/ifnet/net_utils.h index 42f8d672..dee49143 100644 --- a/src/settings/plugins/ifnet/net_utils.h +++ b/src/settings/plugins/ifnet/net_utils.h @@ -77,4 +77,5 @@ gboolean is_true (const char *str); void get_dhcp_hostname_and_client_id (char **hostname, char **client_id); +void backup_file (const gchar* target); #endif diff --git a/src/settings/plugins/ifnet/plugin.c b/src/settings/plugins/ifnet/plugin.c index 59083688..fff83805 100644 --- a/src/settings/plugins/ifnet/plugin.c +++ b/src/settings/plugins/ifnet/plugin.c @@ -48,6 +48,7 @@ typedef struct { GHashTable *config_connections; gchar *hostname; + char *conf_file; gboolean unmanaged_well_known; GFileMonitor *hostname_monitor; @@ -180,7 +181,7 @@ monitor_file_changes (const char *filename, /* Callback for nm_settings_connection_replace_and_commit. Report any errors * encountered when commiting connection settings updates. */ static void -commit_cb (NMSettingsConnection *connection, GError *error, gpointer unused) +commit_cb (NMSettingsConnection *connection, GError *error, gpointer unused) { if (error) { PLUGIN_WARN (IFNET_PLUGIN_NAME, " error updating: %s", @@ -188,8 +189,7 @@ commit_cb (NMSettingsConnection *connection, GError *error, gpointer unused) } else { NMSettingConnection *s_con; - s_con = (NMSettingConnection *) nm_connection_get_setting (NM_CONNECTION (connection), - NM_TYPE_SETTING_CONNECTION); + s_con = nm_connection_get_setting_connection (NM_CONNECTION (connection)); g_assert (s_con); PLUGIN_PRINT (IFNET_PLUGIN_NAME, "Connection %s updated", nm_setting_connection_get_id (s_con)); @@ -317,6 +317,26 @@ reload_connections (gpointer config) g_list_free (conn_names); } +static void +check_flagged_secrets (NMSetting *setting, + const char *key, + const GValue *value, + GParamFlags flags, + gpointer user_data) +{ + gboolean *is_system_secret = user_data; + + if (flags & NM_SETTING_PARAM_SECRET) { + NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE; + + nm_setting_get_secret_flags (setting, key, &secret_flags, NULL); + + if (secret_flags != NM_SETTING_SECRET_FLAG_NONE) { + *is_system_secret = TRUE; + } + } +} + static NMSettingsConnection * add_connection (NMSystemConfigInterface *config, NMConnection *source, @@ -324,11 +344,28 @@ add_connection (NMSystemConfigInterface *config, { NMIfnetConnection *connection = NULL; char *conn_name; + gboolean has_flagged_secrets = FALSE; + NMSettingConnection *s_con; + + s_con = nm_connection_get_setting_connection (source); + g_assert (s_con); + + /* If the connection is not available for all users, ignore + * it as this plugin only deals with System Connections */ + if (nm_setting_connection_get_num_permissions (s_con)) + return NULL; + + /* If the connection has flagged secrets, ignore + * it as this plugin does not deal with user agent service */ + nm_connection_for_each_setting_value (source, check_flagged_secrets, &has_flagged_secrets); + + if (!has_flagged_secrets) { + conn_name = ifnet_add_new_connection (source, CONF_NET_FILE, WPA_SUPPLICANT_CONF, error); + if (conn_name) + connection = nm_ifnet_connection_new (conn_name, source); + reload_connections (config); + } - conn_name = ifnet_add_new_connection (source, CONF_NET_FILE, WPA_SUPPLICANT_CONF, error); - if (conn_name) - connection = nm_ifnet_connection_new (conn_name, source); - reload_connections (config); return connection ? NM_SETTINGS_CONNECTION (connection) : NULL; } @@ -494,6 +531,7 @@ dispose (GObject * object) } g_free (priv->hostname); + g_free (priv->conf_file); ifnet_destroy (); wpa_parser_destroy (); G_OBJECT_CLASS (sc_plugin_ifnet_parent_class)->dispose (object); @@ -527,16 +565,37 @@ sc_plugin_ifnet_class_init (SCPluginIfnetClass * req_class) NM_SYSTEM_CONFIG_INTERFACE_HOSTNAME); } +const char * +ifnet_plugin_get_conf_file (void) +{ + SCPluginIfnet *ifnet_plugin; + SCPluginIfnetPrivate *priv; + + /* Get config file name. Plugin's singleton has already been created + * with correct config file path, so the string passed here has no efect + * and we get the valid file name. + */ + ifnet_plugin = SC_PLUGIN_IFNET (nm_system_config_factory ("fake string")); + priv = SC_PLUGIN_IFNET_GET_PRIVATE (ifnet_plugin); + g_object_unref (ifnet_plugin); + + return priv->conf_file; +} + G_MODULE_EXPORT GObject * -nm_system_config_factory (void) +nm_system_config_factory (const char *config_file) { static SCPluginIfnet *singleton = NULL; + SCPluginIfnetPrivate *priv; - if (!singleton) - singleton - = - SC_PLUGIN_IFNET (g_object_new (SC_TYPE_PLUGIN_IFNET, NULL)); - else + if (!singleton) { + singleton = SC_PLUGIN_IFNET (g_object_new (SC_TYPE_PLUGIN_IFNET, NULL)); + if (singleton) { + priv = SC_PLUGIN_IFNET_GET_PRIVATE (singleton); + priv->conf_file = strdup (config_file); + } + } else g_object_ref (singleton); + return G_OBJECT (singleton); } diff --git a/src/settings/plugins/ifnet/plugin.h b/src/settings/plugins/ifnet/plugin.h index 83099b63..eecab159 100644 --- a/src/settings/plugins/ifnet/plugin.h +++ b/src/settings/plugins/ifnet/plugin.h @@ -43,5 +43,7 @@ struct _SCPluginIfnetClass { GObjectClass parent; }; +const char * ifnet_plugin_get_conf_file (void); + GType sc_plugin_ifnet_get_type (void); #endif diff --git a/src/settings/plugins/ifnet/tests/Makefile.in b/src/settings/plugins/ifnet/tests/Makefile.in index fe7f40e2..02ee121f 100644 --- a/src/settings/plugins/ifnet/tests/Makefile.in +++ b/src/settings/plugins/ifnet/tests/Makefile.in @@ -141,6 +141,8 @@ GIO_LIBS = @GIO_LIBS@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@ GLIB_LIBS = @GLIB_LIBS@ +GLIB_MAKEFILE = @GLIB_MAKEFILE@ +GLIB_MKENUMS = @GLIB_MKENUMS@ GMODULE_CFLAGS = @GMODULE_CFLAGS@ GMODULE_LIBS = @GMODULE_LIBS@ GMSGFMT = @GMSGFMT@ @@ -195,11 +197,15 @@ LIBNL2_LIBS = @LIBNL2_LIBS@ LIBNL3_CFLAGS = @LIBNL3_CFLAGS@ LIBNL3_LIBS = @LIBNL3_LIBS@ LIBNL_CFLAGS = @LIBNL_CFLAGS@ +LIBNL_GENL3_CFLAGS = @LIBNL_GENL3_CFLAGS@ +LIBNL_GENL3_LIBS = @LIBNL_GENL3_LIBS@ LIBNL_LIBS = @LIBNL_LIBS@ LIBNL_ROUTE3_CFLAGS = @LIBNL_ROUTE3_CFLAGS@ LIBNL_ROUTE3_LIBS = @LIBNL_ROUTE3_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ +LIBSOUP_CFLAGS = @LIBSOUP_CFLAGS@ +LIBSOUP_LIBS = @LIBSOUP_LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ @@ -210,6 +216,7 @@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ +MOC = @MOC@ MSGFMT = @MSGFMT@ MSGFMT_015 = @MSGFMT_015@ MSGMERGE = @MSGMERGE@ @@ -249,6 +256,8 @@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ +SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@ +SYSTEMD_LIBS = @SYSTEMD_LIBS@ SYSTEM_CA_PATH = @SYSTEM_CA_PATH@ UDEV_BASE_DIR = @UDEV_BASE_DIR@ USE_NLS = @USE_NLS@ diff --git a/src/settings/plugins/ifnet/tests/net b/src/settings/plugins/ifnet/tests/net index 0eef399a..27d39f44 100644 --- a/src/settings/plugins/ifnet/tests/net +++ b/src/settings/plugins/ifnet/tests/net @@ -27,10 +27,9 @@ config_eth2=( routes_eth2=("default via 4321:0:1:2:3:4:567:89ab") enable_ipv6_eth2="true" config_eth3=("nufjlsjlll") -managed_eth4=("false") +managed_eth4="false" routes_eth4=("default via 4321:0:1:2:3:4:567:89ab") config_eth5=("dhcp") -config_eth6=("192.168.4.{1..101}/24") config_eth7=( "dhcp" ) auto_eth7="true" @@ -38,6 +37,14 @@ auto_eth7="true" # missing config_eth8 auto_eth8="true" +#new openrc style +config_eth9="202.117.16.10/24 202.117.17.10/24" +routes_eth9="default via 202.117.16.1 +10.0.0.0/8 via 192.168.0.1 +" +config_eth10="202.117.16.2 netmask 255.255.255.0" +routes_eth10="10.0.0.0/8 via 192.168.0.1" + config_myxjtu2=("202.117.16.121/24 brd 202.117.16.255") routes_myxjtu2=("default via 202.117.16.1") dns_servers_myxjtu2="202.117.0.20 202.117.0.21" diff --git a/src/settings/plugins/ifnet/tests/test_all.c b/src/settings/plugins/ifnet/tests/test_all.c index 52d9ce2a..50441d4e 100644 --- a/src/settings/plugins/ifnet/tests/test_all.c +++ b/src/settings/plugins/ifnet/tests/test_all.c @@ -33,11 +33,21 @@ #include "wpa_parser.h" #include "connection_parser.h" +/* Fake config file function to make the linker happy */ +const char *ifnet_plugin_get_conf_file (void); + +const char * +ifnet_plugin_get_conf_file (void) +{ + return "/etc/foo/barasdfasdfasdfasdf"; +} + + static void test_getdata () { ASSERT (ifnet_get_data ("eth1", "config") - && strcmp (ifnet_get_data ("eth1", "config"), "dhcp") == 0, + && strcmp (ifnet_get_data ("eth1", "config"), "( \"dhcp\" )") == 0, "get data", "config_eth1 is not correct"); ASSERT (ifnet_get_data ("ppp0", "username") && strcmp (ifnet_get_data ("ppp0", "username"), "user") == 0, @@ -84,7 +94,7 @@ test_is_static () ASSERT (is_static_ip4 ("eth0") == TRUE, "is static", "a static interface is recognized as dhcp"); ASSERT (!is_static_ip6 ("eth0") == TRUE, "is static", - "a static interface is recognized as dhcp"); + "a dhcp interface is recognized as static"); } static void @@ -182,10 +192,6 @@ test_convert_ipv4_config_block () ASSERT (iblock == NULL, "convert config_block", "convert error configuration"); destroy_ip_block (iblock); - iblock = convert_ip4_config_block ("eth6"); - ASSERT (iblock != NULL, "convert config_block", - "convert error configuration"); - destroy_ip_block (iblock); } static void @@ -200,6 +206,16 @@ test_convert_ipv4_routes_block () destroy_ip_block (tmp); ASSERT (iblock == NULL, "convert ip4 routes", "should only get one route"); + + iblock = convert_ip4_routes_block ("eth9"); + tmp = iblock; + + ASSERT (iblock != NULL, "convert ip4 routes", "should get one route"); + check_ip_block (iblock, "10.0.0.0", "255.0.0.0", "192.168.0.1"); + iblock = iblock->next; + destroy_ip_block (tmp); + ASSERT (iblock == NULL, "convert ip4 routes", + "should only get one route"); } static void @@ -222,6 +238,9 @@ test_wpa_parser () "wep_key0 of static-wep-test should be abcde, find %s", value); ASSERT (exist_ssid ("leap-example"), "get wsec", "ssid leap-example is not found"); + + value = wpa_get_value ("test-with-hash-in-psk", "psk"); + g_assert_cmpstr (value, ==, "\"xjtudlc3731###asdfasdfasdf\""); } static void @@ -272,6 +291,18 @@ test_new_connection () "new connection failed: %s", error ? error->message : "NONE"); g_object_unref (connection); + + connection = ifnet_update_connection_from_config_block ("eth9", &error); + ASSERT (connection != NULL, "new connection", + "new connection(eth9) failed: %s", + error ? error->message : "NONE"); + g_object_unref (connection); + + connection = ifnet_update_connection_from_config_block ("eth10", &error); + ASSERT (connection != NULL, "new connection", + "new connection(eth10) failed: %s", + error ? error->message : "NONE"); + g_object_unref (connection); } #define NET_GEN_NAME "net.generate" diff --git a/src/settings/plugins/ifnet/tests/wpa_supplicant.conf b/src/settings/plugins/ifnet/tests/wpa_supplicant.conf index 4f5f68cf..609ee0e1 100644 --- a/src/settings/plugins/ifnet/tests/wpa_supplicant.conf +++ b/src/settings/plugins/ifnet/tests/wpa_supplicant.conf @@ -863,3 +863,10 @@ network={ phase2="auth=CHAP" priority=20 } + +network={ + ssid="test-with-hash-in-psk" + key_mgmt=WPA-PSK + psk="xjtudlc3731###asdfasdfasdf" +} + diff --git a/src/settings/plugins/ifnet/wpa_parser.c b/src/settings/plugins/ifnet/wpa_parser.c index da2bc3bb..0fd7d16b 100644 --- a/src/settings/plugins/ifnet/wpa_parser.c +++ b/src/settings/plugins/ifnet/wpa_parser.c @@ -124,7 +124,7 @@ add_key_value (GHashTable * network, gchar * line) g_strstrip (key_value[0]); g_strstrip (key_value[1]); - /* Reserve quotes for psk, wep_key, ssid + /* Reserve quotes for psk, wep_key, ssid * Quotes will determine whether they are hex format */ if (strcmp (key_value[0], "psk") != 0 && !g_str_has_prefix (key_value[0], "wep_key") @@ -162,7 +162,7 @@ add_one_wep_key (GHashTable * table, int key_num, gchar * one_wep_key) } } -/* Reading wep security information from /etc/conf.d/net. +/* Reading wep security information from /etc/conf.d/net. * This should not be used in futre, use wpa_supplicant instead. */ static void add_keys_from_net () @@ -279,16 +279,21 @@ wpa_parser_init (const char *wpa_supplicant_conf) } else { GHashTable *network = g_hash_table_new (g_str_hash, g_str_equal); - gchar *tmp; do { + gchar *quote_start, *quote_end = NULL, *comment; + if (line[0] == '#' || line[0] == '\0') { g_free (line); continue; } - /* ignore inline comments */ - if ((tmp = strchr (line, '#')) != NULL) - *tmp = '\0'; + /* ignore inline comments unless inside + a double-quoted string */ + if ((quote_start = strchr (line, '"')) != NULL) + quote_end = strrchr (quote_start + 1, '"'); + if ((comment = strchr ((quote_end != NULL) ? + quote_end : line, '#')) != NULL) + *comment = '\0'; if (strstr (line, "}") != NULL) complete = TRUE; add_key_value (network, line); @@ -371,6 +376,8 @@ wpa_flush_to_file (const char *config_file) if (!wsec_table || !wsec_global_table) return FALSE; + backup_file (config_file); + channel = g_io_channel_new_file (config_file, "w", NULL); if (!channel) { PLUGIN_WARN (IFNET_PLUGIN_NAME, diff --git a/src/settings/plugins/ifnet/wpa_parser.h b/src/settings/plugins/ifnet/wpa_parser.h index 7fd77a05..3a0d377e 100644 --- a/src/settings/plugins/ifnet/wpa_parser.h +++ b/src/settings/plugins/ifnet/wpa_parser.h @@ -21,8 +21,11 @@ #ifndef _WPA_PARSER_H #define _WPA_PARSER_H -#define WPA_SUPPLICANT_CONF "/etc/wpa_supplicant/wpa_supplicant.conf" + #include <glib.h> + +#define WPA_SUPPLICANT_CONF SYSCONFDIR "/wpa_supplicant/wpa_supplicant.conf" + void wpa_parser_init (const char *wpa_supplicant_conf); void wpa_parser_destroy (void); |