wlanutilities/eapwizard/src/eapwizard_p.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:18:40 +0300
branchRCL_3
changeset 24 63be7eb3fc78
permissions -rw-r--r--
Revision: 201029 Kit: 201035

/*
 * 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 Wizard: Private implementation.
 */

// System includes
#include <QDebug>
#include <QDataStream>
#include <HbTranslator>
#include <HbParameterLengthLimiter>
#include <eapqtconfiginterface.h>
#include <eapqtplugininfo.h>
#include <eapqtpluginhandle.h>
#include <eapqtconfig.h>
#include <eapqtpacstoreconfig.h>
#include <eapqtcertificateinfo.h>
#include <wlanerrorcodes.h>

// User includes
#include "wlanwizardhelper.h"
#include "wlanwizardplugin.h"
#include "eapwizard.h"
#include "eapwizard_p.h"
#include "eapwizarduistrings.h"
#include "eapwizardpageoutertype.h"
#include "eapwizardpagecertca.h"
#include "eapwizardpagecertuser.h"
#include "eapwizardpageidentity.h"
#include "eapwizardpageinnertype.h"
#include "eapwizardpageusernamepassword.h"
#include "eapwizardpagenewpacstore.h"
#include "eapwizardpagepacstorepasswordconfirm.h"
#include "OstTraceDefinitions.h"
#ifdef OST_TRACE_COMPILER_IN_USE
#include "eapwizard_pTraces.h"
#endif

/*!
   \class EapWizardPrivate
   \brief Implements the EAP wizard plugin for WLAN wizard.
 */

// External function prototypes

// Local constants


// ======== LOCAL FUNCTIONS ========

// ======== MEMBER FUNCTIONS ========

/*!
   Constructor of EAP Wizard.

   @param [in] wizardHelper pointer to the helper instance.
 */
EapWizardPrivate::EapWizardPrivate(
    WlanWizardHelper *wizardHelper) :
    mWizardHelper(wizardHelper), 
    mTranslator(new HbTranslator("eapwizard")), 
    mEapConfIf(new EapQtConfigInterface(
        EapQtConfigInterface::EapBearerTypeWlan, 
        EapQtConfigInterface::IapIdUndefined))
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_EAPWIZARDPRIVATE_ENTRY );
    Q_ASSERT(wizardHelper);
    createPages();
    OstTraceFunctionExit0( EAPWIZARDPRIVATE_EAPWIZARDPRIVATE_EXIT );
}

/*!
   Destructor.
 */
EapWizardPrivate::~EapWizardPrivate()
{
    OstTraceFunctionEntry0( DUP1_EAPWIZARDPRIVATE_EAPWIZARDPRIVATE_ENTRY );
    OstTraceFunctionExit0( DUP1_EAPWIZARDPRIVATE_EAPWIZARDPRIVATE_EXIT );
}

/*!
   See EapWizard::summary().
 */
bool EapWizardPrivate::summary(
    WlanWizardPlugin::Summary sum, 
    QString &item, 
    QString &value)
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_SUMMARY_ENTRY );
    bool ret = false;
    int outerType = configurations(EapWizardPrivate::OuterType).toInt();

    switch (sum) {
    case WlanWizardPlugin::SummaryEapInnerType:
        if (hasInnerMethod()) {
            item = hbTrId("txt_occ_dblist_inner_eap");
            value = eapTypeToString(configurations(EapWizardPrivate::InnerType).toInt());
            ret = true;
        }
        break;

    case WlanWizardPlugin::SummaryEapFastProvisioningMode:
        if (outerType == EapQtPluginHandle::PluginEapFast) {
            item = hbTrId("txt_occ_dblist_provisioning_mode_for_eapfast");
            value = hbTrId("txt_occ_dblist_provisioning_mode_for_val_unauthent");
            ret = true;
        }
        break;

    default:
        Q_ASSERT(sum == WlanWizardPlugin::SummaryEapOuterType);
        item = hbTrId("txt_occ_dblist_outer_eap");
        value = eapTypeToString(outerType);
        ret = true;
        break;

    }
    OstTraceFunctionExit0( EAPWIZARDPRIVATE_SUMMARY_EXIT );
    return ret;
}

/*!
   See EapWizard::storeSettings().

   @return true - ok, false - failed
 */
bool EapWizardPrivate::storeSettings()
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_STORESETTINGS_ENTRY );
    bool ret = false;
    EapQtPluginHandle outerType(static_cast<EapQtPluginHandle::Plugin>(
        configurations(OuterType).toInt()));

    int iapId = mWizardHelper->configuration(WlanWizardHelper::ConfIapId).toInt();

    if (mEapConfIf->setConfigurationReference(iapId) 
        && storeOuterTypeSettings(outerType)
        && storeInnerTypeSettings(outerType)) {
        ret = true;
    }

    OstTraceFunctionExit0( EAPWIZARDPRIVATE_STORESETTINGS_EXIT );
    return ret;
}

/*!
   See WlanWizardPlugin::errorString().

   Returns EAP spesific error string.
 */
QString EapWizardPrivate::errorString(int errorCode)
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_ERRORSTRING_ENTRY );
    char* textId = NULL;
    int eapType = EapQtPluginHandle::PluginUndefined;

    switch (errorCode){
    case KErrWlanUserRejected:
        textId = "txt_occ_dialog_1_auth_failed_user_cert_rej";
        eapType = configurations(OuterType).toInt();
        break;

    case KErrWlanUserCertificateExpired:
        textId = "txt_occ_dialog_1_auth_failed_user_cert_exp";
        eapType = configurations(OuterType).toInt();
        break;

    case KErrWlanServerCertificateExpired:
        textId = "txt_occ_dialog_1_authentication_failed_server_ce";
        eapType = configurations(OuterType).toInt();
        break;

    case KErrWlanCerficateVerifyFailed:
        textId = "txt_occ_dialog_1_authentication_failed_could_not";
        eapType = configurations(OuterType).toInt();
        break;

    case KErrWlanNoCipherSuite:
        textId = "txt_occ_dialog_1_authentication_failed_cipher_su";
        eapType = configurations(OuterType).toInt();
        break;

    case KErrWlanSimNotInstalled:
        textId = "txt_occ_dialog_1_authentication_failed_check_sim";
        eapType = configurations(OuterType).toInt();
        break;

    case KErrWlanEapFastPacStoreCorrupted:
        textId = "txt_occ_dialog_1_authentication_failed_reset_pac";
        eapType = EapQtPluginHandle::PluginEapFast;
        break;

    case KErrWlanEapSimFailed:
    case KErrWlanEapTlsFailed:
    case KErrWlanEapPeapFailed:
    case KErrWlanEapAkaFailed:
    case KErrWlanEapTtlsFailed:
    case KErrWlanLeapFailed:
    case KErrWlanNoUserCertificate:
    case KErrWlanEapFastTunnelCompromiseError:
    case KErrWlanEapFastUnexpextedTlvExhanged:
    case KErrWlanEapFastNoPacNorCertsToAuthenticateWithProvDisabled:
    case KErrWlanEapFastNoMatchingPacForAid:
    case KErrWlanEapFastAuthFailed:
        textId = "txt_occ_dialog_1_authentication_failed";
        eapType = configurations(OuterType).toInt();
        break;

    case KErrWlanEapMsChapv2:
    case KErrWlanEapGtcFailed:
        textId = "txt_occ_dialog_1_authentication_failed";
        eapType = configurations(InnerType).toInt();
        break;

    case KErrWlanNotSubscribed:
    case KErrWlanAccessBarred:
    case KErrWlanPasswordExpired:
    case KErrWlanNoDialinPermissions:
    case KErrWlanAccountDisabled:
    case KErrWlanRestrictedLogonHours:
        textId = "txt_occ_dialog_1_authentication_failed";
        if (hasInnerMethod()){
            eapType = configurations(InnerType).toInt();
        } else {
            eapType = configurations(OuterType).toInt();
        }
        break;

    default:
        // Return empty string
        break;
    }

    QString string;
    if (textId) {
        string = HbParameterLengthLimiter(textId).arg(eapTypeToString(eapType));
    }

    OstTraceFunctionExit0( EAPWIZARDPRIVATE_ERRORSTRING_EXIT );
    return string;
}

/*!
   Reader method for eap configurations.

   See ConfigurationId for further details about the data types in QVariant.

   @param [in] confId Defines what configuration is read.

   @return configuration value.
 */
QVariant EapWizardPrivate::configurations(ConfigurationId confId) const
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_CONFIGURATIONS_ENTRY );
    Q_ASSERT(mConfigurations.contains(confId));

#ifdef OST_TRACE_COMPILER_IN_USE
    QString tmp;
    QDebug tmpStream(&tmp );
    tmpStream << mConfigurations[confId];
    TPtrC16 string(tmp.utf16(), tmp.length() );

    OstTraceExt2( 
        TRACE_NORMAL, 
        EAPWIZARDPRIVATE_CONFIGURATIONS, 
        "EapWizardPrivate::configurations;confId=%{ConfigurationId};string=%S", 
        (TUint)confId, string );
#endif

    OstTraceFunctionExit0( EAPWIZARDPRIVATE_CONFIGURATIONS_EXIT );
    return mConfigurations[confId];
}

/*!
   Sets EAP configuration value for given configuration identifier.
   See ConfigurationId for further details about the data types in QVariant.

   @param [in] confId Configuration Identifier do to be set
   @param [in] value  Value for configuration.
 */
void EapWizardPrivate::setConfigurations(
    ConfigurationId confId, const QVariant &value)
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_SETCONFIGURATIONS_ENTRY );
#ifdef OST_TRACE_COMPILER_IN_USE
    QString tmp;
    QDebug tmpStream(&tmp );
    tmpStream << value;
    TPtrC16 string( tmp.utf16(), tmp.length() );

    OstTraceExt2( 
        TRACE_NORMAL, 
        EAPWIZARDPRIVATE_SETCONFIGURATIONS, 
        "EapWizardPrivate::setConfigurations;confId=%{ConfigurationId};string=%S", 
        (TUint)confId, string );
#endif

    mConfigurations[confId] = value;
    OstTraceFunctionExit0( EAPWIZARDPRIVATE_SETCONFIGURATIONS_EXIT );
}

/*!
   @return pointer to EapQtConfigInterface.
 */
EapQtConfigInterface* EapWizardPrivate::eapConfigurationInterface() const
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_EAPCONFIGURATIONINTERFACE_ENTRY );
    Q_ASSERT(mEapConfIf.data());
    OstTraceFunctionExit0( EAPWIZARDPRIVATE_EAPCONFIGURATIONINTERFACE_EXIT );
    return mEapConfIf.data();
}

/*!
   Maps given EAP Qt Plugin handle into string.

   @param [in] id EapQtPluginHandle::Handle, id to be mapped to string.

   @return EAP String.
 */
QString EapWizardPrivate::eapTypeToString(int id) const
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_EAPTYPETOSTRING_ENTRY );
    QString locId;
    switch (id) {
    case EapQtPluginHandle::PluginEapAka:
        locId = EapWizardUiStrings::EapAka;
        break;

    case EapQtPluginHandle::PluginEapFast:
        locId = EapWizardUiStrings::EapFast;
        break;

    case EapQtPluginHandle::PluginLeap:
        locId = EapWizardUiStrings::Leap;
        break;

    case EapQtPluginHandle::PluginPeap:
        locId = EapWizardUiStrings::Peap;
        break;

    case EapQtPluginHandle::PluginEapSim:
        locId = EapWizardUiStrings::EapSim;
        break;

    case EapQtPluginHandle::PluginEapTls:
        locId = EapWizardUiStrings::EapTls;
        break;

    case EapQtPluginHandle::PluginEapTtls:
        locId = EapWizardUiStrings::EapTtls;
        break;

    case EapQtPluginHandle::PluginEapMschapv2:
        locId = EapWizardUiStrings::EapMschapv2;
        break;

    case EapQtPluginHandle::PluginEapGtc:
        locId = EapWizardUiStrings::EapGtc;
        break;

    case EapQtPluginHandle::PluginPap:
        locId = EapWizardUiStrings::Pap;
        break;

    default:
        // Invalid enum
        Q_ASSERT(EapQtPluginHandle::PluginPlainMschapv2 == id);
        locId = EapWizardUiStrings::Mschapv2;
        break;
    }

    OstTraceFunctionExit0( EAPWIZARDPRIVATE_EAPTYPETOSTRING_EXIT );
    return locId;
}

/*!
   Accessor to WLAN Wizard Helper objects.

   @return a pointer to helper object.
 */
WlanWizardHelper *EapWizardPrivate::wizardHelper() const
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_WIZARDHELPER_ENTRY );
    Q_ASSERT(mWizardHelper);
    OstTraceFunctionExit0( EAPWIZARDPRIVATE_WIZARDHELPER_EXIT );
    return mWizardHelper;
}

/*!
   Creates EAP Wizard pages and add those to the wizard framework.
 */
void EapWizardPrivate::createPages()
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_CREATEPAGES_ENTRY );
    mWizardHelper->addPage(
        EapWizardPage::PageOuterType,
        new EapWizardPageOuterType(this));

    mWizardHelper->addPage(
        EapWizardPage::PageCertificateCa,
        new EapWizardPageCertCa(this));

    mWizardHelper->addPage(
        EapWizardPage::PageCertificateUser,
        new EapWizardPageCertUser(this));

    mWizardHelper->addPage(
        EapWizardPage::PageIdentity,
        new EapWizardPageIdentity(this));

    mWizardHelper->addPage(
        EapWizardPage::PageInnerTypeEapTtls, 
        new EapWizardPageInnerType(
            this, 
            EapQtPluginHandle::PluginEapTtls));

    mWizardHelper->addPage(
        EapWizardPage::PageInnerTypePeap, 
        new EapWizardPageInnerType(
            this,
            EapQtPluginHandle::PluginPeap));

    mWizardHelper->addPage(
        EapWizardPage::PageUsernamePassword, 
        new EapWizardPageUsernamePassword(this));

    mWizardHelper->addPage(
        EapWizardPage::PageNewPacStorePassword, 
        new EapWizardPageNewPacStore(this));

    mWizardHelper->addPage(
        EapWizardPage::PagePromptPacStorePassword,
        new EapWizardPagePacStorePasswordConfirm(this));
    OstTraceFunctionExit0( EAPWIZARDPRIVATE_CREATEPAGES_EXIT );
}

/*!
   Check whether selected outer type has inner method.

   @return true if inner method exists, false otherwise.
 */
bool EapWizardPrivate::hasInnerMethod() const
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_HASINNERMETHOD_ENTRY );
    int outerType = configurations(EapWizardPrivate::OuterType).toInt();
    bool ret = false;

    switch (outerType) {
    case EapQtPluginHandle::PluginEapTtls:
    case EapQtPluginHandle::PluginPeap:
    case EapQtPluginHandle::PluginEapFast:
        ret = true;
        break;
    }

    OstTraceFunctionExit0( EAPWIZARDPRIVATE_HASINNERMETHOD_EXIT );
    return ret;
}


/*
   Handles TLS methods (PEAP, EAP-TLS and EAP-TTLS) settings.

   Stores configurations to eapConf

   @param [in,out] eapConf configuration is written to this object.
   @param [in] outerType Outer EAP method
 */
void EapWizardPrivate::handleTlsMethodsSettings(
    EapQtConfig &eapConf,
    EapQtPluginHandle &outerType)
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_HANDLETLSMETHODSSETTINGS_ENTRY );
    // Common stuff for all tls methods
    eapConf.setValue(EapQtConfig::UseIdentityPrivacy, false);
    eapConf.setValue(EapQtConfig::VerifyServerRealm, false);
    eapConf.setValue(EapQtConfig::ClientAuthenticationRequired, false);
    eapConf.setValue(EapQtConfig::UsernameAutomatic, configurations(TunnelUsernameAutomatic));
    eapConf.setValue(EapQtConfig::Username, configurations(TunnelUsername));
    eapConf.setValue(EapQtConfig::RealmAutomatic, configurations(TunnelRealmAutomatic));
    eapConf.setValue(EapQtConfig::Realm, configurations(TunnelRealm));

    QVariant certVariant = configurations(CertificateCa);

    if (certVariant.canConvert<EapQtCertificateInfo> ()) {
        QList<QVariant> caCerts;
        caCerts.append(certVariant);
        eapConf.setValue(EapQtConfig::AuthorityCertificate, caCerts);
        eapConf.setValue(EapQtConfig::AuthorityCertificateAutomatic, false);
    } else {
        eapConf.setValue(EapQtConfig::AuthorityCertificateAutomatic, true);
    }

    // type specific configurations
    if (outerType == EapQtPluginHandle::PluginEapTls) {
        QList<QVariant> userCerts;
        userCerts.append(configurations(CertificateUser));
        eapConf.setValue(EapQtConfig::ClientAuthenticationRequired, true);
        eapConf.setValue(EapQtConfig::UserCertificate, userCerts);

    } else if (outerType == EapQtPluginHandle::PluginPeap) {

        switch (configurations(InnerType).toInt()) {
        case EapQtPluginHandle::PluginEapMschapv2:
            // EAP-MSCHAPv2: enable v0 only
            eapConf.setValue(EapQtConfig::PeapVersion0Allowed, true);
            eapConf.setValue(EapQtConfig::PeapVersion1Allowed, false);
            break;

        case EapQtPluginHandle::PluginEapGtc:
            // EAP-GTC: enable v1 only
            eapConf.setValue(EapQtConfig::PeapVersion0Allowed, false);
            eapConf.setValue(EapQtConfig::PeapVersion1Allowed, true);
            break;
        }
        eapConf.setValue(EapQtConfig::PeapVersion2Allowed, false);
    }
    OstTraceFunctionExit0( EAPWIZARDPRIVATE_HANDLETLSMETHODSSETTINGS_EXIT );
}

/*!
   Handles configurations for EAP-FAST.

   @param [in,out] eapConf EAP Configuration

   @param false in case of failure.
 */
bool EapWizardPrivate::handleEapFastSettings(EapQtConfig &eapConf)
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_HANDLEEAPFASTSETTINGS_ENTRY );
    bool ret = true;
    EapQtPacStoreConfig pacStoreConf;

    eapConf.setValue(EapQtConfig::ProvisioningModeAuthenticated, false);
    eapConf.setValue(EapQtConfig::ProvisioningModeUnauthenticated, true);
    eapConf.setValue(EapQtConfig::VerifyServerRealm, false);
    eapConf.setValue(EapQtConfig::UseIdentityPrivacy, false);

    switch (configurations(PacStoreState).toInt()) {
    case EapQtPacStoreConfig::PacStoreStateStoreNotExists:
    case EapQtPacStoreConfig::PacStoreStatePasswordRequired:            
        pacStoreConf.setValue(
            EapQtPacStoreConfig::PacStorePassword, 
            configurations(PacStorePassword));

        pacStoreConf.setValue(
            EapQtPacStoreConfig::PacStoreSavePassword, 
            true);

        if (!mEapConfIf->savePacStoreConfiguration(pacStoreConf)) {
            // no cleaning required
            ret = false;
        }
        break;

    default:
        // Do nothing
        break;
    }

    OstTraceFunctionExit0( EAPWIZARDPRIVATE_HANDLEEAPFASTSETTINGS_EXIT );
    return ret;
}

/*!
   Handles configurations for EAP-AKA and EAP-SIM.

   @param [in,out] eapConf EAP Configuration
 */
void EapWizardPrivate::handleEapAkaSimSettings(EapQtConfig &eapConf)
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_HANDLEEAPAKASIMSETTINGS_ENTRY );
    eapConf.setValue(EapQtConfig::UsernameAutomatic, true);
    eapConf.setValue(EapQtConfig::RealmAutomatic, true);    
    OstTraceFunctionExit0( EAPWIZARDPRIVATE_HANDLEEAPAKASIMSETTINGS_EXIT );
}

/*!
   Handles configurations for LEAP.

   @param [in,out] eapConf EAP Configuration
 */
void EapWizardPrivate::handleLeapSettings(EapQtConfig &eapConf)
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_HANDLELEAPSETTINGS_ENTRY );
    eapConf.setValue(EapQtConfig::UsernameAutomatic, false);
    eapConf.setValue(EapQtConfig::Username, configurations(Username));
    eapConf.setValue(EapQtConfig::PasswordPrompt, false);
    eapConf.setValue(EapQtConfig::Password, configurations(Password));    
    OstTraceFunctionExit0( EAPWIZARDPRIVATE_HANDLELEAPSETTINGS_EXIT );
}

/*!
   Store outer type settings.

   @param outerType reference to outertype

   @return false in case of failure.
 */
bool EapWizardPrivate::storeOuterTypeSettings(EapQtPluginHandle &outerType)
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_STOREOUTERTYPESETTINGS_ENTRY );
    EapQtConfig eapConf;

    // 1. Store outer type settings
    switch (outerType.pluginId()) {
    case EapQtPluginHandle::PluginEapTtls: 
    case EapQtPluginHandle::PluginPeap:
    case EapQtPluginHandle::PluginEapTls:
        handleTlsMethodsSettings(eapConf, outerType);
        break;

    case EapQtPluginHandle::PluginEapFast:
        if (!handleEapFastSettings(eapConf)) {
            OstTraceFunctionExit0( EAPWIZARDPRIVATE_STOREOUTERTYPESETTINGS_EXIT );
            return false;
        }
        break;

    case EapQtPluginHandle::PluginEapAka: 
    case EapQtPluginHandle::PluginEapSim:
        handleEapAkaSimSettings(eapConf);
        break;

    default:
        Q_ASSERT(outerType == EapQtPluginHandle::PluginLeap);
        handleLeapSettings(eapConf);
        break;
    }

    if (hasInnerMethod()) {
        EapQtPluginHandle inner = static_cast<EapQtPluginHandle::Plugin>(
            configurations(InnerType).toInt());

        QList<QVariant> innerType;
        innerType.append(qVariantFromValue(inner));
        eapConf.setValue(EapQtConfig::InnerType, innerType);
    }

    // store outer type configurations
    if (!mEapConfIf->saveConfiguration(outerType, eapConf)){
        mEapConfIf->deleteConfiguration();
        OstTraceFunctionExit0( DUP1_EAPWIZARDPRIVATE_STOREOUTERTYPESETTINGS_EXIT );
        return false;
    }

    QList<EapQtPluginHandle> selectedOuterTypes;
    selectedOuterTypes.append(outerType);
    if (!mEapConfIf->setSelectedOuterTypes(selectedOuterTypes)){
        mEapConfIf->deleteConfiguration();
        OstTraceFunctionExit0( DUP2_EAPWIZARDPRIVATE_STOREOUTERTYPESETTINGS_EXIT );
        return false;
    }

    OstTraceFunctionExit0( DUP3_EAPWIZARDPRIVATE_STOREOUTERTYPESETTINGS_EXIT );
    return true;
}


/*!
   Store inner type settings if exists.

   @param outerType reference to outertype

   @return false in case of failure.
 */
bool EapWizardPrivate::storeInnerTypeSettings(EapQtPluginHandle &outerType)
{
    OstTraceFunctionEntry0( EAPWIZARDPRIVATE_STOREINNERTYPESETTINGS_ENTRY );
    bool ret = true;

    if (hasInnerMethod()) {
        EapQtPluginHandle inner = static_cast<EapQtPluginHandle::Plugin>(
            configurations(InnerType).toInt());

        // All inner methods supported by wizard use password / username. 
        EapQtConfig eapConfInner;
        eapConfInner.setValue(EapQtConfig::OuterType, qVariantFromValue(outerType));
        eapConfInner.setValue(EapQtConfig::UsernameAutomatic, false);
        eapConfInner.setValue(EapQtConfig::Username, configurations(Username));
        eapConfInner.setValue(EapQtConfig::PasswordPrompt, false);
        eapConfInner.setValue(EapQtConfig::Password, configurations(Password));

        if (!mEapConfIf->saveConfiguration(inner, eapConfInner)){
            mEapConfIf->deleteConfiguration();
            ret = false;
        }
    }
    OstTraceFunctionExit0( EAPWIZARDPRIVATE_STOREINNERTYPESETTINGS_EXIT );
    return ret;
}