diff -r 8840d3e38314 -r 7aac0b9e8906 wlansecuritysettings/wapisecuritysettingsui/src/wapisecuritysettingsimpl.cpp --- a/wlansecuritysettings/wapisecuritysettingsui/src/wapisecuritysettingsimpl.cpp Fri Mar 19 09:29:58 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,602 +0,0 @@ -/* -* ============================================================================ -* Name : wapisecuritysettingsimpl.cpp -* Part of : WAPI Security Settings UI -* -* Description: -* Implementation of class CWAPISecuritySettingsImpl. -* -* Version: %version: 13.1.2 % -* -* Copyright (C) 2008 Nokia Corporation. -* This material, including documentation and any related -* computer programs, is protected by copyright controlled by -* Nokia Corporation. All rights are reserved. Copying, -* including reproducing, storing, adapting or translating, any -* or all of this material requires the prior written consent of -* Nokia Corporation. This material also contains confidential -* information which may not be disclosed to others without the -* prior written consent of Nokia Corporation. -* -* ============================================================================ -*/ - -// INCLUDE FILES - -#include "wapisecuritysettingsimpl.h" -#include "wapisecuritysettingsuipanic.h" -#include "wapisecuritysettingsui.h" - -#include -#include -#include - -#include - -// CONSTANT DECLARATIONS - - -// ================= MEMBER FUNCTIONS ======================= - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::NewL -// --------------------------------------------------------- -// -CWAPISecuritySettingsImpl* CWAPISecuritySettingsImpl::NewL() - { - CWAPISecuritySettingsImpl* settings = - new ( ELeave ) CWAPISecuritySettingsImpl(); - CleanupStack::PushL( settings ); - settings->ConstructL(); - CleanupStack::Pop( settings ); - return settings; - } - - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::CWAPISecuritySettingsImpl -// --------------------------------------------------------- -// -CWAPISecuritySettingsImpl::CWAPISecuritySettingsImpl() - { - iUserCertInUse = KCertNone; - iCACertInUse = KCertNone; - iCertificatesLoaded = EFalse; - } - - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::ConstructL -// --------------------------------------------------------- -// -void CWAPISecuritySettingsImpl::ConstructL() - { - iCertificateStore = CWapiCertificates::NewL(); - - #if defined( _DEBUG ) || defined( DEBUG ) - RDebug::Print(_L("CWAPISecuritySettingsImpl::ConstructL, iCertificateStore created.") ); - #endif - - FeatureManager::InitializeLibL(); - } - - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::~CWAPISecuritySettingsImpl -// --------------------------------------------------------- -// -CWAPISecuritySettingsImpl::~CWAPISecuritySettingsImpl() - { - if (iUserCertificates) - { - iUserCertificates->Close(); - delete iUserCertificates; - } - if (iUserCertificateData) - { - iUserCertificateData->Close(); - delete iUserCertificateData; - } - - if (iCACertificates) - { - iCACertificates->Close(); - delete iCACertificates; - } - if (iCACertificateData) - { - iCACertificateData->Close(); - delete iCACertificateData; - } - - delete iCertificateStore; - - FeatureManager::UnInitializeLib(); - } - - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::LoadL -// --------------------------------------------------------- -// -void CWAPISecuritySettingsImpl::LoadL( TUint32 aIapRecordId, CMDBSession& aSession ) - { - CCDIAPRecord *iapRecord = static_cast - (CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord)); - - CleanupStack::PushL( iapRecord ); - - iapRecord->SetRecordId( aIapRecordId ); - - iapRecord->LoadL( aSession ); - - TUint32 wlanServiceId = iapRecord->iService; - - CleanupStack::PopAndDestroy(iapRecord); - - #if defined( _DEBUG ) || defined( DEBUG ) - RDebug::Print(_L("CWAPISecuritySettingsImpl::LoadL, aIapId = %d, wlanServiceId = %d"), - aIapRecordId, wlanServiceId ); - #endif - - if ( wlanServiceId == KUidNone ) - { - return; - } - - // search for the record - CMDBGenericRecord* generic = static_cast( - CCDRecordBase::RecordFactoryL( 0 ) ); - CleanupStack::PushL( generic ); - generic->InitializeL( TPtrC( WLAN_SERVICE ), NULL ); - generic->LoadL( aSession ); - - CMDBField* sidField = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanServiceId ) ); - - // prime with service id - *sidField = wlanServiceId; - - if (generic->FindL( aSession )) - { - // Get authentication - CMDBField* enableWpaPskField = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanEnableWpaPsk ) ); - iWapiAuth = (*enableWpaPskField == 0 ) ? EWapiAuthCert : EWapiAuthPSK; - - // Get preshared key format - CMDBField* wapiPskFormat = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanFormatKey1 ) ); - iWapiKeyFormat = *wapiPskFormat; - - // Get preshared key - CMDBField* wpaPskField = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanWpaPreSharedKey ) ); - iWapiPSKKey = *wpaPskField; - - iWapiPSKKeySet = IsValidPsk(iWapiPSKKey); - } - - // Save aIapRecordId for later certificate loading. - iWlanServiceId = wlanServiceId; - - CleanupStack::PopAndDestroy( generic ); - - } - - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::SaveL -// --------------------------------------------------------- -// -void CWAPISecuritySettingsImpl::SaveL( TUint32 aIapRecordId, CMDBSession& aSession ) const - { - - CCDIAPRecord *iapRecord = static_cast - (CCDRecordBase::RecordFactoryL(KCDTIdIAPRecord)); - - CleanupStack::PushL( iapRecord ); - - iapRecord->SetRecordId( aIapRecordId ); - - iapRecord->LoadL( aSession ); - - TUint32 wlanServiceId = iapRecord->iService; - - CleanupStack::PopAndDestroy(iapRecord); - #if defined( _DEBUG ) || defined( DEBUG ) - RDebug::Print(_L("CWAPISecuritySettingsImpl::SaveL, iapRecordId = %d, wlanServiceId = %d"), - aIapRecordId, wlanServiceId ); - #endif - - // Load WLAN service table - // first get WLAN table id - CMDBGenericRecord* generic = static_cast - ( CCDRecordBase::RecordFactoryL( 0 ) ); - CleanupStack::PushL( generic ); - generic->InitializeL( TPtrC( WLAN_SERVICE ), NULL ); - generic->LoadL( aSession ); - TMDBElementId wlanTableId = generic->TableId(); - - CMDBField* sidField = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanServiceId ) ); - - // prime with service id - *sidField = wlanServiceId; - - TBool found = generic->FindL( aSession); - - // If loading failed, WLAN service record will be - // created and StoreL()-d, otherwise, ModifyL() - - // Set WPA mode - CMDBField* enableWpaPskField = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanEnableWpaPsk ) ); - enableWpaPskField->SetL( iWapiAuth == EWapiAuthPSK ? 1 : 0 ); - - if (iWapiAuth == EWapiAuthPSK) - { - if (iWapiPSKKeySet) - { - - // Save PreShared Key format - CMDBField* keyFormat = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanFormatKey1 ) ); - keyFormat->SetL( iWapiKeyFormat ); - - // Save PreShared Key - CMDBField* wapiPskField = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanWpaPreSharedKey ) ); - wapiPskField->SetL( iWapiPSKKey ); - - // Save PreShared Key length - CMDBField* keyLengthField = static_cast*> - ( generic->GetFieldByIdL( KCDTIdWlanWpaKeyLength ) ); - keyLengthField->SetL( iWapiPSKKey.Length() ); - } - } - // If certificates have not been loaded, i*CertInUse doesn't contain right values - else if ( iCertificateStore && iCertificatesLoaded != EFalse) - { - #if defined( _DEBUG ) || defined( DEBUG ) - RDebug::Print(_L("Saving user cert index %d"), iUserCertInUse ); - RDebug::Print(_L("Saving CA cert index %d"), iCACertInUse ); - #endif - - // "none" is communicated to wapicertificates as zero length identity - TBuf8 certNone; - certNone.Zero(); - - if (iUserCertInUse == KCertNone) - { - iCertificateStore->SetUserCertL( wlanServiceId, certNone); - } - else - { - iCertificateStore->SetUserCertL( wlanServiceId, (*iUserCertificateData)[iUserCertInUse]); - } - - if (iCACertInUse == KCertNone) - { - iCertificateStore->SetCACertL( wlanServiceId, certNone); - } - else - { - iCertificateStore->SetCACertL( wlanServiceId, (*iCACertificateData)[iCACertInUse]); - } - } - // Saving changes - if ( !found ) - { - // there wasn't any wlan service record, we have to create it now - generic->SetRecordId( KCDNewRecordRequest ); - generic->StoreL( aSession ); - } - else - { - // modify existing record - generic->ModifyL( aSession ); - } - - CleanupStack::PopAndDestroy( generic ); - } - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::SetPreSharedKeyL -// --------------------------------------------------------- -// -void CWAPISecuritySettingsImpl::SetPreSharedKeyL( const CWAPISecuritySettings::TWapiKeyFormat aKeyFormat, const TDesC& aPreSharedKey ) - { - HBufC8* buf8 = HBufC8::NewL( aPreSharedKey.Length() ); - - TPtr8 pskPtr( buf8->Des() ); - pskPtr.Copy( aPreSharedKey ); - - if ( !IsValidPsk( aKeyFormat, pskPtr ) ) - { - delete buf8; - User::Leave(KErrArgument); - } - - SetAuthentication(EWapiAuthPSK); - SetKeyFormat( aKeyFormat ); - SetWapiPSKKeyL( aPreSharedKey ); - - delete buf8; - } - - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::ResetCertificateStoreL -// --------------------------------------------------------- -// -void CWAPISecuritySettingsImpl::ResetCertificateStoreL() - { - if ( iCertificateStore ) - { - iCertificateStore->ResetCertificateStoreL(); - - //Certificate store was reseted. Set certificates in use to "None" and - //Close RARRAY's - iUserCertInUse = KCertNone; - iCACertInUse = KCertNone; - - // Reload certificate data: delete old and load new ones. - if (iUserCertificates) - { - iUserCertificates->Close(); - delete iUserCertificates; - iUserCertificates = NULL; - } - if (iUserCertificateData) - { - iUserCertificateData->Close(); - delete iUserCertificateData; - iUserCertificateData = NULL; - } - - if (iCACertificates) - { - iCACertificates->Close(); - delete iCACertificates; - iCACertificates = NULL; - } - if (iCACertificateData) - { - iCACertificateData->Close(); - delete iCACertificateData; - iCACertificateData = NULL; - } - - iCertificateStore->GetAllCertificateLabelsL( - &iUserCertificates, &iUserCertificateData, - &iCACertificates, &iCACertificateData); - } - } -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::LoadCertificatesL -// --------------------------------------------------------- -// -void CWAPISecuritySettingsImpl::LoadCertificatesL() - { - #if defined( _DEBUG ) || defined( DEBUG ) - RDebug::Print(_L("LoadCertificatesL()")); - #endif - - if ( iCertificateStore && iCertificatesLoaded == EFalse) - { - iCertificateStore->GetAllCertificateLabelsL( - &iUserCertificates, &iUserCertificateData, - &iCACertificates, &iCACertificateData); - - //Define local variables for certificate labels - TBuf userCertLabel; - TBuf CACertLabel; - - //Fetch configuration from EAPOL - iCertificateStore->GetConfigurationL( - iWlanServiceId, CACertLabel, userCertLabel ); - - #if defined( _DEBUG ) || defined( DEBUG ) - RDebug::Print(_L("CWAPISecuritySettingsImpl::LoadL, iWlanServiceId = %d"), iWlanServiceId ); - RDebug::Print(_L("CWAPISecuritySettingsImpl::LoadL, CACertLabel = %S"), &CACertLabel ); - RDebug::Print(_L("CWAPISecuritySettingsImpl::LoadL, userCertLabel = %S"), &userCertLabel ); - #endif - - //Fetch matching indexes - iUserCertInUse = GetIndexByCertLabel(iUserCertificates, userCertLabel); - iCACertInUse = GetIndexByCertLabel(iCACertificates, CACertLabel); - - #if defined( _DEBUG ) || defined( DEBUG ) - RDebug::Print(_L("iUserCertInUse = %d"), iUserCertInUse ); - RDebug::Print(_L("iCACertInUse = %d"), iCACertInUse ); - #endif - - // Don't load certificates again because it resets made configuration changes too. - iCertificatesLoaded = ETrue; - } - } - - -//------------------------------------------------------------------------------ -// CWAPISecuritySettingsImpl::DeleteAPSpecificDataL -//------------------------------------------------------------------------------ -// -void CWAPISecuritySettingsImpl::DeleteAPSpecificDataL( const TInt aId ) - { - if ( iCertificateStore ) - { - iCertificateStore->DeleteAPSpecificDataL( aId ); - } - } - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::GetIndexByCertLabel -// --------------------------------------------------------- -// -TInt CWAPISecuritySettingsImpl::GetIndexByCertLabel( - RArray >* aCertificates, - const TDesC& aCert ) - { - if ( aCertificates ) - { - for ( TInt i = 0; i < aCertificates->Count(); i++ ) - { - if ( aCert.Compare((*aCertificates)[i])== 0 ) //Compare returns zero - //when result is matching - { - return i; - } - } - } - return KCertNone; // if certificate is not found return zero index - } - - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::GetAuthentication -// --------------------------------------------------------- -// -TWapiAuth CWAPISecuritySettingsImpl::GetAuthentication( ) - { - return iWapiAuth; - } - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::SetAuthentication -// --------------------------------------------------------- -// -void CWAPISecuritySettingsImpl::SetAuthentication( TWapiAuth aWapiAuth ) - { - iWapiAuth = aWapiAuth; - } - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::GetKeyFormat -// --------------------------------------------------------- -// -CWAPISecuritySettings::TWapiKeyFormat CWAPISecuritySettingsImpl::GetKeyFormat() - { - return iWapiKeyFormat; - } - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::SetKeyFormat -// --------------------------------------------------------- -// -void CWAPISecuritySettingsImpl::SetKeyFormat( CWAPISecuritySettings::TWapiKeyFormat aWapiKeyFormat ) - { - iWapiKeyFormat = aWapiKeyFormat; - } - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::GetWapiPSKKey -// --------------------------------------------------------- -// -TBool CWAPISecuritySettingsImpl::hasWapiPSKKey() - { - return iWapiPSKKeySet; - } - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::SetWapiPSKKey -// --------------------------------------------------------- -// -TInt CWAPISecuritySettingsImpl::SetWapiPSKKeyL( const TDesC& aWapiPSKKey ) - { - TInt ret( KErrNone ); - - #if defined( _DEBUG ) || defined( DEBUG ) - RDebug::Print(_L("CWAPISecuritySettingsImpl::SetWapiPSKKeyL te")); - #endif - - HBufC8* buf8 = HBufC8::NewL( aWapiPSKKey.Length() ); - - if ( buf8 ) - { - TPtr8 pskPtr( buf8->Des() ); - pskPtr.Copy( aWapiPSKKey ); - - if (IsValidPsk(pskPtr)) - { - iWapiPSKKeySet = ETrue; - iWapiPSKKey = pskPtr; - iWapiAuth = EWapiAuthPSK; - } - else - { - ret = KErrArgument; - } - delete buf8; - } - else - { - ret = KErrNoMemory; - } - - return ret; - } - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::IsValidPsk -// --------------------------------------------------------- -// -TBool CWAPISecuritySettingsImpl::IsValidPsk( const TDesC8& aPsk ) - { - return IsValidPsk(iWapiKeyFormat, aPsk); - } - -TBool CWAPISecuritySettingsImpl::IsValidPsk( - const CWAPISecuritySettings::TWapiKeyFormat aWapiKeyFormat, - const TDesC8& aPsk ) - { - TBool ret( EFalse ); - - TInt len = aPsk.Length(); - ret = (len >= 1 && len <= KWapiMaxKeyLength ); - - if (ret && (aWapiKeyFormat == CWAPISecuritySettings::EWapiKeyHex)) - { - ret = !(len % 2); // Must be even length - if (ret) - { - // Check contents - for ( TInt i = 0; i < len; ++i ) - { - TChar ch( aPsk[i] ); - if ( !ch.IsHexDigit() ) - { - // Got a bad character - ret = EFalse; - break; - } - } - } - } - - return ret; - - } - -// --------------------------------------------------------- -// CWAPISecuritySettingsImpl::Valid -// --------------------------------------------------------- -// -TBool CWAPISecuritySettingsImpl::IsValid( ) - { - TBool ret( EFalse ); - - if (iWapiAuth == EWapiAuthPSK) - { - // Pre-shared key is compulsory. - ret = iWapiPSKKeySet; - } - else // ... == EWapiAuthCert - { - // Always valid. - ret = ETrue; - } - return ret; - } - -// End of File