--- a/cryptoservices/certificateandkeymgmt/tcertstore/T_unifiedcertstoreremove.cpp Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptoservices/certificateandkeymgmt/tcertstore/T_unifiedcertstoreremove.cpp Thu Sep 10 14:01:51 2009 +0300
@@ -1,754 +1,755 @@
-/*
-* Copyright (c) 2005-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:
-*
-*/
-
-
-
-
-/**
- @file
-*/
-
-#include "t_unifiedcertstoreremove.h"
-#include "t_certstoredefs.h"
-#include "t_input.h"
-#include "t_certstoreout.h"
-#include <ccertattributefilter.h>
-
-
-/////////////////////////////////////////////////////////////////////////////////
-//CDeleteCertificate
-/////////////////////////////////////////////////////////////////////////////////
-
-
-CTestAction* CDeleteCertificate::NewL(RFs& aFs,
- CConsoleBase& aConsole,
- Output& aOut,
- const TTestActionSpec& aTestActionSpec)
- {
- CDeleteCertificate* self = new(ELeave) CDeleteCertificate(aFs, aConsole, aOut);
- CleanupStack::PushL(self);
- self->ConstructL(aTestActionSpec);
- CleanupStack::Pop(self);
- return self;
- }
-
-CDeleteCertificate::CDeleteCertificate(RFs& aFs, CConsoleBase& aConsole,
- Output& aOut)
-: CSubscriberAction(aFs, aConsole, aOut), iState(EIdle),iCertDeleteType(NULL)
- {
- }
-
-void CDeleteCertificate::PerformAction(TRequestStatus& aStatus)
- {
- if (aStatus != KErrNone)
- {
- iState = EFinished;
- }
-
- switch (iState)
- {
- case EIdle:
- //get the certs
- if (iCertInfos.Count() > 0)
- {
- iCertInfos.Close(); // JCS added for multiple delete case
- }
-
- iState = EGettingCerts;
- //get the certs
- GetCerts(aStatus);
- break;
-
- case EGettingCerts:
- {
- if (iNotificationSubscribed)
- {
- if (!iNotifier)
- {
- iNotifier = CCertStoreChangeNotifier::NewL(iNotifierFlag);
- iNotifier->StartNotification();
- }
- iState = ECheckNotification;
- }
- else
- {
- iState = EFinished;
- }
- DeleteCert(aStatus);
- }
- break;
-
- case ECheckNotification:
- {
- TInt ret=KErrNone;
- if (!iNotifierFlag)
- {
- ret=KErrGeneral;
- }
- iState = EFinished;
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, ret);
- }
- break;
-
- case EFinished:
- {
- if (aStatus == iExpectedResult)
- {
- iResult = ETrue;
- }
- else
- {
- iResult = EFalse;
- }
- if (aStatus == KErrNoMemory)
- {
- iState = EIdle;
- }
- else
- {
- iFinished = ETrue;
- }
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, aStatus.Int());
- }
- break;
-
- default:
- User::Invariant();
- }
- }
-
-void CDeleteCertificate::PerformCancel()
- {
- switch (iState)
- {
- case EGettingCerts:
- CertStore().CancelList();
- break;
- case ECheckNotification:
- case EIdle:
- case EFinished:
- // We /may/ be deleting a cert in these states - fortunately cancel is lenient
- UnifiedCertStore().CancelRemove();
- break;
-
- default:
- User::Invariant();
- }
- }
-
-void CDeleteCertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
- {
- CSubscriberAction::ConstructL(aTestActionSpec);
-
- iFilter = CCertAttributeFilter::NewL();
- TInt pos = 0;
- TInt err1 = KErrNone;
-
- TPtrC8 pLabel1 = Input::ParseElement(aTestActionSpec.iActionBody, KCertTypeStart, KCertTypeEnd, pos, err1);
-
- if(err1 == KErrNone)
- {
- iCertDeleteType = HBufC8::NewL(pLabel1.Size());
- *iCertDeleteType = pLabel1;
- }
-
- pos=0;
- TInt err2 = KErrNone;
- TPtrC8 pLabel2 = Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart, KCertLabelEnd, pos, err2);
- if (err2 != KErrNone)
- {
- User::Leave(err2);
- }
-
- iCertLabel.Copy(pLabel2);
- if (iCertLabel.Compare(_L("*.*"))==0) // delete all certs
- {// Check that the flag has been set
- TPtrC8 pDeleteAll = Input::ParseElement(aTestActionSpec.iActionBody, KDeleteAllStart, KDeleteAllEnd, pos, err1);
- if (pDeleteAll!=KNullDesC8)
- {
- TLex8 lexer(pDeleteAll);
- TInt boolVal = 0;
- lexer.Val(boolVal);
- iDeleteAllCerts = (boolVal > 0) ? ETrue : EFalse;
- }
- }
- else if( err1 != KErrNone && err1 != KErrNotFound)
- {
- User::Leave(err1);
- }
-
- // Set expected result
- HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
- TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
- Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
- CleanupStack::PopAndDestroy(result);
- }
-
-void CDeleteCertificate::GetCerts(TRequestStatus& aStatus)
- {
- CertStore().List(iCertInfos, *iFilter, aStatus);
- }
-
-CDeleteCertificate::~CDeleteCertificate()
- {
- delete iCertDeleteType;
- iCertInfos.Close();
- delete iFilter;
- }
-
-void CDeleteCertificate::DeleteCert(TRequestStatus& aStatus)
- {
- TInt ix = KErrNotFound;
- TInt count = iCertInfos.Count();
- for (TInt i = count-1; i >= 0 ; i--)
- {
- if (iDeleteAllCerts)
- {// Just delete the first one we come across
- if (i>=0) // Still some certificates to delete
- { // Set the state back to continue
- iState = EIdle;
- }
-
- ix = i;
- break;
- }
- // Only delete if there's a label match and the certificate is of specified type
- else if (iCertInfos[i]->Label() == iCertLabel && CheckCertType(*iCertInfos[i]) )
- {
- ix = i;
- break;
- }
- }
-
- TRequestStatus* status = &aStatus;
- if (ix == KErrNotFound)
- {
- TInt result = KErrNone;
-
- if(iDeleteAllCerts)
- result = KErrNone;
- else if(iCertDeleteType == NULL)
- result = KErrNotSupported;
- else
- result = KErrNotFound;
-
- User::RequestComplete(status, result);
- }
- else
- {
- iCertInfoToDelete = iCertInfos[ix];
- UnifiedCertStore().Remove(*iCertInfos[ix], aStatus);
- }
- }
-
-TBool CDeleteCertificate::CheckCertType( CCTCertInfo& aCertInfo )
- {
- if(iCertDeleteType == NULL)
- return EFalse;
-
- TBool returnValue = EFalse;
- switch(aCertInfo.CertificateOwnerType())
- {
- case ECACertificate:
- if(iCertDeleteType->Compare(KCACert) == 0 )
- returnValue = ETrue;
- break;
- case EUserCertificate:
- if(iCertDeleteType->Compare(KUserCert) == 0 )
- returnValue = ETrue;
- break;
- case EPeerCertificate:
- if(iCertDeleteType->Compare(KPeerCert) == 0 )
- returnValue = ETrue;
- break;
- }
- return returnValue;
- }
-
-void CDeleteCertificate::DoReportAction()
- {
- iOut.writeString(_L("Deleting certificate..."));
- iOut.writeNewLine();
- iOut.writeString(_L("\tLabel = "));
- iOut.writeString(iCertLabel);
- iOut.writeNewLine();
- iOut.writeNewLine();
- }
-
-void CDeleteCertificate::DoCheckResult(TInt aError)
- {
- if (iFinished)
- {
- if (aError == KErrNone && iCertInfoToDelete)
- {
- switch (iCertInfoToDelete->CertificateOwnerType())
- {
- case ECACertificate:
- iConsole.Write(_L("\tCA certificate deleted successfully\n"));
- iOut.writeString(_L("\tCA certificate deleted successfully"));
- break;
-
- case EUserCertificate:
- iConsole.Write(_L("\tUser certificate deleted successfully\n"));
- iOut.writeString(_L("\tUser certificate deleted successfully"));
- break;
-
- case EPeerCertificate:
- iConsole.Write(_L("\tPeer certificate deleted successfully\n"));
- iOut.writeString(_L("\tPeer certificate deleted successfully"));
- break;
- default:
- iConsole.Write(_L("\tUnknown owner certificate deleted successfully\n"));
- iOut.writeString(_L("\tUnknown owner certificate deleted successfully"));
- break;
- }
- }
- iOut.writeNewLine();
- iOut.writeNewLine();
- }
- }
-
-void CDeleteCertificate::Reset()
- {
- iState = EIdle;
- iCertInfos.Close();
- }
-
-
-/////////////////////////////////////////////////////////////////////////////////
-//CDeleteRetrieveCertificate
-/////////////////////////////////////////////////////////////////////////////////
-CDeleteRetrieveCertificate::CDeleteRetrieveCertificate(RFs& aFs, CConsoleBase& aConsole,
- Output& aOut)
-: CSubscriberAction(aFs, aConsole, aOut), iState(EIdle)
- {
- }
-
-void CDeleteRetrieveCertificate::PerformAction(TRequestStatus& aStatus)
- {
- TRequestStatus* status = &aStatus;
- switch (iState)
- {
- case EIdle:
- //get the certs
- iState = EDeletingCert;
- //get the certs
- GetCerts(aStatus);
- if (aStatus == KErrNoMemory)
- {
- iState = EFinished;
- }
- break;
-
- case EDeletingCert:
- {
- if (iNotificationSubscribed)
- {
- iNotifier = CCertStoreChangeNotifier::NewL(iNotifierFlag);
- iNotifier->StartNotification();
- iState = ECheckNotification;
- }
- else
- {
- iState = EGettingCerts;
- }
- //delete the cert
- DeleteCert(aStatus);
- break;
- }
-
- case ECheckNotification:
- {
- TInt ret=KErrNone;
- if (!iNotifierFlag)
- {
- ret=KErrGeneral;
- }
- if (ret!=KErrNone)
- {
- iState = EFinished;
- }
- else
- {
- iState = EGettingCerts;
- }
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, ret);
- }
- break;
- case EGettingCerts:
- {
- iState = EFinished;
- //get the cert
- RetrieveCerts(aStatus);
- break;
- }
- case EFinished:
- {
- if (aStatus == iExpectedResult)
- {
- iResult = ETrue;
- }
- else
- {
- iResult = EFalse;
- }
- if (aStatus == KErrNoMemory)
- {
- iState = EIdle;
- }
- else
- {
- iFinished = ETrue;
- }
- User::RequestComplete(status, aStatus.Int());
- }
- break;
- default:
- {
- //some kind of error behaviour
- }
- }
- }
-
-void CDeleteRetrieveCertificate::PerformCancel()
- {
- }
-
-void CDeleteRetrieveCertificate::Reset()
- {
- __ASSERT_DEBUG(EFalse, User::Panic(_L("CDeleteRetrieveCertificate::Reset()"), 1));
- }
-
-////////////////////////////////////////////////////////////////////////////////
-//CDeleteCACertificate
-//////////////////////////////////////////////////////////////////////////////////
-
-CTestAction* CDeleteRetrieveCACertificate::NewL(RFs& aFs,
- CConsoleBase& aConsole,
- Output& aOut,
- const TTestActionSpec& aTestActionSpec)
- {
- CDeleteRetrieveCACertificate* self =
- new(ELeave) CDeleteRetrieveCACertificate(aFs, aConsole, aOut);
- CleanupStack::PushL(self);
- self->ConstructL(aTestActionSpec);
- CleanupStack::Pop(self);
- return self;
- }
-
-CDeleteRetrieveCACertificate::CDeleteRetrieveCACertificate(RFs& aFs, CConsoleBase& aConsole,
- Output& aOut)
- :CDeleteRetrieveCertificate(aFs, aConsole, aOut)
- {
- }
-
-void CDeleteRetrieveCACertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
- {
- CSubscriberAction::ConstructL(aTestActionSpec);
- iCertlisted = new(ELeave) RPointerArray<HBufC8>;
- iFilter = CCertAttributeFilter::NewL();
- TInt pos = 0;
- TInt err = KErrNone;
- TPtrC8 pLabel = Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart, KCertLabelEnd, pos, err);
- if (err != KErrNone)
- {
- User::Leave(err);
- }
- iCertLabel.Copy(pLabel);
-
- // Set expected result
- pos = 0;
-
- HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
- TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
- Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
- CleanupStack::PopAndDestroy(result);
- }
-
-void CDeleteRetrieveCACertificate::GetCerts(TRequestStatus& aStatus)
- {
- CertStore().List(iCertInfos, *iFilter, aStatus);
- }
-
-void CDeleteRetrieveCACertificate::RetrieveCerts(TRequestStatus& aStatus)
- {
- TRequestStatus* status = &aStatus;
- TInt ix = KErrNotFound;
- TInt count = iCertInfos.Count();
- for (TInt i = 0; i < count; i++)
- {
- if (iCertInfos[i]->Label() == iCertLabel)
- {
- ix = i;
- break;
- }
- }
- if (ix == KErrNotFound)
- {
- User::RequestComplete(status, ix);
- }
- else
- {
- iCertInfoToRetrieve = iCertInfos[ix];
-
- HBufC8* buf = HBufC8::NewLC(iCertInfoToRetrieve->Size());
- User::LeaveIfError(iCertlisted->Append(buf));
- CleanupStack::Pop();//buf
- __ASSERT_DEBUG(!iBuf, User::Panic(_L("CListCACertificates"), 1));
- iBuf = new(ELeave) TPtr8(buf->Des());
- CertStore().Retrieve(*iCertInfoToRetrieve, *iBuf, aStatus);
- }
- }
-
-CDeleteRetrieveCACertificate::~CDeleteRetrieveCACertificate()
- {
- iCertInfos.Close();
- delete iFilter;
- if (iCertlisted)
- {
- iCertlisted->ResetAndDestroy();
- delete iCertlisted;
- }
- delete iBuf;
- }
-
-void CDeleteRetrieveCACertificate::DeleteCert(TRequestStatus& aStatus)
- {
- TRequestStatus* status = &aStatus;
- TInt ix = KErrNotFound;
- TInt count = iCertInfos.Count();
- for (TInt i = 0; i < count; i++)
- {
- if (iCertInfos[i]->Label() == iCertLabel)
- {
- ix = i;
- break;
- }
- }
- if (ix == KErrNotFound)
- {
- User::RequestComplete(status, ix);
- }
- else
- {
- iCertInfoToDelete = iCertInfos[ix];
- UnifiedCertStore().Remove(*iCertInfoToDelete, aStatus);
- }
- }
-
-void CDeleteRetrieveCACertificate::DoReportAction()
- {
- iOut.writeString(_L("Deleting certificate..."));
- iOut.writeNewLine();
- iOut.writeString(_L("\tLabel = "));
- iOut.writeString(iCertLabel);
- iOut.writeNewLine();
- iOut.writeNewLine();
- }
-
-void CDeleteRetrieveCACertificate::DoCheckResult(TInt aError)
- {
- if (iFinished)
- {
- if (aError == KErrNone && iResult)
- {
- switch (iCertInfoToDelete->CertificateOwnerType())
- {
- case ECACertificate:
- iConsole.Write(_L("\tCA certificate deleted successfully\n"));
- iOut.writeString(_L("\tCA certificate deleted successfully"));
- break;
-
- case EUserCertificate:
- iConsole.Write(_L("\tUser certificate deleted successfully\n"));
- iOut.writeString(_L("\tUser certificate deleted successfully"));
- break;
-
- default:
- iConsole.Write(_L("\tUnknown owner certificate deleted successfully\n"));
- iOut.writeString(_L("\tUnknown owner certificate deleted successfully"));
- break;
- }
- }
- else
- {
- if (iResult)
- {
- iConsole.Write(_L("\tCA OK\n"));
- iOut.writeString(_L("\tCA OK"));
- }
- }
- iOut.writeNewLine();
- iOut.writeNewLine();
- }
- }
-
-////////////////////////////////////////////////////////////////////////////////
-//CDeleteUserCertificate
-//////////////////////////////////////////////////////////////////////////////////
-CTestAction* CDeleteRetrieveUserCertificate::NewL(RFs& aFs,
- CConsoleBase& aConsole,
- Output& aOut,
- const TTestActionSpec& aTestActionSpec)
- {
- CDeleteRetrieveUserCertificate* self =
- new(ELeave) CDeleteRetrieveUserCertificate(aFs, aConsole, aOut);
- CleanupStack::PushL(self);
- self->ConstructL(aTestActionSpec);
- CleanupStack::Pop(self);
- return self;
- }
-
-CDeleteRetrieveUserCertificate::CDeleteRetrieveUserCertificate(RFs& aFs, CConsoleBase& aConsole,
- Output& aOut)
- :CDeleteRetrieveCertificate(aFs, aConsole, aOut)
- {
- }
-
-void CDeleteRetrieveUserCertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
- {
- CSubscriberAction::ConstructL(aTestActionSpec);
- iCertlisted = new(ELeave) RPointerArray<HBufC8>;
- iFilter = CCertAttributeFilter::NewL();
- TInt pos = 0;
- TInt err = KErrNone;
- TPtrC8 pLabel = Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart, KCertLabelEnd, pos, err);
- if (err != KErrNone)
- {
- User::Leave(err);
- }
- iCertLabel.Copy(pLabel);
-
- // Set expected result
- HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
- TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
- Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
- CleanupStack::PopAndDestroy(result);
- }
-
-void CDeleteRetrieveUserCertificate::GetCerts(TRequestStatus& aStatus)
- {
- CertStore().List(iCertInfos, *iFilter, aStatus);
- }
-
-void CDeleteRetrieveUserCertificate::RetrieveCerts(TRequestStatus& aStatus)
- {
- TRequestStatus* status = &aStatus;
- TInt ix = KErrNotFound;
- TInt count = iCertInfos.Count();
- for (TInt i = 0; i < count; i++)
- {
- if (iCertInfos[i]->Label() == iCertLabel)
- {
- ix = i;
- break;
- }
- }
- if (ix == KErrNotFound)
- {
- User::RequestComplete(status, ix);
- }
- else
- {
- iCertInfoToRetrieve = iCertInfos[ix];
-
- HBufC8* buf = HBufC8::NewLC(iCertInfoToRetrieve->Size());
- User::LeaveIfError(iCertlisted->Append(buf));
- CleanupStack::Pop();//buf
- //__ASSERT_DEBUG(!iBuf, User::Panic(_L("CListCACertificates"), 1));
- iBuf = new(ELeave) TPtr8(buf->Des());
- CertStore().Retrieve(*iCertInfoToRetrieve, *iBuf, aStatus);
- }
- }
-
-CDeleteRetrieveUserCertificate::~CDeleteRetrieveUserCertificate()
- {
- iCertInfos.Close();
- delete iFilter;
- if (iCertlisted)
- {
- iCertlisted->ResetAndDestroy();
- delete iCertlisted;
- }
- delete iBuf;
- }
-
-void CDeleteRetrieveUserCertificate::DeleteCert(TRequestStatus& aStatus)
- {
- TRequestStatus* status = &aStatus;
- TInt ix = KErrNotFound;
- TInt count = iCertInfos.Count();
- for (TInt i = 0; i < count; i++)
- {
- if (iCertInfos[i]->Label() == iCertLabel)
- {
- ix = i;
- break;
- }
- }
- if (ix == KErrNotFound)
- {
- User::RequestComplete(status, ix);
- }
- else
- {
- CCTCertInfo* certInfo = iCertInfos[ix];
- UnifiedCertStore().Remove(*certInfo, aStatus);
- }
- }
-
-void CDeleteRetrieveUserCertificate::DoReportAction()
- {
- iOut.writeString(_L("Deleting user certificate..."));
- iOut.writeNewLine();
- iOut.writeString(_L("\tLabel = "));
- iOut.writeString(iCertLabel);
- iOut.writeNewLine();
- iOut.writeNewLine();
- }
-
-void CDeleteRetrieveUserCertificate::DoCheckResult(TInt aError)
- {
- if (iFinished)
- {
- if (aError == KErrNone && iResult)
- {
- iConsole.Write(_L("\tuser cert deleted successfully\n"));
- iOut.writeString(_L("\tuser cert deleted successfully"));
- iOut.writeNewLine();
- iOut.writeNewLine();
- }
- else
- {
- if (iResult)
- {
- iConsole.Write(_L("\tnot retrieved but expected\n"));
- iOut.writeString(_L("\tCA OK"));
- }
- else
- {
- iConsole.Write(_L("\tuser cert deleted successfully\n"));
- iOut.writeString(_L("\tuser cert deleted successfully"));
- iOut.writeNewLine();
- iOut.writeNewLine();
- }
- }
- }
- }
+/*
+* Copyright (c) 2005-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:
+*
+*/
+
+
+/**
+ @file
+*/
+
+#include "t_unifiedcertstoreremove.h"
+#include "t_certstoredefs.h"
+#include "t_input.h"
+#include "t_certstoreout.h"
+#include <ccertattributefilter.h>
+
+
+/////////////////////////////////////////////////////////////////////////////////
+//CDeleteCertificate
+/////////////////////////////////////////////////////////////////////////////////
+
+
+CTestAction* CDeleteCertificate::NewL(RFs& aFs,
+ CConsoleBase& aConsole,
+ Output& aOut,
+ const TTestActionSpec& aTestActionSpec)
+ {
+ CDeleteCertificate* self = new(ELeave) CDeleteCertificate(aFs, aConsole, aOut);
+ CleanupStack::PushL(self);
+ self->ConstructL(aTestActionSpec);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CDeleteCertificate::CDeleteCertificate(RFs& aFs, CConsoleBase& aConsole,
+ Output& aOut)
+: CSubscriberAction(aFs, aConsole, aOut), iState(EIdle),iCertDeleteType(NULL)
+ {
+ }
+
+void CDeleteCertificate::PerformAction(TRequestStatus& aStatus)
+ {
+ if (aStatus != KErrNone)
+ {
+ iState = EFinished;
+ }
+
+ switch (iState)
+ {
+ case EIdle:
+ //get the certs
+ if (iCertInfos.Count() > 0)
+ {
+ iCertInfos.Close(); // JCS added for multiple delete case
+ }
+
+ iState = EGettingCerts;
+ //get the certs
+ GetCerts(aStatus);
+ break;
+
+ case EGettingCerts:
+ {
+ if (iNotificationSubscribed)
+ {
+ if (!iNotifier)
+ {
+ iNotifier = CCertStoreChangeNotifier::NewL(iNotifierFlag);
+ iNotifier->StartNotification();
+ }
+ iState = ECheckNotification;
+ }
+ else
+ {
+ iState = EFinished;
+ }
+ DeleteCert(aStatus);
+ }
+ break;
+
+ case ECheckNotification:
+ {
+ iState = EFinished;
+ if (iNotifierFlag)
+ {
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, KErrNone);
+ }
+ else
+ {
+ iNotifier->SetCompleteStatus(&aStatus);
+ }
+ }
+
+ break;
+
+ case EFinished:
+ {
+ if (aStatus == iExpectedResult)
+ {
+ iResult = ETrue;
+ }
+ else
+ {
+ iResult = EFalse;
+ }
+ if (aStatus == KErrNoMemory)
+ {
+ iState = EIdle;
+ }
+ else
+ {
+ iFinished = ETrue;
+ }
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, aStatus.Int());
+ }
+ break;
+
+ default:
+ User::Invariant();
+ }
+ }
+
+void CDeleteCertificate::PerformCancel()
+ {
+ switch (iState)
+ {
+ case EGettingCerts:
+ CertStore().CancelList();
+ break;
+ case ECheckNotification:
+ case EIdle:
+ case EFinished:
+ // We /may/ be deleting a cert in these states - fortunately cancel is lenient
+ UnifiedCertStore().CancelRemove();
+ break;
+
+ default:
+ User::Invariant();
+ }
+ }
+
+void CDeleteCertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
+ {
+ CSubscriberAction::ConstructL(aTestActionSpec);
+
+ iFilter = CCertAttributeFilter::NewL();
+ TInt pos = 0;
+ TInt err1 = KErrNone;
+
+ TPtrC8 pLabel1 = Input::ParseElement(aTestActionSpec.iActionBody, KCertTypeStart, KCertTypeEnd, pos, err1);
+
+ if(err1 == KErrNone)
+ {
+ iCertDeleteType = HBufC8::NewL(pLabel1.Size());
+ *iCertDeleteType = pLabel1;
+ }
+
+ pos=0;
+ TInt err2 = KErrNone;
+ TPtrC8 pLabel2 = Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart, KCertLabelEnd, pos, err2);
+ if (err2 != KErrNone)
+ {
+ User::Leave(err2);
+ }
+
+ iCertLabel.Copy(pLabel2);
+ if (iCertLabel.Compare(_L("*.*"))==0) // delete all certs
+ {// Check that the flag has been set
+ TPtrC8 pDeleteAll = Input::ParseElement(aTestActionSpec.iActionBody, KDeleteAllStart, KDeleteAllEnd, pos, err1);
+ if (pDeleteAll!=KNullDesC8)
+ {
+ TLex8 lexer(pDeleteAll);
+ TInt boolVal = 0;
+ lexer.Val(boolVal);
+ iDeleteAllCerts = (boolVal > 0) ? ETrue : EFalse;
+ }
+ }
+ else if( err1 != KErrNone && err1 != KErrNotFound)
+ {
+ User::Leave(err1);
+ }
+
+ // Set expected result
+ HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
+ TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
+ Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
+ CleanupStack::PopAndDestroy(result);
+ }
+
+void CDeleteCertificate::GetCerts(TRequestStatus& aStatus)
+ {
+ CertStore().List(iCertInfos, *iFilter, aStatus);
+ }
+
+CDeleteCertificate::~CDeleteCertificate()
+ {
+ delete iCertDeleteType;
+ iCertInfos.Close();
+ delete iFilter;
+ }
+
+void CDeleteCertificate::DeleteCert(TRequestStatus& aStatus)
+ {
+ TInt ix = KErrNotFound;
+ TInt count = iCertInfos.Count();
+ for (TInt i = count-1; i >= 0 ; i--)
+ {
+ if (iDeleteAllCerts)
+ {// Just delete the first one we come across
+ if (i>=0) // Still some certificates to delete
+ { // Set the state back to continue
+ iState = EIdle;
+ }
+
+ ix = i;
+ break;
+ }
+ // Only delete if there's a label match and the certificate is of specified type
+ else if (iCertInfos[i]->Label() == iCertLabel && CheckCertType(*iCertInfos[i]) )
+ {
+ ix = i;
+ break;
+ }
+ }
+
+ TRequestStatus* status = &aStatus;
+ if (ix == KErrNotFound)
+ {
+ TInt result = KErrNone;
+
+ if(iDeleteAllCerts)
+ result = KErrNone;
+ else if(iCertDeleteType == NULL)
+ result = KErrNotSupported;
+ else
+ result = KErrNotFound;
+
+ User::RequestComplete(status, result);
+ }
+ else
+ {
+ iCertInfoToDelete = iCertInfos[ix];
+ UnifiedCertStore().Remove(*iCertInfos[ix], aStatus);
+ }
+ }
+
+TBool CDeleteCertificate::CheckCertType( CCTCertInfo& aCertInfo )
+ {
+ if(iCertDeleteType == NULL)
+ return EFalse;
+
+ TBool returnValue = EFalse;
+ switch(aCertInfo.CertificateOwnerType())
+ {
+ case ECACertificate:
+ if(iCertDeleteType->Compare(KCACert) == 0 )
+ returnValue = ETrue;
+ break;
+ case EUserCertificate:
+ if(iCertDeleteType->Compare(KUserCert) == 0 )
+ returnValue = ETrue;
+ break;
+ case EPeerCertificate:
+ if(iCertDeleteType->Compare(KPeerCert) == 0 )
+ returnValue = ETrue;
+ break;
+ }
+ return returnValue;
+ }
+
+void CDeleteCertificate::DoReportAction()
+ {
+ iOut.writeString(_L("Deleting certificate..."));
+ iOut.writeNewLine();
+ iOut.writeString(_L("\tLabel = "));
+ iOut.writeString(iCertLabel);
+ iOut.writeNewLine();
+ iOut.writeNewLine();
+ }
+
+void CDeleteCertificate::DoCheckResult(TInt aError)
+ {
+ if (iFinished)
+ {
+ if (aError == KErrNone && iCertInfoToDelete)
+ {
+ switch (iCertInfoToDelete->CertificateOwnerType())
+ {
+ case ECACertificate:
+ iConsole.Write(_L("\tCA certificate deleted successfully\n"));
+ iOut.writeString(_L("\tCA certificate deleted successfully"));
+ break;
+
+ case EUserCertificate:
+ iConsole.Write(_L("\tUser certificate deleted successfully\n"));
+ iOut.writeString(_L("\tUser certificate deleted successfully"));
+ break;
+
+ case EPeerCertificate:
+ iConsole.Write(_L("\tPeer certificate deleted successfully\n"));
+ iOut.writeString(_L("\tPeer certificate deleted successfully"));
+ break;
+ default:
+ iConsole.Write(_L("\tUnknown owner certificate deleted successfully\n"));
+ iOut.writeString(_L("\tUnknown owner certificate deleted successfully"));
+ break;
+ }
+ }
+ iOut.writeNewLine();
+ iOut.writeNewLine();
+ }
+ }
+
+void CDeleteCertificate::Reset()
+ {
+ iState = EIdle;
+ iCertInfos.Close();
+ }
+
+
+/////////////////////////////////////////////////////////////////////////////////
+//CDeleteRetrieveCertificate
+/////////////////////////////////////////////////////////////////////////////////
+CDeleteRetrieveCertificate::CDeleteRetrieveCertificate(RFs& aFs, CConsoleBase& aConsole,
+ Output& aOut)
+: CSubscriberAction(aFs, aConsole, aOut), iState(EIdle)
+ {
+ }
+
+void CDeleteRetrieveCertificate::PerformAction(TRequestStatus& aStatus)
+ {
+ TRequestStatus* status = &aStatus;
+ switch (iState)
+ {
+ case EIdle:
+ //get the certs
+ iState = EDeletingCert;
+ //get the certs
+ GetCerts(aStatus);
+ if (aStatus == KErrNoMemory)
+ {
+ iState = EFinished;
+ }
+ break;
+
+ case EDeletingCert:
+ {
+ if (iNotificationSubscribed)
+ {
+ iNotifier = CCertStoreChangeNotifier::NewL(iNotifierFlag);
+ iNotifier->StartNotification();
+ iState = ECheckNotification;
+ }
+ else
+ {
+ iState = EGettingCerts;
+ }
+ //delete the cert
+ DeleteCert(aStatus);
+ break;
+ }
+
+ case ECheckNotification:
+ {
+ TInt ret=KErrNone;
+ if (!iNotifierFlag)
+ {
+ ret=KErrGeneral;
+ }
+ if (ret!=KErrNone)
+ {
+ iState = EFinished;
+ }
+ else
+ {
+ iState = EGettingCerts;
+ }
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, ret);
+ }
+ break;
+ case EGettingCerts:
+ {
+ iState = EFinished;
+ //get the cert
+ RetrieveCerts(aStatus);
+ break;
+ }
+ case EFinished:
+ {
+ if (aStatus == iExpectedResult)
+ {
+ iResult = ETrue;
+ }
+ else
+ {
+ iResult = EFalse;
+ }
+ if (aStatus == KErrNoMemory)
+ {
+ iState = EIdle;
+ }
+ else
+ {
+ iFinished = ETrue;
+ }
+ User::RequestComplete(status, aStatus.Int());
+ }
+ break;
+ default:
+ {
+ //some kind of error behaviour
+ }
+ }
+ }
+
+void CDeleteRetrieveCertificate::PerformCancel()
+ {
+ }
+
+void CDeleteRetrieveCertificate::Reset()
+ {
+ __ASSERT_DEBUG(EFalse, User::Panic(_L("CDeleteRetrieveCertificate::Reset()"), 1));
+ }
+
+////////////////////////////////////////////////////////////////////////////////
+//CDeleteCACertificate
+//////////////////////////////////////////////////////////////////////////////////
+
+CTestAction* CDeleteRetrieveCACertificate::NewL(RFs& aFs,
+ CConsoleBase& aConsole,
+ Output& aOut,
+ const TTestActionSpec& aTestActionSpec)
+ {
+ CDeleteRetrieveCACertificate* self =
+ new(ELeave) CDeleteRetrieveCACertificate(aFs, aConsole, aOut);
+ CleanupStack::PushL(self);
+ self->ConstructL(aTestActionSpec);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CDeleteRetrieveCACertificate::CDeleteRetrieveCACertificate(RFs& aFs, CConsoleBase& aConsole,
+ Output& aOut)
+ :CDeleteRetrieveCertificate(aFs, aConsole, aOut)
+ {
+ }
+
+void CDeleteRetrieveCACertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
+ {
+ CSubscriberAction::ConstructL(aTestActionSpec);
+ iCertlisted = new(ELeave) RPointerArray<HBufC8>;
+ iFilter = CCertAttributeFilter::NewL();
+ TInt pos = 0;
+ TInt err = KErrNone;
+ TPtrC8 pLabel = Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart, KCertLabelEnd, pos, err);
+ if (err != KErrNone)
+ {
+ User::Leave(err);
+ }
+ iCertLabel.Copy(pLabel);
+
+ // Set expected result
+ pos = 0;
+
+ HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
+ TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
+ Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
+ CleanupStack::PopAndDestroy(result);
+ }
+
+void CDeleteRetrieveCACertificate::GetCerts(TRequestStatus& aStatus)
+ {
+ CertStore().List(iCertInfos, *iFilter, aStatus);
+ }
+
+void CDeleteRetrieveCACertificate::RetrieveCerts(TRequestStatus& aStatus)
+ {
+ TRequestStatus* status = &aStatus;
+ TInt ix = KErrNotFound;
+ TInt count = iCertInfos.Count();
+ for (TInt i = 0; i < count; i++)
+ {
+ if (iCertInfos[i]->Label() == iCertLabel)
+ {
+ ix = i;
+ break;
+ }
+ }
+ if (ix == KErrNotFound)
+ {
+ User::RequestComplete(status, ix);
+ }
+ else
+ {
+ iCertInfoToRetrieve = iCertInfos[ix];
+
+ HBufC8* buf = HBufC8::NewLC(iCertInfoToRetrieve->Size());
+ User::LeaveIfError(iCertlisted->Append(buf));
+ CleanupStack::Pop();//buf
+ __ASSERT_DEBUG(!iBuf, User::Panic(_L("CListCACertificates"), 1));
+ iBuf = new(ELeave) TPtr8(buf->Des());
+ CertStore().Retrieve(*iCertInfoToRetrieve, *iBuf, aStatus);
+ }
+ }
+
+CDeleteRetrieveCACertificate::~CDeleteRetrieveCACertificate()
+ {
+ iCertInfos.Close();
+ delete iFilter;
+ if (iCertlisted)
+ {
+ iCertlisted->ResetAndDestroy();
+ delete iCertlisted;
+ }
+ delete iBuf;
+ }
+
+void CDeleteRetrieveCACertificate::DeleteCert(TRequestStatus& aStatus)
+ {
+ TRequestStatus* status = &aStatus;
+ TInt ix = KErrNotFound;
+ TInt count = iCertInfos.Count();
+ for (TInt i = 0; i < count; i++)
+ {
+ if (iCertInfos[i]->Label() == iCertLabel)
+ {
+ ix = i;
+ break;
+ }
+ }
+ if (ix == KErrNotFound)
+ {
+ User::RequestComplete(status, ix);
+ }
+ else
+ {
+ iCertInfoToDelete = iCertInfos[ix];
+ UnifiedCertStore().Remove(*iCertInfoToDelete, aStatus);
+ }
+ }
+
+void CDeleteRetrieveCACertificate::DoReportAction()
+ {
+ iOut.writeString(_L("Deleting certificate..."));
+ iOut.writeNewLine();
+ iOut.writeString(_L("\tLabel = "));
+ iOut.writeString(iCertLabel);
+ iOut.writeNewLine();
+ iOut.writeNewLine();
+ }
+
+void CDeleteRetrieveCACertificate::DoCheckResult(TInt aError)
+ {
+ if (iFinished)
+ {
+ if (aError == KErrNone && iResult)
+ {
+ switch (iCertInfoToDelete->CertificateOwnerType())
+ {
+ case ECACertificate:
+ iConsole.Write(_L("\tCA certificate deleted successfully\n"));
+ iOut.writeString(_L("\tCA certificate deleted successfully"));
+ break;
+
+ case EUserCertificate:
+ iConsole.Write(_L("\tUser certificate deleted successfully\n"));
+ iOut.writeString(_L("\tUser certificate deleted successfully"));
+ break;
+
+ default:
+ iConsole.Write(_L("\tUnknown owner certificate deleted successfully\n"));
+ iOut.writeString(_L("\tUnknown owner certificate deleted successfully"));
+ break;
+ }
+ }
+ else
+ {
+ if (iResult)
+ {
+ iConsole.Write(_L("\tCA OK\n"));
+ iOut.writeString(_L("\tCA OK"));
+ }
+ }
+ iOut.writeNewLine();
+ iOut.writeNewLine();
+ }
+ }
+
+////////////////////////////////////////////////////////////////////////////////
+//CDeleteUserCertificate
+//////////////////////////////////////////////////////////////////////////////////
+CTestAction* CDeleteRetrieveUserCertificate::NewL(RFs& aFs,
+ CConsoleBase& aConsole,
+ Output& aOut,
+ const TTestActionSpec& aTestActionSpec)
+ {
+ CDeleteRetrieveUserCertificate* self =
+ new(ELeave) CDeleteRetrieveUserCertificate(aFs, aConsole, aOut);
+ CleanupStack::PushL(self);
+ self->ConstructL(aTestActionSpec);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CDeleteRetrieveUserCertificate::CDeleteRetrieveUserCertificate(RFs& aFs, CConsoleBase& aConsole,
+ Output& aOut)
+ :CDeleteRetrieveCertificate(aFs, aConsole, aOut)
+ {
+ }
+
+void CDeleteRetrieveUserCertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
+ {
+ CSubscriberAction::ConstructL(aTestActionSpec);
+ iCertlisted = new(ELeave) RPointerArray<HBufC8>;
+ iFilter = CCertAttributeFilter::NewL();
+ TInt pos = 0;
+ TInt err = KErrNone;
+ TPtrC8 pLabel = Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart, KCertLabelEnd, pos, err);
+ if (err != KErrNone)
+ {
+ User::Leave(err);
+ }
+ iCertLabel.Copy(pLabel);
+
+ // Set expected result
+ HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
+ TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
+ Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
+ CleanupStack::PopAndDestroy(result);
+ }
+
+void CDeleteRetrieveUserCertificate::GetCerts(TRequestStatus& aStatus)
+ {
+ CertStore().List(iCertInfos, *iFilter, aStatus);
+ }
+
+void CDeleteRetrieveUserCertificate::RetrieveCerts(TRequestStatus& aStatus)
+ {
+ TRequestStatus* status = &aStatus;
+ TInt ix = KErrNotFound;
+ TInt count = iCertInfos.Count();
+ for (TInt i = 0; i < count; i++)
+ {
+ if (iCertInfos[i]->Label() == iCertLabel)
+ {
+ ix = i;
+ break;
+ }
+ }
+ if (ix == KErrNotFound)
+ {
+ User::RequestComplete(status, ix);
+ }
+ else
+ {
+ iCertInfoToRetrieve = iCertInfos[ix];
+
+ HBufC8* buf = HBufC8::NewLC(iCertInfoToRetrieve->Size());
+ User::LeaveIfError(iCertlisted->Append(buf));
+ CleanupStack::Pop();//buf
+ //__ASSERT_DEBUG(!iBuf, User::Panic(_L("CListCACertificates"), 1));
+ iBuf = new(ELeave) TPtr8(buf->Des());
+ CertStore().Retrieve(*iCertInfoToRetrieve, *iBuf, aStatus);
+ }
+ }
+
+CDeleteRetrieveUserCertificate::~CDeleteRetrieveUserCertificate()
+ {
+ iCertInfos.Close();
+ delete iFilter;
+ if (iCertlisted)
+ {
+ iCertlisted->ResetAndDestroy();
+ delete iCertlisted;
+ }
+ delete iBuf;
+ }
+
+void CDeleteRetrieveUserCertificate::DeleteCert(TRequestStatus& aStatus)
+ {
+ TRequestStatus* status = &aStatus;
+ TInt ix = KErrNotFound;
+ TInt count = iCertInfos.Count();
+ for (TInt i = 0; i < count; i++)
+ {
+ if (iCertInfos[i]->Label() == iCertLabel)
+ {
+ ix = i;
+ break;
+ }
+ }
+ if (ix == KErrNotFound)
+ {
+ User::RequestComplete(status, ix);
+ }
+ else
+ {
+ CCTCertInfo* certInfo = iCertInfos[ix];
+ UnifiedCertStore().Remove(*certInfo, aStatus);
+ }
+ }
+
+void CDeleteRetrieveUserCertificate::DoReportAction()
+ {
+ iOut.writeString(_L("Deleting user certificate..."));
+ iOut.writeNewLine();
+ iOut.writeString(_L("\tLabel = "));
+ iOut.writeString(iCertLabel);
+ iOut.writeNewLine();
+ iOut.writeNewLine();
+ }
+
+void CDeleteRetrieveUserCertificate::DoCheckResult(TInt aError)
+ {
+ if (iFinished)
+ {
+ if (aError == KErrNone && iResult)
+ {
+ iConsole.Write(_L("\tuser cert deleted successfully\n"));
+ iOut.writeString(_L("\tuser cert deleted successfully"));
+ iOut.writeNewLine();
+ iOut.writeNewLine();
+ }
+ else
+ {
+ if (iResult)
+ {
+ iConsole.Write(_L("\tnot retrieved but expected\n"));
+ iOut.writeString(_L("\tCA OK"));
+ }
+ else
+ {
+ iConsole.Write(_L("\tuser cert deleted successfully\n"));
+ iOut.writeString(_L("\tuser cert deleted successfully"));
+ iOut.writeNewLine();
+ iOut.writeNewLine();
+ }
+ }
+ }
+ }