diff -r 30e048a7b597 -r bad0cc58d154 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 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 -#include "eap_am_trace_symbian.h" +#include +#include #include #include @@ -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