diff -r 63339781d179 -r 09b1ac925e3f cpsecplugins/cpadvancedsecplugin/src/cpcerttrustview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cpsecplugins/cpadvancedsecplugin/src/cpcerttrustview.cpp Tue Aug 31 16:04:40 2010 +0300 @@ -0,0 +1,379 @@ +/* +* 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: Implementation of class CCertManUIContainerTrust. +* Maintains correct list of trusted clients depending +* on the certificate that was in focus in Authority +* certificates view when Trust Settings view was entered. +* Shows and changes correct Yes/No text for the Trusted client. +* +*/ + +// INCLUDE FILES +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include <../../inc/cpsecplugins.h> +#include "cpcerttrustview.h" +#include "cpcertdatacontainer.h" +#include "cpcertmanuisyncwrapper.h" +#include "cpuitrustids.h" + +const TInt KMidpCertStoreUid = 0x101F5B71; + +// ============================= LOCAL FUNCTIONS =============================== + +// ================= MEMBER FUNCTIONS ======================= + +CpCertTrustView::CpCertTrustView( TInt certificateIndex, CpCertDataContainer& certDataContainer, QGraphicsItem *parent /*= 0*/) + : CpBaseSettingView(0,parent), mCertDataContainer(certDataContainer), mCertificateIndex(certificateIndex) + { + setTitle(tr("Trust Settings")); + viewTrustSettings(); + } + +// --------------------------------------------------------- +// CpCertTrustView::~CpCertTrustView() +// Destructor +// --------------------------------------------------------- +// +CpCertTrustView::~CpCertTrustView() + { + delete mAppInfoManager; + mClientUids.Close(); + delete mFormModel; + mTrustedClients.erase(mTrustedClients.begin(), mTrustedClients.end()); + mTrustValues.erase(mTrustValues.begin(), mTrustValues.end()); + } + + +void CpCertTrustView::viewTrustSettings() + { + RDEBUG("0", 0); + mTrustedClients << " \tWAP connection\t\t"; + mTrustedClients << " \tMail and Image conn.\t\t"; + mTrustedClients << " \tNative installing\t\t"; + mTrustedClients << " \tJava installing\t\t"; + mTrustedClients << " \tOCSP validation\t\t"; + mTrustedClients << " \tVPN\t\t"; + mTrustedClients << " \tWidget Installation\t\t"; + + mTrustValues << "On"; + mTrustValues << "Off"; + + try + { + QT_TRAP_THROWING( mAppInfoManager = + CCertificateAppInfoManager::NewL( mCertDataContainer.iRfs, EFalse ); + updateListBoxL();) + } + catch(std::exception& exception) + { + QString error(exception.what()); + QT_TRAP_THROWING( mCertDataContainer.ShowErrorNoteL( error.toInt()) ); + throw(exception); + } + } + + +// --------------------------------------------------------------------------- +// CpCertTrustView::UpdateListBoxL() +// Puts correct Trust Settings text to listbox and correct value (yes/no) +// to the setting, asks the value from CheckCertificateClientTrust +// For X509 certificates, only one Application is currently supported +// (Application controller), more applications maybe added later however, +// so one additional application has been left in comments as an example. +// WAP connection and Application installer have their names from resources +// and thus localized, other additional application get their names from +// TCertificateAppInfo's Name() function. +// --------------------------------------------------------------------------- +// + +void CpCertTrustView::updateListBoxL() + { + RDEBUG("0", 0); + mClientUids.Reset(); + + TInt clientCount = 0; + + // Use certificate index from previous view + CCTCertInfo* entry = mCertDataContainer.iCALabelEntries[ mCertificateIndex ]->iCAEntry; + + // Here MCTCertApps should be used to get client options, but it is not properly + // supported in any cert store. It should be possible to get the MCTCertApps + // through token's GetInterface function. + if ( entry->Token().TokenType().Type() == TUid::Uid( KTokenTypeFileCertstore ) ) + { + if ( !mAppInfoManager ) + { + User::Leave( KErrArgument ); + } + RArray apps; + apps = mAppInfoManager->Applications(); + for ( TInt i = 0; i < apps.Count(); i++ ) + { + if ( apps[i].Id() != KCertManUIViewTrustJavaInstallingId && + apps[i].Id() != KCertManUIViewTrustApplicationControllerId ) + { + mClientUids.Append( apps[i].Id() ); + } + } + } + else + { + mCertDataContainer.iWrapper->GetApplicationsL( + mCertDataContainer.CertManager(), *entry, mClientUids ); + } + + // This is needed because MIDPCertStore does not support MCTCertApps + if ( mClientUids.Count() == 0 && + entry->Token().TokenType().Type() == TUid::Uid( KMidpCertStoreUid ) ) + { + mClientUids.Append( KCertManUIViewTrustJavaInstallingId ); + } + + if ( EX509Certificate != entry->CertificateFormat() ) + { + return; + } + TInt resIndex = KErrNotFound; + QList itemArray; + QList trustValue; + clientCount = mClientUids.Count(); + if ( clientCount > 0 ) + { + for ( TInt k = 0; k < clientCount; k++ ) + { + resIndex = trustIdIndex( mClientUids[k] ); + if ( resIndex == KErrNotFound ) + { + continue; + } + + // based on the trust list update the array + TBool trustState = EFalse; + QString item = mTrustedClients[ resIndex ]; + trustState = checkCertificateClientTrustL( mClientUids[k], *entry ); + // insert the index which would be used to retrieve the value from mTrustedClients + itemArray.insert(k,resIndex); + + if ( trustState ) + { + trustValue.insert(k,1); + } + else + { + trustValue.insert(k,0); + } + } + } + // display the list + QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical); + setLayout(layout); + std::auto_ptr form(new HbDataForm()); + mFormModel = new HbDataFormModel(); + + HbListWidget* mCertLabelList = new HbListWidget(this); + std::auto_ptr certLabel(q_check_ptr(new HbListWidgetItem())); + const TDesC& label = entry->Label(); + certLabel->setText(QString( (QChar*)label.Ptr(),label.Length() ) ); + mCertLabelList->addItem(certLabel.get()); + certLabel.release(); + + RDEBUG("0", 0); + + int count = itemArray.size(); + for( int index = 0 ;index < count; ++index) + { + std::auto_ptr item (q_check_ptr(new HbDataFormModelItem( + HbDataFormModelItem::ToggleValueItem, + mTrustedClients[itemArray[index]] ) )); + + if( trustValue[index] == 1) + { + item->setContentWidgetData("text",mTrustValues[0]); + item->setContentWidgetData("additionalText",mTrustValues[1]); + } + else + { + item->setContentWidgetData("text",mTrustValues[1]); + item->setContentWidgetData("additionalText",mTrustValues[0]); + } + mFormModel->appendDataFormItem(item.get()); + item.release(); + } + + form->setModel(mFormModel); + layout->addItem(mCertLabelList); + layout->addItem(form.get()); + form.release(); + } + + +void CpCertTrustView::saveTrustSettings() + { + RDEBUG("0", 0); + CCTCertInfo& entry = *( mCertDataContainer.iCALabelEntries[ mCertificateIndex ]->iCAEntry ); + if ( entry.IsDeletable() ) + { + TInt itemCount = mFormModel->rowCount(); + RArray newUids; + QT_TRAP_THROWING + ( + CleanupClosePushL( newUids ); + + for(int index = 0;indexitem(index); + QString trustValue = item->contentWidgetData("text").toString(); + if(trustValue == "On") + { + newUids.Append(trusterId(mTrustedClients[index])); + } + } + if(newUids.Count() > 0 ) + { + mCertDataContainer.iWrapper->SetApplicabilityL( mCertDataContainer.CertManager(), entry, newUids ); + } + CleanupStack::PopAndDestroy(&newUids); + ) + } + } + +TUid CpCertTrustView::trusterId(const QString& clientDescription) const + { + RDEBUG("0", 0); + TUid retValue = TUid::Uid(0); + if( clientDescription == " \tWAP connection\t\t" ) + retValue = KCertManUIViewTrustWapConnectionId; + else if( clientDescription == " \tMail and Image conn.\t\t" ) + retValue = KCertManUIViewTrustMailAndImageConnId; + else if( clientDescription == " \tNative installing\t\t" ) + retValue = KCertManUIViewTrustApplicationControllerId; + else if( clientDescription == " \tJava installing\t\t" ) + retValue = KCertManUIViewTrustJavaInstallingId; + else if( clientDescription == " \tOCSP validation\t\t" ) + retValue = KCertManUIViewOCSPCheckInstallingId; + else if( clientDescription == " \tVPN\t\t" ) + retValue = KCertManUIViewTrustVPNId; + else if( clientDescription == " \tWidget Installation\t\t" ) + retValue = KCertManUIViewTrustWidgetInstallId; + return retValue; + } + +// --------------------------------------------------------------------------- +// CpCertTrustView::trustIdIndex( TUid trustUid ) +// --------------------------------------------------------------------------- +// +TInt CpCertTrustView::trustIdIndex( TUid trustUid ) const + { + RDEBUG("0", 0); + TInt resIndex = KErrNotFound; + + if ( trustUid == KCertManUIViewTrustApplicationControllerId ) + { + resIndex = KTrustSettingsResourceIndexAppCtrl; + } + else if( trustUid == KCertManUIViewTrustWapConnectionId ) + { + resIndex = KTrustSettingsResourceIndexWAP; + } + else if ( trustUid == KCertManUIViewTrustMailAndImageConnId ) + { + resIndex = KTrustSettingsResourceIndexMailAndImageConn; + } + else if ( trustUid == KCertManUIViewTrustJavaInstallingId ) + { + resIndex = KTrustSettingsResourceIndexJavaInstall; + } + else if ( trustUid == KCertManUIViewOCSPCheckInstallingId ) + { + resIndex = KTrustSettingsResourceIndexOCSPCheck; + } + else if ( trustUid == KCertManUIViewTrustVPNId ) + { + resIndex = KTrustSettingsResourceIndexVPN; + } + else if ( trustUid == KCertManUIViewTrustWidgetInstallId ) + { + resIndex = KTrustSettingsResourceIndexWidget; + } + return resIndex; + } + + +// --------------------------------------------------------------------------- +// CpCertTrustView::CheckCertificateClientTrustL(const TUid aClientTUid, +// CCTCertInfo& aEntry) const +// Checks if a certificate trusts a client +// * Certificate format == ECrX509Certificate ECrX968Certificate ECrCertificateURL +// are not supported if certificate location == ECrCertLocationWIMCard +// * Certificate format == ECrX968Certificate ECrCertificateURL are not supported +// if certificate location == ECrCertLocationCertMan +// * Certificate location == ECrCertLocationWIMURL ECrCertLocationPhoneMemory +// ECrCertLocationPhoneMemoryURL are not supported +// --------------------------------------------------------------------------- +// +TBool CpCertTrustView::checkCertificateClientTrustL( + const TUid clientUid, const CCTCertInfo& entry ) const + { + RDEBUG("0", 0); + TBool trustSettingTrusted = EFalse; + TCertificateFormat format = entry.CertificateFormat(); + + if ( format == EX509Certificate ) + { + + RArray trusterUids; + CleanupClosePushL( trusterUids ); + + //Owned by mCertDataContainer. + CUnifiedCertStore*& store = mCertDataContainer.CertManager(); + // Get trusting applications' Uids for the one selected + // certificate entry + mCertDataContainer.iWrapper->GetApplicationsL( store, entry, trusterUids ); + + // get the number of trusting applications for one + // selected certificate entry + TInt trusterCount = trusterUids.Count(); + // in this loop, for every trusting application in one + // selected certificate entry + for ( TInt i = 0; i < trusterCount; ++i ) + { + // put the trusting application's Uid to TUid truster + if ( clientUid == trusterUids[i] ) + { + trustSettingTrusted = ETrue; + break; + } + } + CleanupStack::PopAndDestroy(&trusterUids); + } + + return trustSettingTrusted; + } + +// End of File +