--- /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.h> // CCTCertInfo
+#include <certificateapps.h> // CCertificateAppInfoManager
+#include <HbTextResolverSymbian>
+
+_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<const char*>(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<AdvSecSettingsCertificate*> &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<int,QString> &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<int,bool> &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<int,bool> &usageIdAndTrust)
+{
+ if (!IsActive() && (iState == EIdle)) {
+ iCertInfo = CertificateInfo(cert);
+ if (iCertInfo) {
+ iApplications.Reset();
+ QMapIterator<int,bool> 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<int,QString> &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<TCertificateAppInfo> &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<int,QString> &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<TCertificateAppInfo> &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;
+}
+