/*
* Copyright (c) 2004-2009 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:
* CCheckedCertStore class implementation
*
*/
/**
@file
@internalComponent
*/
#ifndef __CCHECKEDCERTSTORE_H__
#define __CCHECKEDCERTSTORE_H__
#include <e32std.h>
#include <ct.h>
#include <e32property.h>
#include <mctwritablecertstore.h>
#include "unifiedkeystore.h"
NONSHARABLE_CLASS(CCheckedCertStore) : public CActive, public MCTWritableCertStore
{
public:
static CCheckedCertStore* NewCheckedCertStoreL(MCTTokenInterface*, RProperty&);
static CCheckedCertStore* NewCheckedWritableCertStoreL(MCTTokenInterface*, RProperty&);
public:
void ConstructL();
public: // MCTTokenInterface
virtual MCTToken& Token();
public: // MCTCertStore
virtual void List(RMPointerArray<CCTCertInfo>& aCerts, const CCertAttributeFilter& aFilter,
TRequestStatus& aStatus);
virtual void CancelList();
virtual void GetCert(CCTCertInfo*& aCertInfo, const TCTTokenObjectHandle& aHandle,
TRequestStatus& aStatus);
virtual void CancelGetCert();
virtual void Applications(const CCTCertInfo& aCertInfo, RArray<TUid>& aApplications,
TRequestStatus& aStatus);
virtual void CancelApplications();
virtual void IsApplicable(const CCTCertInfo& aCertInfo, TUid aApplication,
TBool& aIsApplicable, TRequestStatus& aStatus);
virtual void CancelIsApplicable();
virtual void Trusted(const CCTCertInfo& aCertInfo, TBool& aTrusted,
TRequestStatus& aStatus);
virtual void CancelTrusted();
virtual void Retrieve(const CCTCertInfo& aCertInfo, TDes8& aEncodedCert,
TRequestStatus& aStatus);
virtual void CancelRetrieve();
public: // MCTWritableCertStore
virtual void Add( const TDesC& aLabel, TCertificateFormat aFormat,
TCertificateOwnerType aCertificateOwnerType,
const TKeyIdentifier* aSubjectKeyId,
const TKeyIdentifier* aIssuerKeyId,
const TDesC8& aCert, TRequestStatus& aStatus);
// new Add(.., TBool aDeletable, ..) method from MCTWritableCertStore
virtual void Add( const TDesC& aLabel,
TCertificateFormat aFormat,
TCertificateOwnerType aCertificateOwnerType,
const TKeyIdentifier* aSubjectKeyId,
const TKeyIdentifier* aIssuerKeyId,
const TDesC8& aCert,
const TBool aDeletable,
TRequestStatus& aStatus);
virtual void CancelAdd();
virtual void Remove(const CCTCertInfo& aCertInfo, TRequestStatus& aStatus);
virtual void CancelRemove();
virtual void SetApplicability(const CCTCertInfo& aCertInfo,
const RArray<TUid>& aApplications, TRequestStatus &aStatus);
virtual void CancelSetApplicability();
virtual void SetTrust(const CCTCertInfo& aCertInfo, TBool aTrusted,
TRequestStatus& aStatus);
virtual void CancelSetTrust();
protected: // From CActive
virtual void DoCancel();
virtual void RunL();
virtual TInt RunError(TInt aError);
private:
enum TState
{
EIdleState = 0,
EList,
EAdd, // attempts using new Add() with aDeletable param
EInitKeyStoreForAdd,
EInitKeyStoreForList,
EGetKeyInfosForAdd,
EGetKeyInfosForList,
EOldAdd, // uses original Add() w/o aDeletable param
// if the new Add is not supported
ERemove,
ESetApplicability,
ESetTrust
};
private:
CCheckedCertStore(MCTCertStore&, RProperty&);
CCheckedCertStore(MCTWritableCertStore&, RProperty&);
virtual ~CCheckedCertStore();
private:
void Complete(TInt aError);
void Cleanup();
void InitialiseKeyStoreL(TState aNextState);
void BuildCheckedCertificateListL();
void ComputeAndCheckSubjectKeyIdL();
void DoAddL( const TDesC& aLabel,
TCertificateFormat aFormat,
TCertificateOwnerType aCertificateOwnerType,
const TKeyIdentifier* aSubjectKeyId,
const TKeyIdentifier* aIssuerKeyId,
const TDesC8& aCert,
const TBool aDeletable,
TRequestStatus& aStatus
);
void CancelOutstandingRequest();
private: // Generic
/// The certificate store we wrap, owned by us
MCTCertStore& iCertStore;
/// Pointer to the same object as iCertStore if it's writable, otherwise NULL
MCTWritableCertStore* iWritableCertStore;
/// File server session, used by unified key store
RFs iFs;
/// Unified keystore, created and destroyed on demand
CUnifiedKeyStore* iUnifiedKeyStore;
/// Current state of the active object
TState iState;
/// Request status of client request
TRequestStatus* iCallerStatus;
/// Key filter used for listing and adding certs
TCTKeyAttributeFilter iKeyFilter;
/// List of key infos returned by keystore
RMPointerArray<CCTKeyInfo> iKeyInfos;
// For Add requests
/// Format of cert to add
TCertificateFormat iFormat;
/// Owner type of cert to add
TCertificateOwnerType iCertificateOwnerType;
/// Subject key id of cert to add, not owned by us
const TKeyIdentifier* iSubjectKeyId;
/// Issuer key id of cert to add, not owned by us
const TKeyIdentifier* iIssuerKeyId;
// Deletable flag of cert to add
TBool iDeletable;
/// Holds the subject key id extracted from the cert - used if the caller
/// doesn't supply it
TKeyIdentifier iComputedSubjectKeyId;
/// Label of the cert to add, owned by us
HBufC* iCertLabel;
/// Certificate data to add, owned by us
HBufC8* iCertificate;
// For List requests
/// Pointer to client's cert list, used to return certs, not owned by us
RMPointerArray<CCTCertInfo>* iCallerCerts;
/// Pointer to client's cert filter, not owned by us
const CCertAttributeFilter* iCallerFilter;
// Reference for the certstore change notification property.
RProperty& iPSCertstoreChangePropertyRef;
};
#endif // __CCHECKEDCERTSTORE_H__