mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-02-05 13:30:28 +01:00
ifcfg-rh: recognize WEP connections even if they dont have WEP keys yet
Just because the key isn't saved (ie, the user hasn't entered it yet, or the user want to type it in every time) doesn't mean the setting isn't WEP, so recognize it as WEP if DEFAULTKEY or SECURITYMODE is set.
This commit is contained in:
parent
77239854f4
commit
da47a2add4
5 changed files with 154 additions and 17 deletions
|
|
@ -1697,6 +1697,7 @@ make_wep_setting (shvarFile *ifcfg,
|
|||
char *value;
|
||||
shvarFile *keys_ifcfg = NULL;
|
||||
int default_key_idx = 0;
|
||||
gboolean has_default_key = FALSE;
|
||||
|
||||
s_wireless_sec = NM_SETTING_WIRELESS_SECURITY (nm_setting_wireless_security_new ());
|
||||
g_object_set (s_wireless_sec, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "none", NULL);
|
||||
|
|
@ -1707,6 +1708,7 @@ make_wep_setting (shvarFile *ifcfg,
|
|||
|
||||
success = get_int (value, &default_key_idx);
|
||||
if (success && (default_key_idx >= 1) && (default_key_idx <= 4)) {
|
||||
has_default_key = TRUE;
|
||||
default_key_idx--; /* convert to [0...3] */
|
||||
g_object_set (s_wireless_sec, NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX, default_key_idx, NULL);
|
||||
} else {
|
||||
|
|
@ -1733,21 +1735,6 @@ make_wep_setting (shvarFile *ifcfg,
|
|||
g_assert (error == NULL || *error == NULL);
|
||||
}
|
||||
|
||||
/* If there's a default key, ensure that key exists */
|
||||
if ((default_key_idx == 1) && !nm_setting_wireless_security_get_wep_key (s_wireless_sec, 1)) {
|
||||
g_set_error (error, IFCFG_PLUGIN_ERROR, 0,
|
||||
"Default WEP key index was 2, but no valid KEY2 exists.");
|
||||
goto error;
|
||||
} else if ((default_key_idx == 2) && !nm_setting_wireless_security_get_wep_key (s_wireless_sec, 2)) {
|
||||
g_set_error (error, IFCFG_PLUGIN_ERROR, 0,
|
||||
"Default WEP key index was 3, but no valid KEY3 exists.");
|
||||
goto error;
|
||||
} else if ((default_key_idx == 3) && !nm_setting_wireless_security_get_wep_key (s_wireless_sec, 3)) {
|
||||
g_set_error (error, IFCFG_PLUGIN_ERROR, 0,
|
||||
"Default WEP key index was 4, but no valid KEY4 exists.");
|
||||
goto error;
|
||||
}
|
||||
|
||||
value = svGetValue (ifcfg, "SECURITYMODE", FALSE);
|
||||
if (value) {
|
||||
char *lcase;
|
||||
|
|
@ -1773,7 +1760,7 @@ make_wep_setting (shvarFile *ifcfg,
|
|||
&& !nm_setting_wireless_security_get_wep_key (s_wireless_sec, 1)
|
||||
&& !nm_setting_wireless_security_get_wep_key (s_wireless_sec, 2)
|
||||
&& !nm_setting_wireless_security_get_wep_key (s_wireless_sec, 3)
|
||||
&& !nm_setting_wireless_security_get_wep_tx_keyidx (s_wireless_sec)) {
|
||||
&& (has_default_key == FALSE)) {
|
||||
const char *auth_alg;
|
||||
|
||||
auth_alg = nm_setting_wireless_security_get_auth_alg (s_wireless_sec);
|
||||
|
|
|
|||
|
|
@ -69,7 +69,8 @@ EXTRA_DIST = \
|
|||
ifcfg-test-wired-qeth-static \
|
||||
ifcfg-test-bridge-main \
|
||||
ifcfg-test-bridge-component \
|
||||
ifcfg-test-vlan-interface
|
||||
ifcfg-test-vlan-interface \
|
||||
ifcfg-test-wifi-wep-no-keys
|
||||
|
||||
check-local:
|
||||
@for f in $(EXTRA_DIST); do \
|
||||
|
|
|
|||
|
|
@ -0,0 +1,18 @@
|
|||
ESSID="foobar"
|
||||
MODE=Managed
|
||||
TYPE=Wireless
|
||||
BOOTPROTO=dhcp
|
||||
DEFROUTE=yes
|
||||
IPV4_FAILURE_FATAL=yes
|
||||
IPV6INIT=yes
|
||||
IPV6_AUTOCONF=yes
|
||||
IPV6_DEFROUTE=yes
|
||||
IPV6_FAILURE_FATAL=no
|
||||
UUID=9c4637bd-7600-40cc-9c24-13819c5bf5dd
|
||||
ONBOOT=yes
|
||||
HWADDR=00:16:BB:AA:CC:DD
|
||||
DEFAULTKEY=1
|
||||
PEERDNS=yes
|
||||
PEERROUTES=yes
|
||||
IPV6_PEERDNS=yes
|
||||
IPV6_PEERROUTES=yes
|
||||
|
|
@ -5621,6 +5621,129 @@ test_read_wired_qeth_static (void)
|
|||
g_object_unref (connection);
|
||||
}
|
||||
|
||||
#define TEST_IFCFG_WIFI_WEP_NO_KEYS TEST_IFCFG_DIR"/network-scripts/ifcfg-test-wifi-wep-no-keys"
|
||||
|
||||
static void
|
||||
test_read_wifi_wep_no_keys (void)
|
||||
{
|
||||
NMConnection *connection;
|
||||
NMSettingConnection *s_con;
|
||||
NMSettingWireless *s_wireless;
|
||||
NMSettingWirelessSecurity *s_wsec;
|
||||
char *unmanaged = NULL;
|
||||
char *keyfile = NULL;
|
||||
char *routefile = NULL;
|
||||
char *route6file = NULL;
|
||||
gboolean ignore_error = FALSE;
|
||||
GError *error = NULL;
|
||||
const char *tmp;
|
||||
const char *expected_id = "System foobar (test-wifi-wep-no-keys)";
|
||||
NMWepKeyType key_type;
|
||||
|
||||
connection = connection_from_file (TEST_IFCFG_WIFI_WEP_NO_KEYS,
|
||||
NULL,
|
||||
TYPE_WIRELESS,
|
||||
NULL,
|
||||
&unmanaged,
|
||||
&keyfile,
|
||||
&routefile,
|
||||
&route6file,
|
||||
&error,
|
||||
&ignore_error);
|
||||
ASSERT (connection != NULL,
|
||||
"wifi-wep-no-keys-read", "failed to read %s: %s", TEST_IFCFG_WIFI_WEP_NO_KEYS, error->message);
|
||||
|
||||
ASSERT (nm_connection_verify (connection, &error),
|
||||
"wifi-wep-no-keys-verify", "failed to verify %s: %s", TEST_IFCFG_WIFI_WEP_NO_KEYS, error->message);
|
||||
|
||||
/* ===== CONNECTION SETTING ===== */
|
||||
|
||||
s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
|
||||
ASSERT (s_con != NULL,
|
||||
"wifi-wep-no-keys-verify-connection", "failed to verify %s: missing %s setting",
|
||||
TEST_IFCFG_WIFI_WEP_NO_KEYS,
|
||||
NM_SETTING_CONNECTION_SETTING_NAME);
|
||||
|
||||
/* ID */
|
||||
tmp = nm_setting_connection_get_id (s_con);
|
||||
ASSERT (tmp != NULL,
|
||||
"wifi-wep-no-keys-verify-connection", "failed to verify %s: missing %s / %s key",
|
||||
TEST_IFCFG_WIFI_WEP_NO_KEYS,
|
||||
NM_SETTING_CONNECTION_SETTING_NAME,
|
||||
NM_SETTING_CONNECTION_ID);
|
||||
ASSERT (strcmp (tmp, expected_id) == 0,
|
||||
"wifi-wep-no-keys-verify-connection", "failed to verify %s: unexpected %s / %s key value",
|
||||
TEST_IFCFG_WIFI_WEP_NO_KEYS,
|
||||
NM_SETTING_CONNECTION_SETTING_NAME,
|
||||
NM_SETTING_CONNECTION_ID);
|
||||
|
||||
/* UUID can't be tested if the ifcfg does not contain the UUID key, because
|
||||
* the UUID is generated on the full path of the ifcfg file, which can change
|
||||
* depending on where the tests are run.
|
||||
*/
|
||||
|
||||
/* ===== WIRELESS SETTING ===== */
|
||||
|
||||
s_wireless = NM_SETTING_WIRELESS (nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS));
|
||||
ASSERT (s_wireless != NULL,
|
||||
"wifi-wep-no-keys-verify-wireless", "failed to verify %s: missing %s setting",
|
||||
TEST_IFCFG_WIFI_WEP_NO_KEYS,
|
||||
NM_SETTING_WIRELESS_SETTING_NAME);
|
||||
|
||||
/* Security */
|
||||
tmp = nm_setting_wireless_get_security (s_wireless);
|
||||
ASSERT (tmp != NULL,
|
||||
"wifi-wep-no-keys-verify-wireless", "failed to verify %s: missing %s / %s key",
|
||||
TEST_IFCFG_WIFI_WEP_NO_KEYS,
|
||||
NM_SETTING_WIRELESS_SETTING_NAME,
|
||||
NM_SETTING_WIRELESS_SEC);
|
||||
ASSERT (strcmp (tmp, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME) == 0,
|
||||
"wifi-wep-no-keys-verify-wireless", "failed to verify %s: unexpected %s / %s key value",
|
||||
TEST_IFCFG_WIFI_WEP_NO_KEYS,
|
||||
NM_SETTING_WIRELESS_SETTING_NAME,
|
||||
NM_SETTING_WIRELESS_SEC);
|
||||
|
||||
|
||||
/* ===== WIRELESS SECURITY SETTING ===== */
|
||||
|
||||
s_wsec = NM_SETTING_WIRELESS_SECURITY (nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS_SECURITY));
|
||||
ASSERT (s_wsec != NULL,
|
||||
"wifi-wep-no-keys-verify-wireless", "failed to verify %s: missing %s setting",
|
||||
TEST_IFCFG_WIFI_WEP_NO_KEYS,
|
||||
NM_SETTING_WIRELESS_SECURITY_SETTING_NAME);
|
||||
|
||||
/* Key management */
|
||||
ASSERT (strcmp (nm_setting_wireless_security_get_key_mgmt (s_wsec), "none") == 0,
|
||||
"wifi-wep-no-keys-verify-wireless", "failed to verify %s: missing %s / %s key",
|
||||
TEST_IFCFG_WIFI_WEP_NO_KEYS,
|
||||
NM_SETTING_WIRELESS_SECURITY_SETTING_NAME,
|
||||
NM_SETTING_WIRELESS_SECURITY_KEY_MGMT);
|
||||
|
||||
/* WEP key index */
|
||||
ASSERT (nm_setting_wireless_security_get_wep_tx_keyidx (s_wsec) == 0,
|
||||
"wifi-wep-no-keys-verify-wireless", "failed to verify %s: unexpected %s / %s key value",
|
||||
TEST_IFCFG_WIFI_WEP_NO_KEYS,
|
||||
NM_SETTING_WIRELESS_SECURITY_SETTING_NAME,
|
||||
NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX);
|
||||
|
||||
/* WEP key type */
|
||||
key_type = nm_setting_wireless_security_get_wep_key_type (s_wsec);
|
||||
ASSERT (key_type == NM_WEP_KEY_TYPE_UNKNOWN || key_type == NM_WEP_KEY_TYPE_KEY,
|
||||
"wifi-wep-no-keys-verify-wireless", "failed to verify %s: unexpected WEP key type %d",
|
||||
TEST_IFCFG_WIFI_WEP_NO_KEYS,
|
||||
key_type);
|
||||
|
||||
/* WEP key index 0; we don't expect it to be filled */
|
||||
tmp = nm_setting_wireless_security_get_wep_key (s_wsec, 0);
|
||||
ASSERT (tmp == NULL,
|
||||
"wifi-wep-no-keys-verify-wireless", "failed to verify %s: missing %s / %s key",
|
||||
TEST_IFCFG_WIFI_WEP_NO_KEYS,
|
||||
NM_SETTING_WIRELESS_SECURITY_SETTING_NAME,
|
||||
NM_SETTING_WIRELESS_SECURITY_WEP_KEY0);
|
||||
|
||||
g_object_unref (connection);
|
||||
}
|
||||
|
||||
static void
|
||||
test_write_wired_static (void)
|
||||
{
|
||||
|
|
@ -9537,6 +9660,7 @@ int main (int argc, char **argv)
|
|||
test_read_wifi_wpa_eap_ttls_tls ();
|
||||
test_read_wifi_wep_eap_ttls_chap ();
|
||||
test_read_wired_qeth_static ();
|
||||
test_read_wifi_wep_no_keys ();
|
||||
|
||||
test_write_wired_static ();
|
||||
test_write_wired_static_ip6_only ();
|
||||
|
|
|
|||
|
|
@ -850,6 +850,13 @@ write_wireless_setting (NMConnection *connection,
|
|||
g_free (tmp);
|
||||
}
|
||||
|
||||
/* Ensure DEFAULTKEY and SECURITYMODE are cleared unless there's security;
|
||||
* otherwise there's no way to detect WEP vs. open when WEP keys aren't
|
||||
* saved.
|
||||
*/
|
||||
svSetValue (ifcfg, "DEFAULTKEY", NULL, FALSE);
|
||||
svSetValue (ifcfg, "SECURITYMODE", NULL, FALSE);
|
||||
|
||||
if (nm_setting_wireless_get_security (s_wireless)) {
|
||||
if (!write_wireless_security_setting (connection, ifcfg, adhoc, no_8021x, error))
|
||||
return FALSE;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue