diff -r 3255e7d5bd67 -r 989397f9511c cpsecplugins/cpadvancedsecplugin/src/advsecsettingscertificatemodel_symbian_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cpsecplugins/cpadvancedsecplugin/src/advsecsettingscertificatemodel_symbian_p.cpp Thu Oct 14 13:56:11 2010 +0300 @@ -0,0 +1,539 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Symbian specific advanced security settings certificate model +* +*/ + +#include "advsecsettingscertificatemodel_symbian_p.h" +#include "advsecsettingscertificatemodel.h" +#include "advsecsettingscertificate.h" +#include "advsecsettingstrustedcertusageuids.h" +#include "advsecsettingsstoreuids.h" +#include "advsecsettingscertlistbuilder_symbian.h" +#include "advsecsettingscertdetailsbuilder_symbian.h" +#include "advsecsettingscertmover_symbian.h" +#include // CCTCertInfo +#include // CCertificateAppInfoManager +#include + +_LIT(KTranslationFile, "z:\\resource\\qt\\translations"); +_LIT(KTranslationPath, "certificate_manager_"); + +_LIT(KLocNativeInstallationUsage, "txt_certificate_manager_formlabel_symbian_instal"); +_LIT(KLocJavaInstallationUsage, "txt_certificate_manager_formlabel_java_installing"); +_LIT(KLocWidgetInstallationUsage, "txt_certificate_manager_formlabel_widget_installat"); +_LIT(KLocInternetUsage, "txt_certificate_manager_formlabel_internet"); +_LIT(KLocOcspUsage, "txt_certificate_manager_formlabel_online_certifica"); +_LIT(KLocVPNUsage, "txt_certificate_manager_formlabel_vpn"); + +#define TRAP_HANDLE_AND_RETURN_IF_ERROR(_f) \ +{ \ + TInt __thr_error = KErrNone; \ + TRAP(__thr_error, _f); \ + if (__thr_error) { \ + q_ptr->handleError(__thr_error); \ + return; \ + } \ +} + + +// ======== LOCAL FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CopyStringL() +// --------------------------------------------------------------------------- +// +QString CopyStringL(const TDesC16 &aDes16) +{ + QString string; + QT_TRYCATCH_LEAVING(string = QString::fromUtf16(aDes16.Ptr(), aDes16.Length())); + return string; +} + +// --------------------------------------------------------------------------- +// CopyStringL() +// --------------------------------------------------------------------------- +// +QString CopyStringL(const TDesC8 &aDes8) +{ + QString string; + QT_TRYCATCH_LEAVING(string = QString::fromUtf8( + reinterpret_cast(aDes8.Ptr()), aDes8.Length())); + return string; +} + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::AdvSecSettingsCertificateModelPrivate() +// --------------------------------------------------------------------------- +// +AdvSecSettingsCertificateModelPrivate::AdvSecSettingsCertificateModelPrivate( + AdvSecSettingsCertificateModel *q) : CActive(CActive::EPriorityLow), q_ptr(q), + iState(ENotInitialized) +{ + CActiveScheduler::Add(this); +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::~AdvSecSettingsCertificateModelPrivate() +// --------------------------------------------------------------------------- +// +AdvSecSettingsCertificateModelPrivate::~AdvSecSettingsCertificateModelPrivate() +{ + Cancel(); + + delete iMover; + delete iCertAppInfoManager; + delete iCertStore; + iFs.Close(); + + iCertInfo = NULL; + iCertInfoArray.Close(); + delete iCertListBuilder; + delete iDetailsBuilder; + + iTrustedUids = NULL; + iApplications.Reset(); +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::initialize() +// --------------------------------------------------------------------------- +// +void AdvSecSettingsCertificateModelPrivate::initialize() +{ + if (!IsActive() && (iState == ENotInitialized)) { + TRAP_HANDLE_AND_RETURN_IF_ERROR(ConstructL()); + iCertStore->Initialize(iStatus); + iState = EInitializing; + SetActive(); + } else { + q_ptr->handleError(KErrAlreadyExists); + } +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::getCertificates() +// --------------------------------------------------------------------------- +// +void AdvSecSettingsCertificateModelPrivate::getCertificates( + QList &certList) +{ + if (!IsActive() && (iState == EIdle)) { + if (!iCertListBuilder) { + TRAP_HANDLE_AND_RETURN_IF_ERROR(iCertListBuilder = + CAdvSecSettingsCertListBuilder::NewL(iFs, *iCertStore)); + } + iCertListBuilder->GetCertificateList(certList, iCertInfoArray, iStatus); + iState = EGettingCertificatesList; + SetActive(); + } else { + q_ptr->handleError(KErrInUse); + } +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::getCertificateDetails() +// --------------------------------------------------------------------------- +// +void AdvSecSettingsCertificateModelPrivate::getCertificateDetails( + const AdvSecSettingsCertificate &cert, QMap &details) +{ + if (!IsActive() && (iState == EIdle)) { + iCertInfo = CertificateInfo(cert); + if (iCertInfo) { + if (!iDetailsBuilder) { + TRAP_HANDLE_AND_RETURN_IF_ERROR(iDetailsBuilder = + CAdvSecSettingsCertDetailsBuilder::NewL(iFs, *iCertStore)); + } + TRAP_HANDLE_AND_RETURN_IF_ERROR( + iDetailsBuilder->GetDetailsL(*iCertInfo, details, iStatus)); + iState = EBuildingCertificateDetails; + SetActive(); + } + } else { + q_ptr->handleError(KErrInUse); + } +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::isDeletable() +// --------------------------------------------------------------------------- +// +bool AdvSecSettingsCertificateModelPrivate::isDeletable( + const AdvSecSettingsCertificate &cert) const +{ + const CCTCertInfo* certInfo = CertificateInfo(cert); + if (certInfo) { + return certInfo->IsDeletable(); + } + return false; +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::deleteCertificate() +// --------------------------------------------------------------------------- +// +void AdvSecSettingsCertificateModelPrivate::deleteCertificate( + const AdvSecSettingsCertificate &cert) +{ + if (!IsActive() && (iState == EIdle)) { + iCertInfo = CertificateInfo(cert); + if (iCertInfo) { + iCertStore->Remove(*iCertInfo, iStatus); + iState = EDeletingCertificate; + SetActive(); + } + } else { + q_ptr->handleError(KErrInUse); + } +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::getTrustSettings() +// --------------------------------------------------------------------------- +// +void AdvSecSettingsCertificateModelPrivate::getTrustSettings( + const AdvSecSettingsCertificate &cert, QMap &usageIdAndTrust) +{ + if (!IsActive() && (iState == EIdle)) { + iCertInfo = CertificateInfo(cert); + if (iCertInfo) { + iTrustedUids = &usageIdAndTrust; + iApplications.Reset(); + iCertStore->Applications(*iCertInfo, iApplications, iStatus); + iState = EReadingApplications; + SetActive(); + } + } else { + q_ptr->handleError(KErrInUse); + } +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::setTrustSettings() +// --------------------------------------------------------------------------- +// +void AdvSecSettingsCertificateModelPrivate::setTrustSettings( + const AdvSecSettingsCertificate &cert, const QMap &usageIdAndTrust) +{ + if (!IsActive() && (iState == EIdle)) { + iCertInfo = CertificateInfo(cert); + if (iCertInfo) { + iApplications.Reset(); + QMapIterator usageIter(usageIdAndTrust); + while (usageIter.hasNext()) { + usageIter.next(); + if (usageIter.value()) { + iApplications.Append(TUid::Uid(usageIter.key())); + } + } + + iCertStore->SetApplicability(*iCertInfo, iApplications, iStatus); + iState = EWritingApplications; + SetActive(); + } + } else { + q_ptr->handleError(KErrInUse); + } +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::getCertificateUsageNames() +// --------------------------------------------------------------------------- +// +void AdvSecSettingsCertificateModelPrivate::getCertificateUsageNames( + QMap &usageIdAndName) +{ + usageIdAndName.clear(); + QT_TRAP_THROWING(DoGetCertificateUsageNamesL(usageIdAndName)); +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::moveToPersonalCertificates() +// --------------------------------------------------------------------------- +// +void AdvSecSettingsCertificateModelPrivate::moveToPersonalCertificates( + const AdvSecSettingsCertificate &cert) +{ + if (!IsActive() && (iState == EIdle)) { + iCertInfo = CertificateInfo(cert); + if (iCertInfo) { + if (!iMover) { + TRAP_HANDLE_AND_RETURN_IF_ERROR(iMover = + CAdvSecSettingsCertMover::NewL(iFs)); + } + // personal certificate store == file certificate store + iMover->Move(*iCertInfo, KAdvSecSettingsDeviceCertStore, + KAdvSecSettingsFileCertStore, iStatus); + iState = EMovingCertificateToPersonalStore; + SetActive(); + } + } else { + q_ptr->handleError(KErrInUse); + } +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::moveToDeviceCertificates() +// --------------------------------------------------------------------------- +// +void AdvSecSettingsCertificateModelPrivate::moveToDeviceCertificates( + const AdvSecSettingsCertificate &cert) +{ + if (!IsActive() && (iState == EIdle)) { + iCertInfo = CertificateInfo(cert); + if (iCertInfo) { + if (!iMover) { + TRAP_HANDLE_AND_RETURN_IF_ERROR(iMover = + CAdvSecSettingsCertMover::NewL(iFs)); + } + iMover->Move(*iCertInfo, KAdvSecSettingsFileCertStore, + KAdvSecSettingsDeviceCertStore, iStatus); + iState = EMovingCertificateToDeviceStore; + SetActive(); + } + } else { + q_ptr->handleError(KErrInUse); + } +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::DoCancel() +// --------------------------------------------------------------------------- +// +void AdvSecSettingsCertificateModelPrivate::DoCancel() +{ + switch (iState) { + case EInitializing: + iCertStore->CancelInitialize(); + break; + case EGettingCertificatesList: + delete iCertListBuilder; + iCertListBuilder = NULL; + break; + case EBuildingCertificateDetails: + delete iDetailsBuilder; + iDetailsBuilder = NULL; + break; + case EDeletingCertificate: + iCertStore->CancelRemove(); + break; + case EReadingApplications: + iCertStore->CancelApplications(); + break; + case EWritingApplications: + iCertStore->CancelSetApplicability(); + break; + case EMovingCertificateToPersonalStore: + case EMovingCertificateToDeviceStore: + delete iMover; + iMover = NULL; + break; + default: + break; + } + if (iState == EInitializing) { + iState = ENotInitialized; + } else { + iState = EIdle; + } + q_ptr->handleError(KErrCancel); +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::RunL() +// --------------------------------------------------------------------------- +// +void AdvSecSettingsCertificateModelPrivate::RunL() +{ + User::LeaveIfError(iStatus.Int()); + + switch (iState) { + case EInitializing: + iState = EIdle; + q_ptr->handleInitializeCompleted(); + break; + case EGettingCertificatesList: + iState = EIdle; + q_ptr->handleGetCertificatesCompleted(); + break; + case EBuildingCertificateDetails: + iState = EIdle; + q_ptr->handleGetCertificateDetailsCompleted(); + break; + case EDeletingCertificate: + iState = EIdle; + q_ptr->handleDeleteCertificateCompleted(); + break; + case EReadingApplications: + ReturnTrustSettingsDetails(); + iState = EIdle; + q_ptr->handleGetTrustSettingsCompleted(); + break; + case EWritingApplications: + iState = EIdle; + q_ptr->handleSetTrustSettingsCompleted(); + break; + case EMovingCertificateToPersonalStore: + iState = EIdle; + q_ptr->handleMoveToPersonalCertificateCompleted(); + break; + case EMovingCertificateToDeviceStore: + iState = EIdle; + q_ptr->handleMoveToDeviceCertificatesCompleted(); + break; + default: + ASSERT(EFalse); + break; + } +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::RunError() +// --------------------------------------------------------------------------- +// +TInt AdvSecSettingsCertificateModelPrivate::RunError(TInt aError) +{ + if (iState == EInitializing) { + iState = ENotInitialized; + } else { + iState = EIdle; + } + q_ptr->handleError(aError); + return KErrNone; +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::ConstructL() +// --------------------------------------------------------------------------- +// +void AdvSecSettingsCertificateModelPrivate::ConstructL() +{ + User::LeaveIfError(iFs.Connect()); + const TBool KWriteMode = ETrue; + iCertStore = CUnifiedCertStore::NewL(iFs, KWriteMode); + iCertAppInfoManager = CCertificateAppInfoManager::NewL(); + if (!HbTextResolverSymbian::Init(KTranslationFile, KTranslationPath)) { + // TODO: text resolver initialisation failed + } +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::ReturnTrustSettingsDetails() +// --------------------------------------------------------------------------- +// +void AdvSecSettingsCertificateModelPrivate::ReturnTrustSettingsDetails() +{ + if (iTrustedUids && iCertInfo) { + iTrustedUids->clear(); + + // Set applicable trusted usages for different kinds of certs. + TUid tokenType(iCertInfo->Token().TokenType().Type()); + if (tokenType.iUid == KAdvSecSettingsSWICertStore) { + iTrustedUids->insert(KAdvSecSettingsTrustedUsageSwInstallNativeSis, false); + iTrustedUids->insert(KAdvSecSettingsTrustedUsageSwInstallSisOcsp, false); + } else if (tokenType.iUid == KAdvSecSettingsMidpCertStore) { + iTrustedUids->insert(KAdvSecSettingsTrustedUsageSwInstallJava, false); + } else { + const RArray &apps(iCertAppInfoManager->Applications()); + for (TInt index = 0; index < apps.Count(); ++index) { + const TCertificateAppInfo &appInfo = apps[index]; + int usageId = appInfo.Id().iUid; + iTrustedUids->insert(usageId, false); + } + } + + // Set trusted usages, usually this just replaces some of the values set above. + TInt count = iApplications.Count(); + for (TInt index = 0; index < count; ++index ) { + iTrustedUids->insert(iApplications[index].iUid, true); + } + + // Native and Java installation use certs only from SWI and MIDP cert stores. + // Hence, native and Java install usages are not displayed for certs in file + // cert store. + if (tokenType.iUid == KAdvSecSettingsFileCertStore) { + iTrustedUids->remove(KAdvSecSettingsTrustedUsageSwInstallNativeSis); + iTrustedUids->remove(KAdvSecSettingsTrustedUsageSwInstallJava); + } + } +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::DoGetCertificateUsageNamesL() +// --------------------------------------------------------------------------- +// +void AdvSecSettingsCertificateModelPrivate::DoGetCertificateUsageNamesL( + QMap &usageIdAndName) +{ + // Pre-defined localized usage names + HBufC* usageName = HbTextResolverSymbian::LoadLC(KLocNativeInstallationUsage); + usageIdAndName[KAdvSecSettingsTrustedUsageSwInstallNativeSis] = CopyStringL(*usageName); + CleanupStack::PopAndDestroy(usageName); + + usageName = HbTextResolverSymbian::LoadLC(KLocJavaInstallationUsage); + usageIdAndName[KAdvSecSettingsTrustedUsageSwInstallJava] = CopyStringL(*usageName); + CleanupStack::PopAndDestroy(usageName); + + usageName = HbTextResolverSymbian::LoadLC(KLocWidgetInstallationUsage); + usageIdAndName[KAdvSecSettingsTrustedUsageSwInstallWidget] = CopyStringL(*usageName); + CleanupStack::PopAndDestroy(usageName); + + usageName = HbTextResolverSymbian::LoadLC(KLocInternetUsage); + usageIdAndName[KAdvSecSettingsTrustedUsageInternet] = CopyStringL(*usageName); + CleanupStack::PopAndDestroy(usageName); + + usageName = HbTextResolverSymbian::LoadLC(KLocOcspUsage); + usageIdAndName[KAdvSecSettingsTrustedUsageSwInstallSisOcsp] = CopyStringL(*usageName); + CleanupStack::PopAndDestroy(usageName); + + usageName = HbTextResolverSymbian::LoadLC(KLocVPNUsage); + usageIdAndName[KAdvSecSettingsTrustedUsageVPN] = CopyStringL(*usageName); + CleanupStack::PopAndDestroy(usageName); + + // TODO: localized UI string needed + usageIdAndName[KAdvSecSettingsTrustedUsageWap] = QString("Wap"); + + // Possible additional usage names defined in system databases + if (iCertAppInfoManager) { + const RArray &apps(iCertAppInfoManager->Applications()); + for(TInt index = 0; index < apps.Count(); ++index) { + const TCertificateAppInfo &appInfo = apps[index]; + + int usageId = appInfo.Id().iUid; + if (!usageIdAndName.contains(usageId)) { + QString usageName = CopyStringL(appInfo.Name()); + usageIdAndName.insert(usageId, usageName); + } + } + } +} + +// --------------------------------------------------------------------------- +// AdvSecSettingsCertificateModelPrivate::CertificateInfo() +// --------------------------------------------------------------------------- +// +const CCTCertInfo *AdvSecSettingsCertificateModelPrivate::CertificateInfo( + const AdvSecSettingsCertificate &cert) const +{ + TInt index = cert.modelIndex(); + if (index >= 0 && index < iCertInfoArray.Count()) { + return iCertInfoArray[index]; + } + return NULL; +} +