summary refs log tree commit diff
path: root/src/settings/plugins/ifcfg-rh/reader.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2016-10-01 00:33:49 +0200
committerMichael Biebl <biebl@debian.org>2016-10-01 00:33:49 +0200
commit270c4830551c9810ad4e83f9a1db2b1cb946208c (patch)
tree5df09188f7e43b70896efb7b6e942e0b130d75d3 /src/settings/plugins/ifcfg-rh/reader.c
parent7514efc2f38c9ace4557d4e69d68e7d380389030 (diff)
New upstream version 1.4.2 upstream/1.4.2
Diffstat (limited to 'src/settings/plugins/ifcfg-rh/reader.c')
-rw-r--r--src/settings/plugins/ifcfg-rh/reader.c78
1 files changed, 43 insertions, 35 deletions
diff --git a/src/settings/plugins/ifcfg-rh/reader.c b/src/settings/plugins/ifcfg-rh/reader.c
index af5d2910..5a351cfa 100644
--- a/src/settings/plugins/ifcfg-rh/reader.c
+++ b/src/settings/plugins/ifcfg-rh/reader.c
@@ -1621,26 +1621,29 @@ check_if_bond_slave (shvarFile *ifcfg,
 	 */
 }
 
-static void
+static gboolean
 check_if_team_slave (shvarFile *ifcfg,
                      NMSettingConnection *s_con)
 {
-	char *value;
+	gs_free char *value = NULL;
 
-	value = svGetValue (ifcfg, "DEVICETYPE", FALSE);
-	if (!value)
-		return;
-	if (strcasecmp (value, TYPE_TEAM_PORT)) {
-		g_free (value);
-		return;
-	}
-	g_free (value);
 	value = svGetValue (ifcfg, "TEAM_MASTER", FALSE);
 	if (!value)
-		return;
+		return FALSE;
 	g_object_set (s_con, NM_SETTING_CONNECTION_MASTER, value, NULL);
 	g_object_set (s_con, NM_SETTING_CONNECTION_SLAVE_TYPE, NM_SETTING_TEAM_SETTING_NAME, NULL);
-	g_free (value);
+	return TRUE;
+}
+
+static void
+check_if_slave (shvarFile *ifcfg,
+                NMSettingConnection *s_con)
+{
+	g_return_if_fail (NM_IS_SETTING_CONNECTION (s_con));
+
+	if (check_if_team_slave (ifcfg, s_con))
+		return;
+	check_if_bond_slave (ifcfg, s_con);
 }
 
 typedef struct {
@@ -3157,14 +3160,6 @@ make_wpa_setting (shvarFile *ifcfg,
 		if (allow_rsn && svGetValueBoolean (ifcfg, "WPA_ALLOW_WPA2", TRUE))
 			nm_setting_wireless_security_add_proto (wsec, "rsn");
 
-		/* If neither WPA_ALLOW_WPA or WPA_ALLOW_WPA2 were present, default
-		 * to both WPA and RSN allowed.
-		 */
-		if (!allow_wpa && !allow_rsn && !ieee8021x) {
-			nm_setting_wireless_security_add_proto (wsec, "wpa");
-			nm_setting_wireless_security_add_proto (wsec, "rsn");
-		}
-
 		g_free (allow_wpa);
 		g_free (allow_rsn);
 	}
@@ -3211,6 +3206,12 @@ make_wpa_setting (shvarFile *ifcfg,
 	}
 
 	g_free (value);
+
+	value = svGetValue (ifcfg, "SECURITYMODE", FALSE);
+	if (NM_IN_STRSET (value, NULL, "open"))
+		g_object_set (wsec, NM_SETTING_WIRELESS_SECURITY_AUTH_ALG, value, NULL);
+
+	g_free (value);
 	return (NMSetting *) wsec;
 
 error:
@@ -3948,8 +3949,7 @@ wired_connection_from_ifcfg (const char *file,
 		g_object_unref (connection);
 		return NULL;
 	}
-	check_if_bond_slave (ifcfg, NM_SETTING_CONNECTION (con_setting));
-	check_if_team_slave (ifcfg, NM_SETTING_CONNECTION (con_setting));
+	check_if_slave (ifcfg, (NMSettingConnection *) con_setting);
 	nm_connection_add_setting (connection, con_setting);
 
 	wired_setting = make_wired_setting (ifcfg, file, &s_8021x, error);
@@ -4099,8 +4099,7 @@ infiniband_connection_from_ifcfg (const char *file,
 		g_object_unref (connection);
 		return NULL;
 	}
-	check_if_bond_slave (ifcfg, NM_SETTING_CONNECTION (con_setting));
-	check_if_team_slave (ifcfg, NM_SETTING_CONNECTION (con_setting));
+	check_if_slave (ifcfg, (NMSettingConnection *) con_setting);
 	nm_connection_add_setting (connection, con_setting);
 
 	infiniband_setting = make_infiniband_setting (ifcfg, file, error);
@@ -4237,6 +4236,7 @@ bond_connection_from_ifcfg (const char *file,
 static char *
 read_team_config (shvarFile *ifcfg, const char *key, GError **error)
 {
+	gs_free_error GError *local_error = NULL;
 	char *value;
 	size_t l;
 
@@ -4257,6 +4257,12 @@ read_team_config (shvarFile *ifcfg, const char *key, GError **error)
 		return NULL;
 	}
 	svUnescape (value);
+
+	if (value && value[0] && !_nm_utils_check_valid_json (value, &local_error)) {
+		PARSE_WARNING ("ignoring invalid team configuration: %s", local_error->message);
+		g_clear_pointer (&value, g_free);
+	}
+
 	return value;
 }
 
@@ -4599,8 +4605,6 @@ is_bond_device (const char *name, shvarFile *parsed)
 
 	if (svGetValueBoolean (parsed, "BONDING_MASTER", FALSE))
 		return TRUE;
-	
-	/* XXX: Check for "bond[\d]+"? */
 
 	return FALSE;
 }
@@ -4816,8 +4820,7 @@ vlan_connection_from_ifcfg (const char *file,
 		g_object_unref (connection);
 		return NULL;
 	}
-	check_if_bond_slave (ifcfg, NM_SETTING_CONNECTION (con_setting));
-	check_if_team_slave (ifcfg, NM_SETTING_CONNECTION (con_setting));
+	check_if_slave (ifcfg, (NMSettingConnection *) con_setting);
 	nm_connection_add_setting (connection, con_setting);
 
 	vlan_setting = make_vlan_setting (ifcfg, file, error);
@@ -4848,7 +4851,7 @@ create_unhandled_connection (const char *filename, shvarFile *ifcfg,
 	NMSetting *s_con;
 	char *value;
 
-	g_assert (out_spec != NULL);
+	nm_assert (out_spec && !*out_spec);
 
 	connection = nm_simple_connection_new ();
 
@@ -4963,8 +4966,7 @@ connection_from_file_full (const char *filename,
 	const char *ifcfg_name = NULL;
 
 	g_return_val_if_fail (filename != NULL, NULL);
-	if (out_unhandled)
-		g_return_val_if_fail (*out_unhandled == NULL, NULL);
+	g_return_val_if_fail (out_unhandled && !*out_unhandled, NULL);
 
 	/* Non-NULL only for unit tests; normally use /etc/sysconfig/network */
 	if (!network_file)
@@ -4982,8 +4984,6 @@ connection_from_file_full (const char *filename,
 		return NULL;
 
 	if (!svGetValueBoolean (parsed, "NM_CONTROLLED", TRUE)) {
-		g_assert (out_unhandled != NULL);
-
 		connection = create_unhandled_connection (filename, parsed, "unmanaged", out_unhandled);
 		if (!connection)
 			g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_FAILED,
@@ -5011,6 +5011,16 @@ connection_from_file_full (const char *filename,
 			type = g_strdup (TYPE_ETHERNET);
 		g_free (devtype);
 	}
+	if (!type) {
+		gs_free char *t = NULL;
+
+		/* Team and TeamPort types are also accepted by the mere
+		 * presense of TEAM_CONFIG/TEAM_MASTER. They don't require
+		 * DEVICETYPE. */
+		t = svGetValue (parsed, "TEAM_CONFIG", FALSE);
+		if (t)
+			type = g_strdup (TYPE_TEAM);
+	}
 
 	if (!type)
 		type = svGetValue (parsed, "TYPE", FALSE);
@@ -5136,8 +5146,6 @@ connection_from_file_full (const char *filename,
 	else if (!strcasecmp (type, TYPE_BRIDGE))
 		connection = bridge_connection_from_ifcfg (filename, parsed, error);
 	else {
-		g_assert (out_unhandled != NULL);
-
 		connection = create_unhandled_connection (filename, parsed, "unrecognized", out_unhandled);
 		if (!connection)
 			PARSE_WARNING ("connection type was unrecognized but device was not uniquely identified; device may be managed");