You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdenetworkmanager/tdenetworkmanager/src/knetworkmanager-connection_...

381 lines
10 KiB

/***************************************************************************
*
* knetworkmanager-connection_setting_8021x.cpp - A NetworkManager frontend for KDE
*
* 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>
/* knetworkmanager headers */
#include "knetworkmanager.h"
#include "knetworkmanager-connection_setting_8021x.h"
#include "knetworkmanager-accesspoint.h"
#include "knetworkmanager-connection_setting_wireless.h"
#include "knetworkmanager-connection.h"
#include "sha1.h"
#include "md5.h"
#define WPA_PMK_LEN 32
using namespace ConnectionSettings;
/*
class IEEE8021x
*/
IEEE8021x::IEEE8021x(Connection* conn)
: ConnectionSetting(conn, NM_SETTING_802_1X_SETTING_NAME)
, _eap(EAP_PHASE1_NONE)
, _identity(TQString())
, _anonIdentity(TQString())
, _caPath(TQString())
, _phase1PeapVer(TQString())
, _phase1PeapLabel(TQString())
, _phase1FastProvisioning(TQString())
, _eapPhase2(EAP_PHASE2_AUTH_NONE)
, _phase2AuthEAP(TQString())
, _phase2CaPath(TQString())
, _useSystemCaCert(false)
{
// init eap map
_eapMap[EAP_NONE] = TQString();
_eapMap[EAP_LEAP] = "leap";
_eapMap[EAP_MD5] = "md5";
_eapMap[EAP_PAP] = "pap";
_eapMap[EAP_CHAP] = "chap";
_eapMap[EAP_MSCHAP] = "mschap";
_eapMap[EAP_MSCHAPV2] = "mschapv2";
_eapMap[EAP_FAST] = "fast";
_eapMap[EAP_PSK] = "psk";
_eapMap[EAP_PAX] = "pax";
_eapMap[EAP_SAKE] = "sake";
_eapMap[EAP_GPSK] = "gpsk";
_eapMap[EAP_TLS] = "tls";
_eapMap[EAP_PEAP] = "peap";
_eapMap[EAP_TTLS] = "ttls";
_eapMap[EAP_SIM] = "sim";
_eapMap[EAP_GTC] = "gtc";
_eapMap[EAP_OTP] = "otp";
}
TQString
IEEE8021x::getIdentity(void) const
{
return _identity;
}
void
IEEE8021x::setIdentity(const TQString & identity)
{
_identity = identity;
}
TQString
IEEE8021x::getAnonIdentity(void) const
{
return _anonIdentity;
}
void
IEEE8021x::setAnonIdentity(const TQString & identity)
{
_anonIdentity = identity;
}
void
IEEE8021x::setPassword(const TQString& pwd)
{
_password = pwd;
}
TQString
IEEE8021x::getPassword(void) const
{
return _password;
}
bool
IEEE8021x::getUseSystemCaCert(void) const
{
return _useSystemCaCert;
}
void
IEEE8021x::setUseSystemCaCert(bool use)
{
_useSystemCaCert = use;
}
IEEE8021x::EAP_PHASE1
IEEE8021x::getEAP(void) const
{
return _eap;
}
void
IEEE8021x::setEAP(EAP_PHASE1 eap)
{
_eap = eap;
}
IEEE8021x::EAP_PHASE2
IEEE8021x::getPhase2EAP(void) const
{
return _eapPhase2;
}
void
IEEE8021x::setPhase2EAP(EAP_PHASE2 eap)
{
_eapPhase2 = eap;
}
SettingsMap
IEEE8021x::toMap() const
{
SettingsMap map;
// EAP
TQString eap = _eapMap[(EAP)_eap];
if (!eap.isEmpty())
{
TQValueList<TQT_DBusData> eap_methods;
eap_methods.append(TQT_DBusData::fromString(eap));
map.insert(NM_SETTING_802_1X_EAP, TQT_DBusData::fromTQValueList(eap_methods));
}
// Phase2 EAP
if (_eapPhase2 != EAP_PHASE2_AUTH_NONE)
{
map.insert(NM_SETTING_802_1X_PHASE2_AUTH, TQT_DBusData::fromString(_eapMap[(EAP)_eapPhase2]));
}
if (!_identity.isEmpty())
map.insert(NM_SETTING_802_1X_IDENTITY, TQT_DBusData::fromString(_identity));
if (!_anonIdentity.isEmpty())
map.insert(NM_SETTING_802_1X_ANONYMOUS_IDENTITY, TQT_DBusData::fromString(_anonIdentity));
// FIXME
/*
if (!_caCert.isNull())
map.insert("ca-cert", TQT_DBusData::fromString(_caCert));
*/
if (!_caPath.isEmpty())
map.insert(NM_SETTING_802_1X_CA_PATH, TQT_DBusData::fromString(_caPath));
if (!eap.isEmpty())
map.insert(NM_SETTING_802_1X_SYSTEM_CA_CERTS, TQT_DBusData::fromBool(_useSystemCaCert));
//FIXME
/*
if (!_clientCert.isNull())
map.insert("client-cert", TQT_DBusData::fromString(_clientCert));
if (!_privateKey.isNull())
map.insert("private-key", TQT_DBusData::fromString(_privateKey));
*/
if (!_phase1PeapVer.isNull())
map.insert(NM_SETTING_802_1X_PHASE1_PEAPVER, TQT_DBusData::fromString(_phase1PeapVer));
if (!_phase1PeapLabel.isNull())
map.insert(NM_SETTING_802_1X_PHASE1_PEAPLABEL, TQT_DBusData::fromString(_phase1PeapLabel));
if (!_phase1FastProvisioning.isNull())
map.insert(NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING, TQT_DBusData::fromString(_phase1FastProvisioning));
if (!_phase2AuthEAP.isNull())
map.insert(NM_SETTING_802_1X_PHASE2_AUTHEAP, TQT_DBusData::fromString(_phase2AuthEAP));
// FIXME
/*
if (!_phase2CaCert.isNull())
map.insert("phase2-ca-cert", TQVariant(_phase2CaCert));
*/
if (!_phase2CaPath.isNull())
map.insert(NM_SETTING_802_1X_PHASE2_CA_PATH, TQT_DBusData::fromString(_phase2CaPath));
// FIXME
/*
if (!_phase2ClientCert.isNull())
map.insert("phase2-client-cert", TQVariant(_phase2ClientCert));
if (!_phase2PrivateKey.isNull())
map.insert("phase2-private-key", TQVariant(_phase2PrivateKey));
*/
if(!_password.isNull())
map.insert(NM_SETTING_802_1X_PASSWORD, TQT_DBusData::fromString(""));
/*
899 g_hash_table_insert (hash, "password", string_to_gvalue (self->password));
900 if (self->pin)
901 g_hash_table_insert (hash, "pin", string_to_gvalue (self->pin));
902 if (self->eappsk)
903 g_hash_table_insert (hash, "eappsk", string_to_gvalue (self->eappsk));
904 if (self->private_key_passwd)
905 g_hash_table_insert (hash, "private-key-passwd", string_to_gvalue (self->private_key_passwd));
906 if (self->phase2_private_key_passwd)
907 g_hash_table_insert (hash, "phase2-private-key-passwd", string_to_gvalue (self->phase2_private_key_passwd));
*/
return map;
}
void
IEEE8021x::fromMap(const SettingsMap& map)
{
kdDebug() << "IEEE8021x::fromMap" << endl;
for (SettingsMap::ConstIterator it = map.begin(); it != map.end(); ++it)
{
if(it.key() == NM_SETTING_802_1X_EAP)
{
TQValueList<TQT_DBusData> eap_methods = it.data().toTQValueList();
if (!eap_methods.isEmpty())
{
TQString eap = eap_methods.first().toString();
TQBiDirectionalMap<EAP, TQString>::Iterator it2;
if (_eapMap.end() != (it2 = _eapMap.findData(eap)))
setEAP((EAP_PHASE1)it2.key());
}
else
{
// older version of NM used TQString instead of TQValueList<TQString>
TQString eap = it.data().toString();
if (!eap.isEmpty())
{
TQBiDirectionalMap<EAP, TQString>::Iterator it2;
if (_eapMap.end() != (it2 = _eapMap.findData(eap)))
setEAP((EAP_PHASE1)it2.key());
}
}
}
else if (it.key() == NM_SETTING_802_1X_PHASE2_AUTH)
{
TQString eapPhase2 = it.data().toString();
TQBiDirectionalMap<EAP, TQString>::Iterator it2;
if (_eapMap.end() != (it2 = _eapMap.findData(eapPhase2)))
setPhase2EAP((EAP_PHASE2)it2.key());
}
else if (it.key() == NM_SETTING_802_1X_IDENTITY)
_identity = it.data().toString();
else if (it.key() == NM_SETTING_802_1X_ANONYMOUS_IDENTITY)
_anonIdentity = it.data().toString();
else if (it.key() == NM_SETTING_802_1X_CA_PATH)
_caPath = it.data().toString();
else if (it.key() == NM_SETTING_802_1X_PHASE1_PEAPVER)
_phase1PeapVer = it.data().toString();
else if (it.key() == NM_SETTING_802_1X_PHASE1_PEAPLABEL)
_phase1PeapLabel = it.data().toString();
else if (it.key() == NM_SETTING_802_1X_PHASE1_FAST_PROVISIONING)
_phase1FastProvisioning = it.data().toString();
else if (it.key() == NM_SETTING_802_1X_PHASE2_AUTHEAP)
_phase2AuthEAP = it.data().toString();
else if (it.key() == NM_SETTING_802_1X_PHASE2_CA_PATH)
_phase2CaPath = it.data().toString();
else if (it.key() == NM_SETTING_802_1X_SYSTEM_CA_CERTS)
_useSystemCaCert = it.data().toBool();
else
kdWarning() << k_funcinfo << " Unknown setting: " << it.key() << endl;
}
}
SettingsMap
IEEE8021x::toSecretsMap(bool with_settings) const
{
SettingsMap map;
kdDebug() << "IEEE8021x::toSecretsMap" << endl;
// first serialize the settings if needed
if (with_settings)
map = toMap();
// add password
if (!_password.isNull())
map.insert(NM_SETTING_802_1X_PASSWORD, TQT_DBusData::fromString(_password));
if (!_privateKeyPasswd.isNull())
map.insert(NM_SETTING_802_1X_PRIVATE_KEY, TQT_DBusData::fromString(_privateKeyPasswd));
if (!_phase2PrivateKeyPasswd.isNull())
map.insert(NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, TQT_DBusData::fromString(_phase2PrivateKeyPasswd));
return map;
}
bool
IEEE8021x::fromSecretsMap(const SettingsMap& map)
{
kdDebug() << "IEEE8021x::fromMap" << endl;
for (SettingsMap::ConstIterator it = map.begin(); it != map.end(); ++it)
{
if (it.key() == NM_SETTING_802_1X_PASSWORD)
_password = it.data().toString();
else if (it.key() == NM_SETTING_802_1X_PRIVATE_KEY)
_privateKeyPasswd = it.data().toString();
else if (it.key() == NM_SETTING_802_1X_PHASE2_PRIVATE_KEY)
_phase2PrivateKeyPasswd = it.data().toString();
else
kdWarning() << k_funcinfo << " Unknown setting: " << it.key() << endl;
}
return true;
}
bool
IEEE8021x::isValid() const
{
return true;
}
TQValueList<IEEE8021x::EAP_PHASE2>
IEEE8021x::getAllowedPhase2Methods() const
{
TQValueList<EAP_PHASE2> phase2;
// TODO : not sure if this is correct, jsut copied from nm-applet
switch(_eap)
{
case EAP_PHASE1_TTLS:
phase2.append(EAP_PHASE2_AUTH_MSCHAPV2);
phase2.append(EAP_PHASE2_AUTH_MSCHAP);
phase2.append(EAP_PHASE2_AUTH_CHAP);
phase2.append(EAP_PHASE2_AUTH_PAP);
break;
case EAP_PHASE1_PEAP:
phase2.append(EAP_PHASE2_AUTH_MSCHAPV2);
phase2.append(EAP_PHASE2_AUTH_MD5);
break;
default:
phase2.append(EAP_PHASE2_AUTH_NONE);
}
return phase2;
}