os/security/cryptoservices/certificateandkeymgmt/tcertstore/T_unifiedcertstoreremove.cpp
First public contribution.
2 * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of the License "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
23 #include "t_unifiedcertstoreremove.h"
24 #include "t_certstoredefs.h"
26 #include "t_certstoreout.h"
27 #include <ccertattributefilter.h>
30 /////////////////////////////////////////////////////////////////////////////////
32 /////////////////////////////////////////////////////////////////////////////////
35 CTestAction* CDeleteCertificate::NewL(RFs& aFs,
36 CConsoleBase& aConsole,
38 const TTestActionSpec& aTestActionSpec)
40 CDeleteCertificate* self = new(ELeave) CDeleteCertificate(aFs, aConsole, aOut);
41 CleanupStack::PushL(self);
42 self->ConstructL(aTestActionSpec);
43 CleanupStack::Pop(self);
47 CDeleteCertificate::CDeleteCertificate(RFs& aFs, CConsoleBase& aConsole,
49 : CSubscriberAction(aFs, aConsole, aOut), iState(EIdle),iCertDeleteType(NULL)
53 void CDeleteCertificate::PerformAction(TRequestStatus& aStatus)
55 if (aStatus != KErrNone)
64 if (iCertInfos.Count() > 0)
66 iCertInfos.Close(); // JCS added for multiple delete case
69 iState = EGettingCerts;
76 if (iNotificationSubscribed)
80 iNotifier = CCertStoreChangeNotifier::NewL(iNotifierFlag);
81 iNotifier->StartNotification();
83 iState = ECheckNotification;
93 case ECheckNotification:
98 TRequestStatus* status = &aStatus;
99 User::RequestComplete(status, KErrNone);
103 iNotifier->SetCompleteStatus(&aStatus);
111 if (aStatus == iExpectedResult)
119 if (aStatus == KErrNoMemory)
127 TRequestStatus* status = &aStatus;
128 User::RequestComplete(status, aStatus.Int());
137 void CDeleteCertificate::PerformCancel()
142 CertStore().CancelList();
144 case ECheckNotification:
147 // We /may/ be deleting a cert in these states - fortunately cancel is lenient
148 UnifiedCertStore().CancelRemove();
156 void CDeleteCertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
158 CSubscriberAction::ConstructL(aTestActionSpec);
160 iFilter = CCertAttributeFilter::NewL();
162 TInt err1 = KErrNone;
164 TPtrC8 pLabel1 = Input::ParseElement(aTestActionSpec.iActionBody, KCertTypeStart, KCertTypeEnd, pos, err1);
168 iCertDeleteType = HBufC8::NewL(pLabel1.Size());
169 *iCertDeleteType = pLabel1;
173 TInt err2 = KErrNone;
174 TPtrC8 pLabel2 = Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart, KCertLabelEnd, pos, err2);
175 if (err2 != KErrNone)
180 iCertLabel.Copy(pLabel2);
181 if (iCertLabel.Compare(_L("*.*"))==0) // delete all certs
182 {// Check that the flag has been set
183 TPtrC8 pDeleteAll = Input::ParseElement(aTestActionSpec.iActionBody, KDeleteAllStart, KDeleteAllEnd, pos, err1);
184 if (pDeleteAll!=KNullDesC8)
186 TLex8 lexer(pDeleteAll);
189 iDeleteAllCerts = (boolVal > 0) ? ETrue : EFalse;
192 else if( err1 != KErrNone && err1 != KErrNotFound)
197 // Set expected result
198 HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
199 TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
200 Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
201 CleanupStack::PopAndDestroy(result);
204 void CDeleteCertificate::GetCerts(TRequestStatus& aStatus)
206 CertStore().List(iCertInfos, *iFilter, aStatus);
209 CDeleteCertificate::~CDeleteCertificate()
211 delete iCertDeleteType;
216 void CDeleteCertificate::DeleteCert(TRequestStatus& aStatus)
218 TInt ix = KErrNotFound;
219 TInt count = iCertInfos.Count();
220 for (TInt i = count-1; i >= 0 ; i--)
223 {// Just delete the first one we come across
224 if (i>=0) // Still some certificates to delete
225 { // Set the state back to continue
232 // Only delete if there's a label match and the certificate is of specified type
233 else if (iCertInfos[i]->Label() == iCertLabel && CheckCertType(*iCertInfos[i]) )
240 TRequestStatus* status = &aStatus;
241 if (ix == KErrNotFound)
243 TInt result = KErrNone;
247 else if(iCertDeleteType == NULL)
248 result = KErrNotSupported;
250 result = KErrNotFound;
252 User::RequestComplete(status, result);
256 iCertInfoToDelete = iCertInfos[ix];
257 UnifiedCertStore().Remove(*iCertInfos[ix], aStatus);
261 TBool CDeleteCertificate::CheckCertType( CCTCertInfo& aCertInfo )
263 if(iCertDeleteType == NULL)
266 TBool returnValue = EFalse;
267 switch(aCertInfo.CertificateOwnerType())
270 if(iCertDeleteType->Compare(KCACert) == 0 )
273 case EUserCertificate:
274 if(iCertDeleteType->Compare(KUserCert) == 0 )
277 case EPeerCertificate:
278 if(iCertDeleteType->Compare(KPeerCert) == 0 )
285 void CDeleteCertificate::DoReportAction()
287 iOut.writeString(_L("Deleting certificate..."));
289 iOut.writeString(_L("\tLabel = "));
290 iOut.writeString(iCertLabel);
295 void CDeleteCertificate::DoCheckResult(TInt aError)
299 if (aError == KErrNone && iCertInfoToDelete)
301 switch (iCertInfoToDelete->CertificateOwnerType())
304 iConsole.Write(_L("\tCA certificate deleted successfully\n"));
305 iOut.writeString(_L("\tCA certificate deleted successfully"));
308 case EUserCertificate:
309 iConsole.Write(_L("\tUser certificate deleted successfully\n"));
310 iOut.writeString(_L("\tUser certificate deleted successfully"));
313 case EPeerCertificate:
314 iConsole.Write(_L("\tPeer certificate deleted successfully\n"));
315 iOut.writeString(_L("\tPeer certificate deleted successfully"));
318 iConsole.Write(_L("\tUnknown owner certificate deleted successfully\n"));
319 iOut.writeString(_L("\tUnknown owner certificate deleted successfully"));
328 void CDeleteCertificate::Reset()
335 /////////////////////////////////////////////////////////////////////////////////
336 //CDeleteRetrieveCertificate
337 /////////////////////////////////////////////////////////////////////////////////
338 CDeleteRetrieveCertificate::CDeleteRetrieveCertificate(RFs& aFs, CConsoleBase& aConsole,
340 : CSubscriberAction(aFs, aConsole, aOut), iState(EIdle)
344 void CDeleteRetrieveCertificate::PerformAction(TRequestStatus& aStatus)
346 TRequestStatus* status = &aStatus;
351 iState = EDeletingCert;
354 if (aStatus == KErrNoMemory)
362 if (iNotificationSubscribed)
364 iNotifier = CCertStoreChangeNotifier::NewL(iNotifierFlag);
365 iNotifier->StartNotification();
366 iState = ECheckNotification;
370 iState = EGettingCerts;
377 case ECheckNotification:
390 iState = EGettingCerts;
392 TRequestStatus* status = &aStatus;
393 User::RequestComplete(status, ret);
400 RetrieveCerts(aStatus);
405 if (aStatus == iExpectedResult)
413 if (aStatus == KErrNoMemory)
421 User::RequestComplete(status, aStatus.Int());
426 //some kind of error behaviour
431 void CDeleteRetrieveCertificate::PerformCancel()
435 void CDeleteRetrieveCertificate::Reset()
437 __ASSERT_DEBUG(EFalse, User::Panic(_L("CDeleteRetrieveCertificate::Reset()"), 1));
440 ////////////////////////////////////////////////////////////////////////////////
441 //CDeleteCACertificate
442 //////////////////////////////////////////////////////////////////////////////////
444 CTestAction* CDeleteRetrieveCACertificate::NewL(RFs& aFs,
445 CConsoleBase& aConsole,
447 const TTestActionSpec& aTestActionSpec)
449 CDeleteRetrieveCACertificate* self =
450 new(ELeave) CDeleteRetrieveCACertificate(aFs, aConsole, aOut);
451 CleanupStack::PushL(self);
452 self->ConstructL(aTestActionSpec);
453 CleanupStack::Pop(self);
457 CDeleteRetrieveCACertificate::CDeleteRetrieveCACertificate(RFs& aFs, CConsoleBase& aConsole,
459 :CDeleteRetrieveCertificate(aFs, aConsole, aOut)
463 void CDeleteRetrieveCACertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
465 CSubscriberAction::ConstructL(aTestActionSpec);
466 iCertlisted = new(ELeave) RPointerArray<HBufC8>;
467 iFilter = CCertAttributeFilter::NewL();
470 TPtrC8 pLabel = Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart, KCertLabelEnd, pos, err);
475 iCertLabel.Copy(pLabel);
477 // Set expected result
480 HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
481 TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
482 Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
483 CleanupStack::PopAndDestroy(result);
486 void CDeleteRetrieveCACertificate::GetCerts(TRequestStatus& aStatus)
488 CertStore().List(iCertInfos, *iFilter, aStatus);
491 void CDeleteRetrieveCACertificate::RetrieveCerts(TRequestStatus& aStatus)
493 TRequestStatus* status = &aStatus;
494 TInt ix = KErrNotFound;
495 TInt count = iCertInfos.Count();
496 for (TInt i = 0; i < count; i++)
498 if (iCertInfos[i]->Label() == iCertLabel)
504 if (ix == KErrNotFound)
506 User::RequestComplete(status, ix);
510 iCertInfoToRetrieve = iCertInfos[ix];
512 HBufC8* buf = HBufC8::NewLC(iCertInfoToRetrieve->Size());
513 User::LeaveIfError(iCertlisted->Append(buf));
514 CleanupStack::Pop();//buf
515 __ASSERT_DEBUG(!iBuf, User::Panic(_L("CListCACertificates"), 1));
516 iBuf = new(ELeave) TPtr8(buf->Des());
517 CertStore().Retrieve(*iCertInfoToRetrieve, *iBuf, aStatus);
521 CDeleteRetrieveCACertificate::~CDeleteRetrieveCACertificate()
527 iCertlisted->ResetAndDestroy();
533 void CDeleteRetrieveCACertificate::DeleteCert(TRequestStatus& aStatus)
535 TRequestStatus* status = &aStatus;
536 TInt ix = KErrNotFound;
537 TInt count = iCertInfos.Count();
538 for (TInt i = 0; i < count; i++)
540 if (iCertInfos[i]->Label() == iCertLabel)
546 if (ix == KErrNotFound)
548 User::RequestComplete(status, ix);
552 iCertInfoToDelete = iCertInfos[ix];
553 UnifiedCertStore().Remove(*iCertInfoToDelete, aStatus);
557 void CDeleteRetrieveCACertificate::DoReportAction()
559 iOut.writeString(_L("Deleting certificate..."));
561 iOut.writeString(_L("\tLabel = "));
562 iOut.writeString(iCertLabel);
567 void CDeleteRetrieveCACertificate::DoCheckResult(TInt aError)
571 if (aError == KErrNone && iResult)
573 switch (iCertInfoToDelete->CertificateOwnerType())
576 iConsole.Write(_L("\tCA certificate deleted successfully\n"));
577 iOut.writeString(_L("\tCA certificate deleted successfully"));
580 case EUserCertificate:
581 iConsole.Write(_L("\tUser certificate deleted successfully\n"));
582 iOut.writeString(_L("\tUser certificate deleted successfully"));
586 iConsole.Write(_L("\tUnknown owner certificate deleted successfully\n"));
587 iOut.writeString(_L("\tUnknown owner certificate deleted successfully"));
595 iConsole.Write(_L("\tCA OK\n"));
596 iOut.writeString(_L("\tCA OK"));
604 ////////////////////////////////////////////////////////////////////////////////
605 //CDeleteUserCertificate
606 //////////////////////////////////////////////////////////////////////////////////
607 CTestAction* CDeleteRetrieveUserCertificate::NewL(RFs& aFs,
608 CConsoleBase& aConsole,
610 const TTestActionSpec& aTestActionSpec)
612 CDeleteRetrieveUserCertificate* self =
613 new(ELeave) CDeleteRetrieveUserCertificate(aFs, aConsole, aOut);
614 CleanupStack::PushL(self);
615 self->ConstructL(aTestActionSpec);
616 CleanupStack::Pop(self);
620 CDeleteRetrieveUserCertificate::CDeleteRetrieveUserCertificate(RFs& aFs, CConsoleBase& aConsole,
622 :CDeleteRetrieveCertificate(aFs, aConsole, aOut)
626 void CDeleteRetrieveUserCertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
628 CSubscriberAction::ConstructL(aTestActionSpec);
629 iCertlisted = new(ELeave) RPointerArray<HBufC8>;
630 iFilter = CCertAttributeFilter::NewL();
633 TPtrC8 pLabel = Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart, KCertLabelEnd, pos, err);
638 iCertLabel.Copy(pLabel);
640 // Set expected result
641 HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
642 TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
643 Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
644 CleanupStack::PopAndDestroy(result);
647 void CDeleteRetrieveUserCertificate::GetCerts(TRequestStatus& aStatus)
649 CertStore().List(iCertInfos, *iFilter, aStatus);
652 void CDeleteRetrieveUserCertificate::RetrieveCerts(TRequestStatus& aStatus)
654 TRequestStatus* status = &aStatus;
655 TInt ix = KErrNotFound;
656 TInt count = iCertInfos.Count();
657 for (TInt i = 0; i < count; i++)
659 if (iCertInfos[i]->Label() == iCertLabel)
665 if (ix == KErrNotFound)
667 User::RequestComplete(status, ix);
671 iCertInfoToRetrieve = iCertInfos[ix];
673 HBufC8* buf = HBufC8::NewLC(iCertInfoToRetrieve->Size());
674 User::LeaveIfError(iCertlisted->Append(buf));
675 CleanupStack::Pop();//buf
676 //__ASSERT_DEBUG(!iBuf, User::Panic(_L("CListCACertificates"), 1));
677 iBuf = new(ELeave) TPtr8(buf->Des());
678 CertStore().Retrieve(*iCertInfoToRetrieve, *iBuf, aStatus);
682 CDeleteRetrieveUserCertificate::~CDeleteRetrieveUserCertificate()
688 iCertlisted->ResetAndDestroy();
694 void CDeleteRetrieveUserCertificate::DeleteCert(TRequestStatus& aStatus)
696 TRequestStatus* status = &aStatus;
697 TInt ix = KErrNotFound;
698 TInt count = iCertInfos.Count();
699 for (TInt i = 0; i < count; i++)
701 if (iCertInfos[i]->Label() == iCertLabel)
707 if (ix == KErrNotFound)
709 User::RequestComplete(status, ix);
713 CCTCertInfo* certInfo = iCertInfos[ix];
714 UnifiedCertStore().Remove(*certInfo, aStatus);
718 void CDeleteRetrieveUserCertificate::DoReportAction()
720 iOut.writeString(_L("Deleting user certificate..."));
722 iOut.writeString(_L("\tLabel = "));
723 iOut.writeString(iCertLabel);
728 void CDeleteRetrieveUserCertificate::DoCheckResult(TInt aError)
732 if (aError == KErrNone && iResult)
734 iConsole.Write(_L("\tuser cert deleted successfully\n"));
735 iOut.writeString(_L("\tuser cert deleted successfully"));
743 iConsole.Write(_L("\tnot retrieved but expected\n"));
744 iOut.writeString(_L("\tCA OK"));
748 iConsole.Write(_L("\tuser cert deleted successfully\n"));
749 iOut.writeString(_L("\tuser cert deleted successfully"));