diff -r 000000000000 -r 164170e6151a pkiutilities/SecModUI/src/SecModUIModel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkiutilities/SecModUI/src/SecModUIModel.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,1384 @@ +/* +* Copyright (c) 2005-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: Implementation of the CSecModUIModel class +* +*/ + + + +// INCLUDE FILES +#include "SecModUI.h" +#include "SecModUIModel.h" +#include "SecModUIViewAccess.h" +#include "SecModUIViewCode.h" +#include "SecModUIViewMain.h" +#include "SecModUIViewSignature.h" +#include "SecModUISyncWrapper.h" +#include "SecModUILogger.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// CONSTANTS +_LIT(KResourceFile, "z:SecModUI.rsc"); +_LIT(KResourceFile2, "z:CertManUI.rsc"); +_LIT(KResourceFile3, "z:CTsecdlgs.rsc"); +_LIT(KTab, " \t"); +_LIT(KDoubleTab, "\t\t"); +_LIT(KFourAsterisks,"****"); +_LIT(KEnter, "\n"); +_LIT(KDoubleEnter, "\n\n"); + +_LIT(KSecModUIPanic, "Security Module UI panic"); + +const TInt KMaxLengthTextDetailsBody = 750; +const TInt KMaxLengthItemValue = 100; +const TInt KWIMStoreUid ( 0x101F79D9 ); +const TInt KItemLength (200); + +// ============================= LOCAL FUNCTIONS =============================== +GLDEF_C void Panic(TInt aPanic) + { + User::Panic(KSecModUIPanic, aPanic); + } + +// ============================ MEMBER FUNCTIONS =============================== +#ifndef RD_GS_RENOVATION +EXPORT_C MSecModUI* MSecModUI::CreateL() + { + LOG_CREATE; + LOG_ENTERFN("MSecModUI::CreateL()"); + LOG_LEAVEFN("MSecModUI::CreateL()"); + return CSecModUIModel::NewL(); + } +#endif + +// ----------------------------------------------------------------------------- +// CSecModUIModel::CSecModUIModel +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CSecModUIModel::CSecModUIModel() + { + LOG_WRITE( "CSecModUIModel::CSecModUIModel" ); + } + +// Destructor +CSecModUIModel::~CSecModUIModel() + { + LOG_ENTERFN("CSecModUIModel::~CSecModUIModel"); + delete iWrapper; + if ( iResourceFileOffset ) + { + iEikEnv->DeleteResourceFile( iResourceFileOffset ); + } + if ( iResourceFileOffset2 ) + { + iEikEnv->DeleteResourceFile( iResourceFileOffset2 ); + } + if ( iResourceFileOffset3 ) + { + iEikEnv->DeleteResourceFile( iResourceFileOffset3 ); + } + ResetAndDestroyCTObjects(); + LOG_LEAVEFN("CSecModUIModel::~CSecModUIModel"); + LOG_DELETE; + } +// ----------------------------------------------------------------------------- +// CSecModUIModel::ResetAndDestroyCTObjects() +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::ResetAndDestroyCTObjects() + { + LOG_ENTERFN("CSecModUIModel::ResetAndDestroyCTObjects()"); + + ResetAndDestroyAOs(); + + iAOKeyStores.Reset(); + + delete iUnifiedKeyStore; + iUnifiedKeyStore = NULL; + iKeyStore = NULL; + LOG_LEAVEFN("CSecModUIModel::ResetAndDestroyCTObjects()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::ResetAndDestroyAOs() +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::ResetAndDestroyAOs() + { + LOG_ENTERFN("CSecModUIModel::ResetAndDestroyAOs()"); + if (iAOList) + { + iAOList->Release(); + iAOList = NULL; + } + if (iAOArray.Count() > 0 && + iAOArray[0]->Token().TokenType().Type().iUid == KTokenTypeFileKeystore) + { + iAOArray.Reset(); + } + else + { + iAOArray.Close(); + } + LOG_LEAVEFN("CSecModUIModel::ResetAndDestroyAOs()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::ConstructL() +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::ConstructL() + { + LOG_ENTERFN("CSecModUIModel::ConstructL()"); + iEikEnv = CEikonEnv::Static(); + AddResourceFileL(); + +#ifndef RD_GS_RENOVATION + + CSecModUIViewMain* viewMain = CSecModUIViewMain::NewLC(*this); + ((CAknViewAppUi*)iEikEnv->EikAppUi())->AddViewL(viewMain); + CleanupStack::Pop(viewMain); + + CSecModUIViewCode* viewCode = CSecModUIViewCode::NewLC(*this); + ((CAknViewAppUi*)iEikEnv->EikAppUi())->AddViewL(viewCode); + CleanupStack::Pop(viewCode); + + CSecModUIViewAccess* viewAccess = CSecModUIViewAccess::NewLC(*this); + ((CAknViewAppUi*)iEikEnv->EikAppUi())->AddViewL(viewAccess); + CleanupStack::Pop(viewAccess); + + CSecModUIViewSignature* viewSignature = + CSecModUIViewSignature::NewLC(*this); + ((CAknViewAppUi*)iEikEnv->EikAppUi())->AddViewL(viewSignature); + CleanupStack::Pop(viewSignature); +#endif + InitializeKeyStoreL(); + LOG_LEAVEFN("CSecModUIModel::ConstructL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSecModUIModel* CSecModUIModel::NewL() + { + LOG_ENTERFN("CSecModUIModel::NewL()"); + CSecModUIModel* self = new( ELeave ) CSecModUIModel(); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + LOG_LEAVEFN("CSecModUIModel::NewL()"); + return self; + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::InitializeKeyStoreL() +// ----------------------------------------------------------------------------- +// +TInt CSecModUIModel::InitializeKeyStoreL() + { + LOG_ENTERFN("CSecModUIModel::InitializeKeyStoreL()"); + ResetAndDestroyCTObjects(); + iUnifiedKeyStore = CUnifiedKeyStore::NewL(iEikEnv->FsSession()); + + if (iWrapper == NULL) + { + iWrapper = CSecModUISyncWrapper::NewL(); + } + + TInt err = iWrapper->Initialize(*iUnifiedKeyStore); + + ShowErrorNoteL(err); + if (KErrNone != err && KErrHardwareNotAvailable != err) + { + LOG_LEAVEFN("CSecModUIModel::InitializeKeyStoreL()"); + return err; + } + TInt keyStoreCount = iUnifiedKeyStore->KeyStoreCount(); + if (0 >= keyStoreCount) + { + LOG_LEAVEFN("CSecModUIModel::InitializeKeyStoreL()"); + return KErrNone; + } + + RMPointerArray keyInfos; + CleanupClosePushL(keyInfos); + TCTKeyAttributeFilter filter; + TInt keyInfoCount = 0; + filter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys; + + for (TInt i = 0; i < keyStoreCount; i++) + { + err = iWrapper->ListKeys(iUnifiedKeyStore->KeyStore(i), keyInfos, filter); + LOG_WRITE_FORMAT( "CSecModUIModel::InitializeKeyStoreL() list err = %d ", err ); + + //If list ok, append the AO, otherwise go next + if ( err == KErrNone ) + { + keyInfoCount = keyInfos.Count(); + for (TInt j = 0; j < keyInfoCount; j++) + { + // Check that keystore has at least one AO. + if (NULL != keyInfos[j]->Protector()) + { + // If keystore has AO, add it to the array. + User::LeaveIfError( + iAOKeyStores.Append(&(iUnifiedKeyStore->KeyStore(i)))); + break; + } + } + } + keyInfos.Close(); + } + CleanupStack::PopAndDestroy(&keyInfos); //keyInfos + + LOG_LEAVEFN("CSecModUIModel::InitializeKeyStoreL()"); + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::AddResourceFileL() +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::AddResourceFileL() + { + LOG_ENTERFN("CSecModUIModel::AddResourceFileL()"); + // Resource file loading + RFs& fs = iEikEnv->FsSession(); + + TFileName fileName; + + TParse parse; + // secmodui.rsc + parse.Set(KResourceFile, &KDC_RESOURCE_FILES_DIR, NULL); + + fileName = parse.FullName(); + + BaflUtils::NearestLanguageFile( fs, fileName ); + iResourceFileOffset = iEikEnv->AddResourceFileL( fileName ); + + // CertManUI.rsc + parse.Set(KResourceFile2, &KDC_RESOURCE_FILES_DIR, NULL); + fileName = parse.FullName(); + BaflUtils::NearestLanguageFile( fs, fileName ); + iResourceFileOffset2 = iEikEnv->AddResourceFileL( fileName ); + + // CTSecDlg.rsc + parse.Set(KResourceFile3, &KDC_RESOURCE_FILES_DIR, NULL); + fileName = parse.FullName(); + BaflUtils::NearestLanguageFile( fs, fileName ); + iResourceFileOffset3 = iEikEnv->AddResourceFileL( fileName ); + + LOG_LEAVEFN("CSecModUIModel::AddResourceFileL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::LoadTokenLabelsL(CEikTextListBox& aListBox) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::LoadTokenLabelsL(CEikTextListBox& aListBox) + { + LOG_ENTERFN("CSecModUIModel::LoadTokenLabelsL()"); + + TInt keyStoreCount = iAOKeyStores.Count(); + + if (0 == keyStoreCount) + { + LOG_WRITE_FORMAT("keyStoreCount == %i",keyStoreCount); + LOG_LEAVEFN("CSecModUIModel::LoadTokenLabelsL()"); + //disable the scrollbar if no keystore + aListBox.ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff,CEikScrollBarFrame::EOff); + return; + } + TBuf item; + TBuf label; + + CDesCArray* itemArray = + STATIC_CAST(CDesCArray*, aListBox.Model()->ItemTextArray()); + for (TInt i = 0; i < keyStoreCount; i++) + { + if (iAOKeyStores[i]->Token().TokenType().Type().iUid + == KTokenTypeFileKeystore) + { + AppendResourceL(label, R_QTN_KEYSTORE_LIST_TEXT_PHONE_KEYSTORE); + } + else + { + label = iAOKeyStores[i]->Token().Label(); + } + item += KTab; + item += label; + item += KTab; + AppendLocationL(item, iAOKeyStores[i]->Token().TokenType().Type()); + item.SetLength(item.Length() - 1); // Remove \n from the end + itemArray->AppendL(item); + label.Zero(); + item.Zero(); + } + + LOG_LEAVEFN("CSecModUIModel::LoadTokenLabelsL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::CheckCodeViewStringsL(MDesCArray& aItemArray) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::CheckCodeViewStringsL(MDesCArray& aItemArray) + { + LOG_ENTERFN("CSecModUIModel::CheckCodeViewStringsL()"); + InitAuthObjectsL(); + ListAuthObjectsL(); + + if (0 >= iAOArray.Count()) + { + // Handle error + } + else if (1 == iAOArray.Count()) + { + // Only PIN-G exists, let's remove "signing codes" from the list + CDesCArray* itemArray = STATIC_CAST(CDesCArray*, &aItemArray); + itemArray->Delete(1); // signing code is in the second position + } + else + { + // Do nothing + } + LOG_LEAVEFN("CSecModUIModel::CheckCodeViewStringsL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::InitAuthObjectsL() +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::InitAuthObjectsL() + { + LOG_ENTERFN("CSecModUIModel::InitAuthObjectsL()"); + TInt err = KErrNone; + // Symbian's file key store does not support + // MCTAuthenticationObjectList interface, so we need to use + // other way to get AO. + if (iKeyStore->Token().TokenType().Type().iUid == KTokenTypeFileKeystore) + { + if (iAOArray.Count()==0) + { + RMPointerArray keyInfos; + CleanupClosePushL(keyInfos); + TCTKeyAttributeFilter filter; + TInt keyInfoCount = 0; + filter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys; + err = iWrapper->ListKeys(*iKeyStore, keyInfos, filter); + ShowErrorNoteL(err); + User::LeaveIfError(err); + keyInfoCount = keyInfos.Count(); + for (TInt j = 0; j < keyInfoCount; j++) + { + // Check that keystore has at least one AO. + if (NULL != keyInfos[j]->Protector()) + { + // If keystore has AO, add it to the array. + User::LeaveIfError(iAOArray.Append(keyInfos[j]->Protector())); + break; + } + } + CleanupStack::PopAndDestroy(&keyInfos); //keyInfos + } + } + else + { + if (NULL == iAOList) + { + MCTTokenInterface* tokenInterface = NULL; + err = iWrapper->GetAuthObjectInterface( + iKeyStore->Token(), tokenInterface); + if ( KErrNone != err || NULL == tokenInterface ) + { + ShowErrorNoteL(err); + LOG_LEAVEFN("CSecModUIModel::InitAuthObjectsL()"); + User::Leave(err); + } + iAOList = (MCTAuthenticationObjectList*)tokenInterface; + } + } + LOG_LEAVEFN("CSecModUIModel::InitAuthObjectsL()"); + } +// ----------------------------------------------------------------------------- +// CSecModUIModel::ListAuthObjectsL() +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::ListAuthObjectsL() + { + LOG_ENTERFN("CSecModUIModel::ListAuthObjectsL()"); + if (0 >= iAOArray.Count()) + { + __ASSERT_ALWAYS(iAOList, Panic(EPanicNullPointer)); + TInt err = iWrapper->ListAuthObjects(*iAOList, iAOArray); + if (err) + { + ShowErrorNoteL(err); + User::Leave(err); + } + } + LOG_LEAVEFN("CSecModUIModel::ListAuthObjectsL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::OpenTokenL(TInt aTokenIndex) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::OpenTokenL(TInt aTokenIndex) + { + LOG_ENTERFN("CSecModUIModel::OpenTokenL()"); + ResetAndDestroyAOs(); + iKeyStore = iAOKeyStores[aTokenIndex]; + ((CAknViewAppUi*)iAvkonAppUi)->ActivateLocalViewL(KSecModUIViewCodeId); + LOG_LEAVEFN("CSecModUIModel::OpenTokenL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::OpenAuthObjViewL(TInt aIndex) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::OpenAuthObjViewL(TInt aIndex) + { + LOG_ENTERFN("CSecModUIModel::OpenAuthObjViewL()"); + if (KPinGSettIndex==aIndex) + { + ((CAknViewAppUi*)iAvkonAppUi)->ActivateLocalViewL(KSecModUIViewAccessId); + } + else if (KPinNrSettIndex==aIndex) + { + ((CAknViewAppUi*)iAvkonAppUi)-> + ActivateLocalViewL(KSecModUIViewSignatureId); + } + else + { + + } + LOG_LEAVEFN("CSecModUIModel::OpenAuthObjViewL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::CloseAuthObjL(TInt aIndex) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::CloseAuthObjL(TInt aIndex) + { + LOG_ENTERFN("CSecModUIModel::CloseAuthObjL()"); + if (PinOpen(aIndex)) + { + __ASSERT_ALWAYS(aIndex < iAOArray.Count(), Panic(EPanicIndexOutOfRange)); + TInt err = iWrapper->CloseAuthObject(*(iAOArray[aIndex])); + if (err) + { + ShowErrorNoteL(err); + User::Leave(err); + } + } + LOG_LEAVEFN("CSecModUIModel::CloseAuthObjL()"); + } + + +// ----------------------------------------------------------------------------- +// CSecModUIModel::ViewSecModDetailsL(TInt aTokenIndex) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::ViewSecModDetailsL(TInt aTokenIndex) + { + LOG_ENTERFN("CSecModUIModel::ViewSecModDetailsL(TInt aTokenIndex)"); + iKeyStore = iAOKeyStores[aTokenIndex]; + InitAuthObjectsL(); + ListAuthObjectsL(); + ViewOpenedSecModDetailsL(); + iKeyStore = NULL; // not owned + if (iAOList) + { + iAOList->Release(); + iAOList = NULL; + } + iAOArray.Reset(); + + LOG_LEAVEFN("CSecModUIModel::ViewSecModDetailsL(TInt aTokenIndex)"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::ViewOpenedSecModDetailsL() +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::ViewOpenedSecModDetailsL() + { + LOG_ENTERFN("CSecModUIModel::ViewSecModDetailsL()"); + // Create message buffer + HBufC* message = HBufC::NewLC(KMaxLengthTextDetailsBody); + TPtr messagePtr = message->Des(); + MCTToken& token = iKeyStore->Token(); + + if (token.TokenType().Type().iUid == KTokenTypeFileKeystore) + { + AppendItemL(messagePtr, R_QTN_WIM_NAME, + KNullDesC, R_QTN_KEYSTORE_LIST_TEXT_PHONE_KEYSTORE); + } + else + { + AppendItemL(messagePtr, R_QTN_WIM_NAME, + token.Label(), R_TEXT_RESOURCE_VIEW_NO_LABEL_DETAILS); + } + + AppendItemL(messagePtr, R_QTN_WIM_CARD_VERSION, + token.Information( MCTToken::EVersion ), + R_TEXT_RESOURCE_DETAILS_VIEW_NOT_DEFINED ); + + AppendLocationL(messagePtr, token.TokenType().Type(), R_QTN_WIM_SECURITY_MODULE_LOCATION); + messagePtr.Append(KEnter); // AppendLocationL does not add enter as others + + if (token.TokenType().Type().iUid == KTokenTypeFileKeystore) + { + AppendItemL(messagePtr, R_QTN_WIM_SETT_PIN_G, + KNullDesC, R_QTN_SECMOD_TITLE_PHONE_KEYSTORE_CODE); + } + else + { + AppendItemL(messagePtr, R_QTN_WIM_SETT_PIN_G, + iAOArray[0]->Label(), R_QTN_WIM_PIN_G_NO_LABEL_DETAILS); + } + + AppendPinNRsL(messagePtr); + + AppendItemL(messagePtr, R_QTN_WIM_SERIAL_NRO, + token.Information( MCTToken::ESerialNo), + R_TEXT_RESOURCE_DETAILS_VIEW_NOT_DEFINED); + + AppendItemL(messagePtr, R_QTN_WIM_MANUF, + token.Information( MCTToken::EManufacturer), + R_TEXT_RESOURCE_DETAILS_VIEW_NOT_DEFINED); + + CAknMessageQueryDialog* dlg = CAknMessageQueryDialog::NewL(*message); + dlg->PrepareLC(R_SECMOD_DETAILS_VIEW); + dlg->RunLD(); + CleanupStack::PopAndDestroy(message); + LOG_LEAVEFN("CSecModUIModel::ViewSecModDetailsL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::AppendPinNRsL(TDes& aMessage) const +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::AppendPinNRsL(TDes& aMessage) const + { + TInt pinCount = iAOArray.Count(); + HBufC* value = NULL; + TInt j = 1; + + for (TInt i=1; iLabel().Length() > 0) + { + aMessage.Append(iAOArray[i]->Label()); + } + else + { + value = StringLoader::LoadLC(R_QTN_WIM_PIN_NR_NO_LABEL_DETAILS, j); + aMessage.Append(*value); + j++; + } + aMessage.Append(KDoubleEnter); + } + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::AppendLocationL(...) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::AppendLocationL( + TDes& aMessage, + TUid aUid, + TInt aItemRes) const + { + TInt location = 0; + + + switch ( aUid.iUid ) + { + case KTokenTypeFileKeystore: + { + location = R_TEXT_RESOURCE_DETAILS_VIEW_LOCATION_PHONE_MEMORY; + break; + } + case KWIMStoreUid: + { + location = R_TEXT_RESOURCE_DETAILS_VIEW_LOCATION_SMART_CARD; + break; + } + default: + { + break; + } + } + if (0 != aItemRes) + { + AppendResourceAndEnterL(aMessage, aItemRes); + } + AppendResourceAndEnterL(aMessage, location); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::AppendItemL(...) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::AppendItemL( + TDes& aMessage, + TInt aResItem, + const TDesC& aValue, + TInt aResNotDefined) const + { + AppendResourceAndEnterL(aMessage, aResItem); + AppendValueL(aMessage, aValue, aResNotDefined); + aMessage.Append(KEnter); + } + +// --------------------------------------------------------- +// CSecModUIModel::AppendResourceL(TDes& aMessage, TInt aResource) +// Appends aResource to aMessage +// --------------------------------------------------------- +// +void CSecModUIModel::AppendResourceL(TDes& aMessage, TInt aResource) const + { + HBufC* stringHolder = StringLoader::LoadLC(aResource); + aMessage.Append(*stringHolder); + CleanupStack::PopAndDestroy(stringHolder); + } + +// --------------------------------------------------------- +// CSecModUIModel::AppendResourceL(TDes& aMessage, TInt aResource) +// Appends aResource to aMessage +// --------------------------------------------------------- +// +void CSecModUIModel::AppendResourceAndEnterL(TDes& aMessage, TInt aResource) const + { + HBufC* stringHolder = StringLoader::LoadLC(aResource); + aMessage.Append(*stringHolder); + CleanupStack::PopAndDestroy(stringHolder); + aMessage.Append(KEnter); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::AppendValueL(...) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::AppendValueL( + TDes& aMessage, + const TDesC& aValue, + TInt aResNotDefined) const + { + HBufC* buf = HBufC::NewLC(KMaxLengthItemValue); + buf->Des() = aValue; + buf->Des().TrimLeft(); + TInt length = buf->Des().Length(); + if (length == 0 ) + { + AppendResourceAndEnterL(aMessage, aResNotDefined); + } + else + { + aMessage.Append(*buf); + aMessage.Append(KEnter); + } + CleanupStack::PopAndDestroy(buf); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::DeleteKeyStoreL(TInt aTokenIndex) +// ----------------------------------------------------------------------------- +// +TBool CSecModUIModel::DeleteKeyStoreL(TInt aTokenIndex) + { + LOG_ENTERFN("CSecModUIModel::DeleteKeyStoreL()"); + __ASSERT_ALWAYS(aTokenIndex < iAOKeyStores.Count(), Panic(EPanicIndexOutOfRange)); + // ask confirmation from the user + if (ShowConfirmationQueryL(R_QTN_CM_CONFIRM_DELETE_KEYS)) + { + RMPointerArray keyInfos; + CleanupClosePushL(keyInfos); + TCTKeyAttributeFilter filter; + filter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys; + TInt err = iWrapper->ListKeys(*iAOKeyStores[aTokenIndex], keyInfos, filter); + ShowErrorNoteL(err); + User::LeaveIfError(err); + for (TInt i = 0; i < keyInfos.Count(); ++i) + { + err = iWrapper->DeleteKey(*iUnifiedKeyStore, keyInfos[i]->Handle()); + ShowErrorNoteL(err); + + if (KErrHardwareNotAvailable == err ) + { + break; // Break the loop, if keystore not available + } + } + CleanupStack::PopAndDestroy(&keyInfos); //keyInfos + ResetAndDestroyCTObjects(); + InitializeKeyStoreL(); + LOG_LEAVEFN("CSecModUIModel::DeleteKeyStoreL()"); + return ETrue; + } + else + { + LOG_LEAVEFN("CSecModUIModel::DeleteKeyStoreL()"); + return EFalse; + } + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::IsTokenDeletable(TInt aTokenIndex) +// ----------------------------------------------------------------------------- +// +TBool CSecModUIModel::IsTokenDeletable(TInt aTokenIndex) + { + LOG_ENTERFN("CSecModUIModel::IsTokenDeletable()"); + __ASSERT_ALWAYS(aTokenIndex < iAOKeyStores.Count(), Panic(EPanicIndexOutOfRange)); + TBool ret = EFalse; + if (iAOKeyStores[aTokenIndex]->Token().TokenType().Type().iUid + == KTokenTypeFileKeystore) + { + ret = ETrue; + } + else + { + ret = EFalse; + } + LOG_LEAVEFN("CSecModUIModel::IsTokenDeletable()"); + return ret; + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::LoadPinNRLabelsL(...) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::LoadPinNRLabelsL(CEikTextListBox& aListBox, TBool aShowBlockedNote) + { + LOG_ENTERFN("CSecModUIModel::LoadPinNRLabelsL()"); + TBuf item; + TBuf label; + CDesCArray* itemArray = STATIC_CAST(CDesCArray*, aListBox.Model()->ItemTextArray()); + itemArray->Reset(); + + LOG_WRITE_FORMAT("CSecModUIModel::LoadPinNRLabelsL, iAOArray.Count() == %i",iAOArray.Count()); + TUint32 status = 0; + // Here is assumed that the first AO is always PIN-G + for (TInt i = 1; i < iAOArray.Count(); i++) + { + label = iAOArray[i]->Label(); + status = iAOArray[i]->Status(); + LOG_WRITE_FORMAT("PIN-NR status == %i", status); + if (status & EAuthObjectBlocked) + { + if (aShowBlockedNote) + { + if (status & EUnblockDisabled) + { + ShowInformationNoteL(R_QTN_WIM_PIN_TOTALBLOCKED, label); + } + else + { + ShowInformationNoteL(R_QTN_WIM_ERR_PIN_BLOCKED, label); + } + } + HBufC* value = StringLoader::LoadLC(R_QTN_WIM_STATUS_BLOCKED); + CreateSettingItem(label, *value, item ); + CleanupStack::PopAndDestroy(value); + } + else + { + CreateSettingItem(label, KFourAsterisks, item); + } + itemArray->AppendL(item); + label.Zero(); + item.Zero(); + } + LOG_LEAVEFN("CSecModUIModel::LoadPinNRLabelsL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::LoadPinGItemsL(CEikTextListBox& aListBox) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::LoadPinGItemsL(CEikTextListBox& aListBox) + { + LOG_ENTERFN("CSecModUIModel::LoadPinGItemsL()"); + TBuf item; + TBuf label; + + CDesCArray* itemArray = STATIC_CAST(CDesCArray*, + aListBox.Model()->ItemTextArray()); + + if (iKeyStore->Token().TokenType().Type().iUid + == KTokenTypeFileKeystore) + { + AppendResourceL(label, R_QTN_SECMOD_TITLE_PHONE_KEYSTORE_CODE); + } + else + { + label = iAOArray[KPinGIndex]->Label(); + } + CreateSettingItem(label, KFourAsterisks, item); + itemArray->AppendL(item); + item.Zero(); + PINRequestItemL(KPinGIndex, item); + itemArray->AppendL(item); + item.Zero(); + PINStatusItemL(KPinGIndex, item, ETrue); + itemArray->AppendL(item); + LOG_LEAVEFN("CSecModUIModel::LoadPinGItemsL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::PINRequestItemL(...) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::PINRequestItemL(TInt aIndex, TDes& aItem) const + { + LOG_ENTERFN("CSecModUIModel::PINRequestItemL()"); + __ASSERT_ALWAYS(aIndex < iAOArray.Count(), Panic(EPanicIndexOutOfRange)); + TUint32 status = iAOArray[aIndex]->Status(); + HBufC* title = NULL; + HBufC* value = NULL; + title = StringLoader::LoadLC(R_QTN_WIM_PIN_REQUEST); + + if (status & EEnabled) + { + value = StringLoader::LoadLC(R_QTN_WIM_REQUEST_ON); + CreateSettingItem(*title, *value, aItem ); + } + else + { + value = StringLoader::LoadLC(R_QTN_WIM_REQUEST_OFF); + CreateSettingItem(*title, *value, aItem ); + } + CleanupStack::PopAndDestroy(2, title); + LOG_LEAVEFN("CSecModUIModel::PINRequestItemL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::PINStatusItemL(...) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::PINStatusItemL( + TInt aIndex, + TDes& aItem, + TBool aShowBlockedNote) const + { + LOG_ENTERFN("CSecModUIModel::PINStatusItemL()"); + __ASSERT_ALWAYS(aIndex < iAOArray.Count(), Panic(EPanicIndexOutOfRange)); + TUint32 status = iAOArray[aIndex]->Status(); + HBufC* title = NULL; + HBufC* value = NULL; + title = StringLoader::LoadLC(R_QTN_WIM_SETT_STATUS); + + LOG_WRITE_FORMAT("PIN-G status == %i", status); + + if (status & EAuthObjectBlocked) + { + if (aShowBlockedNote) + { + if (status & EUnblockDisabled) + { + ShowInformationNoteL( + R_QTN_WIM_PIN_TOTALBLOCKED, iAOArray[aIndex]->Label()); + } + else + { + ShowInformationNoteL( + R_QTN_WIM_ERR_PIN_BLOCKED, iAOArray[aIndex]->Label()); + } + } + value = StringLoader::LoadLC(R_QTN_SECMOD_STATUS_VALUE_BLOCKED); + } + else if ( PinOpen(aIndex) ) + { + value = StringLoader::LoadLC(R_QTN_WIM_OPT_OPEN); + } + else + { + value = StringLoader::LoadLC(R_QTN_WIM_STATUS_CLOSED); + } + CreateSettingItem(*title, *value, aItem ); + CleanupStack::PopAndDestroy(2, title); + LOG_LEAVEFN("CSecModUIModel::PINStatusItemL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::CreateSettingItem(...) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::CreateSettingItem( + const TDesC& aTitle, const TDesC& aValue, TDes& aItem) const + { + LOG_ENTERFN("CSecModUIModel::CreateSettingItem()"); + aItem += KTab; + aItem += aTitle; + aItem += KDoubleTab; + aItem += aValue; + LOG_LEAVEFN("CSecModUIModel::CreateSettingItem()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::eOrUnblockPinNrL(TInt aIndex) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::ChangeOrUnblockPinNrL(TInt aIndex) + { + LOG_ENTERFN("CSecModUIModel::ChangeOrUnblockPinNrL()"); + // Add PIN-G to the list + ChangeOrUnblockPinL(aIndex+1); + LOG_LEAVEFN("CSecModUIModel::ChangeOrUnblockPinNrL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::ChangeOrUnblockPinL(TInt aIndex) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::ChangeOrUnblockPinL(TInt aIndex) + { + LOG_ENTERFN("CSecModUIModel::ChangeOrUnblockPinL()"); + __ASSERT_ALWAYS(aIndex < iAOArray.Count(), Panic(EPanicIndexOutOfRange)); + TUint32 status = iAOArray[aIndex]->Status(); + + if ((status & EAuthObjectBlocked) && (status & EUnblockDisabled)) + { + return; // We cannot do anything. PIN is total bolcked. + } + else if (status & EAuthObjectBlocked) + { + // Let's unblock the PIN + UnblockPinL(aIndex); + } + else if (status & EChangeDisabled) + { + // We cannot do anything. Change is disabled. + } + else if (status & EEnabled) + { + // PIN is enabled. Let's change the PIN. + ChangePinL(aIndex); + } + else + { + // PIN is disabled. Not possible to change PIN. + } + LOG_LEAVEFN("CSecModUIModel::ChangeOrUnblockPinL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::ChangePinNrL(TInt aIndex) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::ChangePinNrL(TInt aIndex) + { + LOG_ENTERFN("CSecModUIModel::ChangePinNrL()"); + ChangePinL(aIndex+1); + LOG_LEAVEFN("CSecModUIModel::ChangePinNrL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::ChangePinL(TInt aIndex) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::ChangePinL(TInt aIndex) + { + LOG_ENTERFN("CSecModUIModel::ChangePinL()"); + __ASSERT_ALWAYS(aIndex < iAOArray.Count(), Panic(EPanicIndexOutOfRange)); + TInt err = KErrNone; + + err = iWrapper->ChangeReferenceData(*(iAOArray[aIndex])); + if (err) + { + ShowErrorNoteL(err); + } + else + { + ShowConfirmationNoteL(R_QTN_WIM_INFO_PIN_CHANGED); + } + + LOG_LEAVEFN("CSecModUIModel::ChangePinL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::UnblockPinNrL(TInt aIndex) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::UnblockPinNrL(TInt aIndex) + { + LOG_ENTERFN("CSecModUIModel::UnblockPinNrL()"); + UnblockPinL(aIndex+1); + LOG_LEAVEFN("CSecModUIModel::UnblockPinNrL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::UnblockPinL(TInt aIndex) +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::UnblockPinL(TInt aIndex) + { + LOG_ENTERFN("CSecModUIModel::UnblockPinL()"); + __ASSERT_ALWAYS(aIndex < iAOArray.Count(), Panic(EPanicIndexOutOfRange)); + TInt err = iWrapper->UnblockAuthObject(*(iAOArray[aIndex])); + if (KErrNone == err) + { + ShowConfirmationNoteL(R_QTN_WIM_INFO_PIN_UNBLOCKED); + } + else + { + ShowErrorNoteL(err); + } + LOG_LEAVEFN("CSecModUIModel::UnblockPinL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::PinNrChangeable(TInt aIndex) const +// ----------------------------------------------------------------------------- +// +TBool CSecModUIModel::PinNrChangeable(TInt aIndex) const + { + // Add PIN-G to the list + return PinChangeable(aIndex+1); + } +// ----------------------------------------------------------------------------- +// CSecModUIModel::PinChangeable(TInt aIndex) const +// ----------------------------------------------------------------------------- +// +TBool CSecModUIModel::PinChangeable(TInt aIndex) const + { + LOG_ENTERFN("CSecModUIModel::PinChangeable()"); + __ASSERT_ALWAYS(aIndex < iAOArray.Count(), Panic(EPanicIndexOutOfRange)); + TUint32 status = iAOArray[aIndex]->Status(); + TBool ret = ETrue; + if ( (status & EAuthObjectBlocked) || (status & EChangeDisabled) ) + //if ( status & (EAuthObjectBlocked | EChangeDisabled)) + { + ret = EFalse; + } + else if ( status & EEnabled ) + { + ret = ETrue; + } + else // PIN is disabled; + { + ret = EFalse; + } + LOG_LEAVEFN("CSecModUIModel::PinChangeable()"); + return ret; + } +// ----------------------------------------------------------------------------- +// CSecModUIModel::PinNrUnblockable(TInt aIndex) const +// ----------------------------------------------------------------------------- +// +TBool CSecModUIModel::PinNrUnblockable(TInt aIndex) const + { + // Add PIN-G to the list + return PinUnblockable(aIndex+1); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::PinUnblockable(TInt aIndex) const +// ----------------------------------------------------------------------------- +// +TBool CSecModUIModel::PinUnblockable(TInt aIndex) const + { + LOG_ENTERFN("CSecModUIModel::PinUnblockable()"); + TUint32 status = iAOArray[aIndex]->Status(); + TBool ret = ETrue; + if ( status & EUnblockDisabled ) + { + ret = EFalse; + } + else if ( status & EAuthObjectBlocked ) + { + ret = ETrue; + } + else // PIN is not blocked; + { + ret = EFalse; + } + LOG_LEAVEFN("CSecModUIModel::PinUnblockable()"); + return ret; + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::PinOpen(TInt aIndex) const +// ----------------------------------------------------------------------------- +// +TBool CSecModUIModel::PinOpen(TInt aIndex) const + { + LOG_ENTERFN("CSecModUIModel::PinOpen()"); + __ASSERT_ALWAYS(aIndex < iAOArray.Count(), Panic(EPanicIndexOutOfRange)); + TInt timeRemaining = 0; + TInt err = iWrapper->TimeRemaining(*(iAOArray[aIndex]), timeRemaining); + TBool ret = ETrue; + if ( 0 < timeRemaining ) + { + ret = ETrue; + } + else if( timeRemaining == -1 ) + { + ret = ETrue; + } + else + { + ret = EFalse; + } + LOG_LEAVEFN("CSecModUIModel::PinOpen()"); + return ret; + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::ChangeCodeRequestL(TInt aIndex) +// ----------------------------------------------------------------------------- +// +TInt CSecModUIModel::ChangeCodeRequestL(TInt aIndex) + { + LOG_ENTERFN("CSecModUIModel::ChangeCodeRequestL()"); + __ASSERT_ALWAYS(aIndex < iAOArray.Count(), Panic(EPanicIndexOutOfRange)); + TUint32 status = iAOArray[aIndex]->Status(); + TInt err = KErrNone; + if (status & EDisableAllowed && !(status & EAuthObjectBlocked)) + { + if ( status & EEnabled ) + { + err = iWrapper->DisableAuthObject(*(iAOArray[aIndex])); + } + else + { + err = iWrapper->EnableAuthObject(*(iAOArray[aIndex])); + } + ShowErrorNoteL(err); + } + LOG_LEAVEFN("CSecModUIModel::ChangeCodeRequestL()"); + return err; + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::PinRequestChangeable(TInt aIndex) const +// ----------------------------------------------------------------------------- +// +TBool CSecModUIModel::PinRequestChangeable(TInt aIndex) const + { + LOG_ENTERFN("CSecModUIModel::PinRequestChangeable()"); + __ASSERT_ALWAYS(aIndex < iAOArray.Count(), Panic(EPanicIndexOutOfRange)); + TUint32 status = iAOArray[aIndex]->Status(); + TBool ret = EFalse; + if ( status & EAuthObjectBlocked ) + { + ret = EFalse; + } + else if ( status & EDisableAllowed ) + { + ret = ETrue; + } + else // Disable not allowed; + { + ret = EFalse; + } + LOG_LEAVEFN("CSecModUIModel::PinRequestChangeable()"); + return ret; + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::ShowErrorNoteL(TInt aError) const +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::ShowErrorNoteL(TInt aError) const + { + LOG_ENTERFN("CSecModUIModel::ShowErrorNoteL()"); + HBufC* text = NULL; + + switch (aError) + { + case KErrCancel: + case KErrLocked: + case KErrNone: + { + LOG_WRITE_FORMAT("aError == %i",aError); + LOG_LEAVEFN("CSecModUIModel::ShowErrorNoteL()"); + break; + } + case KErrInUse: + { + text = StringLoader::LoadLC(R_QTN_KEYSTORE_INFO_UNABLE_TO_DELETE); + break; + } + case KErrBadPassphrase: + { + text = StringLoader::LoadLC(R_QTN_WIM_ERR_WRONG_PIN); + break; + } + case KErrHardwareNotAvailable: // flow thru + default: + { + LOG_WRITE_FORMAT("ERROR: aError == %i",aError); + text = StringLoader::LoadLC(R_QTN_WIM_ERR_IO_ERROR); + break; + } + } + + if (text) + { + CAknErrorNote* note = new (ELeave) CAknErrorNote; + note->ExecuteLD(*text); + CleanupStack::PopAndDestroy(text); + } + LOG_LEAVEFN("CSecModUIModel::ShowErrorNoteL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::ShowConfirmationQueryL(TInt aResourceId) const +// ----------------------------------------------------------------------------- +// +TInt CSecModUIModel::ShowConfirmationQueryL(TInt aResourceId) const + { + LOG_ENTERFN("CSecModUIModel::ShowConfirmationQueryL ()"); + HBufC* text = NULL; + text = StringLoader::LoadLC(aResourceId); + CAknQueryDialog* dlg = CAknQueryDialog::NewL(CAknQueryDialog::ENoTone); + TInt selection = dlg->ExecuteLD(R_SECMOD_CONFIRMATION_QUERY_YES_NO, *text); + CleanupStack::PopAndDestroy(text); + LOG_LEAVEFN("CSecModUIModel::ShowConfirmationNoteL()"); + return selection; + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::ShowConfirmationNoteL(TInt aResourceId) const +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::ShowConfirmationNoteL(TInt aResourceId) const + { + LOG_ENTERFN("CSecModUIModel::ShowConfirmationNoteL()"); + HBufC* text = NULL; + text = StringLoader::LoadLC(aResourceId); + CAknConfirmationNote * note = new (ELeave) CAknConfirmationNote; + note->ExecuteLD(*text); + CleanupStack::PopAndDestroy(text); + LOG_LEAVEFN("CSecModUIModel::ShowConfirmationNoteL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::ShowInformationNoteL(...) +// Global note needs to be used here because otherwise view might cancel +// the query too early when the view is activated. +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::ShowInformationNoteL( + TInt aResourceId, + const TDesC& aString) const + { + LOG_ENTERFN("CSecModUIModel::ShowInformationNoteL()"); + HBufC* text = NULL; + if (0 == aString.Length()) + { + text = StringLoader::LoadLC(aResourceId); + } + else + { + text = StringLoader::LoadLC(aResourceId, aString); + } + CAknGlobalNote * note = CAknGlobalNote::NewLC(); + note->ShowNoteL(EAknGlobalInformationNote, *text); + CleanupStack::PopAndDestroy(2, text); + LOG_LEAVEFN("CSecModUIModel::ShowInformationNoteL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::ActivateTitleL(const TDesC& aTitle) const +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::ActivateTitleL(const TDesC& aTitle) const + { + LOG_ENTERFN("CSecModUIModel::ActivateTitleL()"); + TUid titlePaneUid; + titlePaneUid.iUid = EEikStatusPaneUidTitle; + CEikStatusPane* sp = iAvkonAppUi->StatusPane(); + + CEikStatusPaneBase::TPaneCapabilities subPane = + sp->PaneCapabilities(titlePaneUid); + + if (subPane.IsPresent() && subPane.IsAppOwned()) + { + // Fetch pointer to the default title pane control + CAknTitlePane* title = STATIC_CAST( + CAknTitlePane*, sp->ControlL(titlePaneUid) ); + title->SetTextL(aTitle); + } + LOG_LEAVEFN("CSecModUIModel::ActivateTitleL()"); + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::ActivateTokenLabelToTitleL() const +// ----------------------------------------------------------------------------- +// +void CSecModUIModel::ActivateTokenLabelToTitleL() const + { + if (iKeyStore->Token().TokenType().Type().iUid + == KTokenTypeFileKeystore) + { + HBufC* stringHolder = + StringLoader::LoadLC(R_QTN_KEYSTORE_TITLE_PHONE_KEYSTORE); + ActivateTitleL(*stringHolder); + CleanupStack::PopAndDestroy(stringHolder); + } + else + { + ActivateTitleL(iKeyStore->Token().Label()); + } + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::Wrapper() +// ----------------------------------------------------------------------------- +// +CSecModUISyncWrapper& CSecModUIModel::Wrapper() + { + return *iWrapper; + } + +// ----------------------------------------------------------------------------- +// CSecModUIModel::SecurityModuleCount() const +// ----------------------------------------------------------------------------- +// +TInt CSecModUIModel::SecurityModuleCount() const + { + return iAOKeyStores.Count(); + } + +// End of File