/************************************************************************** * * knetworkmanager-connection_setting_wireless_security.cpp - A NetworkManager frontend for KDE * * Copyright (C) 2005, 2006 Novell, Inc. * * Author: Helmut Schaa , * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * **************************************************************************/ /* qt headers */ #include #include /* kde headers */ #include #include /* TQT_DBus headers*/ #include #include /* knetworkmanager headers */ #include "knetworkmanager.h" #include "knetworkmanager-connection_setting_wireless_security.h" #include "knetworkmanager-accesspoint.h" #include "knetworkmanager-connection_setting_wireless.h" #include "knetworkmanager-connection.h" #include "sha1.h" #include "md5.h" using namespace ConnectionSettings; /* class WirelessSecurity */ WirelessSecurity::WirelessSecurity(Connection* conn) : ConnectionSetting(conn, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME) , _keyMgmt(KEY_MGMT_NONE) , _wepTxKeyidx(0) , _authAlg(AUTH_ALG_NONE) , _proto(PROTO_NONE) , _pairwise(CIPHER_TKIP | CIPHER_CCMP) , _group(CIPHER_TKIP | CIPHER_CCMP) { // init key_mgmt map _keyMgmtMap[KEY_MGMT_NONE] = "none"; _keyMgmtMap[KEY_MGMT_WPA_PSK] = "wpa-psk"; _keyMgmtMap[KEY_MGMT_WPA_EAP] = "wpa-eap"; _keyMgmtMap[KEY_MGMT_IEEE8021X] = "ieee8021x"; // init auth_alg map _authAlgMap[AUTH_ALG_NONE] = TQString(); // do not include auth alg if none is needed _authAlgMap[AUTH_ALG_OPEN] = "open"; _authAlgMap[AUTH_ALG_SHARED] = "shared"; _authAlgMap[AUTH_ALG_LEAP] = "leap"; // proto map _protoMap[PROTO_WPA] = "wpa"; _protoMap[PROTO_RSN] = "rsn"; // Info: rsn is wpa2 // cipher map _cipherMap[CIPHER_TKIP] = "tkip"; _cipherMap[CIPHER_CCMP] = "ccmp"; _cipherMap[CIPHER_WEP40] = "wep40"; _cipherMap[CIPHER_WEP104] = "wep104"; } bool WirelessSecurity::getEnabled() const { Connection* conn = getConnection(); if (conn) { Wireless* wireless = dynamic_cast(conn->getSetting(NM_SETTING_WIRELESS_SETTING_NAME)); if (wireless && wireless->getSecurity() != getType()) { kdDebug() << "WirelessSecurity::getEnabled false " << wireless->getSecurity().ascii() << endl; return false; } } return true; } int WirelessSecurity::getWepTxidx(void) const { return _wepTxKeyidx; } void WirelessSecurity::setWepTxidx(int idx) { if (idx >= 0 && idx < 4) _wepTxKeyidx = idx; } void WirelessSecurity::setWepKey(int idx, TQString key) { kdDebug() << "WirelessSecurity::setWepKey " << idx << " " << key.ascii() << endl; if (idx >= 0 && idx < 4) _wepKey[idx] = key; } TQString WirelessSecurity::getWepKey(int idx) const { if (idx >= 0 && idx < 4) return _wepKey[idx]; return TQString(); } uint32_t WirelessSecurity::getGroupCiphers(void) const { return _group; } void WirelessSecurity::setGroupCiphers(uint32_t ciphers) { _group= ciphers & (CIPHER_TKIP | CIPHER_CCMP | CIPHER_WEP40 | CIPHER_WEP104); } uint32_t WirelessSecurity::getPairwiseCiphers(void) const { return _pairwise; } void WirelessSecurity::setPairwiseCiphers(uint32_t ciphers) { // only tkip and ccmp allowed _pairwise = ciphers & (CIPHER_TKIP | CIPHER_CCMP); } uint32_t WirelessSecurity::getProto(void) const { return _proto; } void WirelessSecurity::setProto(uint32_t proto) { _proto = proto & (PROTO_WPA | PROTO_RSN); } void WirelessSecurity::addProto(uint32_t proto) { setProto(_proto | proto); } void WirelessSecurity::delProto(uint32_t proto) { setProto(_proto & ~proto); } TQString WirelessSecurity::getPSK(void) const { return _psk; } void WirelessSecurity::setPSK(const TQString& psk) { _psk = psk; } TQString WirelessSecurity::getLeapPassword(void) const { return _leapPassword; } void WirelessSecurity::setLeapPassword(const TQString& p) { _leapPassword = p; } TQString WirelessSecurity::getLeapUsername(void) const { return _leapUsername; } void WirelessSecurity::setLeapUsername(const TQString& u) { _leapUsername = u; } WirelessSecurity::KEY_MGMT WirelessSecurity::getKeyMgmt(void) const { return _keyMgmt; } void WirelessSecurity::setKeyMgmt(KEY_MGMT keyMgmt) { _keyMgmt = keyMgmt; } WirelessSecurity::AUTH_ALG WirelessSecurity::getAuthAlg(void) const { return _authAlg; } void WirelessSecurity::setAuthAlg(AUTH_ALG authAlg) { _authAlg = authAlg; } SettingsMap WirelessSecurity::toMap() const { SettingsMap map; // KEY MGMT map.insert(NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, TQT_DBusData::fromString(_keyMgmtMap[_keyMgmt])); // WEP TX KEYIDX is only needed if WEP is used if (_keyMgmt == KEY_MGMT_NONE && _wepTxKeyidx >= 0 && _wepTxKeyidx <= 3) { // WEP TX KEYIDX map.insert(NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX, TQT_DBusData::fromInt32(_wepTxKeyidx)); } // AUTH ALG if (_authAlg != AUTH_ALG_NONE) map.insert(NM_SETTING_WIRELESS_SECURITY_AUTH_ALG, TQT_DBusData::fromString(_authAlgMap[_authAlg])); // PROTO is only needed for WPA connections if (_proto != PROTO_NONE && (_keyMgmt == KEY_MGMT_WPA_NONE || _keyMgmt == KEY_MGMT_WPA_PSK || _keyMgmt == KEY_MGMT_WPA_EAP)) { TQValueList protos; for (TQMap::ConstIterator it = _protoMap.begin(); it != _protoMap.end(); ++it) if (_proto & it.key()) protos.append(TQT_DBusData::fromString(it.data())); if (protos.size() > 0) map.insert(NM_SETTING_WIRELESS_SECURITY_PROTO, TQT_DBusData::fromTQValueList(protos)); } // groupcipher if (_group != CIPHER_NONE) { TQValueList ciphers; for (TQMap::ConstIterator it = _cipherMap.begin(); it != _cipherMap.end(); ++it) if (_group & it.key()) ciphers.append(TQT_DBusData::fromString(it.data())); if (ciphers.size() > 0) map.insert(NM_SETTING_WIRELESS_SECURITY_GROUP, TQT_DBusData::fromTQValueList(ciphers)); } // pairwise cipher if (_pairwise != CIPHER_NONE) { TQValueList ciphers; for (TQMap::ConstIterator it = _cipherMap.begin(); it != _cipherMap.end(); ++it) if (_pairwise & it.key()) ciphers.append(TQT_DBusData::fromString(it.data())); if (ciphers.size() > 0) map.insert(NM_SETTING_WIRELESS_SECURITY_PAIRWISE, TQT_DBusData::fromTQValueList(ciphers)); } if (!_leapUsername.isEmpty()) map.insert(NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME, TQT_DBusData::fromString(_leapUsername)); return map; } void WirelessSecurity::fromMap(const SettingsMap& map) { kdDebug() << "WirelessSecurity::fromMap" << endl; for (SettingsMap::ConstIterator it = map.begin(); it != map.end(); ++it) { if (it.key() == NM_SETTING_WIRELESS_SECURITY_KEY_MGMT) { TQBiDirectionalMap::Iterator it2; if (_keyMgmtMap.end() != (it2 = _keyMgmtMap.findData(it.data().toString()))) setKeyMgmt(it2.key()); } else if (it.key() == NM_SETTING_WIRELESS_SECURITY_WEP_TX_KEYIDX) { _wepTxKeyidx = it.data().toInt32(); } else if (it.key() == NM_SETTING_WIRELESS_SECURITY_AUTH_ALG) { TQBiDirectionalMap::Iterator it2; if (_authAlgMap.end() != (it2 = _authAlgMap.findData(it.data().toString()))) setAuthAlg(it2.key()); } else if(it.key() == NM_SETTING_WIRELESS_SECURITY_PROTO) { TQValueList proto_list = it.data().toTQValueList(); uint32_t protos = PROTO_NONE; for (TQValueList::Iterator proto_it = proto_list.begin(); proto_it != proto_list.end(); ++proto_it) { TQBiDirectionalMap::Iterator it2; if (_protoMap.end() != (it2 = _protoMap.findData( (*proto_it).toString() ))) protos |= it2.key(); } setProto(protos); } else if(it.key() == NM_SETTING_WIRELESS_SECURITY_GROUP) { TQValueList cipher_list = it.data().toTQValueList(); uint32_t ciphers = CIPHER_NONE; for (TQValueList::Iterator cipher_it = cipher_list.begin(); cipher_it != cipher_list.end(); ++cipher_it) { TQBiDirectionalMap::Iterator it2; if (_cipherMap.end() != (it2 = _cipherMap.findData( (*cipher_it).toString() ))) ciphers |= it2.key(); } setGroupCiphers(ciphers); } else if (it.key() == NM_SETTING_WIRELESS_SECURITY_PAIRWISE) { TQValueList cipher_list = it.data().toTQValueList(); uint32_t ciphers = CIPHER_NONE; for (TQValueList::Iterator cipher_it = cipher_list.begin(); cipher_it != cipher_list.end(); ++cipher_it) { TQBiDirectionalMap::Iterator it2; if (_cipherMap.end() != (it2 = _cipherMap.findData( (*cipher_it).toString() ))) ciphers |= it2.key(); } setPairwiseCiphers(ciphers); } else if (it.key() == NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME) { _leapUsername = it.data().toString(); } else if (it.key() == NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD) { _leapPassword = it.data().toString(); } else kdWarning() << k_funcinfo << " Unknown setting: " << it.key() << endl; } } SettingsMap WirelessSecurity::toSecretsMap(bool with_settings) const { SettingsMap map; kdDebug() << "WirelessSecurity::toSecretsMap" << endl; // first serialize the settings if needed if (with_settings) map = toMap(); // add the hashed psk if (!_psk.isNull()) { map.insert(NM_SETTING_WIRELESS_SECURITY_PSK, TQT_DBusData::fromString(_psk), TRUE); } // wep keys if (!_wepKey[0].isNull()) { kdDebug() << "insert wep key0: " << _wepKey[0].ascii() << endl; map.insert(NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, TQT_DBusData::fromString(_wepKey[0])); } if (!_wepKey[1].isNull()) { map.insert(NM_SETTING_WIRELESS_SECURITY_WEP_KEY1, TQT_DBusData::fromString(_wepKey[1])); } if (!_wepKey[2].isNull()) { map.insert(NM_SETTING_WIRELESS_SECURITY_WEP_KEY2, TQT_DBusData::fromString(_wepKey[2])); } if (!_wepKey[3].isNull()) { map.insert(NM_SETTING_WIRELESS_SECURITY_WEP_KEY3, TQT_DBusData::fromString(_wepKey[3])); } if (!_leapPassword.isEmpty()) map.insert(NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD, TQT_DBusData::fromString(_leapPassword)); return map; } bool WirelessSecurity::fromSecretsMap(const SettingsMap& map) { kdDebug() << "WirelessSecurity::fromMap" << endl; for (SettingsMap::ConstIterator it = map.begin(); it != map.end(); ++it) { if (it.key() == NM_SETTING_WIRELESS_SECURITY_PSK) { _psk = it.data().toString(); } else if (it.key() == NM_SETTING_WIRELESS_SECURITY_WEP_KEY0) { _wepKey[0] = it.data().toString(); } else if (it.key() == NM_SETTING_WIRELESS_SECURITY_WEP_KEY1) { _wepKey[1] = it.data().toString(); } else if (it.key() == NM_SETTING_WIRELESS_SECURITY_WEP_KEY2) { _wepKey[2] = it.data().toString(); } else if (it.key() == NM_SETTING_WIRELESS_SECURITY_WEP_KEY3) { _wepKey[3] = it.data().toString(); } else kdWarning() << k_funcinfo << " Unknown setting: " << it.key() << endl; } return true; } bool WirelessSecurity::isValid() const { return true; }