diff -r 29c8f9bc68e1 -r 5960d2d03390 vpnengine/agileprovisionws/src/agileprovisionws.cpp --- a/vpnengine/agileprovisionws/src/agileprovisionws.cpp Wed Sep 15 13:20:54 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,378 +0,0 @@ -/* -* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: VPN Agile provision Web Service Client -* -*/ - -#include -#include -#include -#include -#include "agileprovisionws.h" -#include "agileprovisiondefs.h" -#include "policyinstaller_constants.h" -#include "base64.h" - - -EXPORT_C CAgileProvisionWs* CAgileProvisionWs::NewL() - { - CAgileProvisionWs* self = NewLC(); - CleanupStack::Pop(); // self - return self; - } - - -EXPORT_C CAgileProvisionWs* CAgileProvisionWs::NewLC() - { - CAgileProvisionWs* self = new (ELeave) CAgileProvisionWs(); - CleanupStack::PushL(self); - self->ConstructL(); - return self; - } - -CAgileProvisionWs::CAgileProvisionWs() - { - } - - -void CAgileProvisionWs::ConstructL() - { - } - - -CAgileProvisionWs::~CAgileProvisionWs() - { - delete iPService; - delete iServiceAddr; - } - -EXPORT_C void CAgileProvisionWs::GetPolicy(const TDesC8& aEndPointUri, const TUint aIapId, - TRequestStatus& aStatus) - { - __ASSERT_DEBUG( iClientStatus == NULL, - User::Invariant() ); - - // Store client's request status. - - iClientStatus = &aStatus; - *iClientStatus = KRequestPending; - - TRAPD( err, DoGetPolicyL( aEndPointUri, aIapId) ); - if ( err != KErrNone ) - { - DoComplete( err ); - } - } - -EXPORT_C void CAgileProvisionWs::CancelGetPolicy() - { - if ( iPService != NULL ) - { - iPService->CancelTransaction(); - delete iPService; - iPService = NULL; - } - DoComplete( KErrCancel ); - } - -EXPORT_C void CAgileProvisionWs::SetServiceAddr(const HBufC8* aServiceAddr) - { - iServiceAddr=aServiceAddr; - } - -void CAgileProvisionWs::DoGetPolicyL(const TDesC8& aEndPointUri, const TUint aIapId) - { - - CSenXmlServiceDescription* pServiceDesc = CSenXmlServiceDescription::NewLC( aEndPointUri, - KNullDesC8() ); - iEndPointUri=&aEndPointUri; - pServiceDesc->SetFrameworkIdL( KDefaultBasicWebServicesFrameworkID ); - delete iPService; - iPService = NULL; - - iPService = CAgileProvisionServiceService::NewL( *this, *pServiceDesc ); - - CleanupStack::PopAndDestroy( pServiceDesc ); - - iPService->iIapId= aIapId; - - iState = KStateGettingConf; - - } - -void CAgileProvisionWs::HandleMessageL(const TDesC8& aMessage) -{ - - iPService->ResetTransactionId(); - - if ( iState == KStateGettingConf ) - { - HandleGetConfSoapInL( aMessage ); - GenerateCertReqL(); - iPService->GetCertificateAsyncL(iPService->iCertreq); - iState = KStateGettingCertificate; - } - else if ( iState == KStateGettingCertificate ) - { - HandleGetCertificateSoapInL( aMessage ); - DoComplete( KErrNone ); - iState = KStateInitial; - } - else - { - User::Leave( KErrArgument ); - } -} - -void CAgileProvisionWs::HandleErrorL(const TInt aErrorCode, const TDesC8& /*aError*/) - { - DoComplete( aErrorCode ); - } - - -void CAgileProvisionWs::SetStatus(const TInt aStatus) - { - TInt err = KErrNone; - if ( aStatus == KSenConnectionStatusReady ) - { - TRAP( err, iPService->GetConfAsyncL() ); - } - else if ( aStatus == KSenConnectionStatusCreateFailed ) - { - err = aStatus; - } - else - { - // Do nothing. - } - - if ( err != KErrNone ) - { - DoComplete( err ); - } - } - -EXPORT_C void CAgileProvisionWs::HandleGetConfSoapInL(const TDesC8& aMessage) - { - CSenXmlReader *pXmlReader = CSenXmlReader::NewL(); - CleanupStack::PushL(pXmlReader); - - //CSenDomFragment - CSenDomFragment* pBase = CSenDomFragment::NewL(); - CleanupStack::PushL(pBase); - - //must set the content handler - pXmlReader->SetContentHandler(*pBase); - // and the reader - pBase->SetReader(*pXmlReader); - - pXmlReader->ParseL(aMessage); - - RPointerArray& array = pBase->AsElement().ElementsL(); - - //start the listing of the elements, first level is 1 - TInt contentType(1); - - TInt vpnFilePathLth = KAgileProvisionPolicyFileName().Length() + KTempDirectory().Length(); - HBufC* vpnFilePathBuf = HBufC::NewLC(vpnFilePathLth); - TPtr vpnFilePath(vpnFilePathBuf->Des()); - vpnFilePath.Copy(KTempDirectory); - vpnFilePath.Append(KAgileProvisionPolicyFileName); - - ParseFileFromSoapEnvelopeL(array, contentType, 1, vpnFilePath); - - CleanupStack::PopAndDestroy(vpnFilePathBuf); // file - CleanupStack::PopAndDestroy(pBase); // delete pXmlReader, procMsg, responseStr - CleanupStack::PopAndDestroy(pXmlReader); // delete pXmlReader, procMsg, responseStr - } - - -EXPORT_C void CAgileProvisionWs::HandleGetCertificateSoapInL(const TDesC8& aMessage) - { - CSenXmlReader *pXmlReader = CSenXmlReader::NewL(); - CleanupStack::PushL(pXmlReader); - - //CSenDomFragment - CSenDomFragment* pBase = CSenDomFragment::NewL(); - CleanupStack::PushL(pBase); - - //must set the content handler - pXmlReader->SetContentHandler(*pBase); - // and the reader - pBase->SetReader(*pXmlReader); - - pXmlReader->ParseL(aMessage); - - RPointerArray& array = pBase->AsElement().ElementsL(); - - //start the listing of the elements, first level is 1 - - TInt vpnFilePathLth = KAgileProvisionCertificateFileName().Length() + KTempDirectory().Length(); - HBufC* vpnFilePathBuf = HBufC::NewLC(vpnFilePathLth); - TPtr vpnFilePath(vpnFilePathBuf->Des()); - vpnFilePath.Copy(KTempDirectory); - vpnFilePath.Append(KAgileProvisionCertificateFileName); - TInt contentType(2); - ParseFileFromSoapEnvelopeL(array, contentType, 1, vpnFilePath); - - CleanupStack::PopAndDestroy(vpnFilePathBuf); // file - CleanupStack::PopAndDestroy(pBase); // delete pXmlReader, procMsg, responseStr - CleanupStack::PopAndDestroy(pXmlReader); // delete pXmlReader, procMsg, responseStr - - } - -// The listing of the elements is done in ListNodesL function: -void CAgileProvisionWs::ParseFileFromSoapEnvelopeL(RPointerArray& aArray, - TInt aContentType,TInt aLevel, TDesC& aFileName ) - { - - TInt size = aArray.Count(); - for(TInt i=0; iHasContent() ) - { - //get the content of the element - TPtrC8 content = pElement->Content(); - TBase64Codec* base64Inst = new (ELeave) TBase64Codec(); - CleanupStack::PushL(base64Inst); - HBufC8* dataBuf = base64Inst->Base64DecodeLC(content); - HBufC8* fileBuf = base64Inst->Base64DecodeLC(*dataBuf); - - //CA from getConf envelope - if ( aContentType == 1 && i==1 ) - { - CAgileCryptoCert* agileClientCert = CAgileCryptoCert::NewL(fileBuf->Des(), EFalse); - CleanupStack::PushL(agileClientCert); - agileClientCert->SaveCACertL(); - CleanupStack::PopAndDestroy(agileClientCert); - } - else if ( aContentType == 2) - { - CAgileCryptoCert* agileClientCert = CAgileCryptoCert::NewL(fileBuf->Des(), ETrue); - CleanupStack::PushL(agileClientCert); - agileClientCert->SaveClientCertL(iKeyRef,KPublicKeyLen); - CleanupStack::PopAndDestroy(agileClientCert); - } - else - { - RFile file; - RFs iFs; - TInt err= iFs.Connect(); - CleanupClosePushL(file); - User::LeaveIfError(file.Replace(iFs, aFileName, EFileWrite)); - User::LeaveIfError(file.Write(*fileBuf)); - - //write pin file - TInt vpnPinFilePathLth = KAgileProvisionPinFileName().Length() + KTempDirectory().Length(); - HBufC* vpnPinFilePathBuf = HBufC::NewLC(vpnPinFilePathLth); - TPtr vpnPinFilePath(vpnPinFilePathBuf->Des()); - vpnPinFilePath.Copy(KTempDirectory); - vpnPinFilePath.Append(KAgileProvisionPinFileName); - User::LeaveIfError(file.Replace(iFs, vpnPinFilePath, EFileWrite)); - CleanupStack::PopAndDestroy(vpnPinFilePathBuf); // file - file.Flush(); - file.Close(); - CleanupStack::PopAndDestroy(&file); - iFs.Close(); - } - - - CleanupStack::PopAndDestroy(fileBuf); - CleanupStack::PopAndDestroy(dataBuf); - CleanupStack::PopAndDestroy(base64Inst); - - - } - - //get the first child - CSenElement* child = pElement->Child(0); - - //check if element has childs - if( child ) - { - //get the child elements - RPointerArray& tree = pElement->ElementsL(); - - //list child elements by a recursive call - ParseFileFromSoapEnvelopeL(tree, aContentType, ++aLevel, aFileName); - } - aLevel--; - } //for loop ends - } - -EXPORT_C void CAgileProvisionWs::GenerateCertReqL() - { - TRequestStatus status; - CAgileCryptoPrivKey* agileCryptoPrivKey = CAgileCryptoPrivKey::NewL(); - CleanupStack::PushL(agileCryptoPrivKey); - CAgileCryptoGenerateKeypair* agileCryptoGenerateKeypair = CAgileCryptoGenerateKeypair::NewL(agileCryptoPrivKey); - CleanupStack::PushL(agileCryptoGenerateKeypair); - - // generate key - agileCryptoGenerateKeypair->GenerateKeypairL(KPublicKeyLen, iKeyRef, status); - User::WaitForRequest(status); - - // generate subjectname - _LIT8(KCnHeader, "CN="); - _LIT8(KCnUsername, "vpnuser"); - TInt distinguishedNameLth = KCnHeader().Length() + KCnUsername().Length(); - HBufC8* distinguishedNameHBuf = HBufC8::NewLC(distinguishedNameLth); - TPtr8 distinguishedName(distinguishedNameHBuf->Des()); - distinguishedName.Copy(KCnHeader); - distinguishedName.Append(KCnUsername); - - // generate certreq - const TInt KDmAdMaxCertReqRefLth = KMaxFileName; - HBufC* certReqRef = HBufC::NewLC(KDmAdMaxCertReqRefLth); - TPtr certReqRefPtr(certReqRef->Des()); - TInt certReqSize; - - agileCryptoPrivKey->GenerateCertReqL(*distinguishedNameHBuf, //subjectname - KNullDesC8, // subjectaltname - KNullDesC8, //aChallengePassword, - KNullDesC8, //DnsName, - iKeyRef, - certReqRefPtr, - certReqSize); - - - // read certreq - TRetBufCertReq certReq; - certReq = agileCryptoPrivKey->ReadCertReqL(certReqRefPtr, certReqSize); - if ( iPService ) - { - iPService->iCertreq = certReq; - } - else - { - delete certReq; - certReq=NULL; - } - - CleanupStack::PopAndDestroy(certReqRef); - CleanupStack::PopAndDestroy(distinguishedNameHBuf); - CleanupStack::PopAndDestroy(agileCryptoGenerateKeypair); - CleanupStack::PopAndDestroy(agileCryptoPrivKey); - } - -void CAgileProvisionWs::DoComplete( const TInt aStatus ) - { - if ( iClientStatus != NULL ) - { - User::RequestComplete( iClientStatus, - aStatus ); - } - }