eapol/eapol_framework/eapol_symbian/am/type/tls_peap/symbian/plugin/src/EapTlsPeapCertFetcher.cpp
branchRCL_3
changeset 18 bad0cc58d154
parent 2 1c7bc153c08e
child 19 c74b3d9f6b9e
--- a/eapol/eapol_framework/eapol_symbian/am/type/tls_peap/symbian/plugin/src/EapTlsPeapCertFetcher.cpp	Thu Aug 19 09:58:27 2010 +0300
+++ b/eapol/eapol_framework/eapol_symbian/am/type/tls_peap/symbian/plugin/src/EapTlsPeapCertFetcher.cpp	Tue Aug 31 15:16:37 2010 +0300
@@ -16,7 +16,7 @@
 */
 
 /*
-* %version: 31 %
+* %version: %
 */
 
 // This is enumeration of EAPOL source code.
@@ -32,7 +32,8 @@
 
 #include "EapTlsPeapCertFetcher.h"
 #include <EapTlsPeapUiCertificates.h>
-#include "eap_am_trace_symbian.h"
+#include <EapTraceSymbian.h>
+#include <AbsEapCertificateFetcher.h>
 
 #include <x509cert.h>
 #include <X509CertNameParser.h>
@@ -41,8 +42,11 @@
 
 // ================= MEMBER FUNCTIONS =======================
 
-CEapTlsPeapCertFetcher* CEapTlsPeapCertFetcher::NewL(CEapTlsPeapUiCertificates* const aParent)
+CEapTlsPeapCertFetcher* CEapTlsPeapCertFetcher::NewL(CAbsEapCertificateFetcher* const aParent)
 {
+	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::NewL(CAbsEapCertificateFetcher)\n")));
+	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::NewL(CAbsEapCertificateFetcher)\n"));
+
 	CEapTlsPeapCertFetcher* self = new(ELeave) CEapTlsPeapCertFetcher(aParent);
 	CleanupStack::PushL(self);
 	self->ConstructL();
@@ -55,6 +59,9 @@
 // DON'T USE THIS FUNCTION. THIS IS ONLY FOR EapTlsPeapUtils. 	
 CEapTlsPeapCertFetcher* CEapTlsPeapCertFetcher::NewL()
 {
+	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::NewL()\n")));
+	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::NewL()\n"));
+
 	CEapTlsPeapCertFetcher* self = new(ELeave) CEapTlsPeapCertFetcher();
 	CleanupStack::PushL(self);
 
@@ -83,12 +90,18 @@
 
 //--------------------------------------------------
 
-CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher(CEapTlsPeapUiCertificates* const aParent)
+CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher(CAbsEapCertificateFetcher* const aParent)
 : CActive(CActive::EPriorityStandard)
+, iState(EGetCertificatesNone)
 , iParent(aParent)
 , iEncodedCertificate(0)
 , iCertPtr(0,0)
+, iOwnertype(EUserCertificate)
+, iCertInfoIndex(0)
 {
+	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher(CAbsEapCertificateFetcher)\n")));
+	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher(CAbsEapCertificateFetcher)\n"));
+
 }
 
 //--------------------------------------------------
@@ -96,16 +109,25 @@
 // DON'T USE THIS FUNCTION. THIS IS ONLY FOR EapTlsPeapUtils. 	
 CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher()
 : CActive(CActive::EPriorityStandard)
+, iState(EGetCertificatesNone)
 , iParent(NULL)
 , iEncodedCertificate(0)
 , iCertPtr(0,0)
+, iOwnertype(EUserCertificate)
+, iCertInfoIndex(0)
 {
+	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher()\n")));
+	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher()\n"));
+
 }
 
 //--------------------------------------------------
 
 void CEapTlsPeapCertFetcher::ConstructL()
 {
+	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::ConstructL()\n")));
+	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::ConstructL()\n"));
+
 	User::LeaveIfError(iFs.Connect());
 
 	CActiveScheduler::Add(this);
@@ -119,6 +141,9 @@
 
 CEapTlsPeapCertFetcher::~CEapTlsPeapCertFetcher()
 {
+	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::~CEapTlsPeapCertFetcher()\n")));
+	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::~CEapTlsPeapCertFetcher()\n"));
+
 	// Delete iCertInfos
 	for (TInt i = 0; i < iCertInfos.Count(); i++)
 	{
@@ -126,16 +151,19 @@
 	}
 	iCertInfos.Reset();
 
-	iCACerts.Reset();
+	iCACerts.ResetAndDestroy();
 
-	iUserCerts.Reset();
-		
+	iUserCerts.ResetAndDestroy();
+
 	delete iCertFilter;
-	
+	iCertFilter = 0;
+
 	delete iCertStore;
-	
-	delete iEncodedCertificate;	
-	
+	iCertStore = 0;
+
+	delete iEncodedCertificate;
+	iEncodedCertificate = 0;
+
 	iFs.Close();
 
 	if(IsActive())
@@ -148,6 +176,13 @@
 
 void CEapTlsPeapCertFetcher::GetCertificatesL()
 {	
+	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::GetCertificatesL()\n")));
+	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::GetCertificatesL()\n"));
+
+	iCACerts.ResetAndDestroy();
+
+	iUserCerts.ResetAndDestroy();
+
 	iState = EGetCertificatesInitStore;
 	if (iCertStore == 0)
 	{
@@ -162,149 +197,145 @@
 	SetActive();
 }
 
+//--------------------------------------------------
 
 void CEapTlsPeapCertFetcher::DoCancel()
 {
+	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::DoCancel()\n")));
+	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::DoCancel()\n"));
+
+}
+
+//--------------------------------------------------
+
+void CEapTlsPeapCertFetcher::InitializeQuery()
+{
+	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::InitializeQuery(): iOwnertype=%d\n"),
+		iOwnertype));
+	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::InitializeQuery()\n"));
+
+	// Delete iCertInfos
+	for (TInt i = 0; i < iCertInfos.Count(); i++)
+	{
+		iCertInfos[i]->Release();
+	}
+	iCertInfos.Reset();
+
+	delete iCertFilter;
+	iCertFilter = 0;
+
+	TRAPD(error, iCertFilter = CCertAttributeFilter::NewL());
+	if (error != KErrNone)
+	{
+		// Complete with empty lists
+		EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: CEapTlsPeapCertFetcher::InitializeQuery() -  Complete with empty lists Error:%d, iUserCerts.Count()=%d, iCACerts.Count()=%d\n"),
+			error,
+			iUserCerts.Count(),
+			iCACerts.Count()) );
+		TRAP(error, iParent->CompleteReadCertificatesL(iUserCerts, iCACerts));
+		return;
+	}
+	iCertFilter->SetFormat(EX509Certificate);
+
+	iCertFilter->SetOwnerType(iOwnertype);
+
+	iCertInfoIndex = 0;
+
+	iState = EGetCertificatesGetCertList;
+
+	iCertStore->List(
+		iCertInfos,
+		*iCertFilter, 
+		iStatus);
+
+	SetActive();		
 }
 
 //--------------------------------------------------
 
 void CEapTlsPeapCertFetcher::RunL()
 {	
-	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL - iStatus.Int()=%d, iState=%d \n"),
-	iStatus.Int() , iState));
-	if( iState == EGetSymbianSubjectKeyId )
-	{
-		// Only for GetSymbianSubjectKeyIdL.
-		iWait.AsyncStop(); // This is needed to continue the execution after Wait.Start()
-		return; // No need to proceed further.
-	}
-	
-	if( iState == EGetCertificatesRetrieveCert)
-	{
-		// This is executed when certificate details are being retrieved.
-		iWait.AsyncStop(); // This is needed to continue the execution after Wait.Start()
-		return; // No need to proceed further.
-	}
-	
-	int i;
-	TInt err(KErrNone);
+	EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL(): - iStatus.Int()=%d, iState=%d \n"),
+		iStatus.Int() , iState));
+	EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::RunL()\n"));
+
+	//int i;
+	TInt error(KErrNone);
 		
 	// This causes panic if leaves
 	if (iStatus.Int() != KErrNone)
 	{
-RDebug::Print(_L("CEapTlsPeapCertFetcher::RunL() -- don't leave..."));
+		EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL() -- don't leave...")));
 	}
 	
 	switch (iState)
 	{
 	case EGetCertificatesInitStore:
 		{
-			// Delete iCertInfos
-			for (TInt i = 0; i < iCertInfos.Count(); i++)
-			{
-				iCertInfos[i]->Release();
-			}
-			iCertInfos.Reset();
-		
-			delete iCertFilter;
-			iCertFilter = 0;
-		
-			TRAP(err, iCertFilter = CCertAttributeFilter::NewL());
-			if (err != KErrNone)
-			{
-				// Complete with empty lists
-				TInt err(KErrNone);
-				TRAP(err, iParent->CompleteReadCertificatesL(iUserCerts, iCACerts));
-				break;
-			}
-			iCertFilter->SetFormat(EX509Certificate);
+			EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL(): - EGetCertificatesInitStore\n")));
 
-			iState = EGetCertificatesGetCertList;
-			iCertStore->List(
-				iCertInfos,
-				*iCertFilter, 
-				iStatus);
-			SetActive();		
+			// First get the User certificates.
+			iOwnertype = EUserCertificate;
+			InitializeQuery();
 		}
 		break;
 
-	case EGetCertificatesGetCertList:
+	case EGetCertificatesRetrieveCert:
 		{			
-			EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL - EGetCertificatesGetCertList - Symbian cert store found %d certs in device\n"),
-			iCertInfos.Count()));
-		
-			if(0 == iCertInfos.Count())
+			EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL(): - EGetCertificatesRetrieveCert - Symbian cert store found %d certs in device\n"),
+				iCertInfos.Count()));
+
+			EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL() - iWait.Start() returned, iStatus.Int()=%d \n"),iStatus.Int() ) );
+
+			CCTCertInfo* CertInfo = iCertInfos[iCertInfoIndex];
+			CCertificate* cert = NULL;
+
+			if ( iStatus.Int() == KErrNone )
 			{
-				EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR : CEapTlsPeapCertFetcher::RunL - SERIOUS PROBLEM - Symbian cert store couldn't find any certs in device\n")));				
-			}
-		
-			for (i = 0; i < iCertInfos.Count(); i++)
-			{				
-			    CCTCertInfo* CertInfo;
-				CertInfo = iCertInfos[i];
-				iEncodedCertificate->Des().SetLength(0);
-				
-				TRAPD(err, iEncodedCertificate = iEncodedCertificate->ReAllocL(iCertInfos[i]->Size()));
-				if (err != KErrNone)
+				switch ( CertInfo->CertificateFormat() )
 				{
-					EAP_TRACE_DEBUG_SYMBIAN((_L("\nCEapTlsPeapCertFetcher::RunL() -  EGetCertificatesGetCertList - leave from iEncodedCertificate->ReAllocL Error:%d\n"), err ) );
-				}		
-				iCertPtr.Set(iEncodedCertificate->Des());
-
-				EAP_TRACE_DEBUG_SYMBIAN((_L("\nCEapTlsPeapCertFetcher::RunL() - EGetCertificatesGetCertList - Retreiving cert %d\n"), i ) );
-				
-			    iCertStore->Retrieve( *CertInfo, iCertPtr, iStatus);
-			    
-			    iState = EGetCertificatesRetrieveCert;
-
-			    SetActive();
-			    iWait.Start();
-			 	
-				EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL() - iWait.Start() returned, iStatus.Int()=%d \n"),iStatus.Int() ) );
-
-			 	CCertificate* cert = NULL;
+				case EX509Certificate:
+					{
+						TRAPD(error, cert = CX509Certificate::NewL( iCertPtr ));
+						if (error != KErrNone)
+						{
+							EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: CEapTlsPeapCertFetcher::RunL() - EGetCertificatesGetCertList - leave from CX509Certificate::NewL Label:%S Error:%d\n"),
+							&(CertInfo->Label()),
+							error ) );
 
-			    if ( iStatus.Int() == KErrNone )
-		        {
-			        switch ( CertInfo->CertificateFormat() )
-		            {
-		            case EX509Certificate:
-		                {
-		                TRAPD(err, cert = CX509Certificate::NewL( iCertPtr ));
-			            if (err != KErrNone)
-			               	EAP_TRACE_DEBUG_SYMBIAN((_L("\nCEapTlsPeapCertFetcher::RunL() - EGetCertificatesGetCertList - leave from CX509Certificate::NewL Label:%S Error:%d\n"),&(CertInfo->Label()), err ) );
-			            break;
-		                }
-		            default:
-		                {
-		                	// Only  X509 type of certificates are supported at the moment.
-		                	// This won't be happening ever since we have used a filter while getting the certificate list.
-							EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL() - Unsupported Certificate - Not X509\n") ) );
-							
-			                break;
-		                }
-		            }
-		        }
-		        else
-		        {
-					EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL() - Error from Certificate retrieve, iStatus.Int()=%d\n"), iStatus.Int() ) );
-		        }
+							cert = NULL;
+						}
+					break;
+					}
+				default:
+					{
+		                // Only  X509 type of certificates are supported at the moment.
+		                // This won't be happening ever since we have used a filter while getting the certificate list.
+						EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: CEapTlsPeapCertFetcher::RunL() - Unsupported Certificate - Not X509\n") ) );
+						
+						cert = NULL;
+					}
+				}
+			}
+			else
+			{
+				EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: CEapTlsPeapCertFetcher::RunL() - Error from Certificate retrieve, iStatus.Int()=%d\n"), iStatus.Int() ) );
+			}
 
-				if( cert == NULL )
-				{
-					// Some problem above. Skip the below and go for the next certificate.
-					continue;
-				}							
+			if( cert != NULL )
+			{
+				HBufC* pri = NULL;
+				HBufC* sec = NULL;
 			
-                HBufC* pri = NULL;
-                HBufC* sec = NULL;
-			
-				CleanupStack::PushL( cert );
+				CleanupStack::PushL(cert);
 				
-                X509CertNameParser::PrimaryAndSecondaryNameL( *((CX509Certificate*)cert), pri, sec, CertInfo->Label());
+				X509CertNameParser::PrimaryAndSecondaryNameL( *((CX509Certificate*)cert), pri, sec, CertInfo->Label());
 	
-				CleanupStack::PopAndDestroy(); // cert		
+				CleanupStack::PopAndDestroy(cert);
+
+				CleanupStack::PushL(pri);
+				CleanupStack::PushL(sec);
+
 
 				EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL() - Label=%S, Pri name=%S,Length=%d, Sec name=%S,Length=%d\n"),
 					 &(CertInfo->Label()), pri, pri->Length(), sec, sec->Length() ) );
@@ -312,45 +343,120 @@
 				EAP_TRACE_DATA_DEBUG_SYMBIAN( ( "CEapTlsPeapCertFetcher::RunL() - Sub Key Id:", (CertInfo->SubjectKeyId().Ptr()), 
 						(CertInfo->SubjectKeyId().Size()) ) );
 
-				SCertEntry certEntry;
-							
-				certEntry.iLabel.Copy(iCertInfos[i]->Label());
-				certEntry.iSubjectKeyId.Copy(iCertInfos[i]->SubjectKeyId());
-				
+				EapCertificateEntry * const certEntry = new EapCertificateEntry;
+				if (certEntry == 0)
+				{
+					User::Leave(KErrNoMemory);
+				}
+				CleanupStack::PushL(certEntry);
+
+				certEntry->SetLabel(CertInfo->Label());
+				certEntry->SetSubjectKeyId(CertInfo->SubjectKeyId());
+
 				// Copy the new fields. Primary and secondary name.				
-				certEntry.iPrimaryName.Copy( pri->Des().Left(KMaxNameLength ) );
-				certEntry.iSecondaryName.Copy( sec->Des().Left(KMaxNameLength ) );
-				
-				delete pri;
-				delete sec;
-				
-				if (iCertInfos[i]->CertificateOwnerType() == ECACertificate)
+				certEntry->SetPrimaryName(pri->Des().Left(KMaxCertNameLength));
+				certEntry->SetSecondaryName(sec->Des().Left(KMaxCertNameLength));
+
+				if (CertInfo->CertificateOwnerType() == ECACertificate)
+				{
+					EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL(): - CA certificate\n")));
+
+					certEntry->SetCertType(EapCertificateEntry::ECA);
+					error = iCACerts.Append(certEntry);	
+				}
+				else if (CertInfo->CertificateOwnerType() == EUserCertificate)
 				{
-					iCACerts.Append(certEntry);	
+					EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL(): - User certificate\n")));
+
+					certEntry->SetCertType(EapCertificateEntry::EUser);
+					error = iUserCerts.Append(certEntry);
+				}
+				else
+				{
+					EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL(): - Unknown certificate\n")));
+				}
+
+				if (error == KErrNone)
+				{
+					CleanupStack::Pop(certEntry);
+				}
+				else
+				{
+					CleanupStack::PopAndDestroy(certEntry);
 				}
-				else if (iCertInfos[i]->CertificateOwnerType() == EUserCertificate)
+
+				CleanupStack::PopAndDestroy(sec);
+				CleanupStack::PopAndDestroy(pri);
+
+			}
+
+			++iCertInfoIndex;
+		}
+
+		// Here MUST NOT be break. State EGetCertificatesGetCertList is run after the state EGetCertificatesRetrieveCert.
+
+	case EGetCertificatesGetCertList:
+		{			
+			EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL(): - EGetCertificatesGetCertList - Symbian cert store found %d certs in device, iCertInfoIndex=%d\n"),
+				iCertInfos.Count(),
+				iCertInfoIndex));
+		
+			if (iCertInfoIndex < iCertInfos.Count())
+			{				
+				CCTCertInfo* CertInfo = iCertInfos[iCertInfoIndex];
+
+				iEncodedCertificate->Des().SetLength(0);
+				
+				TRAPD(error, iEncodedCertificate = iEncodedCertificate->ReAllocL(CertInfo->Size()));
+				if (error != KErrNone)
 				{
-					iUserCerts.Append(certEntry);
-				}				
-			}
-			delete iCertFilter;
-			iCertFilter = 0;
+					EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: CEapTlsPeapCertFetcher::RunL() -  EGetCertificatesGetCertList - leave from iEncodedCertificate->ReAllocL Error:%d\n"), error ) );
+				}		
+				iCertPtr.Set(iEncodedCertificate->Des());
 
-			// Delete iCertInfos
-			for (TInt i = 0; i < iCertInfos.Count(); i++)
+				EAP_TRACE_DEBUG_SYMBIAN((_L("\nCEapTlsPeapCertFetcher::RunL() - EGetCertificatesGetCertList - Retreiving cert %d\n"), iCertInfoIndex ) );
+				
+				iState = EGetCertificatesRetrieveCert;
+
+				iCertStore->Retrieve( *CertInfo, iCertPtr, iStatus);
+
+				SetActive();
+			}
+			else if (iOwnertype == EUserCertificate)
+			{
+				// Next get the CA certificates.
+				iOwnertype = ECACertificate;
+				InitializeQuery();
+				return;
+			}
+			else
 			{
-				iCertInfos[i]->Release();
+				delete iCertFilter;
+				iCertFilter = 0;
+
+				// Delete iCertInfos
+				for (TInt i = 0; i < iCertInfos.Count(); i++)
+				{
+					iCertInfos[i]->Release();
+				}
+				iCertInfos.Reset();
+
+				EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL() -  EGetCertificatesGetCertList - Complete list, iUserCerts.Count()=%d, iCACerts.Count()=%d\n"),
+					iUserCerts.Count(),
+					iCACerts.Count()) );
+
+				TRAP(error, iParent->CompleteReadCertificatesL(iUserCerts, iCACerts));
+				// Ignore error on purpose.			
 			}
-			iCertInfos.Reset();
-			TRAP(err, iParent->CompleteReadCertificatesL(iUserCerts, iCACerts));
-			// Ignore error on purpose.			
 		}
 		break;
 	
 	default:
+		EAP_TRACE_DEBUG_SYMBIAN((_L("WARNING: CEapTlsPeapCertFetcher::RunL(): - default\n")));
 		break;
 	}
 	return;
 }
 
+//--------------------------------------------------
 // End of file