--- 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