--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/securitysettings/qtconfigutils/eapqtconfiginterface/src/eapqtconfiginterface_p.cpp Thu Jul 22 16:34:37 2010 +0100
@@ -0,0 +1,1886 @@
+/*
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ * EAP method configuration QT interface
+ *
+ */
+
+/*
+ * %version: 49 %
+ */
+
+// System includes
+#include <QDir>
+#include <QList>
+#include <QVariant>
+#include <QPluginLoader>
+#include <HbTranslator>
+#include <QLocale>
+#include <QCoreApplication>
+#include <QDebug>
+#include <cmmanager.h>
+#include <cmpluginwlandef.h>
+#include <EapGeneralSettings.h>
+#include <eapqtplugininfo.h>
+#include <eapqtcertificateinfo.h>
+
+// User includes
+#include "cpeapplugininterface.h"
+#include "eapqtconfiginterface_p.h"
+#include "eapqtvalidatorpassword.h"
+#include "eapqtvalidatorusername.h"
+#include "eapqtvalidatorrealm.h"
+#include "eapqtvalidatorpacstorepassword.h"
+#include "eapqtvalidatorpacstorepasswordconfirm.h"
+
+/*!
+ * \class EapQtConfigInterfacePrivate
+ * \brief Private implementation of EAP QT configuration interface
+ */
+
+// External function prototypes
+
+// Local constants
+static const QString eapTranslationFile("cpeapuiplugins");
+
+// ======== LOCAL FUNCTIONS ========
+
+// ======== MEMBER FUNCTIONS ========
+
+EapQtConfigInterfacePrivate::EapQtConfigInterfacePrivate() :
+ mValidatorInstance(true),
+ mLastOuterHandle(EapQtPluginHandle::PluginUndefined),
+ mTranslator(NULL),
+ mEapGsIf(NULL),
+ mEapTypeIf(NULL),
+ mIapId(0),
+ mEapBearer(ELan),
+ mEapDbIndex(EapQtConfigInterface::IapIdUndefined),
+ mEapDbIndexValid(false)
+{
+ qDebug("EapQtConfigInterfacePrivate() - created validator instance, this = 0x%08x", this);
+}
+
+EapQtConfigInterfacePrivate::EapQtConfigInterfacePrivate(
+ const EapQtConfigInterface::EapBearerType bearerType, const int iapId) :
+ mValidatorInstance(false),
+ mLastOuterHandle(EapQtPluginHandle::PluginUndefined),
+ mTranslator(NULL),
+ mEapGsIf(NULL),
+ mEapTypeIf(NULL),
+ mIapId(iapId),
+ mEapBearer(ELan),
+ mEapDbIndex(EapQtConfigInterface::IapIdUndefined),
+ mEapDbIndexValid(false)
+{
+ qDebug("EapQtConfigInterfacePrivate() - creating non-validator instance, this = 0x%08x", this);
+
+ switch (bearerType) {
+ case EapQtConfigInterface::EapBearerTypeVpn:
+ mEapBearer = EVpn;
+ break;
+ default:
+ // All others default to EapQtConfigInterface::EapBearerTypeWlan i.e. ELan
+ mEapBearer = ELan;
+ }
+
+ if (!setEapDbIndex(iapId)) {
+ qDebug("ERROR: EapQtConfigInterfacePrivate() - setIapId failed, bearer = %d, index = %d",
+ mEapBearer, iapId);
+ shutdown();
+ // throw an exception
+ qt_symbian_throwIfError(KErrNotFound);
+ }
+
+ // load plugins after everything else is ok
+ qDebug("EapQtConfigInterfacePrivate() - load plugins");
+ loadPlugins();
+
+ qDebug("EapQtConfigInterfacePrivate() - ends");
+}
+
+EapQtConfigInterfacePrivate::~EapQtConfigInterfacePrivate()
+{
+ qDebug("EapQtConfigInterfacePrivate::~EapQtConfigInterfacePrivate(), this = 0x%08x", this);
+
+ shutdown();
+}
+
+void EapQtConfigInterfacePrivate::shutdown()
+{
+ qDebug("EapQtConfigInterfacePrivate::shutdown(), this = 0x%08x", this);
+
+ mOuterEapsOn.Close();
+ mOuterEapsOff.Close();
+
+ // cleanup Ecom
+ REComSession::FinalClose();
+
+ // mTranslator gets deleted automatically (QScopedPointer)
+ // mEapTypeIf gets deleted automatically (QScopedPointer)
+ // mEapGsIf gets deleted automatically (QScopedPointer)
+}
+
+bool EapQtConfigInterfacePrivate::setConfigurationReference(const int iapId)
+{
+ qDebug("EapQtConfigInterfacePrivate::setConfigurationReference - requested id: %d, this = 0x%08x", iapId, this);
+
+ checkInstanceThrowing();
+ return setEapDbIndex(iapId);
+}
+
+bool EapQtConfigInterfacePrivate::setEapDbIndex(const int iapId)
+{
+
+ qDebug("EapQtConfigInterfacePrivate::setIapId - requested id: %d, this = 0x%08x", iapId, this);
+
+
+ // optimization: do not re-create the interface if the reference does
+ // not change and mEapGsIf exists already
+
+ // WLAN reference is checked after setEapWlanDbIndex below since iapId may be
+ // different than WLAN service ID
+
+ // case for EapQtConfigInterface::IapIdUndefined i.e. setIapId was called
+ // with a negative id last time and now again
+ if (!mEapDbIndexValid && !mEapGsIf.isNull() && iapId < 0) {
+ qDebug(
+ "EapQtConfigInterfacePrivate::setIapId - interface created for IapIdUndefined already");
+ return true;
+ }
+
+ // case for VPN (or any other bearer) in which iap id equals EAP db index
+ if (mEapBearer != ELan && mEapDbIndexValid && !mEapGsIf.isNull() && iapId == mEapDbIndex) {
+ qDebug(
+ "EapQtConfigInterfacePrivate::setIapId - interface created for requested IAP ID for VPN already");
+ return true;
+ }
+
+ // save the current id for checking if WLAN reference changes or not
+ TInt previousEapDbIndex = mEapDbIndex;
+ bool wlanIndexOk = true;
+
+ // allow accessing certain methods with negative iapId
+ if (iapId < 0) {
+ // set to zero to be able to create EAP server instances
+ mEapDbIndex = 0;
+ mEapDbIndexValid = false;
+ }
+ // for real usage iapId must not be negative
+ else {
+ // for VPN
+ mIapId = iapId;
+ mEapDbIndex = iapId;
+ mEapDbIndexValid = true;
+
+ // for WLAN
+ if (mEapBearer == ELan) {
+ // get WLAN service ID as the reference
+ mEapDbIndexValid = setEapWlanDbIndex(iapId);
+ wlanIndexOk = mEapDbIndexValid;
+ // do not re-create if the interface is ok for the new (i.e. same) index already
+ if (!mEapGsIf.isNull() && mEapDbIndex == previousEapDbIndex) {
+ qDebug() << "EapQtConfigInterfacePrivate::setIapId - interface"
+ << "created for requested IAP ID for WLAN already";
+ return true;
+ }
+
+ }
+ }
+
+ // delete possibly existing instances
+ mEapGsIf.reset(NULL);
+ mEapTypeIf.reset(NULL);
+
+ mCurrentServerEapType = *EapExpandedTypeNone.GetType();
+ mLastOuterHandle = EapQtPluginHandle::PluginUndefined;
+
+ if (!wlanIndexOk && mEapBearer == ELan) {
+ // setEapWlanDbIndex was called and failed
+ qDebug("ERROR: EapQtConfigInterfacePrivate::setIapId() - setEapWlanDbIndex failed");
+ return false;
+ }
+
+ qDebug(
+ "EapQtConfigInterfacePrivate::setIapId() - calls CEapGeneralSettings::NewL(), bearer = %d, index = %d",
+ mEapBearer, mEapDbIndex);
+
+ // load EAP general settings interface
+ CEapGeneralSettings* tmp = NULL;
+ TRAPD(err, tmp = CEapGeneralSettings::NewL(mEapBearer, mEapDbIndex));
+ if (err != KErrNone) {
+ qDebug("ERROR: EapQtConfigInterfacePrivate::setIapId - CEapGeneralSettings::NewL() failed");
+ mEapDbIndexValid = false;
+ return false;
+ }
+
+ // set to the created instance
+ mEapGsIf.reset(tmp);
+
+ return true;
+}
+
+bool EapQtConfigInterfacePrivate::setEapWlanDbIndex(const int iapId)
+{
+ qDebug("EapQtConfigInterfacePrivate::setEapWlanDbIndex - requested id: %d, this = 0x%08x", iapId, this);
+
+ RCmManager cmm;
+ TRAPD(err, cmm.OpenL());
+ if (err != KErrNone) {
+ qDebug("ERROR: EapQtConfigInterfacePrivate::setEapWlanDbIndex - cmm.OpenL() failed",
+ mEapBearer, iapId);
+ mEapDbIndex = EapQtConfigInterface::IapIdUndefined;
+ mIapId = 0;
+ return false;
+ }
+
+ TRAP(err, mEapDbIndex = cmm.GetConnectionMethodInfoIntL(iapId, CMManager::EWlanServiceId));
+ if (err != KErrNone) {
+ qDebug(
+ "ERROR: EapQtConfigInterfacePrivate::setEapWlanDbIndex - cmm.GetConnectionMethodInfoIntL() failed",
+ mEapBearer, iapId);
+ cmm.Close();
+ mEapDbIndex = EapQtConfigInterface::IapIdUndefined;
+ mIapId = 0;
+ return false;
+ }
+
+ cmm.Close();
+
+ qDebug("EapQtConfigInterfacePrivate::setEapWlanDbIndex - obtained WLAN service id: %d",
+ mEapDbIndex);
+
+ return true;
+}
+
+void EapQtConfigInterfacePrivate::checkInstanceThrowing() const
+{
+ qDebug() << "EapQtConfigInterfacePrivate::checkInstanceThrowing() - mValidatorInstance:"
+ << mValidatorInstance;
+
+ if (mValidatorInstance) {
+ qDebug(
+ "ERROR: EapQtConfigInterfacePrivate::checkInstanceThrowing - method not supported by this instance");
+ qt_symbian_throwIfError(KErrNotSupported);
+ }
+}
+
+void EapQtConfigInterfacePrivate::appendEapTypes(const RArray<TEapExpandedType>* const eapTypes,
+ QList<QByteArray>* const eapList)
+{
+ qDebug("EapQtConfigInterfacePrivate::appendEapTypes(), this = 0x%08x", this);
+
+ Q_ASSERT(eapTypes);
+ Q_ASSERT(eapList);
+
+ qDebug("EapQtConfigInterfacePrivate - appendEapTypes, EAP count = %d", eapTypes->Count());
+
+ QByteArray tmpEap;
+ for (int ind = 0; ind < eapTypes->Count(); ind++) {
+ tmpEap.append(reinterpret_cast<const char*> ((*eapTypes)[ind].GetValue().Ptr()),
+ (*eapTypes)[ind].GetValue().Length());
+ eapList->append(tmpEap);
+ qDebug() << "EapQtConfigInterfacePrivate - appendEapTypes added EAP: " << tmpEap.toHex();
+ tmpEap.clear();
+ }
+}
+
+QList<EapQtPluginInfo> EapQtConfigInterfacePrivate::supportedOuterTypes()
+{
+ qDebug("EapQtConfigInterfacePrivate::supportedOuterTypes(), this = 0x%08x", this);
+
+ checkInstanceThrowing();
+
+ if (mEapGsIf.isNull()) {
+ qDebug("ERROR: EapQtConfigInterfacePrivate::supportedOuterTypes() - mEapGsIf is NULL");
+ mOuterEapsOn.Reset();
+ mOuterEapsOff.Reset();
+ // return empty list
+ mSupportedOuterTypes.clear();
+ return mSupportedOuterTypes;
+ }
+
+ // get outer EAPs from EAP server,
+ // returned in two lists: enabled and disabled outer EAPs
+ // do this always as the list might have changed and mOuterEapsOn/Off are needed in
+ // other methods
+
+ mOuterEapsOn.Reset();
+ mOuterEapsOff.Reset();
+
+ qDebug("EapQtConfigInterfacePrivate::supportedOuterTypes() - calls GetEapMethods()");
+
+ TUint err = mEapGsIf->GetEapMethods(mOuterEapsOn, mOuterEapsOff);
+ if (err != KErrNone) {
+ qDebug("ERROR: EapQtConfigInterfacePrivate::supportedOuterTypes() - GetEapMethods failed");
+ mOuterEapsOn.Reset();
+ mOuterEapsOff.Reset();
+ // return empty list
+ mSupportedOuterTypes.clear();
+ return mSupportedOuterTypes;
+ }
+
+ // optimization: collect the list only once per instance life time
+ // since no new EAPs will appear to the combination of mOuterEapsOn and mOuterEapsOff
+ if (mSupportedOuterTypes.count() > 0) {
+ qDebug(
+ "EapQtConfigInterfacePrivate - supportedOuterTypes: supported EAPs already listed, return stored list");
+ return mSupportedOuterTypes;
+ }
+
+ qDebug("EapQtConfigInterfacePrivate - supportedOuterTypes: copy response to QList");
+
+ // copy response to qlist for easier comparison
+ QList<QByteArray> outerEaps;
+
+ appendEapTypes(&mOuterEapsOn, &outerEaps);
+ appendEapTypes(&mOuterEapsOff, &outerEaps);
+
+ qDebug("EapQtConfigInterfacePrivate - supportedOuterTypes: EAP server outer type count: %d",
+ outerEaps.count());
+
+ qDebug("EapQtConfigInterfacePrivate - supportedOuterTypes: collected UI plugin count: %d",
+ mPluginInfos.count());
+
+ // set mSupportedOuterTypes to contain only EAPs that both UI and EAP server support
+ QByteArray tmpEap;
+ for (int ind = 0; ind < mPluginInfos.count(); ind++) {
+ tmpEap = mPluginInfos[ind].pluginHandle().type().eapExpandedData();
+ if (outerEaps.contains(tmpEap)) {
+ mSupportedOuterTypes.append(mPluginInfos[ind]);
+ qDebug() << "EapQtConfigInterfacePrivate - supportedOuterTypes: appended EAP: "
+ << tmpEap.toHex();
+ }
+ }
+
+ // sort the list
+ qSort(mSupportedOuterTypes.begin(), mSupportedOuterTypes.end(),
+ EapQtConfigInterfacePrivate::pluginLessThan);
+
+ qDebug("EapQtConfigInterfacePrivate - supportedOuterTypes: supported EAP count: %d",
+ mSupportedOuterTypes.count());
+
+ return mSupportedOuterTypes;
+}
+
+// checks if UI plugins support supplied eapType and returns the
+// index (in mPluginInfos) of the supporting plugin
+bool EapQtConfigInterfacePrivate::isUiSupported(const QByteArray &eapType, int &pluginIndex) const
+{
+ qDebug("EapQtConfigInterfacePrivate::isUiSupported(), this = 0x%08x", this);
+
+ bool ret = false;
+ for (int ind = 0; ind < mPluginInfos.count(); ind++) {
+ qDebug("EapQtConfigInterfacePrivate::isUiSupported() - checking index: %d", ind);
+ pluginIndex = ind;
+ if (eapType == mPluginInfos[ind].pluginHandle().type().eapExpandedData()) {
+ qDebug("EapQtConfigInterfacePrivate::isUiSupported() - ui supported!");
+ ret = true;
+ break;
+ }
+ }
+ return ret;
+}
+
+QList<EapQtPluginInfo> EapQtConfigInterfacePrivate::supportedInnerTypes(
+ const EapQtPluginHandle &outer)
+{
+ qDebug("EapQtConfigInterfacePrivate::supportedInnerTypes(), this = 0x%08x", this);
+
+ checkInstanceThrowing();
+
+ // check if we already have up-to-date data
+ if (mLastOuterHandle == outer) {
+ return mSupportedInnerTypes;
+ }
+
+ // clear previous query result
+ mSupportedInnerTypes.clear();
+ mLastOuterHandle = EapQtPluginHandle::PluginUndefined;
+
+ qDebug()
+ << "EapQtConfigInterfacePrivate::supportedInnerTypes() - calls isSupportedOuterType for: "
+ << outer.type().eapExpandedData().toHex();
+
+ // check if the queried outer EAP is supported
+ if (!isSupportedOuterType(outer)) {
+ qDebug()
+ << "ERROR: EapQtConfigInterfacePrivate::supportedInnerTypes() - queried outer type not supported: "
+ << outer.type().eapExpandedData().toHex();
+ // return empty list
+ return mSupportedInnerTypes;
+ }
+
+ qDebug("EapQtConfigInterfacePrivate::supportedInnerTypes() - calls getEapTypeIf");
+
+ // get outer EAP settings interface
+ getEapTypeIf(outer);
+ if (mEapTypeIf.isNull()) {
+ qDebug("ERROR: EapQtConfigInterfacePrivate::supportedInnerTypes() - getEapTypeIf failed");
+ // return empty list
+ return mSupportedInnerTypes;
+ }
+
+ // get outer EAP settings
+ EAPSettings eapSettings;
+ TRAPD(err, mEapTypeIf->GetConfigurationL(eapSettings));
+ // getEapTypeIf has set mCurrentServerEapType correctly for comparison
+ if (err != KErrNone || eapSettings.iEAPExpandedType != mCurrentServerEapType) {
+ qDebug("ERROR: EapQtConfigInterfacePrivate::supportedInnerTypes - GetConfigurationL failed");
+ // clear the instance so that the next attempt starts from scratch
+ mEapTypeIf.reset(NULL);
+ // return empty list
+ return mSupportedInnerTypes;
+ }
+
+ // store inner EAPs supported by EAP server
+ QList<QByteArray> innerEaps;
+ appendEapTypes(&(eapSettings.iEnabledEncapsulatedEAPExpandedTypes), &innerEaps);
+ appendEapTypes(&(eapSettings.iDisabledEncapsulatedEAPExpandedTypes), &innerEaps);
+
+ int pluginIndex = 0;
+ for (int ind = 0; ind < innerEaps.count(); ind++) {
+ // report only EAPs which do have an UI plugin
+ if (isUiSupported(innerEaps[ind], pluginIndex)) {
+ mSupportedInnerTypes.append(mPluginInfos[pluginIndex]);
+ qDebug() << "EapQtConfigInterfacePrivate::supportedInnerTypes - added inner EAP: "
+ << innerEaps[ind].toHex();
+ }
+ }
+
+ mLastOuterHandle = outer;
+
+ // sort the list
+ qSort(mSupportedInnerTypes.begin(), mSupportedInnerTypes.end(),
+ EapQtConfigInterfacePrivate::pluginLessThan);
+
+ qDebug("EapQtConfigInterfacePrivate - supportedInnerTypes: supported EAP count: %d",
+ mSupportedInnerTypes.count());
+
+ return mSupportedInnerTypes;
+}
+
+void EapQtConfigInterfacePrivate::copyCertificateInfo(
+ const RPointerArray<EapCertificateEntry>* const certEntries,
+ QList<EapQtCertificateInfo>* const certInfos)
+{
+ qDebug("EapQtConfigInterfacePrivate::copyCertificateInfo(), this = 0x%08x", this);
+
+ Q_ASSERT(certEntries);
+ Q_ASSERT(certInfos);
+
+ certInfos->clear();
+
+ EapQtCertificateInfo cert;
+ TKeyIdentifier subjectKeyId;
+ const TDes* text = 0;
+ int ind = 0;
+
+ for (ind = 0; ind < certEntries->Count(); ind++) {
+
+ // cleanup cert
+ cert.clear();
+
+ EapCertificateEntry* certPtr = (*certEntries)[ind];
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyCertificateInfo *** certificate starts *** ";
+
+ if (certPtr->GetSubjectNamePresent() != EFalse) {
+
+ text = certPtr->GetSubjectName();
+ cert.setValue(EapQtCertificateInfo::SubjectName, QString::fromUtf16(text->Ptr(),
+ text->Length()));
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyCertificateInfo SubjectName: "
+ << QString::fromUtf16(text->Ptr(), text->Length());
+ }
+ if (certPtr->GetIssuerNamePresent() != EFalse) {
+
+ text = certPtr->GetIssuerName();
+ cert.setValue(EapQtCertificateInfo::IssuerName, QString::fromUtf16(text->Ptr(),
+ text->Length()));
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyCertificateInfo IssuerName: "
+ << QString::fromUtf16(text->Ptr(), text->Length());
+ }
+ if (certPtr->GetSerialNumberPresent() != EFalse) {
+
+ text = certPtr->GetSerialNumber();
+ cert.setValue(EapQtCertificateInfo::SerialNumber, QString::fromUtf16(text->Ptr(),
+ text->Length()));
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyCertificateInfo SerialNumber: "
+ << QString::fromUtf16(text->Ptr(), text->Length());
+ }
+ if (certPtr->GetSubjectKeyIdPresent() != EFalse) {
+
+ subjectKeyId = certPtr->GetSubjectKeyId();
+ cert.setValue(EapQtCertificateInfo::SubjectKeyId, QByteArray(
+ reinterpret_cast<const char*> (subjectKeyId.Ptr()), subjectKeyId.Length()));
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyCertificateInfo SubjectKeyId: "
+ << (QByteArray(reinterpret_cast<const char*> (subjectKeyId.Ptr()),
+ subjectKeyId.Length())).toHex();
+ }
+ if (certPtr->GetThumbprintPresent() != EFalse) {
+
+ text = certPtr->GetThumbprint();
+ cert.setValue(EapQtCertificateInfo::ThumbPrint, QString::fromUtf16(text->Ptr(),
+ text->Length()));
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyCertificateInfo ThumbPrint: "
+ << QString::fromUtf16(text->Ptr(), text->Length());
+ }
+ if (certPtr->GetLabelPresent() != EFalse) {
+
+ text = certPtr->GetLabel();
+ cert.setValue(EapQtCertificateInfo::CertificateLabel, QString::fromUtf16(text->Ptr(),
+ text->Length()));
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyCertificateInfo CertificateLabel: "
+ << QString::fromUtf16(text->Ptr(), text->Length());
+ }
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyCertificateInfo *** certificate ends *** ";
+
+ certInfos->append(cert);
+
+ }
+}
+
+bool EapQtConfigInterfacePrivate::fetchCertificates(QList<EapQtCertificateInfo>* const caInfos,
+ QList<EapQtCertificateInfo>* const clientInfos)
+{
+ qDebug("EapQtConfigInterfacePrivate::fetchCertificates(), this = 0x%08x", this);
+
+ Q_ASSERT(caInfos != NULL || clientInfos != NULL);
+ Q_ASSERT(!mEapGsIf.isNull());
+
+ TInt err(KErrNone);
+ RPointerArray<EapCertificateEntry> clientCerts;
+ RPointerArray<EapCertificateEntry> caCerts;
+
+ err = mEapGsIf->GetCertificateLists(clientCerts, caCerts);
+ if (err != KErrNone) {
+ qDebug("EapQtConfigInterfacePrivate - fetchCertificates failed: %d", err);
+ caCerts.ResetAndDestroy();
+ clientCerts.ResetAndDestroy();
+ return false;
+ }
+
+ qDebug("user cert count: %d, CA cert count: %d", clientCerts.Count(), caCerts.Count());
+
+ if (caInfos != NULL) {
+ copyCertificateInfo(&caCerts, caInfos);
+ }
+ if (clientInfos != NULL) {
+ copyCertificateInfo(&clientCerts, clientInfos);
+ }
+
+ caCerts.ResetAndDestroy();
+ clientCerts.ResetAndDestroy();
+ return true;
+}
+
+bool EapQtConfigInterfacePrivate::updateCertificates() {
+
+ qDebug("EapQtConfigInterfacePrivate::updateCertificates(), this = 0x%08x", this);
+
+ checkInstanceThrowing();
+
+ // empty current state
+ mCaCertificates.clear();
+ mUserCertificates.clear();
+
+ return fetchCertificates(&mCaCertificates, &mUserCertificates);
+}
+
+QList<EapQtCertificateInfo> EapQtConfigInterfacePrivate::certificateAuthorityCertificates()
+{
+ qDebug("EapQtConfigInterfacePrivate::certificateAuthorityCertificates(), this = 0x%08x", this);
+
+ checkInstanceThrowing();
+
+ // update only if the list is empty
+ if(mCaCertificates.length() == 0) {
+ qDebug() << "EapQtConfigInterfacePrivate::certificateAuthorityCertificates() - updates certificate lists";
+ updateCertificates();
+ }
+
+ return mCaCertificates;
+}
+
+QList<EapQtCertificateInfo> EapQtConfigInterfacePrivate::userCertificates()
+{
+ qDebug("EapQtConfigInterfacePrivate::userCertificates(), this = 0x%08x", this);
+
+ // use the CA certificates method, it will update both the lists
+ // if CA list is empty
+ (void) certificateAuthorityCertificates();
+ return mUserCertificates;
+}
+
+void EapQtConfigInterfacePrivate::getEapTypeIf(const EapQtPluginHandle &pluginHandle)
+{
+ qDebug("EapQtConfigInterfacePrivate::getEapTypeIf(), this = 0x%08x", this);
+
+ // dig up the EAP type in TEapExpandedType format
+ TEapExpandedType eapServerType;
+ QByteArray eapType = pluginHandle.type().eapExpandedData();
+ TInt err(KErrNone);
+
+ qDebug() << "EapQtConfigInterfacePrivate - getEapTypeIf: wanted EAP type: " << eapType.toHex();
+
+ // no need to check if this is successful,
+ // CEapType::NewL call will handle errors
+ (void) eapServerType.SetValue(eapType.data(), eapType.length());
+
+ // slight optimization, load interface only if it does not exist or the EAP type changes
+ if (mEapTypeIf.isNull() || mCurrentServerEapType != eapServerType) {
+
+ qDebug("EapQtConfigInterfacePrivate - getEapTypeIf deletes previous instance");
+
+ // delete previous instance
+ mEapTypeIf.reset(NULL);
+ mCurrentServerEapType = eapServerType;
+
+ qDebug("EapQtConfigInterfacePrivate - getEapTypeIf calls CEapType::NewL()");
+
+ // trap all leaves
+ CEapType* tmp = NULL;
+ TRAP(err, tmp = CEapType::NewL(mEapBearer, mEapDbIndex, mCurrentServerEapType));
+ if (err != KErrNone) {
+ qDebug(
+ "ERROR: EapQtConfigInterfacePrivate - getEapTypeIf CEapType::NewL failed with error: %d",
+ err);
+ mCurrentServerEapType = *EapExpandedTypeNone.GetType();
+ }
+ mEapTypeIf.reset(tmp);
+ }
+
+ // always clear the tunnelling type state just in case some earlier call has set it
+ if (!mEapTypeIf.isNull()) {
+ mEapTypeIf->SetTunnelingType(*EapExpandedTypeNone.GetType());
+ }
+
+}
+
+// in config:
+// if OuterType is defined, the configuration for pluginHandle is set inside this OuterType
+// if OuterType is not defined, pluginHandle is for an outer type
+// if InnerType is defined, the defined inner types in config are activated for pluginHandle
+// if InnerType is not defined, the pluginHandle does not activate any inner type (or they do not exist)
+bool EapQtConfigInterfacePrivate::saveConfiguration(const EapQtPluginHandle &pluginHandle,
+ const EapQtConfig &config)
+{
+ qDebug("EapQtConfigInterfacePrivate::saveConfiguration(), this = 0x%08x", this);
+
+ checkInstanceThrowing();
+
+ if (!mEapDbIndexValid) {
+ qDebug() << "ERROR: Database reference not valid, call setConfigurationReference first!";
+ return false;
+ }
+
+ // set tunneling type & check if the requested EAP is supported
+ // if we are configuring outer type, OuterType == QVariant::Invalid or
+ // EapQtPluginHandle::PluginUndefined
+
+ EapQtPluginHandle tmpOuterHandle;
+ QVariant varValue = config.value(EapQtConfig::OuterType);
+ if (varValue != QVariant::Invalid && !(varValue.value<EapQtPluginHandle> () == EapQtPluginHandle::PluginUndefined)) {
+ tmpOuterHandle = varValue.value<EapQtPluginHandle> ();
+ // check if supported
+ if(!isSupportedInnerType(tmpOuterHandle, pluginHandle)) {
+ qDebug("ERROR: EapQtConfigInterfacePrivate::saveConfiguration() - not supported outer/inner type combination");
+ return false;
+ }
+ }
+ else {
+ tmpOuterHandle = EapQtPluginHandle::PluginUndefined;
+ // check if supported
+ if(!isSupportedOuterType(pluginHandle)) {
+ qDebug("ERROR: EapQtConfigInterfacePrivate::saveConfiguration() - not supported outer type");
+ return false;
+ }
+ }
+
+ getEapTypeIf(pluginHandle);
+ if (mEapTypeIf.isNull()) {
+ qDebug("ERROR: EapQtConfigInterfacePrivate::saveConfiguration() - getEapTypeIf failed");
+ return false;
+ }
+
+ TEapExpandedType tmpOuterEap;
+ tmpOuterEap.SetValue(tmpOuterHandle.type().eapExpandedData().data(),
+ tmpOuterHandle.type().eapExpandedData().length());
+
+ qDebug() << "EapQtConfigInterfacePrivate::saveConfiguration() - sets tunnelling type to: "
+ << tmpOuterHandle.type().eapExpandedData().toHex();
+
+ mEapTypeIf->SetTunnelingType(tmpOuterEap);
+
+ // set EAP type here
+ QByteArray eapType = pluginHandle.type().eapExpandedData();
+
+ // copy config to EAP settings,
+ // no need to check if this is successful,
+ // SetConfigurationL call will handle errors
+ EAPSettings eapSettings;
+ (void) eapSettings.iEAPExpandedType.SetValue(eapType.data(), eapType.length());
+
+ // copy the rest of the settings in the function
+ copyToEapSettings(config, eapSettings);
+ // store settings
+ TRAPD(err, mEapTypeIf->SetConfigurationL(eapSettings));
+ if (err != KErrNone) {
+ qDebug("ERROR: EapQtConfigInterfacePrivate - saveConfiguration: SetConfigurationL failed");
+ // clear the instance so that the next attempt starts from scratch
+ mEapTypeIf.reset(NULL);
+ mCurrentServerEapType = *EapExpandedTypeNone.GetType();
+ return false;
+ }
+
+ return true;
+}
+
+// config must be empty when calling
+bool EapQtConfigInterfacePrivate::readConfiguration(const EapQtPluginHandle &outerHandle,
+ const EapQtPluginHandle &pluginHandle, EapQtConfig &config)
+{
+ qDebug("EapQtConfigInterfacePrivate::readConfiguration(), this = 0x%08x", this);
+
+ // clear input
+ config.clear();
+
+ checkInstanceThrowing();
+
+ if (!mEapDbIndexValid) {
+ qDebug() << "ERROR: Database reference not valid, call setConfigurationReference first!";
+ return false;
+ }
+
+ // check EAP type support
+ if(!(outerHandle == EapQtPluginHandle::PluginUndefined)) {
+ if(!isSupportedInnerType(outerHandle, pluginHandle)) {
+ qDebug("ERROR: EapQtConfigInterfacePrivate::readConfiguration() - not supported outer/inner type combination");
+ return false;
+ }
+ } else {
+ if(!isSupportedOuterType(pluginHandle)) {
+ qDebug("ERROR: EapQtConfigInterfacePrivate::readConfiguration() - not supported outer type");
+ return false;
+ }
+ }
+
+ getEapTypeIf(pluginHandle);
+ if (mEapTypeIf.isNull()) {
+ qDebug("ERROR: EapQtConfigInterfacePrivate::readConfiguration - getEapTypeIf failed");
+ return false;
+ }
+
+ // set tunneling type
+ // if we are configuring outer type, outerHandle == EapQtPluginHandle::PluginUndefined
+ // and calling SetTunnelingType is also ok
+ TEapExpandedType tmpEap;
+ tmpEap.SetValue(outerHandle.type().eapExpandedData().data(),
+ outerHandle.type().eapExpandedData().length());
+
+ qDebug() << "EapQtConfigInterfacePrivate::readConfiguration - sets tunnelling type to: "
+ << outerHandle.type().eapExpandedData().toHex();
+
+ mEapTypeIf->SetTunnelingType(tmpEap);
+
+ // always set OuterType,
+ // set to EapQtPluginHandle::PluginUndefined if no outer type specified
+ config.setValue(EapQtConfig::OuterType, qVariantFromValue(outerHandle));
+
+ qDebug("EapQtConfigInterfacePrivate::readConfiguration - calls GetConfigurationL()");
+
+ // trap all leaves
+ EAPSettings eapSettings;
+ TRAPD(err, mEapTypeIf->GetConfigurationL(eapSettings));
+
+ // check if failed or something strange happened (incorrect EAP type settings received)
+ if (err != KErrNone || eapSettings.iEAPExpandedType != mCurrentServerEapType) {
+ qDebug("ERROR: EapQtConfigInterfacePrivate - readConfiguration: GetConfigurationL failed");
+ // clear the instance so that the next attempt starts from scratch
+ mEapTypeIf.reset(NULL);
+ mCurrentServerEapType = *EapExpandedTypeNone.GetType();
+ // nothing to be set to config
+ return false;
+ }
+ copyFromEapSettings(eapSettings, config);
+ return true;
+}
+
+bool EapQtConfigInterfacePrivate::convertToBool(TBool value)
+{
+ return (value != EFalse ? true : false);
+}
+
+TBool EapQtConfigInterfacePrivate::convertToTbool(bool value)
+{
+ return (value ? ETrue : EFalse);
+}
+
+void EapQtConfigInterfacePrivate::copyToEapSettings(const EapQtConfig &config, EAPSettings &eapSettings)
+{
+ qDebug("EapQtConfigInterfacePrivate::copyToEapSettings(), this = 0x%08x", this);
+
+ int ind = 0;
+
+ QVariant varValue = config.value(EapQtConfig::UsernameAutomatic);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iUseAutomaticUsernamePresent = ETrue;
+ eapSettings.iUseAutomaticUsername = convertToTbool(varValue.toBool());
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings UsernameAutomatic: "
+ << varValue.toBool();
+ }
+
+ varValue = config.value(EapQtConfig::AuthorityCertificateAutomatic);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iUseAutomaticCACertificatePresent = ETrue;
+ eapSettings.iUseAutomaticCACertificate = convertToTbool(varValue.toBool());
+ qDebug()
+ << "EapQtConfigInterfacePrivate - copyToEapSettings AuthorityCertificateAutomatic: "
+ << varValue.toBool();
+ }
+
+ varValue = config.value(EapQtConfig::Username);
+ // do not copy if too large string
+ if (varValue.type() == QVariant::String && varValue.toString().count() <= StringMaxLength) {
+ // QString::utf16 returns a null terminated string
+ eapSettings.iUsername.Copy(varValue.toString().utf16());
+ eapSettings.iUsernamePresent = ETrue;
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings Username: "
+ << varValue.toString();
+ }
+
+ varValue = config.value(EapQtConfig::PasswordPrompt);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iShowPassWordPromptPresent = ETrue;
+ eapSettings.iShowPassWordPrompt = convertToTbool(varValue.toBool());
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings PasswordPrompt: "
+ << varValue.toBool();
+ }
+
+ varValue = config.value(EapQtConfig::Password);
+ // do not copy if too large string
+ if (varValue.type() == QVariant::String && varValue.toString().count() <= StringMaxLength) {
+ //QString::utf16 returns a null terminated string
+ eapSettings.iPassword.Copy(varValue.toString().utf16());
+ eapSettings.iPasswordPresent = ETrue;
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings Password: "
+ << varValue.toString();
+ }
+
+ varValue = config.value(EapQtConfig::PasswordClear);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iPasswordExistPresent = ETrue;
+ eapSettings.iPasswordExist = convertToTbool(varValue.toBool());
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings PasswordClear: "
+ << varValue.toBool();
+ }
+
+ varValue = config.value(EapQtConfig::RealmAutomatic);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iUseAutomaticRealmPresent = ETrue;
+ eapSettings.iUseAutomaticRealm = convertToTbool(varValue.toBool());
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings RealmAutomatic: "
+ << varValue.toBool();
+ }
+
+ varValue = config.value(EapQtConfig::Realm);
+ // do not copy if too large string
+ if (varValue.type() == QVariant::String && varValue.toString().count() <= StringMaxLength) {
+ // QString::utf16 returns a null terminated string
+ eapSettings.iRealm.Copy(varValue.toString().utf16());
+ eapSettings.iRealmPresent = ETrue;
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings Realm: "
+ << varValue.toString();
+ }
+
+ varValue = config.value(EapQtConfig::UsePseudonyms);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iUsePseudonymsPresent = ETrue;
+ eapSettings.iUsePseudonyms = convertToTbool(varValue.toBool());
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings UsePseudonyms: "
+ << varValue.toBool();
+ }
+
+ varValue = config.value(EapQtConfig::VerifyServerRealm);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iVerifyServerRealmPresent = ETrue;
+ eapSettings.iVerifyServerRealm = convertToTbool(varValue.toBool());
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings VerifyServerRealm: "
+ << varValue.toBool();
+ }
+
+ varValue = config.value(EapQtConfig::ClientAuthenticationRequired);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iRequireClientAuthenticationPresent = ETrue;
+ eapSettings.iRequireClientAuthentication = convertToTbool(varValue.toBool());
+ qDebug()
+ << "EapQtConfigInterfacePrivate - copyToEapSettings ClientAuthenticationRequired: "
+ << varValue.toBool();
+ }
+
+ varValue = config.value(EapQtConfig::SessionValidityTime);
+ if (varValue.type() == QVariant::UInt) {
+ eapSettings.iSessionValidityTimePresent = ETrue;
+ eapSettings.iSessionValidityTime = varValue.toUInt();
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings SessionValidityTime: "
+ << varValue.toUInt();
+ }
+
+ varValue = config.value(EapQtConfig::PeapVersion0Allowed);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iPEAPVersionsPresent = ETrue;
+ eapSettings.iPEAPv0Allowed = convertToTbool(varValue.toBool());
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings PeapVersion0Allowed: "
+ << varValue.toBool();
+ } else {
+ // in any other case disable PEAP version;
+ // no need to set eapSettings.iPEAPVersionsPresent,
+ // it will be set if one of the other PEAP versions is enabled,
+ // otherwise this setting is redundant and can be ignored
+ eapSettings.iPEAPv0Allowed = EFalse;
+ }
+
+ varValue = config.value(EapQtConfig::PeapVersion1Allowed);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iPEAPVersionsPresent = ETrue;
+ eapSettings.iPEAPv1Allowed = convertToTbool(varValue.toBool());
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings PeapVersion1Allowed: "
+ << varValue.toBool();
+ } else {
+ // in any other case disable PEAP version;
+ // no need to set eapSettings.iPEAPVersionsPresent,
+ // it will be set if one of the other PEAP versions is enabled,
+ // otherwise this setting is redundant and can be ignored
+ eapSettings.iPEAPv1Allowed = EFalse;
+ }
+
+ varValue = config.value(EapQtConfig::PeapVersion2Allowed);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iPEAPVersionsPresent = ETrue;
+ eapSettings.iPEAPv2Allowed = convertToTbool(varValue.toBool());
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings PeapVersion2Allowed: "
+ << varValue.toBool();
+ } else {
+ // in any other case disable PEAP version;
+ // no need to set eapSettings.iPEAPVersionsPresent,
+ // it will be set if one of the other PEAP versions is enabled,
+ // otherwise this setting is redundant and can be ignored
+ eapSettings.iPEAPv2Allowed = EFalse;
+ }
+
+ varValue = config.value(EapQtConfig::ProvisioningModeAuthenticated);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iAuthProvModeAllowedPresent = ETrue;
+ eapSettings.iAuthProvModeAllowed = convertToTbool(varValue.toBool());
+ qDebug()
+ << "EapQtConfigInterfacePrivate - copyToEapSettings ProvisioningModeAuthenticated: "
+ << varValue.toBool();
+ }
+
+ varValue = config.value(EapQtConfig::ProvisioningModeUnauthenticated);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iUnauthProvModeAllowedPresent = ETrue;
+ eapSettings.iUnauthProvModeAllowed = convertToTbool(varValue.toBool());
+ qDebug()
+ << "EapQtConfigInterfacePrivate - copyToEapSettings ProvisioningModeUnauthenticated: "
+ << varValue.toBool();
+ }
+
+ varValue = config.value(EapQtConfig::PACGroupReference);
+ // do not copy if too large string
+ if (varValue.type() == QVariant::String && varValue.toString().count() <= StringMaxLength) {
+ eapSettings.iPACGroupReference.Copy(varValue.toString().utf16());
+ eapSettings.iPACGroupReferencePresent = ETrue;
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings PACGroupReference: "
+ << varValue.toString();
+ }
+
+ varValue = config.value(EapQtConfig::WarnADHPNoPAC);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iWarnADHPNoPACPresent = ETrue;
+ eapSettings.iWarnADHPNoPAC = convertToTbool(varValue.toBool());
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings WarnADHPNoPAC: "
+ << varValue.toBool();
+ }
+
+ varValue = config.value(EapQtConfig::WarnADHPNoMatchingPAC);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iWarnADHPNoMatchingPACPresent = ETrue;
+ eapSettings.iWarnADHPNoMatchingPAC = convertToTbool(varValue.toBool());
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings WarnADHPNoMatchingPAC: "
+ << varValue.toBool();
+ }
+
+ varValue = config.value(EapQtConfig::WarnNotDefaultServer);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iWarnNotDefaultServerPresent = ETrue;
+ eapSettings.iWarnNotDefaultServer = convertToTbool(varValue.toBool());
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings WarnNotDefaultServer: "
+ << varValue.toBool();
+ }
+
+ varValue = config.value(EapQtConfig::UseIdentityPrivacy);
+ if (varValue.type() == QVariant::Bool) {
+ eapSettings.iUseIdentityPrivacyPresent = ETrue;
+ eapSettings.iUseIdentityPrivacy = convertToTbool(varValue.toBool());
+ qDebug() << "EapQtConfigInterfacePrivate - copyToEapSettings UseIdentityPrivacy: "
+ << varValue.toBool();
+ }
+
+ varValue = config.value(EapQtConfig::InnerType);
+ if (varValue.type() == QVariant::List) {
+
+ // not need to set disable inner types
+ // EAP server takes care of them internally
+
+ qDebug() << "EapQtConfigInterfacePrivate::copyToEapSettings() - InnerType present";
+
+ QList<QVariant> varList = varValue.toList();
+ TEapExpandedType tmpEap;
+ EapQtPluginHandle tmpHandle;
+
+ for (ind = 0; ind < varList.count(); ind++) {
+ if (varList[ind].canConvert<EapQtPluginHandle> ()) {
+ // set to true only if at least one item is ok
+ eapSettings.iEnabledEncapsulatedEAPExpandedTypesPresent = ETrue;
+
+ tmpHandle = varList[ind].value<EapQtPluginHandle> ();
+ tmpEap.SetValue(tmpHandle.type().eapExpandedData().data(),
+ tmpHandle.type().eapExpandedData().length());
+ eapSettings.iEnabledEncapsulatedEAPExpandedTypes.Append(tmpEap);
+
+ qDebug()
+ << "EapQtConfigInterfacePrivate::copyToEapSettings() - Added to InnerType: "
+ << tmpHandle.type().eapExpandedData().toHex();
+ }
+ }
+ }
+
+ varValue = config.value(EapQtConfig::CipherSuites);
+ if (varValue.type() == QVariant::List) {
+
+ qDebug() << "EapQtConfigInterfacePrivate::copyToEapSettings() - CipherSuites present";
+ QList<QVariant> varCiphers = varValue.toList();
+
+ // clears the ciphersuite configuration if the provided list is empty
+ eapSettings.iCipherSuitesPresent = ETrue;
+
+ for (ind = 0; ind < varCiphers.count(); ind++) {
+ // check that the item is of correct type (int also accepted to not be too strict)
+ if (varCiphers[ind].type() == QVariant::UInt || varCiphers[ind].type() == QVariant::Int) {
+ eapSettings.iCipherSuites.Append(varCiphers[ind].toUInt());
+ qDebug(
+ "EapQtConfigInterfacePrivate::copyToEapSettings() - CipherSuites at %d: 0x%08x",
+ ind, varCiphers[ind].toUInt());
+ }
+ }
+ }
+
+ // set always to true to support clearing previously configured CA/user certificates
+ // if the EAP method in question does not use certificates,
+ // EAP server will ignore the setting;
+ // CA/user certificates get cleared if EapQtConfig::Authority/UserCertificate is QVariant::Invalid or
+ // the provided lists are empty
+ eapSettings.iCertificatesPresent = ETrue;
+
+ varValue = config.value(EapQtConfig::AuthorityCertificate);
+ if (varValue.type() == QVariant::List) {
+
+ qDebug()
+ << "EapQtConfigInterfacePrivate::copyToEapSettings() - AuthorityCertificate present";
+
+ QList<QVariant> varCerts = varValue.toList();
+ for (ind = 0; ind < varCerts.count(); ind++) {
+ // check that the item is of correct type
+ if (varCerts[ind].canConvert<EapQtCertificateInfo> ()) {
+ appendCertificateInfo(true, varCerts[ind].value<EapQtCertificateInfo> (),
+ &(eapSettings.iCertificates));
+ qDebug()
+ << "EapQtConfigInterfacePrivate::copyToEapSettings() - AuthorityCertificate appended";
+ }
+ }
+ }
+
+ varValue = config.value(EapQtConfig::UserCertificate);
+ if (varValue.type() == QVariant::List) {
+
+ qDebug() << "EapQtConfigInterfacePrivate::copyToEapSettings() - UserCertificate present";
+
+ QList<QVariant> varCerts = varValue.toList();
+ for (ind = 0; ind < varCerts.count(); ind++) {
+ // check that the item is of correct type
+ if (varCerts[ind].canConvert<EapQtCertificateInfo> ()) {
+ appendCertificateInfo(false, varCerts[ind].value<EapQtCertificateInfo> (),
+ &(eapSettings.iCertificates));
+ qDebug()
+ << "EapQtConfigInterfacePrivate::copyToEapSettings() - AuthorityCertificate appended";
+ }
+ }
+ }
+
+}
+
+// caller takes care of deallocating resulting data in certList
+void EapQtConfigInterfacePrivate::appendCertificateInfo(bool isCaCertificate,
+ const EapQtCertificateInfo& certInfo, RPointerArray<EapCertificateEntry>* const certList)
+{
+ qDebug("EapQtConfigInterfacePrivate::appendCertificateInfo(), this = 0x%08x", this);
+
+ Q_ASSERT(certList);
+
+ // use scoped pointer to make sure memory is not leaked in failures
+ QScopedPointer<EapCertificateEntry> certEntry(new EapCertificateEntry);
+
+ // set certificate enabled in EAP settings
+ certEntry->SetIsEnabledPresent();
+ certEntry->SetIsEnabled(ETrue);
+
+ if (isCaCertificate) {
+ qDebug("EapQtConfigInterfacePrivate::appendCertificateInfo() - CA certificate");
+ certEntry->SetCertType(EapCertificateEntry::ECA);
+ }
+ else {
+ qDebug("EapQtConfigInterfacePrivate::appendCertificateInfo() - Client certificate");
+ certEntry->SetCertType(EapCertificateEntry::EUser);
+ }
+
+ qDebug("EapQtConfigInterfacePrivate::appendCertificateInfo() - *** Adding cert data");
+
+ TBuf<KGeneralStringMaxLength> certText;
+
+ QVariant varValue = certInfo.value(EapQtCertificateInfo::SubjectName);
+ if (varValue.type() == QVariant::String && varValue.toString().count() <= StringMaxLength) {
+ certEntry->SetSubjectNamePresent();
+ certText.Copy(varValue.toString().utf16());
+ certEntry->SetSubjectName(certText);
+
+ qDebug() << "EapQtConfigInterfacePrivate::appendCertificateInfo() - SubjectName: "
+ << varValue.toString();
+ }
+
+ varValue = certInfo.value(EapQtCertificateInfo::IssuerName);
+ if (varValue.type() == QVariant::String && varValue.toString().count() <= StringMaxLength) {
+ certEntry->SetIssuerNamePresent();
+ certText.Copy(varValue.toString().utf16());
+ certEntry->SetIssuerName(certText);
+
+ qDebug() << "EapQtConfigInterfacePrivate::appendCertificateInfo() - IssuerName: "
+ << varValue.toString();
+ }
+
+ varValue = certInfo.value(EapQtCertificateInfo::SerialNumber);
+ if (varValue.type() == QVariant::String && varValue.toString().count() <= StringMaxLength) {
+ certEntry->SetSerialNumberPresent();
+ certText.Copy(varValue.toString().utf16());
+ certEntry->SetSerialNumber(certText);
+
+ qDebug() << "EapQtConfigInterfacePrivate::appendCertificateInfo() - SerialNumber: "
+ << varValue.toString();
+ }
+
+ TCertLabel certLabel;
+
+ varValue = certInfo.value(EapQtCertificateInfo::CertificateLabel);
+ if (varValue.type() == QVariant::String && varValue.toString().count() <= CertLabelMaxLength) {
+ certEntry->SetLabelPresent();
+ certLabel.Copy(varValue.toString().utf16());
+ certEntry->SetLabel(certLabel);
+
+ qDebug() << "EapQtConfigInterfacePrivate::appendCertificateInfo() - CertificateLabel: "
+ << varValue.toString();
+ }
+
+ TBuf<KThumbprintMaxLength> thumbPrint;
+
+ varValue = certInfo.value(EapQtCertificateInfo::ThumbPrint);
+ if (varValue.type() == QVariant::String && varValue.toString().count()
+ <= CertThumbprintMaxLength) {
+ certEntry->SetThumbprintPresent();
+ thumbPrint.Copy(varValue.toString().utf16());
+ certEntry->SetThumbprint(thumbPrint);
+
+ qDebug() << "EapQtConfigInterfacePrivate::appendCertificateInfo() - ThumbPrint: "
+ << varValue.toString();
+ }
+
+ TKeyIdentifier keyId;
+
+ varValue = certInfo.value(EapQtCertificateInfo::SubjectKeyId);
+ if (varValue.type() == QVariant::ByteArray && varValue.toByteArray().count()
+ <= CertSubjectKeyIdLength) {
+ certEntry->SetSubjectKeyIdPresent();
+ keyId.Copy(reinterpret_cast<unsigned char*> (varValue.toByteArray().data()),
+ varValue.toByteArray().size());
+ certEntry->SetSubjectKeyId(keyId);
+
+ qDebug() << "EapQtConfigInterfacePrivate::appendCertificateInfo() - SubjectKeyId: "
+ << varValue.toByteArray().toHex();
+ }
+
+ // EapSettings destructor takes care of deallocating the entry
+ certList->Append(certEntry.data());
+
+ qDebug()
+ << "EapQtConfigInterfacePrivate::appendCertificateInfo()"
+ << "- *** certificate appended to list";
+
+ // all ok, remove the ownerhsip from scoped pointer
+ (void) certEntry.take();
+}
+
+void EapQtConfigInterfacePrivate::copyFromEapSettings(EAPSettings &eapSettings, EapQtConfig &config)
+{
+ qDebug("EapQtConfigInterfacePrivate::copyFromEapSettings(), this = 0x%08x", this);
+
+ int ind = 0;
+
+ // automatic username
+ if (eapSettings.iUseAutomaticUsernamePresent) {
+ config.setValue(EapQtConfig::UsernameAutomatic, convertToBool(
+ eapSettings.iUseAutomaticUsername));
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings UsernameAutomatic: "
+ << config.value(EapQtConfig::UsernameAutomatic).toBool();
+ }
+
+ // automatic CA certificate
+ if (eapSettings.iUseAutomaticCACertificatePresent) {
+ config.setValue(EapQtConfig::AuthorityCertificateAutomatic, convertToBool(
+ eapSettings.iUseAutomaticCACertificate));
+ qDebug()
+ << "EapQtConfigInterfacePrivate - copyFromEapSettings AuthorityCertificateAutomatic: "
+ << config.value(EapQtConfig::AuthorityCertificateAutomatic).toBool();
+ }
+
+ // username
+ if (eapSettings.iUsernamePresent) {
+ config.setValue(EapQtConfig::Username, QString::fromUtf16(eapSettings.iUsername.Ptr(),
+ eapSettings.iUsername.Length()));
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings Username: " << config.value(
+ EapQtConfig::Username).toString();
+ }
+
+ // password existence check, password itself is write-only, cannot be read
+ if (eapSettings.iPasswordExistPresent) {
+ // report to caller if password exists in the database
+ config.setValue(EapQtConfig::PasswordStored, convertToBool(eapSettings.iPasswordExist));
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings PasswordStored: "
+ << config.value(EapQtConfig::PasswordStored).toBool();
+ }
+
+ // password prompt
+ if (eapSettings.iShowPassWordPromptPresent) {
+ config.setValue(EapQtConfig::PasswordPrompt, convertToBool(eapSettings.iShowPassWordPrompt));
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings PasswordPrompt: "
+ << config.value(EapQtConfig::PasswordPrompt).toBool();
+ }
+
+ // automatic realm
+ if (eapSettings.iUseAutomaticRealmPresent) {
+ config.setValue(EapQtConfig::RealmAutomatic, convertToBool(eapSettings.iUseAutomaticRealm));
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings RealmAutomatic: "
+ << config.value(EapQtConfig::RealmAutomatic).toBool();
+ }
+
+ // realm
+ if (eapSettings.iRealmPresent) {
+ config.setValue(EapQtConfig::Realm, QString::fromUtf16(eapSettings.iRealm.Ptr(),
+ eapSettings.iRealm.Length()));
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings Realm: " << config.value(
+ EapQtConfig::Realm).toString();
+ }
+
+ // server name
+ if (eapSettings.iVerifyServerRealmPresent) {
+ config.setValue(EapQtConfig::VerifyServerRealm, convertToBool(
+ eapSettings.iVerifyServerRealm));
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings VerifyServerRealm: "
+ << config.value(EapQtConfig::VerifyServerRealm).toBool();
+ }
+
+ // pseudonym
+ if (eapSettings.iUsePseudonymsPresent) {
+ config.setValue(EapQtConfig::UsePseudonyms, convertToBool(eapSettings.iUsePseudonyms));
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings UsePseudonyms: "
+ << config.value(EapQtConfig::UsePseudonyms).toBool();
+ }
+
+ // policy: server must require client authentication
+ if (eapSettings.iRequireClientAuthenticationPresent) {
+ config.setValue(EapQtConfig::ClientAuthenticationRequired, convertToBool(
+ eapSettings.iRequireClientAuthentication));
+
+ qDebug()
+ << "EapQtConfigInterfacePrivate - copyFromEapSettings ClientAuthenticationRequired: "
+ << config.value(EapQtConfig::ClientAuthenticationRequired).toBool();
+ }
+
+ // session validity time
+ if (eapSettings.iSessionValidityTimePresent) {
+ config.setValue(EapQtConfig::SessionValidityTime, eapSettings.iSessionValidityTime);
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings SessionValidityTime: "
+ << config.value(EapQtConfig::SessionValidityTime).toUInt();
+ }
+
+ // TLS ciphersuites
+ if (eapSettings.iCipherSuitesPresent) {
+ QList<QVariant> ciphers; // QVariant has a constructor for uint
+ for (ind = 0; ind < eapSettings.iCipherSuites.Count(); ind++) {
+ ciphers.append(eapSettings.iCipherSuites[ind]);
+ qDebug("EapQtConfigInterfacePrivate - copyFromEapSettings CipherSuites at %d: 0x%08x",
+ ind, ciphers[ind].toUInt());
+ }
+ config.setValue(EapQtConfig::CipherSuites, ciphers);
+ }
+
+ // certificates
+ if (eapSettings.iCertificatesPresent) {
+
+ QList<EapQtCertificateInfo> caCerts;
+ QList<EapQtCertificateInfo> clientCerts;
+ RPointerArray<EapCertificateEntry> serverCaCerts;
+ RPointerArray<EapCertificateEntry> serverClientCerts;
+
+ // separate CA and client certs to their own lists
+ for (ind = 0; ind < eapSettings.iCertificates.Count(); ind++) {
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings certificates, "
+ << "cert type: " << eapSettings.iCertificates[ind]->GetCertType() << ", enabled: "
+ << convertToBool(eapSettings.iCertificates[ind]->GetIsEnabled());
+
+ // only enabled certificates are reported
+ if (eapSettings.iCertificates[ind]->GetCertType() == EapCertificateEntry::EUser
+ && eapSettings.iCertificates[ind]->GetIsEnabled() != EFalse) {
+ serverClientCerts.Append(eapSettings.iCertificates[ind]);
+ }
+ // only enabled certificates are reported
+ else if (eapSettings.iCertificates[ind]->GetCertType() == EapCertificateEntry::ECA
+ && eapSettings.iCertificates[ind]->GetIsEnabled() != EFalse) {
+ serverCaCerts.Append(eapSettings.iCertificates[ind]);
+ }
+ else {
+ qDebug()
+ << "WARNING: EapQtConfigInterfacePrivate - copyFromEapSettings certificates, "
+ << "unknown certificate type in the list or certificate not enabled";
+ }
+ }
+
+ // copy to lists of our type
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings AuthorityCertificates";
+ copyCertificateInfo(&serverCaCerts, &caCerts);
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings UserCertificates";
+ copyCertificateInfo(&serverClientCerts, &clientCerts);
+
+ // reset the arrays, data is owned by EapSettings.h,
+ // must not be destroyed here
+ serverCaCerts.Reset();
+ serverClientCerts.Reset();
+
+ // we still need to convert QList<EapQtCertificateInfo> to QList<QVariant>
+ // to be able to store to config
+ QVariant tmp;
+ QList<QVariant> varCaCerts;
+ QList<QVariant> varClientCerts;
+
+ for (ind = 0; ind < caCerts.count(); ind++) {
+ tmp.setValue(caCerts[ind]);
+ varCaCerts.append(tmp);
+ }
+ for (ind = 0; ind < clientCerts.count(); ind++) {
+ tmp.setValue(clientCerts[ind]);
+ varClientCerts.append(tmp);
+ }
+
+ // finally copy to config
+ config.setValue(EapQtConfig::AuthorityCertificate, varCaCerts);
+ config.setValue(EapQtConfig::UserCertificate, varClientCerts);
+ }
+
+ // PEAP specific
+ if (eapSettings.iPEAPVersionsPresent) {
+ config.setValue(EapQtConfig::PeapVersion0Allowed, convertToBool(eapSettings.iPEAPv0Allowed));
+ config.setValue(EapQtConfig::PeapVersion1Allowed, convertToBool(eapSettings.iPEAPv1Allowed));
+ config.setValue(EapQtConfig::PeapVersion2Allowed, convertToBool(eapSettings.iPEAPv2Allowed));
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings PeapVersion0Allowed: "
+ << config.value(EapQtConfig::PeapVersion0Allowed).toBool();
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings PeapVersion1Allowed: "
+ << config.value(EapQtConfig::PeapVersion1Allowed).toBool();
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings PeapVersion2Allowed: "
+ << config.value(EapQtConfig::PeapVersion2Allowed).toBool();
+ }
+
+ // TLS privacy
+ if (eapSettings.iUseIdentityPrivacyPresent) {
+ config.setValue(EapQtConfig::UseIdentityPrivacy, convertToBool(
+ eapSettings.iUseIdentityPrivacy));
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings UseIdentityPrivacy: "
+ << config.value(EapQtConfig::UseIdentityPrivacy).toBool();
+ }
+
+ // EAP-FAST specific
+ if (eapSettings.iAuthProvModeAllowedPresent) {
+ config.setValue(EapQtConfig::ProvisioningModeAuthenticated, convertToBool(
+ eapSettings.iAuthProvModeAllowed));
+
+ qDebug()
+ << "EapQtConfigInterfacePrivate - copyFromEapSettings ProvisioningModeAuthenticated: "
+ << config.value(EapQtConfig::ProvisioningModeAuthenticated).toBool();
+ }
+ if (eapSettings.iUnauthProvModeAllowedPresent) {
+ config.setValue(EapQtConfig::ProvisioningModeUnauthenticated, convertToBool(
+ eapSettings.iUnauthProvModeAllowed));
+
+ qDebug()
+ << "EapQtConfigInterfacePrivate - copyFromEapSettings ProvisioningModeUnauthenticated: "
+ << config.value(EapQtConfig::ProvisioningModeUnauthenticated).toBool();
+ }
+ if (eapSettings.iWarnADHPNoPACPresent) {
+ config.setValue(EapQtConfig::WarnADHPNoPAC, convertToBool(eapSettings.iWarnADHPNoPAC));
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings WarnADHPNoPAC: "
+ << config.value(EapQtConfig::WarnADHPNoPAC).toBool();
+ }
+ if (eapSettings.iWarnADHPNoMatchingPACPresent) {
+ config.setValue(EapQtConfig::WarnADHPNoMatchingPAC, convertToBool(
+ eapSettings.iWarnADHPNoMatchingPAC));
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings WarnADHPNoMatchingPAC: "
+ << config.value(EapQtConfig::WarnADHPNoMatchingPAC).toBool();
+ }
+ if (eapSettings.iWarnNotDefaultServerPresent) {
+ config.setValue(EapQtConfig::WarnNotDefaultServer, convertToBool(
+ eapSettings.iWarnNotDefaultServer));
+
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings WarnNotDefaultServer: "
+ << config.value(EapQtConfig::WarnNotDefaultServer).toBool();
+ }
+ if (eapSettings.iPACGroupReferencePresent) {
+ config.setValue(EapQtConfig::PACGroupReference, QString::fromUtf16(
+ eapSettings.iPACGroupReference.Ptr(), eapSettings.iPACGroupReference.Length()));
+ qDebug() << "EapQtConfigInterfacePrivate - copyFromEapSettings PACGroupReference: "
+ << config.value(EapQtConfig::PACGroupReference).toString();
+ }
+
+ // enabled inner EAPs
+ if (eapSettings.iEnabledEncapsulatedEAPExpandedTypesPresent) {
+
+ qDebug("EapQtConfigInterfacePrivate - copyFromEapSettings InnerType, enabled count %d",
+ eapSettings.iEnabledEncapsulatedEAPExpandedTypes.Count());
+
+ QList<QByteArray> innerEapsOn;
+ appendEapTypes(&(eapSettings.iEnabledEncapsulatedEAPExpandedTypes), &innerEapsOn);
+
+ // convert to QList<QVariant> to be able to store to config
+ QVariant varTmp;
+ QList<QVariant> varInnerEapsOn;
+ int dummy = 0;
+
+ for (ind = 0; ind < innerEapsOn.count(); ind++) {
+ // report only EAPs which do have an UI plugin
+ if (isUiSupported(innerEapsOn[ind], dummy)) {
+ // create plugin handle from EAP type with constructors
+ // calls: EapQtExpandedEapType(const QByteArray data) -> EapQtPluginHandle(EapQtExpandedEapType type)
+ varTmp.setValue(EapQtPluginHandle(EapQtExpandedEapType(innerEapsOn[ind])));
+ varInnerEapsOn.append(varTmp);
+ qDebug()
+ << "EapQtConfigInterfacePrivate - copyFromEapSettings InnerType: added EAP: "
+ << innerEapsOn[ind].toHex();
+ }
+ }
+
+ // copy to config
+ config.setValue(EapQtConfig::InnerType, varInnerEapsOn);
+ }
+
+ // disabled inner EAPs
+ if (eapSettings.iDisabledEncapsulatedEAPExpandedTypesPresent) {
+ // setting is not needed, enabled are enough
+ qDebug(
+ "EapQtConfigInterfacePrivate - copyFromEapSettings InnerType: disabled count %d (not needed for anything here)",
+ eapSettings.iDisabledEncapsulatedEAPExpandedTypes.Count());
+ }
+
+}
+
+QList<EapQtPluginHandle> EapQtConfigInterfacePrivate::selectedOuterTypes()
+{
+ qDebug("EapQtConfigInterfacePrivate::selectedOuterTypes(), this = 0x%08x", this);
+
+ checkInstanceThrowing();
+
+ if (!mEapDbIndexValid) {
+ qDebug() << "ERROR: Database reference not valid, call setConfigurationReference first!";
+ return QList<EapQtPluginHandle> ();
+ }
+
+ // call to make sure the members (mOuterEapsOn and mSupportedOuterTypes) are up-to-date
+ (void) supportedOuterTypes();
+
+ QList<EapQtPluginHandle> selectedOuterTypes;
+
+ QList<QByteArray> tmpEaps;
+ appendEapTypes(&mOuterEapsOn, &tmpEaps);
+
+ // report only the ones that also have an UI, i.e. listed in mSupportedOuterTypes
+ for (int ind = 0; ind < mSupportedOuterTypes.count(); ind++) {
+ if (tmpEaps.contains(mSupportedOuterTypes[ind].pluginHandle().type().eapExpandedData())) {
+ selectedOuterTypes.append(mSupportedOuterTypes[ind].pluginHandle());
+ }
+ }
+
+ qDebug("EapQtConfigInterfacePrivate - selected outer type count: %d",
+ selectedOuterTypes.count());
+
+ return selectedOuterTypes;
+}
+
+bool EapQtConfigInterfacePrivate::isSupportedOuterType(const EapQtPluginHandle &handle)
+{
+ qDebug("EapQtConfigInterfacePrivate::isSupportedOuterType(), this = 0x%08x", this);
+
+ checkInstanceThrowing();
+
+ // check if mSupportedOuterTypes is up-to-date
+ if (mSupportedOuterTypes.count() <= 0) {
+ // update mSupportedOuterTypes
+ (void) supportedOuterTypes();
+ }
+
+ bool ret = false;
+ for (int ind = 0; ind < mSupportedOuterTypes.count(); ind++) {
+ if (mSupportedOuterTypes[ind].pluginHandle() == handle) {
+ ret = true;
+ }
+ }
+ return ret;
+}
+
+bool EapQtConfigInterfacePrivate::setSelectedOuterTypes(
+ const QList<EapQtPluginHandle> &outerHandles)
+{
+ qDebug("EapQtConfigInterfacePrivate::setSelectedOuterTypes()");
+
+ checkInstanceThrowing();
+
+ if (!mEapDbIndexValid || mEapGsIf.isNull()) {
+ qDebug()
+ << "ERROR: Database reference not valid (or mEapGsIf is NULL), call setConfigurationReference first!";
+ return false;
+ }
+
+ // check if mSupportedOuterTypes is up-to-date
+ if (mSupportedOuterTypes.count() <= 0) {
+ // update mSupportedOuterTypes
+ (void) supportedOuterTypes();
+ }
+
+ // clear arrays
+ mOuterEapsOn.Reset();
+ mOuterEapsOff.Reset();
+
+ // pick only the supported ones from outerHandles
+ TEapExpandedType tmpEap;
+ for (int ind = 0; ind < mSupportedOuterTypes.count(); ind++) {
+ if (outerHandles.contains(mSupportedOuterTypes[ind].pluginHandle())) {
+
+ // convert to TEapExpandedType
+ tmpEap.SetValue(
+ mSupportedOuterTypes[ind].pluginHandle().type().eapExpandedData().data(),
+ mSupportedOuterTypes[ind].pluginHandle().type().eapExpandedData().length());
+
+ // add to mOuterEapsOn
+ mOuterEapsOn.Append(tmpEap);
+
+ qDebug()
+ << "EapQtConfigInterfacePrivate - setSelectedOuterTypes adding to enabledOuterHandles: "
+ << mSupportedOuterTypes[ind].pluginHandle().type().eapExpandedData().toHex();
+ }
+ }
+
+ bool ret = true;
+
+ // set selection to EAP server, no need to have correct content in mOuterEapsOff,
+ // EAP server handles it, mOuterEapsOn is only important
+ TUint err = mEapGsIf->SetEapMethods(mOuterEapsOn, mOuterEapsOff);
+ if (err != KErrNone) {
+ qDebug("EapQtConfigInterfacePrivate::setSelectedOuterTypes() - SetEapMethods failed: %d",
+ err);
+ // nothing we can do to recover, just exit
+ ret = false;
+ }
+ return ret;
+}
+
+bool EapQtConfigInterfacePrivate::isSupportedInnerType(const EapQtPluginHandle &outerHandle,
+ const EapQtPluginHandle &innerHandle)
+{
+ qDebug("EapQtConfigInterfacePrivate::isSupportedInnerType(), this = 0x%08x", this);
+
+ checkInstanceThrowing();
+
+ // update mSupportedInnerTypes
+ (void) supportedInnerTypes(outerHandle);
+
+ for (int ind = 0; ind < mSupportedInnerTypes.count(); ind++) {
+ if (mSupportedInnerTypes[ind].pluginHandle() == innerHandle) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool EapQtConfigInterfacePrivate::deleteConfiguration()
+{
+ qDebug("EapQtConfigInterfacePrivate::deleteConfiguration(), this = 0x%08x", this);
+
+ checkInstanceThrowing();
+
+ if (!mEapDbIndexValid || mEapGsIf.isNull()) {
+ qDebug()
+ << "ERROR: Database reference not valid (or mEapGsIf is NULL), call setConfigurationReference first!";
+ return false;
+ }
+
+ bool ret = true;
+ TInt err = mEapGsIf->DeleteAllEapSettings();
+ if (err != KErrNone) {
+ ret = false;
+ }
+ return ret;
+}
+
+void EapQtConfigInterfacePrivate::loadPlugins()
+{
+ qDebug("EapQtConfigInterfacePrivate::loadPlugins(), this = 0x%08x", this);
+
+ checkInstanceThrowing();
+
+ // plugin directory defined in cpeapplugininterface.h
+ QDir pluginsDir(CpEapPluginInterfacePluginDirectory);
+ foreach( QString fileName, pluginsDir.entryList(QDir::Files) )
+ {
+ QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
+ QObject *tmp = loader.instance();
+ if (tmp) {
+ CpEapPluginInterface *plugin = qobject_cast<CpEapPluginInterface*> (tmp);
+ if (plugin) {
+ mPlugins.append(plugin);
+ }
+ }
+ }
+
+ // collect UI plugin infos
+ QList<CpEapPluginInterface*>::iterator iter;
+ for (iter = mPlugins.begin(); iter != mPlugins.end(); ++iter) {
+ mPluginInfos.append((*iter)->pluginInfo());
+ }
+
+ // sort the UI plugins according to their order number
+ qSort(mPluginInfos.begin(), mPluginInfos.end(), EapQtConfigInterfacePrivate::pluginLessThan);
+
+ qDebug("EapQtConfigInterfacePrivate - loadPlugins: supported EAP plugin count: %d",
+ mPluginInfos.count());
+}
+
+bool EapQtConfigInterfacePrivate::pluginLessThan(
+ const EapQtPluginInfo &plugin1,
+ const EapQtPluginInfo &plugin2)
+{
+ return plugin1.orderNumber() < plugin2.orderNumber();
+}
+
+CpBaseSettingView *EapQtConfigInterfacePrivate::uiInstance(const EapQtPluginHandle &outerHandle,
+ const EapQtPluginHandle &pluginHandle)
+{
+ qDebug("EapQtConfigInterfacePrivate::uiInstance(), this = 0x%08x", this);
+
+ checkInstanceThrowing();
+
+ // if outer type UI is requested, outerHandle must be undefined and pluginHandle
+ // must be supported as outer type
+ if (outerHandle == EapQtPluginHandle::PluginUndefined) {
+ if (!isSupportedOuterType(pluginHandle)) {
+ qDebug() << "ERROR: EapQtConfigInterfacePrivate::uiInstance() -"
+ << "plugin not supported as outer type";
+ return NULL;
+ }
+ }
+ else {
+ // outerHandle defined, pluginHandle must be supported inside outerHandle
+ if (!isSupportedInnerType(outerHandle, pluginHandle)) {
+ qDebug() << "ERROR: EapQtConfigInterfacePrivate::uiInstance() -"
+ << "plugin not supported as the inner type of the specified outer type";
+ return NULL;
+ }
+ }
+
+ if (mTranslator.isNull()) {
+ // install translations for EAP UI plugins
+ mTranslator.reset(new HbTranslator(eapTranslationFile));
+ }
+
+ // go through all interfaces (dlls)
+ QList<CpEapPluginInterface*>::iterator iter;
+ for (iter = mPlugins.begin(); iter != mPlugins.end(); ++iter) {
+ QList<EapQtPluginInfo> plugins;
+ plugins.append((*iter)->pluginInfo());
+
+ // go through all plugings inside the interface implementation
+ QList<EapQtPluginInfo>::iterator j;
+ for (j = plugins.begin(); j != plugins.end(); ++j) {
+ if ((*j).pluginHandle() == pluginHandle) {
+ qDebug("EapQtConfigInterfacePrivate::uiInstance() - found plugin");
+ // indicate configured IAP to plugin
+ (*iter)->setSettingsReference(getEapBearer(), mIapId);
+ return (*iter)->uiInstance(outerHandle, *j);
+ }
+ }
+
+ }
+ qDebug("ERROR: EapQtConfigInterfacePrivate::uiInstance() - plugin not found");
+ return NULL;
+}
+
+EapQtConfigInterface::EapBearerType EapQtConfigInterfacePrivate::getEapBearer()
+{
+ EapQtConfigInterface::EapBearerType ret(EapQtConfigInterface::EapBearerTypeWlan);
+
+ switch (mEapBearer) {
+ case EVpn:
+ ret = EapQtConfigInterface::EapBearerTypeVpn;
+ break;
+ default:
+ ret = EapQtConfigInterface::EapBearerTypeWlan;
+ break;
+ }
+ return ret;
+}
+
+EapQtValidator *EapQtConfigInterfacePrivate::validatorEap(const EapQtExpandedEapType &type,
+ const EapQtConfig::SettingsId id)
+{
+ qDebug("EapQtConfigInterfacePrivate::validatorEap(), this = 0x%08x", this);
+
+ qDebug() << "EapQtConfigInterfacePrivate::validatorEap() - requested EAP: "
+ << type.eapExpandedData().toHex();
+ qDebug() << "EapQtConfigInterfacePrivate::validatorEap() - setting: " << id;
+
+ EapQtValidator *ret = NULL;
+
+ switch (id) {
+
+ case EapQtConfig::Username:
+ switch (type.type()) {
+ case EapQtExpandedEapType::TypeEapAka:
+ case EapQtExpandedEapType::TypeEapFast:
+ case EapQtExpandedEapType::TypeEapGtc:
+ case EapQtExpandedEapType::TypeLeap:
+ case EapQtExpandedEapType::TypeEapMschapv2:
+ case EapQtExpandedEapType::TypePeap:
+ case EapQtExpandedEapType::TypeEapSim:
+ case EapQtExpandedEapType::TypeEapTls:
+ case EapQtExpandedEapType::TypeEapTtls:
+ case EapQtExpandedEapType::TypePap:
+ case EapQtExpandedEapType::TypePlainMschapv2:
+ ret = new EapQtValidatorUsername(type);
+ break;
+ default:
+ ret = NULL;
+ }
+ break;
+
+ case EapQtConfig::Password:
+ switch (type.type()) {
+ case EapQtExpandedEapType::TypeEapGtc:
+ case EapQtExpandedEapType::TypeLeap:
+ case EapQtExpandedEapType::TypeEapMschapv2:
+ case EapQtExpandedEapType::TypePap:
+ case EapQtExpandedEapType::TypePlainMschapv2:
+ ret = new EapQtValidatorPassword(type);
+ break;
+ default:
+ ret = NULL;
+ }
+ break;
+
+ case EapQtConfig::Realm:
+ switch (type.type()) {
+ case EapQtExpandedEapType::TypeEapAka:
+ case EapQtExpandedEapType::TypeEapFast:
+ case EapQtExpandedEapType::TypePeap:
+ case EapQtExpandedEapType::TypeEapSim:
+ case EapQtExpandedEapType::TypeEapTls:
+ case EapQtExpandedEapType::TypeEapTtls:
+ ret = new EapQtValidatorRealm(type);
+ break;
+ default:
+ ret = NULL;
+ }
+ break;
+
+ default:
+ ret = NULL;
+
+ }
+
+ qDebug() << "EapQtConfigInterfacePrivate::validatorEap() - is returning NULL: " << (ret == NULL);
+
+ return ret;
+}
+
+bool EapQtConfigInterfacePrivate::readPacStoreConfiguration(EapQtPacStoreConfig& /* config */)
+{
+ // not supported
+ return false;
+}
+
+bool EapQtConfigInterfacePrivate::savePacStoreConfiguration(const EapQtPacStoreConfig& /* config */)
+{
+ // not supported
+ return false;
+}
+
+EapQtValidator *EapQtConfigInterfacePrivate::validatorPacStore(
+ const EapQtPacStoreConfig::PacStoreSettings id)
+{
+ qDebug("EapQtConfigInterfacePrivate::validatorPacStore(), this = 0x%08x", this);
+
+ EapQtValidator *ret = NULL;
+
+ switch (id) {
+ case EapQtPacStoreConfig::PacStorePassword:
+ ret = new EapQtValidatorPacStorePassword();
+ break;
+ case EapQtPacStoreConfig::PacStorePasswordConfirmation:
+ ret = new EapQtValidatorPacStorePasswordConfirm();
+ break;
+ default:
+ ret = NULL;
+ }
+
+ return ret;
+}