diff -r 000000000000 -r 33413c0669b9 vpnengine/dmadpki/src/DmAdStore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vpnengine/dmadpki/src/DmAdStore.cpp Thu Dec 17 09:14:51 2009 +0200 @@ -0,0 +1,561 @@ +/* +* Copyright (c) 2002-2008 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: implementation of DmAdStore +* +*/ + + + +#include "DmAdStore.h" +#include "DmAdRtNodeData.h" +#include "dmadutil.h" +#include "vpnlogger.h" + +#include "pkcs12vpn.h" + +CDmAdStore* CDmAdStore::NewL(MDmAdCallBack* aDmAdCallBack) + { + TRACE("CDmAdStore::NewL"); + + CDmAdStore *self = new (ELeave) CDmAdStore(); + CleanupStack::PushL(self); + self->ConstructL(aDmAdCallBack); + CleanupStack::Pop(self); + return self; + } + +void CDmAdStore::ConstructL(MDmAdCallBack* aDmAdCallBack) + { + TRACE("CDmAdStore::ConstructL"); + + TInt status = iPkiServiceApi.Connect(); + DEBUG_LOG1(_L("Connect status: %d"), status); + User::LeaveIfError(status); + iCert = CDmAdCert::NewL(iPkiServiceApi); + iCertReq = CDmAdCertReq::NewL(iPkiServiceApi, aDmAdCallBack); + iPrivKey = CDmAdPrivKey::NewL(iPkiServiceApi); + iPKCS12Obj = CDmAdPKCS12::NewL(iPkiServiceApi); + } + +CDmAdStore::CDmAdStore() + { + TRACE("CDmAdStore::CDmAdStore"); + } + +CDmAdStore::~CDmAdStore() + { + TRACE("CDmAdStore::~CDmAdStore"); + + iPkiServiceApi.Close(); + delete iCert; + delete iCertReq; + delete iPrivKey; + delete iPKCS12Obj; + } + +TBool CDmAdStore::FindRtNodeL(const TDesC8& aLuid, const TDesC8& aUri) + { + TRACE("CDmAdStore::FindRtNodeL"); + + TDmAdUriType uriType = CDmAdRtNodeData::UriTypeL(aUri); + switch (uriType) + { + case EDmAdUriTypeCert: + return CertFindRtNodeL(aLuid, aUri); + case EDmAdUriTypeCertReq: + return CertReqFindRtNodeL(aLuid, aUri); + case EDmAdUriTypePrivKey: + return PrivKeyFindRtNodeL(aLuid, aUri); + case EDmAdUriTypePKCS12: + // For PKCS#12, a special case + return EFalse; + default: + DEBUG_LOG(_L("Unexcepted URI type")); + User::Leave(KErrGeneral); + return EFalse; + } + } + +void CDmAdStore::LuidListL(const TDesC8& aUri, const TDesC8& aLuid, RPointerArray& aLuidList) + { + TRACE("CDmAdStore::LuidListL"); + + TDmAdUriType uriType = CDmAdRtNodeData::UriTypeL(aUri); + switch (uriType) + { + case EDmAdUriTypeCert: + CertLuidListL(aUri, aLuid, aLuidList); + break; + case EDmAdUriTypeCertReq: + CertReqLuidListL(aUri, aLuid, aLuidList); + break; + case EDmAdUriTypePrivKey: + PrivKeyLuidListL(aUri, aLuid, aLuidList); + break; + case EDmAdUriTypePKCS12: + // For PKCS#12, a special case + break; + default: + DEBUG_LOG(_L("CDmAdStore::LuidListLC: Unexcepted URI type")); + User::Leave(KErrGeneral); + break; + } + } + +void CDmAdStore::FetchRtNodeL(CDmAdRtNode& aRtNode) + { + TRACE("CDmAdStore::FetchRtNodeL"); + + TDmAdUriType uriType = aRtNode.Data()->UriType(); + switch (uriType) + { + case EDmAdUriTypeCert: + CertFetchRtNodeL(aRtNode); + break; + case EDmAdUriTypeCertReq: + CertReqFetchRtNodeL(aRtNode); + break; + case EDmAdUriTypePrivKey: + PrivKeyFetchRtNodeL(aRtNode); + break; + case EDmAdUriTypePKCS12: + // For PKCS#12, a special case + break; + default: + DEBUG_LOG(_L("Unexcepted URI type")); + User::Leave(KErrGeneral); + break; + } + } + +void CDmAdStore::SaveTopLevelRtNodeL(CDmAdRtNode& aRtNode, CArrayPtr& aChildRtNodes) + { + TRACE("CDmAdStore::SaveTopLevelRtNodeL"); + + TDmAdUriType uriType = aRtNode.Data()->UriType(); + switch (uriType) + { + case EDmAdUriTypeCert: + CertSaveTopLevelRtNodeL(aRtNode, aChildRtNodes); + break; + case EDmAdUriTypeCertReq: + CertReqSaveTopLevelRtNodeL(aRtNode, aChildRtNodes); + break; + case EDmAdUriTypePKCS12: + PKCS12SaveTopLevelRtNodeL(aRtNode, aChildRtNodes); + break; + default: + DEBUG_LOG(_L("Unexcepted URI type")); + User::Leave(KErrGeneral); + break; + } + } + +void CDmAdStore::SaveChildLevelRtNodeL(CDmAdRtNode& aRtNode) + { + TRACE("CDmAdStore::SaveChildLevelRtNodeL"); + + TDmAdUriType uriType = aRtNode.Data()->UriType(); + switch (uriType) + { + case EDmAdUriTypeCert: + CertSaveChildLevelRtNodeL(aRtNode); + break; + case EDmAdUriTypeCertReq: + CertReqSaveChildLevelRtNodeL(aRtNode); + break; + case EDmAdUriTypePKCS12: + // For PKCS#12, a special case + break; + default: + DEBUG_LOG(_L("Unexcepted URI type")); + User::Leave(KErrGeneral); + break; + } + } + +void CDmAdStore::DeleteRtNodeL(const TDesC8& aLuid, const TDesC8& aUri) + { + TRACE("CDmAdStore::DeleteRtNodeL"); + + TDmAdUriType uriType = CDmAdRtNodeData::UriTypeL(aUri); + switch (uriType) + { + case EDmAdUriTypeCert: + CertDeleteRtNodeL(aLuid, aUri); + break; + case EDmAdUriTypeCertReq: + CertReqDeleteRtNodeL(aLuid, aUri); + break; + case EDmAdUriTypePrivKey: + PrivKeyDeleteRtNodeL(aLuid, aUri); + break; + case EDmAdUriTypePKCS12: + // For PKCS#12, a special case + break; + default: + DEBUG_LOG(_L("Unexcepted URI type")); + User::Leave(KErrGeneral); + break; + } + } + +//========================================================================= +//========================================================================= + +TBool CDmAdStore::CertFindRtNodeL(const TDesC8& aLuid, const TDesC8& /*aUri*/) + { + TRACE("CDmAdStore::CertFindRtNodeL"); + + TBool ret = EFalse; + if (aLuid.Length() > 0) + { + if (iCert->FindL(aLuid)) + { + ret = ETrue; + } + } + return ret; + } + +void CDmAdStore::CertLuidListL(const TDesC8& /*aUri*/, const TDesC8& /*aLuid*/, RPointerArray& aLuidList) + { + TRACE("CDmAdStore::CertLuidListL"); + + iCert->ListL(aLuidList); + } + +void CDmAdStore::CertFetchRtNodeL(CDmAdRtNode& aRtNode) + { + TRACE("CDmAdStore::CertFetchRtNodeL"); + + TPtrC8 luid(aRtNode.Luid()); + if (luid.Length() == 0) + { + DEBUG_LOG(_L("Zero length luid")); + User::Leave(KErrNotFound); + } + + CDmAdCertData* data = aRtNode.Data()->CertData(); + CDmAdCertParms* certParms = CDmAdCertParms::NewL(); + CleanupStack::PushL(certParms); + iCert->FetchL(luid, *certParms); + data->RestoreL(*certParms); + CleanupStack::PopAndDestroy(certParms); + } + +void CDmAdStore::CertSaveTopLevelRtNodeL(CDmAdRtNode& aRtNode, CArrayPtr& aChildRtNodes) + { + TRACE("CDmAdStore::CertSaveTopLevelRtNodeL"); + + if (aChildRtNodes.Count() > 0) + { + DEBUG_LOG(_L("ChildRtNode count > 0")); + User::Leave(KErrGeneral); + } + + if (aRtNode.IsJustFetched()) + { + return; + } + + CDmAdCertData* data = aRtNode.Data()->CertData(); + + CDmAdCertParms* certParms = CDmAdCertParms::NewL(); + CleanupStack::PushL(certParms); + + data->ToStoreL(*certParms); + + if (aRtNode.IsSomeLeafAddedToRtNode()) + { + HBufC8* luid = iCert->AddL(*certParms); + CleanupStack::PushL(luid); + aRtNode.SetLuidL(*luid); + CleanupStack::PopAndDestroy(luid); + } + else + { + iCert->UpdateL(aRtNode.Luid(), *certParms); + } + + CleanupStack::PopAndDestroy(certParms); + } + +void CDmAdStore::CertSaveChildLevelRtNodeL(CDmAdRtNode& /*aRtNode*/) + { + TRACE("CDmAdStore::CertSaveChildLevelRtNodeL"); + + DEBUG_LOG(_L("Method not implemented")); + User::Leave(KErrGeneral); + } + +void CDmAdStore::CertDeleteRtNodeL(const TDesC8& aLuid, const TDesC8& /*aUri*/) + { + TRACE("CDmAdStore::CertDeleteRtNodeL"); + + if (aLuid.Length() == 0) + { + DEBUG_LOG(_L("aLuid length is 0")); + User::Leave(KErrNotFound); + } + + iCert->DeleteL(aLuid); + } + +//========================================================================= +//========================================================================= + +TBool CDmAdStore::CertReqFindRtNodeL(const TDesC8& aLuid, const TDesC8& /*aUri*/) + { + TRACE("CDmAdStore::CertReqFindRtNodeL"); + + TBool ret = EFalse; + if (aLuid.Length() > 0) + { + if (iCertReq->FindL(aLuid)) + { + ret = ETrue; + } + } + return ret; + } + +void CDmAdStore::CertReqLuidListL(const TDesC8& /*aUri*/, const TDesC8& /*aLuid*/,RPointerArray& aLuidList) + { + TRACE("CDmAdStore::CertReqLuidListL"); + + iCertReq->ListL(aLuidList); + } + +void CDmAdStore::CertReqFetchRtNodeL(CDmAdRtNode& aRtNode) + { + TRACE("CDmAdStore::CertReqFetchRtNodeL"); + + TPtrC8 luid(aRtNode.Luid()); + if (luid.Length() == 0) + { + DEBUG_LOG(_L("luid length is 0")); + User::Leave(KErrNotFound); + } + + CDmAdCertReqData* data = aRtNode.Data()->CertReqData(); + CDmAdCertReqParms* CertReqParms = CDmAdCertReqParms::NewL(); + CleanupStack::PushL(CertReqParms); + iCertReq->FetchL(luid, *CertReqParms); + data->RestoreL(*CertReqParms); + CleanupStack::PopAndDestroy(CertReqParms); + } + +void CDmAdStore::CertReqSaveTopLevelRtNodeL(CDmAdRtNode& aRtNode, CArrayPtr& aChildRtNodes) + { + TRACE("CDmAdStore::CertReqSaveTopLevelRtNodeL"); + + if (aChildRtNodes.Count() > 0) + { + DEBUG_LOG(_L("aChildRtNodes count > 0")); + User::Leave(KErrGeneral); + } + + if (aRtNode.IsJustFetched()) + { + return; + } + + CDmAdCertReqData* data = aRtNode.Data()->CertReqData(); + + CDmAdCertReqParms* CertReqParms = CDmAdCertReqParms::NewL(); + CleanupStack::PushL(CertReqParms); + + data->ToStoreL(*CertReqParms); + + if (aRtNode.IsSomeLeafAddedToRtNode()) + { + HBufC8* luid = iCertReq->AddL(*CertReqParms); + CleanupStack::PushL(luid); + aRtNode.SetLuidL(*luid); + CleanupStack::PopAndDestroy(luid); + } + else + { + DEBUG_LOG(_L("aRtNode.IsSomeLeafAddedToRtNode() returned false")); + User::Leave(KErrGeneral); + /* + //iCertReq->UpdateL(aRtNode.Luid(), *CertReqParms); + CertReqDeleteRtNodeL(aRtNode.Luid(), aRtNode.Uri()); + + HBufC8* luid = iCertReq->AddL(*CertReqParms); + CleanupStack::PushL(luid); + aRtNode.SetLuidL(*luid); + iCallBack->SetMappingL(aRtNode.Uri(), aRtNode.Luid()); + CleanupStack::PopAndDestroy(); //luid + */ + } + + CleanupStack::PopAndDestroy(CertReqParms); + } + +void CDmAdStore::CertReqSaveChildLevelRtNodeL(CDmAdRtNode& /*aRtNode*/) + { + TRACE("CDmAdStore::CertReqSaveChildLevelRtNodeL"); + + DEBUG_LOG(_L("Method not implemented")); + User::Leave(KErrGeneral); + } + +void CDmAdStore::CertReqDeleteRtNodeL(const TDesC8& aLuid, const TDesC8& /*aUri*/) + { + TRACE("CDmAdStore::CertReqDeleteRtNodeL"); + + if (aLuid.Length() == 0) + { + DEBUG_LOG(_L("aLuid length is 0")); + User::Leave(KErrNotFound); + } + + iCertReq->DeleteL(aLuid); + } + +//========================================================================= +//========================================================================= + +TBool CDmAdStore::PrivKeyFindRtNodeL(const TDesC8& aLuid, const TDesC8& /*aUri*/) + { + TRACE("CDmAdStore::PrivKeyFindRtNodeL"); + + TBool ret = EFalse; + if (aLuid.Length() > 0) + { + if (iPrivKey->FindL(aLuid)) + { + ret = ETrue; + } + } + return ret; + } + +void CDmAdStore::PrivKeyLuidListL(const TDesC8& /*aUri*/, const TDesC8& /*aLuid*/, RPointerArray& aLuidList) + { + TRACE("CDmAdStore::PrivKeyLuidListL"); + iPrivKey->ListL(aLuidList); + } + +void CDmAdStore::PrivKeyFetchRtNodeL(CDmAdRtNode& aRtNode) + { + TRACE("CDmAdStore::PrivKeyFetchRtNodeL"); + + TPtrC8 luid(aRtNode.Luid()); + if (luid.Length() == 0) + { + DEBUG_LOG(_L("aLuid length is 0")); + User::Leave(KErrNotFound); + } + + CDmAdPrivKeyData* data = aRtNode.Data()->PrivKeyData(); + CDmAdPrivKeyParms* PrivKeyParms = CDmAdPrivKeyParms::NewL(); + CleanupStack::PushL(PrivKeyParms); + iPrivKey->FetchL(luid, *PrivKeyParms); + data->RestoreL(*PrivKeyParms); + CleanupStack::PopAndDestroy(PrivKeyParms); + } + + +void CDmAdStore::PrivKeyDeleteRtNodeL(const TDesC8& aLuid, const TDesC8& /*aUri*/) + { + TRACE("CDmAdStore::PrivKeyDeleteRtNodeL"); + + if (aLuid.Length() == 0) + { + DEBUG_LOG(_L("aLuid length is 0")); + User::Leave(KErrNotFound); + } + + iPrivKey->DeleteL(aLuid); + } + +//========================================================================= +//========================================================================= + +// PKCS#12 handling +void CDmAdStore::PKCS12SaveTopLevelRtNodeL(CDmAdRtNode& aRtNode, + CArrayPtr& aChildRtNodes) + { + TRACE("CDmAdStore::PKCS12SaveTopLevelRtNodeL"); + + if (aChildRtNodes.Count() > 0) + { + DEBUG_LOG(_L("ChildRtNode count > 0")); + User::Leave(KErrGeneral); + } + + CDmAdPKCS12Data* data = aRtNode.Data()->PKCS12Data(); + + CDmAdPKCS12Parms* pkcs12Parms = CDmAdPKCS12Parms::NewL(); + CleanupStack::PushL(pkcs12Parms); + + // Extract parameters from data + data->ToStoreL(*pkcs12Parms); + + // Store PKCS#12 object contents to PKI + iPKCS12Obj->AddL(*pkcs12Parms); + + TPtrC8 uri = aRtNode.Uri(); + DEBUG_LOG1(_L8(" Setting LUID to '%S'"), &uri); + aRtNode.SetLuidL(uri); + + CleanupStack::PopAndDestroy(pkcs12Parms); + } + +//========================================================================= +//========================================================================= +void CDmAdStore::PkiLogonL() + { + TRACE("CDmAdStore::PkiLogonL"); + + TRequestStatus requestStatus; + iPkiServiceApi.Logon(requestStatus); + User::WaitForRequest(requestStatus); + TInt status = requestStatus.Int(); + if (status != KErrNone && status != KPKIErrKeyStoreEmpty) + { + DEBUG_LOG1(_L("status = %d"), status); + User::Leave(status); + } + } + +void CDmAdStore::PkiLogoffL() + { + TRACE("CDmAdStore::PkiLogoffL"); + + TRequestStatus requestStatus; + iPkiServiceApi.Logoff(requestStatus); + User::WaitForRequest(requestStatus); + TInt status = requestStatus.Int(); + if (status != KErrNone && status != KPKIErrKeyStoreEmpty) + { + DEBUG_LOG1(_L("status = %d"), status); + User::Leave(status); + } + } + +void CDmAdStore::SetStoreTypeL(TInt aStore, TPkiServiceStoreType aStoreType) + { + TRACE("CDmAdStore::SetStoreTypeL"); + + TInt status = iPkiServiceApi.SetStoreType(aStore, aStoreType); + if (status != KErrNone) + { + DEBUG_LOG1(_L("status = %d"), status); + User::Leave(status); + } + }