diff -r bad0cc58d154 -r c74b3d9f6b9e eapol/eapol_framework/eapol_symbian/am/type/tls_peap/symbian/plugin/src/EapTlsPeapCertFetcher.cpp --- a/eapol/eapol_framework/eapol_symbian/am/type/tls_peap/symbian/plugin/src/EapTlsPeapCertFetcher.cpp Tue Aug 31 15:16:37 2010 +0300 +++ b/eapol/eapol_framework/eapol_symbian/am/type/tls_peap/symbian/plugin/src/EapTlsPeapCertFetcher.cpp Wed Sep 01 12:23:57 2010 +0100 @@ -16,7 +16,7 @@ */ /* -* %version: % +* %version: 31 % */ // This is enumeration of EAPOL source code. @@ -32,8 +32,7 @@ #include "EapTlsPeapCertFetcher.h" #include -#include -#include +#include "eap_am_trace_symbian.h" #include #include @@ -42,11 +41,8 @@ // ================= MEMBER FUNCTIONS ======================= -CEapTlsPeapCertFetcher* CEapTlsPeapCertFetcher::NewL(CAbsEapCertificateFetcher* const aParent) +CEapTlsPeapCertFetcher* CEapTlsPeapCertFetcher::NewL(CEapTlsPeapUiCertificates* 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(); @@ -59,9 +55,6 @@ // 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); @@ -90,18 +83,12 @@ //-------------------------------------------------- -CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher(CAbsEapCertificateFetcher* const aParent) +CEapTlsPeapCertFetcher::CEapTlsPeapCertFetcher(CEapTlsPeapUiCertificates* 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")); - } //-------------------------------------------------- @@ -109,25 +96,16 @@ // 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); @@ -141,9 +119,6 @@ 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++) { @@ -151,19 +126,16 @@ } iCertInfos.Reset(); - iCACerts.ResetAndDestroy(); - - iUserCerts.ResetAndDestroy(); - - delete iCertFilter; - iCertFilter = 0; + iCACerts.Reset(); + iUserCerts.Reset(); + + delete iCertFilter; + delete iCertStore; - iCertStore = 0; - - delete iEncodedCertificate; - iEncodedCertificate = 0; - + + delete iEncodedCertificate; + iFs.Close(); if(IsActive()) @@ -176,13 +148,6 @@ 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) { @@ -197,145 +162,149 @@ 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)); - EAP_TRACE_RETURN_STRING_SYMBIAN(_L("returns: CEapTlsPeapCertFetcher::RunL()\n")); - - //int i; - TInt error(KErrNone); + 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); // This causes panic if leaves if (iStatus.Int() != KErrNone) { - EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL() -- don't leave..."))); +RDebug::Print(_L("CEapTlsPeapCertFetcher::RunL() -- don't leave...")); } switch (iState) { case EGetCertificatesInitStore: { - EAP_TRACE_DEBUG_SYMBIAN((_L("CEapTlsPeapCertFetcher::RunL(): - EGetCertificatesInitStore\n"))); + // 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); - // First get the User certificates. - iOwnertype = EUserCertificate; - InitializeQuery(); + iState = EGetCertificatesGetCertList; + iCertStore->List( + iCertInfos, + *iCertFilter, + iStatus); + SetActive(); } break; - case EGetCertificatesRetrieveCert: + case EGetCertificatesGetCertList: { - 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; + 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("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) + { + EAP_TRACE_DEBUG_SYMBIAN((_L("\nCEapTlsPeapCertFetcher::RunL() - EGetCertificatesGetCertList - leave from iEncodedCertificate->ReAllocL Error:%d\n"), err ) ); + } + iCertPtr.Set(iEncodedCertificate->Des()); - if ( iStatus.Int() == KErrNone ) - { - switch ( CertInfo->CertificateFormat() ) - { - 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 ) ); + 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; - 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 ( 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() ) ); + } - if( cert != NULL ) - { - HBufC* pri = NULL; - HBufC* sec = NULL; + if( cert == NULL ) + { + // Some problem above. Skip the below and go for the next certificate. + continue; + } - CleanupStack::PushL(cert); + HBufC* pri = NULL; + HBufC* sec = NULL; + + CleanupStack::PushL( cert ); - X509CertNameParser::PrimaryAndSecondaryNameL( *((CX509Certificate*)cert), pri, sec, CertInfo->Label()); + X509CertNameParser::PrimaryAndSecondaryNameL( *((CX509Certificate*)cert), pri, sec, CertInfo->Label()); - CleanupStack::PopAndDestroy(cert); - - CleanupStack::PushL(pri); - CleanupStack::PushL(sec); - + CleanupStack::PopAndDestroy(); // cert 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() ) ); @@ -343,120 +312,45 @@ EAP_TRACE_DATA_DEBUG_SYMBIAN( ( "CEapTlsPeapCertFetcher::RunL() - Sub Key Id:", (CertInfo->SubjectKeyId().Ptr()), (CertInfo->SubjectKeyId().Size()) ) ); - EapCertificateEntry * const certEntry = new EapCertificateEntry; - if (certEntry == 0) - { - User::Leave(KErrNoMemory); - } - CleanupStack::PushL(certEntry); - - certEntry->SetLabel(CertInfo->Label()); - certEntry->SetSubjectKeyId(CertInfo->SubjectKeyId()); - + SCertEntry certEntry; + + certEntry.iLabel.Copy(iCertInfos[i]->Label()); + certEntry.iSubjectKeyId.Copy(iCertInfos[i]->SubjectKeyId()); + // Copy the new fields. Primary and secondary name. - 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) + certEntry.iPrimaryName.Copy( pri->Des().Left(KMaxNameLength ) ); + certEntry.iSecondaryName.Copy( sec->Des().Left(KMaxNameLength ) ); + + delete pri; + delete sec; + + if (iCertInfos[i]->CertificateOwnerType() == ECACertificate) { - 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); + iCACerts.Append(certEntry); } - else + else if (iCertInfos[i]->CertificateOwnerType() == EUserCertificate) { - CleanupStack::PopAndDestroy(certEntry); - } - - CleanupStack::PopAndDestroy(sec); - CleanupStack::PopAndDestroy(pri); - + iUserCerts.Append(certEntry); + } } - - ++iCertInfoIndex; - } - - // Here MUST NOT be break. State EGetCertificatesGetCertList is run after the state EGetCertificatesRetrieveCert. + delete iCertFilter; + iCertFilter = 0; - 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) - { - EAP_TRACE_DEBUG_SYMBIAN((_L("ERROR: CEapTlsPeapCertFetcher::RunL() - EGetCertificatesGetCertList - leave from iEncodedCertificate->ReAllocL Error:%d\n"), error ) ); - } - iCertPtr.Set(iEncodedCertificate->Des()); - - EAP_TRACE_DEBUG_SYMBIAN((_L("\nCEapTlsPeapCertFetcher::RunL() - EGetCertificatesGetCertList - Retreiving cert %d\n"), iCertInfoIndex ) ); - - iState = EGetCertificatesRetrieveCert; - - iCertStore->Retrieve( *CertInfo, iCertPtr, iStatus); - - SetActive(); + // Delete iCertInfos + for (TInt i = 0; i < iCertInfos.Count(); i++) + { + iCertInfos[i]->Release(); } - else if (iOwnertype == EUserCertificate) - { - // Next get the CA certificates. - iOwnertype = ECACertificate; - InitializeQuery(); - return; - } - else - { - 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