diff -r 3255e7d5bd67 -r 989397f9511c cpsecplugins/cpadvancedsecplugin/src/advsecsettingscertlistbuilder_symbian.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cpsecplugins/cpadvancedsecplugin/src/advsecsettingscertlistbuilder_symbian.cpp Thu Oct 14 13:56:11 2010 +0300 @@ -0,0 +1,344 @@ +/* +* 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 "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: Helper class to construct certificate list +* +*/ + +#include "advsecsettingscertlistbuilder_symbian.h" +#include "advsecsettingslabeledcertinfo_symbian.h" +#include "advsecsettingsstoreuids.h" // KAdvSecSettingsDeviceCertStore +#include // CX509Certificate +#include // CCertAttributeFilter +#include // X509CertNameParser::PrimaryAndSecondaryNameL +#include // std::auto_ptr + +_LIT(KNameSeparator, " "); + +// implemented in advsecsettingssecuritymodulemodel_symbian_p.cpp +QString CopyStringL(const TDesC16 &aDes16); + + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CAdvSecSettingsCertListBuilder::NewL() +// --------------------------------------------------------------------------- +// +CAdvSecSettingsCertListBuilder *CAdvSecSettingsCertListBuilder::NewL( + RFs &aFs, CUnifiedCertStore &aCertStore) +{ + CAdvSecSettingsCertListBuilder *self = new(ELeave) CAdvSecSettingsCertListBuilder( + aFs, aCertStore); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; +} + +// --------------------------------------------------------------------------- +// CAdvSecSettingsCertListBuilder::~CAdvSecSettingsCertListBuilder() +// --------------------------------------------------------------------------- +// +CAdvSecSettingsCertListBuilder::~CAdvSecSettingsCertListBuilder() +{ + Cancel(); + iLabeledCertInfos.ResetAndDestroy(); + delete iCertificate; + delete iCertAttributeFilter; + iCertInfoArray.Close(); + iCertList = NULL; + iClientInfoArray = NULL; + iClientStatus = NULL; +} + +// --------------------------------------------------------------------------- +// CAdvSecSettingsCertListBuilder::GetCertificateList() +// --------------------------------------------------------------------------- +// +void CAdvSecSettingsCertListBuilder::GetCertificateList( + QList &certList, + RMPointerArray &aCertInfoArray, + TRequestStatus &aStatus) +{ + aStatus = KRequestPending; + if (!IsActive() && (iState == EIdle)) { + iClientStatus = &aStatus; + iCertList = &certList; + iClientInfoArray = &aCertInfoArray; + + iCertInfoArray.Close(); + ResetCertAttributeFilter(); + iCertStore.List(iCertInfoArray, *iCertAttributeFilter, iStatus); + iState = EListingCerts; + SetActive(); + } else { + TRequestStatus *status = &aStatus; + User::RequestComplete(status, KErrInUse); + } +} + +// --------------------------------------------------------------------------- +// CAdvSecSettingsCertListBuilder::DoCancel() +// --------------------------------------------------------------------------- +// +void CAdvSecSettingsCertListBuilder::DoCancel() +{ + switch (iState) { + case EListingCerts: + iCertStore.CancelList(); + break; + case ERetrievingCert: + iCertStore.CancelRetrieve(); + break; + case EProcessingCert: + // nothing to do + break; + default: + break; + } + User::RequestComplete(iClientStatus, KErrCancel); + iClientStatus = NULL; + iState = EIdle; +} + +// --------------------------------------------------------------------------- +// CAdvSecSettingsCertListBuilder::RunL() +// --------------------------------------------------------------------------- +// +void CAdvSecSettingsCertListBuilder::RunL() +{ + User::LeaveIfError(iStatus.Int()); + switch (iState) { + case EListingCerts: + ProcessFirstCertificateL(); + break; + case ERetrievingCert: + ProcessNextCertificateL(); + break; + case EProcessingCert: + ProcessNextCertificateL(); + break; + default: + ASSERT(EFalse); + break; + } +} + +// --------------------------------------------------------------------------- +// CAdvSecSettingsCertListBuilder::RunError() +// --------------------------------------------------------------------------- +// +TInt CAdvSecSettingsCertListBuilder::RunError(TInt aError) +{ + User::RequestComplete(iClientStatus, aError); + iClientStatus = NULL; + iState = EIdle; + return KErrNone; +} + +// --------------------------------------------------------------------------- +// CAdvSecSettingsCertListBuilder::CAdvSecSettingsCertListBuilder() +// --------------------------------------------------------------------------- +// +CAdvSecSettingsCertListBuilder::CAdvSecSettingsCertListBuilder(RFs &aFs, + CUnifiedCertStore &aCertStore) : CActive(CActive::EPriorityLow), + iFs(aFs), iCertStore(aCertStore), iCertPtr(0,0) +{ + CActiveScheduler::Add(this); +} + +// --------------------------------------------------------------------------- +// CAdvSecSettingsCertListBuilder::ConstructL() +// --------------------------------------------------------------------------- +// +void CAdvSecSettingsCertListBuilder::ConstructL() +{ + iCertAttributeFilter = CCertAttributeFilter::NewL(); +} + +// --------------------------------------------------------------------------- +// CAdvSecSettingsCertListBuilder::ResetCertAttributeFilter() +// --------------------------------------------------------------------------- +// +void CAdvSecSettingsCertListBuilder::ResetCertAttributeFilter() +{ + ASSERT(iCertAttributeFilter); + iCertAttributeFilter->iLabelIsSet = EFalse; + iCertAttributeFilter->iUidIsSet = EFalse; + iCertAttributeFilter->iFormatIsSet = EFalse; + iCertAttributeFilter->iKeyUsage = EX509UsageAll; + iCertAttributeFilter->iOwnerTypeIsSet = EFalse; + iCertAttributeFilter->iSubjectKeyIdIsSet = EFalse; + iCertAttributeFilter->iIssuerKeyIdIsSet = EFalse; +} + +// --------------------------------------------------------------------------- +// CAdvSecSettingsCertListBuilder::ProcessFirstCertificateL() +// --------------------------------------------------------------------------- +// +void CAdvSecSettingsCertListBuilder::ProcessFirstCertificateL() +{ + iCertInfoIndex = 0; + StartProcessingCertificateL(); +} + +// --------------------------------------------------------------------------- +// CAdvSecSettingsCertListBuilder::ProcessNextCertificateL() +// --------------------------------------------------------------------------- +// +void CAdvSecSettingsCertListBuilder::ProcessNextCertificateL() +{ + CompleteProcessingCertificateL(); + ++iCertInfoIndex; + StartProcessingCertificateL(); +} + +// --------------------------------------------------------------------------- +// CAdvSecSettingsCertListBuilder::StartProcessingCertificateL() +// --------------------------------------------------------------------------- +// +void CAdvSecSettingsCertListBuilder::StartProcessingCertificateL() +{ + if (iCertInfoIndex < iCertInfoArray.Count()) { + CCTCertInfo *certInfo = iCertInfoArray[iCertInfoIndex]; + + if ((certInfo->CertificateOwnerType() == ECACertificate) && + (certInfo->CertificateFormat() == EX509Certificate)) { + // Have to retrieve the cert to add parts of subject + // to certificate label. For example, all Java certs + // have the same label by default. + if (iCertificate) { + delete iCertificate; + iCertificate = NULL; + } + iCertificate = HBufC8::NewL(certInfo->Size()); + iCertPtr.Set(iCertificate->Des()); + iCertStore.Retrieve(*certInfo, iCertPtr, iStatus); + iState = ERetrievingCert; + SetActive(); + } else { + // Certificate label can be used as such. + TRequestStatus *status = &iStatus; + User::RequestComplete(status, KErrNone); + iState = EProcessingCert; + SetActive(); + } + + } else { + ReturnCertificateListL(); + + User::RequestComplete(iClientStatus, KErrNone); + iClientStatus = NULL; + iState = EIdle; + } +} + +// --------------------------------------------------------------------------- +// CAdvSecSettingsCertListBuilder::CompleteProcessingCertificateL() +// --------------------------------------------------------------------------- +// +void CAdvSecSettingsCertListBuilder::CompleteProcessingCertificateL() +{ + ASSERT(iCertInfoIndex < iCertInfoArray.Count()); + CCTCertInfo *certInfo = iCertInfoArray[iCertInfoIndex]; + + CAdvSecSettingsLabeledCertInfo *labeledCertInfo = + new(ELeave) CAdvSecSettingsLabeledCertInfo(*certInfo); + CleanupStack::PushL(labeledCertInfo); + labeledCertInfo->SetLabelL(certInfo->Label()); + + if (iCertificate) { + CX509Certificate *cert = CX509Certificate::NewL(*iCertificate); + CleanupStack::PushL(cert); + + HBufC *primaryName = NULL; + HBufC *secondaryName = NULL; + TInt err = X509CertNameParser::PrimaryAndSecondaryNameL(*cert, + primaryName, secondaryName, certInfo->Label()); + if (!err) { + if (primaryName && primaryName->Length()) { + labeledCertInfo->AppendLabelL(KNameSeparator, *primaryName); + } else { + if (secondaryName && secondaryName->Length()) { + labeledCertInfo->AppendLabelL(KNameSeparator, *secondaryName); + } + } + } + + CleanupStack::PopAndDestroy(cert); + delete iCertificate; + iCertificate = NULL; + } + + iLabeledCertInfos.AppendL(labeledCertInfo); + CleanupStack::Pop(labeledCertInfo); +} + +// --------------------------------------------------------------------------- +// CAdvSecSettingsCertListBuilder::ReturnCertificateListL() +// --------------------------------------------------------------------------- +// +void CAdvSecSettingsCertListBuilder::ReturnCertificateListL() +{ + TLinearOrder order( CAdvSecSettingsLabeledCertInfo::Compare ); + iLabeledCertInfos.Sort( order ); + + iCertList->clear(); + iClientInfoArray->Reset(); + TInt count = iLabeledCertInfos.Count(); + for (TInt index = 0; index < count; index++) { + const CCTCertInfo &certInfo = iLabeledCertInfos[index]->CertInfo(); + iClientInfoArray->AppendL(&certInfo); + + std::auto_ptr cert(new(ELeave) AdvSecSettingsCertificate); + cert->setModelIndex(index); + cert->setCertType(CertType(certInfo)); + cert->setLabel(CopyStringL(iLabeledCertInfos[index]->Label())); + iCertList->append(cert.release()); + } + iLabeledCertInfos.ResetAndDestroy(); + iCertInfoArray.Reset(); +} + +// --------------------------------------------------------------------------- +// CAdvSecSettingsCertListBuilder::CertType() +// --------------------------------------------------------------------------- +// +AdvSecSettingsCertificate::CertificateType CAdvSecSettingsCertListBuilder::CertType( + const CCTCertInfo &aCertInfo) +{ + AdvSecSettingsCertificate::CertificateType type = + AdvSecSettingsCertificate::NotDefined; + TUid storeType; + switch (aCertInfo.CertificateOwnerType()) { + case ECACertificate: + type = AdvSecSettingsCertificate::AuthorityCertificate; + break; + case EUserCertificate: + storeType = aCertInfo.Handle().iTokenHandle.iTokenTypeUid; + if (storeType.iUid == KAdvSecSettingsDeviceCertStore) { + type = AdvSecSettingsCertificate::DeviceCertificate; + } else { + type = AdvSecSettingsCertificate::PersonalCertificate; + } + break; + case EPeerCertificate: + type = AdvSecSettingsCertificate::TrustedSiteCertificate; + break; + default: + break; + } + return type; +} +