wlansecuritysettings/wapisecuritysettingsui/src/wapisecuritysettingsimpl.cpp
changeset 17 8840d3e38314
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlansecuritysettings/wapisecuritysettingsui/src/wapisecuritysettingsimpl.cpp	Fri Mar 19 09:29:58 2010 +0200
@@ -0,0 +1,602 @@
+/*
+* ============================================================================
+*  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 <featmgr.h>
+#include <cmdestinationext.h>
+#include <cmmanagerext.h>
+
+#include <wlancontainer.h>
+
+// 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<CCDIAPRecord *>
+                            (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<CMDBGenericRecord*>( 
+                                          CCDRecordBase::RecordFactoryL( 0 ) );
+    CleanupStack::PushL( generic );    
+    generic->InitializeL( TPtrC( WLAN_SERVICE ), NULL );
+    generic->LoadL( aSession );
+    
+    CMDBField<TUint32>* sidField = static_cast<CMDBField<TUint32>*>
+                             ( generic->GetFieldByIdL( KCDTIdWlanServiceId ) );
+    
+    // prime with service id                
+    *sidField = wlanServiceId;
+    
+    if (generic->FindL( aSession ))
+        {
+        // Get authentication
+        CMDBField<TUint>* enableWpaPskField = static_cast<CMDBField<TUint>*>
+                          ( generic->GetFieldByIdL( KCDTIdWlanEnableWpaPsk ) );
+        iWapiAuth = (*enableWpaPskField == 0 ) ? EWapiAuthCert : EWapiAuthPSK;
+
+        // Get preshared key format
+        CMDBField<CWAPISecuritySettings::TWapiKeyFormat>* wapiPskFormat = static_cast<CMDBField<CWAPISecuritySettings::TWapiKeyFormat>*>
+                       ( generic->GetFieldByIdL( KCDTIdWlanFormatKey1 ) );
+        iWapiKeyFormat = *wapiPskFormat;
+
+        // Get preshared key
+        CMDBField<TDesC8>* wpaPskField = static_cast<CMDBField<TDesC8>*>
+                       ( 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<CCDIAPRecord *>
+                            (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<CMDBGenericRecord*>
+        ( CCDRecordBase::RecordFactoryL( 0 ) );
+    CleanupStack::PushL( generic );    
+    generic->InitializeL( TPtrC( WLAN_SERVICE ), NULL );
+    generic->LoadL( aSession );
+    TMDBElementId wlanTableId = generic->TableId();
+    
+    CMDBField<TUint32>* sidField = static_cast<CMDBField<TUint32>*>
+                             ( 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<TUint>* enableWpaPskField = static_cast<CMDBField<TUint>*>
+                          ( generic->GetFieldByIdL( KCDTIdWlanEnableWpaPsk ) );
+    enableWpaPskField->SetL( iWapiAuth == EWapiAuthPSK ? 1 : 0 );
+    
+    if (iWapiAuth == EWapiAuthPSK)
+        {
+        if (iWapiPSKKeySet)
+            {
+
+            // Save PreShared Key format
+            CMDBField<TUint>* keyFormat = static_cast<CMDBField<TUint>*>
+                                ( generic->GetFieldByIdL( KCDTIdWlanFormatKey1 ) );
+            keyFormat->SetL( iWapiKeyFormat );
+            
+            // Save PreShared Key
+            CMDBField<TDesC8>* wapiPskField = static_cast<CMDBField<TDesC8>*>
+                               ( generic->GetFieldByIdL( KCDTIdWlanWpaPreSharedKey ) );
+            wapiPskField->SetL( iWapiPSKKey );
+    
+            // Save PreShared Key length
+            CMDBField<TUint>* keyLengthField = static_cast<CMDBField<TUint>*>
+                                ( 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<KMaxIdentityLength> 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<KMaxLabelLength>               userCertLabel;
+        TBuf<KMaxLabelLength>               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<TBuf<KMaxLabelLength> >* 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