--- /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<HBufC8>& 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<CDmAdRtNode>& 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<HBufC8>& 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<CDmAdRtNode>& 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<HBufC8>& 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<CDmAdRtNode>& 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<HBufC8>& 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<CDmAdRtNode>& 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);
+ }
+ }