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:
Dan Williams 2011-02-02 16:50:58 -06:00
parent 77239854f4
commit da47a2add4
5 changed files with 154 additions and 17 deletions

View file

@ -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);

View file

@ -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 \

View file

@ -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

View file

@ -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 ();

View file

@ -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;