diff -r 000000000000 -r 164170e6151a wim/WimServer/src/WimSession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wim/WimServer/src/WimSession.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,634 @@ +/* +* Copyright (c) 2002-2009 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: Session class for WimServer +* +*/ + + + +// INCLUDE FILES +#include "WimSession.h" +#include "WimMemMgmt.h" +#include "WimCertHandler.h" +#include "WimAuthObjHandler.h" +#include "WimTokenHandler.h" +#include "WimKeyMgmtHandler.h" +#include "WimSignTextHandler.h" +#include "WimServer.h" +#include "WimResponse.h" +#include "WimCallbackImpl.h" +#include "WimUtilityFuncs.h" +#include "WimSessionRegistry.h" +#include "WimOmaProvisioning.h" +#include "WimJavaProvisioning.h" +#include "WimTrustSettingsHandler.h" +#include "WimTrace.h" + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CWimSession::CWimSession +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CWimSession::CWimSession() : CSession2() + { + _WIMTRACE(_L("WIM | WIMServer | CWimSession::CWimSession | Begin")); + __DECLARE_NAME( _S( "CWimSession" ) ); + } + +// ----------------------------------------------------------------------------- +// CWimSession::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CWimSession::ConstructL( CWimServer* aWimServer ) + { + _WIMTRACE(_L("WIM | WIMServer | CWimSession::ConstructL | Begin")); + iWimSvr = aWimServer; +#ifdef WIMSERVER_SHUTDOWN + iWimSvr->AddSession(); +#endif + iWimMgmt = CWimMemMgmt::NewL(); + iWimCertHandler = CWimCertHandler::NewL(); + iWimAuthObjHandler = CWimAuthObjHandler::NewL(); + iWimTokenHandler = CWimTokenHandler::NewL(); + iWimKeyMgmtHandler = CWimKeyMgmtHandler::NewL(); + iWimSignTextHandler = CWimSignTextHandler::NewL(); + //iTimer = CWimTimer::NewL( this ); + iWimUtilFuncs = CWimUtilityFuncs::NewL(); + iWimOmaProvisioning = CWimOmaProvisioning::NewL(); + iWimJavaProvisioning = CWimJavaProvisioning::NewL(); + iWimTrustSettingsHandler = CWimTrustSettingsHandler::NewL( iWimSvr->WimTrustSettingsStore() ); + } + +// ----------------------------------------------------------------------------- +// CWimSession::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CWimSession* CWimSession::NewL( CWimServer* aWimServer ) + { + _WIMTRACE(_L("WIM | WIMServer | CWimSession::NewL | Begin")); + CWimSession* self = new( ELeave ) CWimSession(); + CleanupStack::PushL( self ); + self->ConstructL( aWimServer ); + CleanupStack::Pop( self ); + return self; + } + +// Destructor +CWimSession::~CWimSession() + { + _WIMTRACE(_L("WIM | WIMServer | CWimSession::~CWimSession | Begin")); + +#ifdef WIMSERVER_SHUTDOWN + if ( iWimSvr ) + { + iWimSvr->DropSession(); + } +#endif + //Check if message is not completed before session is desctructed + if ( iMessage ) + { + iMessage->Complete( KErrCancel ); + delete iMessage; + } + + if ( iNotifyMessage ) // NotifyOnRemoval message pending + { + iNotifyMessage->Complete( KErrCancel ); + delete iNotifyMessage; + } + + // Delete sessions from session registry + if ( iWimSvr ) + { + iWimSvr->WimSessionRegistry()->RemoveSession( this ); + } + + delete iWimMgmt; + //delete iTimer; + delete iWimCertHandler; + delete iWimAuthObjHandler; + delete iWimTokenHandler; + delete iWimKeyMgmtHandler; + delete iWimSignTextHandler; + delete iWimUtilFuncs; + delete iWimOmaProvisioning; + delete iWimJavaProvisioning; + delete iWimTrustSettingsHandler; + } + +// ----------------------------------------------------------------------------- +// CWimSession::ServiceL +// Handles the servicing of client requests to the server. +// ----------------------------------------------------------------------------- +// +void CWimSession::ServiceL( const RMessage2& aMessage ) + { + _WIMTRACE(_L("WIM | WIMServer | CWimSession::ServiceL | Begin")); + + iMessage = new( ELeave ) RMessage2( aMessage ); + + TRAPD( appErr, DispatchMessageL( aMessage ) ); + // The error is an application error + // If the appErr is '0' or if the appErr is WIM_Error + // then it is completed by the called functions or by + // the callback functions + if ( appErr ) + { + _WIMTRACE2(_L("WIM | WIMServer | CWimSession::ServiceL | Leaved with %d"), appErr); + aMessage.Complete( appErr ); + } + + // Message is completed so delete copy of message + delete iMessage; + iMessage = NULL; + } + +// ----------------------------------------------------------------------------- +// CWimSession::DispatchMessageL +// Handles client requests and forwards them to appropriate handler class. +// ----------------------------------------------------------------------------- +// +void CWimSession::DispatchMessageL( const RMessage2& aMessage ) + { + _WIMTRACE2(_L("WIM|WIMServer|CWimSession::DispatchMessageL|Begin, Function=%d"), aMessage.Function()); + // Check if the WIM has been initialized properly. If not just complete + // message with WimServer status and return + if ( CWimServer::iWimStatus != KErrNone + && aMessage.Function() != EWimInitialize + && aMessage.Function() != ECancelNotifyOnRemoval ) + { + aMessage.Complete( CWimServer::iWimStatus ); + return; + } + + // Are we going to card? (blocks sim refresh until done) + if ( RequestAccessesHW( aMessage.Function() )) + { + iWimSvr->SetIsAccessingToken( ETrue ); + } + + _WIMTRACE2( _L( "WIM|WIMServer|CWimSession::DispatchMessageL|Begin, heap=%d" ), + User::CountAllocCells() ); +#ifdef __WIM_ENABLE_TRACES + TTime funcStart; + TTime funcEnd; + funcStart.UniversalTime(); +#endif // __WIM_ENABLE_TRACES + + switch ( aMessage.Function() ) + { +//==================== WIM operations ========================================== + case EWimInitialize: + _WIMTRACE2(_L("WIM|WIMServer|CWimSession::DispatchMessageL|EWimInitialize, iWimInitialized=%d"), CWimServer::iWimInitialized); + iWimSvr->WimInitialize( aMessage ); + break; + case ECancelWimInitialize: + iWimSvr->CancelWimInitialize( aMessage ); + break; + case EGetWIMCount: + GetWimCountL(); + break; + case EGetWIMRefs: + GetWimRefListL(); + break; + +//==================== WIM card management ===================================== + case EGetWIMInfo: + iWimSvr->WimTimer()->ResetTimer(); + iWimTokenHandler->GetWIMInfoL( aMessage, iWimMgmt ); + break; + case EIsWIMOpen: + iWimTokenHandler->IsWIMOpenL( aMessage, iWimSvr->WimTimer(), iWimMgmt ); + break; + case ECloseWIMAfter: + iWimSvr->WimTimer()->SetCloseAfter( aMessage ); + break; + case EGetCloseWIMAfter: + iWimSvr->WimTimer()->GetCloseAfterL( aMessage ); + break; + case EWimTimeRemaining: + iWimSvr->WimTimer()->TimeRemainingL( aMessage ); + break; + case EWIMClose: + iWimTokenHandler->CloseWIM( aMessage ); + break; + +//==================== Notify on removal ======================================= + case ENotifyOnRemoval: + NotifyOnRemovalL(); + break; + case ECancelNotifyOnRemoval: + CancelNotifyOnRemoval(); + break; + +//==================== WIM Reference handling ================================== + case EFreeMemory: + iWimMgmt->FreeRef( ( WIMI_Ref_pt* )aMessage.Ptr0() ); + aMessage.Complete( KErrNone ); + break; + case EFreeWIMMemoryLst: + { + TUint wimCount = aMessage.Int1(); + + WIMI_Ref_t* temp = NULL; + TUint8 wimIndex = 0 ; + for ( ; wimIndex < KWimMaxCount && ( temp = WIMI_GetWIMRef( wimIndex ) ) != NULL; wimIndex++ ) + { + free_WIMI_Ref_t( temp ); + } + + if ( wimCount != wimIndex ) + { + User::LeaveIfError( KErrArgument ); + } + + iWimMgmt->FreeWIMRefs( aMessage ); + break; + } + case EFreeMemoryLst: + iWimMgmt->FreeRefLst( aMessage ); + break; + +//==================== PIN operations ========================================== + case EGetPINCount: + iWimSvr->WimTimer()->ResetTimer(); + iWimAuthObjHandler->GetPINCountL( aMessage ); + break; + case EGetPINRefs: + iWimSvr->WimTimer()->ResetTimer(); + iWimAuthObjHandler->GetPINRefListL( aMessage, iWimMgmt ); + break; + case EGetPINInfo: + iWimSvr->WimTimer()->ResetTimer(); + iWimAuthObjHandler->GetPINInfoL( aMessage ); + break; + case EGetPINsInfo: + iWimSvr->WimTimer()->ResetTimer(); + iWimAuthObjHandler->GetPINsInfoL( aMessage ); + break; + case EIsPinBlocked: + iWimAuthObjHandler->VerifyPINRequestL( aMessage, EFalse ); + break; + case EIsDisabledPinBlocked: + iWimAuthObjHandler->VerifyDisabledPINRequestL( aMessage ); + break; + case EChangePINReq: + iWimSvr->WimTimer()->ResetTimer(); + iWimAuthObjHandler->ChangePINRequestL( aMessage ); + break; + case ECancelChangePin: + iWimAuthObjHandler->CancelChangePin( aMessage ); + break; + case EEnablePINReq: + iWimSvr->WimTimer()->ResetTimer(); + iWimAuthObjHandler->EnablePINReqL( aMessage ); + break; + case ECancelEnablePin: + iWimAuthObjHandler->CancelEnablePin( aMessage ); + break; + case EUnblockPinReq: + iWimSvr->WimTimer()->ResetTimer(); + iWimAuthObjHandler->UnblockPinReqL( aMessage ); + break; + case ECancelUnblockPin: + iWimAuthObjHandler->CancelUnblockPin( aMessage ); + break; + case EVerifyPinReq: + iWimSvr->WimTimer()->ResetTimer(); + iWimAuthObjHandler->VerifyPINRequestL( aMessage, ETrue ); + break; + case ECancelVerifyPin: + iWimAuthObjHandler->CancelVerifyPin( aMessage ); + break; + case ERetrieveAuthObjsInfo: + iWimAuthObjHandler->RetrieveAuthObjectsInfo( aMessage ); + break; + +//==================== Key operations ========================================== + case EGetKeyDetails: + iWimKeyMgmtHandler->GetKeyDetailsL( aMessage ); + break; + case EGetKeyList: + iWimKeyMgmtHandler->GetKeyListL( aMessage, iWimMgmt ); + break; + case EDoesPvKeyExist: + iWimKeyMgmtHandler->DoesKeyExistL( aMessage ); + break; + +//==================== Certificate Management ================================== + case EGetWIMCertLst: + iWimCertHandler->GetCertificatesFromWimL( aMessage, iWimMgmt ); + break; + case EGetCertCount: + iWimCertHandler->GetCerticateCountL( aMessage, iWimMgmt ); + break; + case EGetWIMCertDetails: + iWimCertHandler->GetCertificateDetailsL( EGetWIMCertDetails, + aMessage ); + break; + case EGetCertExtras: // Get cert extra data (e.g. trusted usage) + iWimCertHandler->GetExtrasFromWimL( aMessage, iWimMgmt ); + break; + case EStoreCertificate: + iWimCertHandler->StoreCertificateL( EStoreCertificate, aMessage ); + break; + case ERemoveCertificate: + iWimCertHandler->RemoveCertificateL( aMessage, iWimMgmt ); + break; + case EExportPublicKey: + iWimCertHandler->ExportPublicKeyL( aMessage ); + break; + +//==================== Digital signature ======================================= + case ESignTextReq: + iWimSignTextHandler->SignTextL( aMessage ); + break; + +//==================== Java Provisioning ======================================== + case EGetACIFFileSize: + iWimJavaProvisioning->ACIFFileSizeL( aMessage ); + break; + case EGetACIFFile: + iWimJavaProvisioning->ACIFFileContentL( aMessage ); + break; + case EGetACFFileSize: + iWimJavaProvisioning->ACFFileSizeL( aMessage ); + break; + case EGetACFFile: + iWimJavaProvisioning->ACFFileContentL( aMessage ); + break; + case EGetLabelAndPath: + iWimJavaProvisioning->LabelAndPath( aMessage ); + break; + +//==================== OMA Provisioning ======================================== + case EGetOMAFileSize: + iWimOmaProvisioning->OmaFileSizeL( aMessage ); + break; + case EGetOMAFile: + iWimOmaProvisioning->OmaFileContentL( aMessage ); + break; + +//==================== Trust Settings ========================================= + case EGetTrustSettings: + iWimTrustSettingsHandler->GetTrustSettingsL( aMessage ); + break; + case ESetApplicability: + iWimTrustSettingsHandler->SetApplicabilityL( aMessage ); + break; + case ESetTrust: + iWimTrustSettingsHandler->SetTrustL( aMessage ); + break; + case ESetDefaultTrustSettings: + iWimTrustSettingsHandler->SetDefaultTrustSettingsL( aMessage ); + break; + case ERemoveTrustSettings: + iWimTrustSettingsHandler->RemoveTrustSettingsL( aMessage ); + break; + case ECancelTrustSettings: + iWimTrustSettingsHandler->CancelDoing(); + break; + +//==================== Opcode not supported ==================================== + default: + aMessage.Complete( KErrArgument ); + break; + } +#ifdef __WIM_ENABLE_TRACES + funcEnd.UniversalTime(); + TTimeIntervalMicroSeconds funcTime = funcEnd.MicroSecondsFrom( funcStart ); + _WIMTRACE3( _L("WIMServer function %d, time %Ld us"), aMessage.Function(), funcTime.Int64() ); + + TInt allocSize = 0; + TInt allocCount = User::AllocSize( allocSize ); + _WIMTRACE3( _L( "WIM|WIMServer|CWimSession::DispatchMessageL|End, heap=%d, heapsize=%d" ), allocCount, allocSize ); +#endif // __WIM_ENABLE_TRACES + + // Assuming that WIMI calls are asynchronous + iWimSvr->SetIsAccessingToken( EFalse ); // HW access complete + + // Has the card data been modified during service? -> re-init + if ( iWimSvr->RefreshNotificationReceived() ) + { + iWimSvr->SetRefreshNotificationReceived( EFalse ); + RefreshWimi(); + } + } + +// ----------------------------------------------------------------------------- +// CWimSession::GetWimRefListL +// Fetches the list of the references of WIMs currently associated with readers. +// ----------------------------------------------------------------------------- +// +void CWimSession::GetWimRefListL() + { + _WIMTRACE(_L("WIM | WIMServer | CWimSession::GetWIMRefListL | Begin")); + WIMI_Ref_pt pWimRefTemp = NULL; + + HBufC8* buf = iWimUtilFuncs->DesLC( 0, *iMessage ); + TUint32* wimRef = ( TUint32* )( buf->Des().Ptr() ); + TUint8 wimIndex = 0; + for ( ; wimIndex < KWimMaxCount && + ( pWimRefTemp = WIMI_GetWIMRef( wimIndex ) ) != NULL; wimIndex++ ) + { + wimRef[wimIndex] = ( TUint32 )pWimRefTemp; + iWimMgmt->AppendWIMRefL( pWimRefTemp ); // takes ownership + } + iMessage->WriteL( 0, buf->Des() ); + CleanupStack::PopAndDestroy( buf ); + + iMessage->Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CWimSession::GetWimCountL +// Fetches the count of WIM cards in use. +// ----------------------------------------------------------------------------- +// +void CWimSession::GetWimCountL() + { + _WIMTRACE(_L("WIM | WIMServer | CWimSession::GetWimCountL | Begin")); + WIMI_Ref_t* temp = NULL; + TUint8 wimIndex = 0 ; + for ( ; wimIndex < KWimMaxCount && + ( temp = WIMI_GetWIMRef( wimIndex ) ) != NULL; wimIndex++ ) + { + free_WIMI_Ref_t( temp ); + } + + TPckgBuf pckg( wimIndex ); + iMessage->WriteL( 0, pckg ); + iMessage->Complete( KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CWimSession::TimerExpired +// Timer for closing WIM card. WIM is opened again with EVerifyPinReq after +// new initialization. +// ----------------------------------------------------------------------------- +// +void CWimSession::TimerExpired() + { + _WIMTRACE(_L("WIM | WIMServer | CWimSession::TimerExpired | Begin")); + WIMI_Ref_pt pWimRefTemp = NULL; + + pWimRefTemp = WIMI_GetWIMRef( 0 ); + + if ( pWimRefTemp ) // Close the WIM + { + WIMI_CloseWIM( pWimRefTemp ); + free_WIMI_Ref_t( pWimRefTemp ); + } + CWimServer::SetWimInitialized( EFalse, KErrNone ); + } + +// ----------------------------------------------------------------------------- +// CWimSession::NotifyOnRemoval +// Notify on card removal. Store message for completing. +// ----------------------------------------------------------------------------- +// +void CWimSession::NotifyOnRemovalL() + { + _WIMTRACE(_L("WIM | WIMServer | CWimSession::NotifyOnRemoval | Begin")); + if ( iNotifyMessage ) // Message already pending + { + _WIMTRACE(_L("WIM|WIMServer|CWimSession::NotifyOnRemoval|KErrAlreadyExists")); + iMessage->Complete( KErrAlreadyExists ); + return; + } + iNotifyMessage = new( ELeave ) RMessage2( *iMessage ); // Store message + _WIMTRACE(_L("WIM|WIMServer|CWimSession::NotifyOnRemoval|iNotifyMessage created")); + } + +// ----------------------------------------------------------------------------- +// CWimSession::CancelNotifyOnRemoval +// Cancels NotifyOnRemoval request if it is pending. +// ----------------------------------------------------------------------------- +// +void CWimSession::CancelNotifyOnRemoval() + { + _WIMTRACE(_L("WIM | WIMServer | CWimSession::CancelNotifyOnRemoval | Begin")); + if ( iNotifyMessage ) + { + _WIMTRACE(_L("WIM | WIMServer | CWimSession::CancelNotifyOnRemoval | iNotifyMessage completed with KErrCancel")); + iNotifyMessage->Complete( KErrCancel ); // Complete pending message + delete iNotifyMessage; + iNotifyMessage = NULL; + } + _WIMTRACE(_L("WIM | WIMServer | CWimSession::CancelNotifyOnRemoval | Message completed with KErrNone")); + iMessage->Complete( KErrNone ); // Complete Cancel message + } + +// ----------------------------------------------------------------------------- +// CWimSession::NotifyComplete +// Complete NotifyOnRemoval message +// ----------------------------------------------------------------------------- +// +void CWimSession::NotifyComplete() + { + _WIMTRACE(_L("WIM | WIMServer | CWimSession::NotifyComplete | Begin")); + if ( iNotifyMessage ) + { + iNotifyMessage->Complete( KErrNone ); + delete iNotifyMessage; + iNotifyMessage = NULL; + } + } + + +// ----------------------------------------------------------------------------- +// CWimSession::RequestAccessesHW +// Check if current request accesses HW +// ----------------------------------------------------------------------------- +// +TBool CWimSession::RequestAccessesHW( TInt aFunction ) + { + TBool rc( EFalse ); + + switch ( aFunction ) + { + // Requests that access HW + case EWimInitialize: //lint -fallthrough +//==================== WIM card management ===================================== + case EWIMClose: //lint -fallthrough +//==================== PIN operations ========================================== + case EIsPinBlocked: //lint -fallthrough + case EChangePINReq: //lint -fallthrough + case EEnablePINReq: //lint -fallthrough + case EUnblockPinReq: //lint -fallthrough + case EVerifyPinReq: //lint -fallthrough +//==================== Certificate Management ================================== + case EGetWIMCertDetails: //lint -fallthrough + case EStoreCertificate: //lint -fallthrough + case ERemoveCertificate: //lint -fallthrough + case EExportPublicKey: //lint -fallthrough +//==================== Digital signature ======================================= + case ESignTextReq: //lint -fallthrough +//==================== OMA Provisioning ======================================== + case EGetOMAFileSize: //lint -fallthrough + case EGetOMAFile: +//==================== JAVA Proisioning ======================================== + case EGetACIFFileSize: + case EGetACIFFile: + case EGetACFFileSize: + case EGetACFFile: + case EGetLabelAndPath: + rc = ETrue; + break; + + // Request does not access HW + default: + break; + } + return rc; + } + + +// ----------------------------------------------------------------------------- +// CWimSession::RefreshWimi +// Data on card has changed, re-init Wimi. +// ----------------------------------------------------------------------------- +// +void CWimSession::RefreshWimi() + { + RArray sessions; + TRAPD( err, iWimSvr->GetSessionsL( sessions )); + + if ( !err ) // Got sessions correctly + { + TInt count = sessions.Count(); + // Loop through all sessions and notify all clients that are + // requesting the notification + for ( TInt i( 0 ); i < count; i++ ) + { + sessions[i]->NotifyComplete(); + } + sessions.Reset(); + // Close WIMI + WIMI_CloseDownReq(); + _WIMTRACE(_L("WIM | CWimSession::RefreshWimi | WIMI closed.")); + } + else + { + _WIMTRACE(_L("WIM | CWimSession::RefreshWimi: FAILED to get sessions.")); + } + } + +// End of File