|
|
|
/**************************************************************************
|
|
|
|
*
|
|
|
|
* tdenetman-connection_setting_wireless_security.cpp - A NetworkManager frontend for TDE
|
|
|
|
*
|
|
|
|
* Copyright (C) 2005, 2006 Novell, Inc.
|
|
|
|
*
|
|
|
|
* Author: Helmut Schaa <hschaa@suse.de>, <helmut.schaa@gmx.de>
|
|
|
|
*
|
|
|
|
* 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 <tqhostaddress.h>
|
|
|
|
#include <tqvariant.h>
|
|
|
|
|
|
|
|
/* kde headers */
|
|
|
|
#include <kdebug.h>
|
|
|
|
#include <klocale.h>
|
|
|
|
|
|
|
|
/* TQT_DBus headers*/
|
|
|
|
#include <tqdbusdata.h>
|
|
|
|
#include <tqdbusdatamap.h>
|
|
|
|
|
|
|
|
/* tdenetman headers */
|
|
|
|
#include "tdenetman.h"
|
|
|
|
#include "tdenetman-connection_setting_wireless_security.h"
|
|
|
|
#include "tdenetman-accesspoint.h"
|
|
|
|
#include "tdenetman-connection_setting_wireless.h"
|
|
|
|
#include "tdenetman-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<Wireless*>(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<TQT_DBusData> protos;
|
|
|
|
for (TQMap<PROTO, TQString>::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<TQT_DBusData> ciphers;
|
|
|
|
for (TQMap<CIPHERS, TQString>::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<TQT_DBusData> ciphers;
|
|
|
|
|
|
|
|
for (TQMap<CIPHERS, TQString>::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<KEY_MGMT, TQString>::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<AUTH_ALG, TQString>::Iterator it2;
|
|
|
|
if (_authAlgMap.end() != (it2 = _authAlgMap.findData(it.data().toString())))
|
|
|
|
setAuthAlg(it2.key());
|
|
|
|
}
|
|
|
|
else if(it.key() == NM_SETTING_WIRELESS_SECURITY_PROTO)
|
|
|
|
{
|
|
|
|
TQValueList<TQT_DBusData> proto_list = it.data().toTQValueList();
|
|
|
|
uint32_t protos = PROTO_NONE;
|
|
|
|
for (TQValueList<TQT_DBusData>::Iterator proto_it = proto_list.begin(); proto_it != proto_list.end(); ++proto_it)
|
|
|
|
{
|
|
|
|
TQBiDirectionalMap<PROTO, TQString>::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<TQT_DBusData> cipher_list = it.data().toTQValueList();
|
|
|
|
uint32_t ciphers = CIPHER_NONE;
|
|
|
|
for (TQValueList<TQT_DBusData>::Iterator cipher_it = cipher_list.begin(); cipher_it != cipher_list.end(); ++cipher_it)
|
|
|
|
{
|
|
|
|
TQBiDirectionalMap<CIPHERS, TQString>::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<TQT_DBusData> cipher_list = it.data().toTQValueList();
|
|
|
|
uint32_t ciphers = CIPHER_NONE;
|
|
|
|
for (TQValueList<TQT_DBusData>::Iterator cipher_it = cipher_list.begin(); cipher_it != cipher_list.end(); ++cipher_it)
|
|
|
|
{
|
|
|
|
TQBiDirectionalMap<CIPHERS, TQString>::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;
|
|
|
|
}
|