diff -r 000000000000 -r 33413c0669b9 vpnengine/dmadpki/src/dmadddf.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vpnengine/dmadpki/src/dmadddf.cpp Thu Dec 17 09:14:51 2009 +0200 @@ -0,0 +1,882 @@ +/* +* 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: ddf tree implementation of DmAdPKI +* +*/ + + + +#include +#include + +#include "dmadddf.h" +#include "dmadutil.h" +#include "vpnlogger.h" +#include "dmadcertxmldefs.h" +#include "XwImpl.h" + +static const TInt KUserStore = 1; +static const TInt KDeviceStore = 2; + +CDmAdDdf* CDmAdDdf::NewL(MDmAdCallBack* aDmAdCallBack, CDmAdStore* aStore) + { + TRACE("CDmAdDdf::NewL"); + + CDmAdDdf* self = NewLC(aDmAdCallBack, aStore); + CleanupStack::Pop(self); + return self; + } + +CDmAdDdf* CDmAdDdf::NewLC(MDmAdCallBack* aDmAdCallBack, CDmAdStore* aStore) + { + CDmAdDdf* self = new (ELeave) CDmAdDdf(aDmAdCallBack, aStore); + CleanupStack::PushL(self); + return self; + } + +CDmAdDdf::CDmAdDdf(MDmAdCallBack* aDmAdCallBack, CDmAdStore* aStore) : + iCallBack(aDmAdCallBack), iStore(aStore) + { + TRACE("CDmAdDdf::CDmAdDdf"); + } + +CDmAdDdf::~CDmAdDdf() + { + TRACE("CDmAdDdf::~CDmAdDdf"); + } + +//=================================================================================================== + +void CDmAdDdf::BuildDDFVersionL(CBufBase& aDDFVersion) + { + TRACE("CDmAdDdf::BuildDDFVersionL"); + aDDFVersion.InsertL(0, KDmAdDdfVersion); + } + +void CDmAdDdf::BuildDDFStructureL(MSmlDmDDFObject& aDDF) + { + TRACE("CDmAdDdf::BuildDDFStructureL"); + + TSmlDmAccessTypes accessTypesExec; + accessTypesExec.SetReplace(); // accessTypesExec.SetExec(); + + TSmlDmAccessTypes accessTypesGet; + accessTypesGet.SetGet(); + + TSmlDmAccessTypes accessTypesAdd; + accessTypesAdd.SetAdd(); + + TSmlDmAccessTypes accessTypesGetAdd; + accessTypesGetAdd.SetGet(); + accessTypesGetAdd.SetAdd(); + + TSmlDmAccessTypes accessTypesAll; + accessTypesAll.SetGet(); + accessTypesAll.SetAdd(); + accessTypesAll.SetDelete(); + accessTypesAll.SetReplace(); + + TSmlDmAccessTypes accessTypesNoDelete; + accessTypesNoDelete.SetGet(); + accessTypesNoDelete.SetAdd(); + accessTypesNoDelete.SetReplace(); + + MSmlDmDDFObject* obj; + MSmlDmDDFObject* objNokiaPki; + MSmlDmDDFObject* objPkiGeneral; + MSmlDmDDFObject* objCert; + MSmlDmDDFObject* objCertX; + MSmlDmDDFObject* objCertReq; + MSmlDmDDFObject* objCertReqX; + MSmlDmDDFObject* objPrivKey; + MSmlDmDDFObject* objPrivKeyX; + MSmlDmDDFObject* objPKCS12; + MSmlDmDDFObject* objPKCS12X; + + +//---------------------------------------------------------------- + + objNokiaPki = &TDmAdUtil::AddChildObjectL(aDDF, KDmAdNodeNokiaPki); + TDmAdUtil::FillNodeInfoL(*objNokiaPki, + accessTypesGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::ENode, + KDmAdDescNodeNokiaPki, + ETrue, + KDmAdNokiaPkiRootTypeProperty); + +//---------------------------------------------------------------- + + + obj = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdLeafLogon); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesExec, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::ENull, + KDmAdDescLeafLogon, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdLeafLogoff); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesExec, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::ENull, + KDmAdDescLeafLogoff, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdLeafKeyStore); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesExec, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EInt, + KDmAdDescLeafKeyStore, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdLeafCertStore); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesExec, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EInt, + KDmAdDescLeafCertStore, + EFalse); + + objPkiGeneral = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdNodeGeneral); + TDmAdUtil::FillNodeInfoL(*objPkiGeneral, + accessTypesGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::ENode, + KDmAdDescNodeGeneral, + EFalse, + KNullDesC8); + + obj = &TDmAdUtil::AddChildObjectL(*objPkiGeneral, KDmAdLeafCertApplications); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EXml, + KDmAdDescLeafCertApplications, + EFalse); + +//---------------------------------------------------------------- + + objCert = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdNodeCert); + TDmAdUtil::FillNodeInfoL(*objCert, + accessTypesGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::ENode, + KDmAdDescNodeCert, + EFalse, + KNullDesC8); + + objCertX = &TDmAdUtil::AddChildObjectL(*objCert, KDmAdNodeRt); + TDmAdUtil::FillNodeInfoL(*objCertX, + accessTypesAll, + MSmlDmDDFObject::EZeroOrMore, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::ENode, + KDmAdDescNodeRt, + EFalse, + KNullDesC8); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafType); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGetAdd, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EInt, + KDmAdDescLeafType, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafFormat); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGetAdd, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EInt, + KDmAdDescLeafFormat, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafSerialNumber); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBin, + KDmAdDescLeafSerialNumber, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafIssuerName); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBin, + KDmAdDescLeafIssuerName, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafFingerprintAlg); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EInt, + KDmAdDescLeafFingerprintAlg, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafFingerprintValue); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBin, + KDmAdDescLeafFingerprintAlg, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafValidityBegin); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KDmAdDescLeafValidityBegin, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafValidityEnd); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KDmAdDescLeafValidityEnd, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafSubjectName); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBin, + KDmAdDescLeafSubjectName, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafSubjectAltName); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGet, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBin, + KDmAdDescLeafSubjectAltName, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafKeyURI); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGet, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KDmAdDescLeafKeyUri, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafKeyId); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGet, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBin, + KDmAdDescLeafKeyId, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafKeyUsage); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGet, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KDmAdDescLeafKeyUsage, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafDeletable); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGetAdd, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBool, + KDmAdDescLeafDeletable, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafTrusted); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesNoDelete, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBool, + KDmAdDescLeafTrusted, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafApplicability); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesNoDelete, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EXml, + KDmAdDescLeafApplicability, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertX, KDmAdLeafContent); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGetAdd, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBin, + KDmAdDescLeafContent, + EFalse); + + +//---------------------------------------------------------------- + + objCertReq = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdNodeCertReq); + TDmAdUtil::FillNodeInfoL(*objCertReq, + accessTypesGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::ENode, + KDmAdDescNodeCertReq, + EFalse, + KNullDesC8); + + + objCertReqX = &TDmAdUtil::AddChildObjectL(*objCertReq, KDmAdNodeRt); + TDmAdUtil::FillNodeInfoL(*objCertReqX, + accessTypesAll, + MSmlDmDDFObject::EZeroOrMore, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::ENode, + KDmAdDescNodeRt, + EFalse, + KNullDesC8); + + obj = &TDmAdUtil::AddChildObjectL(*objCertReqX, KDmAdLeafSubjectName); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesAdd, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBin, + KDmAdDescLeafSubjectName, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertReqX, KDmAdLeafRfc822Name); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesAdd, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBin, + KDmAdDescLeafRfc822Name, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertReqX, KDmAdLeafKeyURI); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesAdd, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KDmAdDescLeafKeyUri, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertReqX, KDmAdLeafKeyLength); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesAdd, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EInt, + KDmAdDescLeafKeyLength, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objCertReqX, KDmAdLeafContent); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGet, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBin, + KDmAdDescLeafContent, + EFalse); + +//---------------------------------------------------------------- + + objPrivKey = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdNodePrivKey); + TDmAdUtil::FillNodeInfoL(*objPrivKey, + accessTypesGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::ENode, + KDmAdDescNodePrivKey, + EFalse, + KNullDesC8); + + + objPrivKeyX = &TDmAdUtil::AddChildObjectL(*objPrivKey, KDmAdNodeRt); + TDmAdUtil::FillNodeInfoL(*objPrivKeyX, + accessTypesAll, + MSmlDmDDFObject::EZeroOrMore, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::ENode, + KDmAdDescNodeRt, + EFalse, + KNullDesC8); + + obj = &TDmAdUtil::AddChildObjectL(*objPrivKeyX, KDmAdLeafKeyType); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGetAdd, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EInt, + KDmAdDescLeafKeyType, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objPrivKeyX, KDmAdLeafKeyId); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KDmAdDescLeafKeyId, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objPrivKeyX, KDmAdLeafKeyLength); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesGetAdd, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EInt, + KDmAdDescLeafKeyLength, + EFalse); + + obj = &TDmAdUtil::AddChildObjectL(*objPrivKeyX, KDmAdLeafContent); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesAdd, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBin, + KDmAdDescLeafContent, + EFalse); + + //------- PKCS#12 Node definitions ----------------- + + DEBUG_LOG(_L("Adding PKCS#12 definitions")); + + // PKCS12 root node + objPKCS12 = &TDmAdUtil::AddChildObjectL(*objNokiaPki, KDmAdNodePKCS12); + TDmAdUtil::FillNodeInfoL(*objPKCS12, + accessTypesGet, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EPermanent, + MSmlDmDDFObject::ENode, + KDmAdDescNodePKCS12, + EFalse, + KNullDesC8); + + // PKCS#12/X node + objPKCS12X = &TDmAdUtil::AddChildObjectL(*objPKCS12, KDmAdNodeRt); + TDmAdUtil::FillNodeInfoL(*objPKCS12X, + accessTypesAdd, + MSmlDmDDFObject::EZeroOrMore, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::ENode, + KDmAdDescNodeRt, + EFalse, + KNullDesC8); + + // PKCS#12/X/Password leaf node + obj = &TDmAdUtil::AddChildObjectL(*objPKCS12X, KDmAdLeafPKCS12Password); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesAdd, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EChr, + KDmAdDescLeafPKCS12Password, + EFalse); + + // PKCS#12/X/Deletable leaf node + obj = &TDmAdUtil::AddChildObjectL(*objPKCS12X, KDmAdLeafDeletable); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesAdd, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBool, + KDmAdDescLeafDeletable, + EFalse); + + // PKCS#12/X/Applicability leaf node + obj = &TDmAdUtil::AddChildObjectL(*objPKCS12X, KDmAdLeafApplicability); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesAdd, + MSmlDmDDFObject::EZeroOrOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EXml, + KDmAdDescLeafApplicability, + EFalse); + + // PKCS#12/X/Content leaf node + obj = &TDmAdUtil::AddChildObjectL(*objPKCS12X, KDmAdLeafContent); + TDmAdUtil::FillNodeInfoL(*obj, + accessTypesAdd, + MSmlDmDDFObject::EOne, + MSmlDmDDFObject::EDynamic, + MSmlDmDDFObject::EBin, + KDmAdDescLeafContent, + EFalse); + + DEBUG_LOG(_L("Adding PKCS#12 definitions - COMPLETE")); + + } + +//--------------------------------------------------------------------------------------- + +void CDmAdDdf::NotRtNodeAddNodeObjectL(const TDesC8& /*aUri*/, const TDesC8& /*aParentLuid*/, TInt aStatusRef) + { + TRACE("CDmAdDdf::NotRtNodeAddNodeObjectL"); + + iCallBack->SetStatusL(aStatusRef, KErrNone); + } + +void CDmAdDdf::NotRtNodeUpdateLeafObjectL(const TDesC8& aUri, const TDesC8& /*aLuid*/, const TDesC8& aObject, const TDesC8& /*aType*/, TInt aStatusRef) + { + TRACE("CDmAdDdf::NotRtNodeUpdateLeafObjectL"); + + TPtrC8 lastSeg = TDmAdUtil::LastUriSeg(aUri); + if (lastSeg.Compare(KDmAdLeafLogon) == 0) + { + iStore->PkiLogonL(); + } + else if (lastSeg.Compare(KDmAdLeafLogoff) == 0) + { + iStore->PkiLogoffL(); + } + else if (lastSeg.Compare(KDmAdLeafKeyStore) == 0) + { + TInt storeFromDm = TDmAdUtil::DesToInt(aObject); + TPkiServiceStoreType pkiStoreType = EPkiStoreTypeAny; + switch(storeFromDm) + { + case KUserStore: + pkiStoreType = EPkiStoreTypeUser; + break; + case KDeviceStore: + pkiStoreType = EPkiStoreTypeDevice; + break; + default: + User::Leave(KPKIErrNotSupported); + break; + } + iStore->SetStoreTypeL(STORE_KEYSTORE, pkiStoreType); + } + else if (lastSeg.Compare(KDmAdLeafCertStore) == 0) + { + TInt storeFromDm = TDmAdUtil::DesToInt(aObject); + TPkiServiceStoreType pkiStoreType = EPkiStoreTypeAny; + switch(storeFromDm) + { + case KUserStore: + pkiStoreType = EPkiStoreTypeUser; + break; + case KDeviceStore: + pkiStoreType = EPkiStoreTypeDevice; + break; + default: + User::Leave(KPKIErrNotSupported); + break; + } + + iStore->SetStoreTypeL(STORE_CERTSTORE, pkiStoreType); + } + + iCallBack->SetStatusL(aStatusRef, KErrNone); + } + +TInt CDmAdDdf::NotRtNodeFetchLeafObjectLC(const TDesC8& aUri, const TDesC8& /*aLuid*/, const TDesC8& /*aType*/, CBufBase*& aObject) + { + TInt status = KErrNotFound; + CBufBase* object = CBufFlat::NewL(32); + CleanupStack::PushL(object); + + TPtrC8 lastSeg = TDmAdUtil::LastUriSeg(aUri); + if (lastSeg.Compare(KDmAdLeafCertApplications) == 0) + { + + CCertificateAppInfoManager* appsMan = CCertificateAppInfoManager::NewLC(); + + const RArray& apps = appsMan->Applications(); + TInt count = apps.Count(); + CXmlWriter* writer = CXmlWriter::NewL(); + CleanupStack::PushL(static_cast(writer)); + + writer->AddStartTagL(KXmlElemCertApps); + for (TInt i=0; iOpenStartTagL(KXmlElemApp); + writer->AddAttributeL(KXmlAttrId, *idInt); + writer->AddAttributeL(KXmlAttrName, *name8); + writer->CloseStartTagL(ETrue); + CleanupStack::PopAndDestroy(2); //name8, idInt + } + writer->AddEndTagL(KXmlElemCertApps); + TPtrC8 docDataPtr(writer->DocPart(0, writer->Length()-1)); + object->InsertL(object->Size(), docDataPtr); + + DEBUG_LOG(_L("popping writer")); + CleanupStack::PopAndDestroy(static_cast(writer)); + DEBUG_LOG(_L("writer popped")); + + CleanupStack::PopAndDestroy(appsMan); + status = KErrNone; + } + aObject = object; + return status; + } + +void CDmAdDdf::NotRtNodeDeleteObjectL(const TDesC8& /*aUri*/, const TDesC8& /*aLuid*/, TInt aStatusRef) + { + TRACE("CDmAdDdf::NotRtNodeDeleteObjectL"); + + iCallBack->SetStatusL(aStatusRef, KErrNone); + } + +//--------------------------------------------------------------------------------------- + +TBool CDmAdDdf::IsNodeRtNodeL(const TDesC8& aUri) + { + TRACE("CDmAdDdf::IsNodeRtNodeL"); + + TBool ret = EFalse; + TPtrC8 lastSeg = TDmAdUtil::LastUriSeg(aUri); + if (lastSeg.Compare(KDmAdNodeNokiaPki) == 0 || + lastSeg.Compare(KDmAdNodeGeneral) == 0 || + lastSeg.Compare(KDmAdNodeCert) == 0 || + lastSeg.Compare(KDmAdNodeCertReq) == 0 || + lastSeg.Compare(KDmAdNodePrivKey) == 0 || + lastSeg.Compare(KDmAdNodePKCS12) == 0) // Added + { + if(lastSeg.Compare(KDmAdNodePKCS12) == 0) // Added + { + DEBUG_LOG(_L("LastSeg == KDmAdNodePKCS12, ret = FALSE")); + } + ret = EFalse; + } + else + { + if (TDmAdUtil::NumOfURISegs(aUri) < 2) + { + DEBUG_LOG(_L("Number of URI segments is < 2")); + User::Leave(KErrNotFound); + } + TPtrC8 prevSeg = TDmAdUtil::LastUriSeg(TDmAdUtil::RemoveLastUriSeg(aUri)); + if (prevSeg.Compare(KDmAdNodeCert) == 0 || + prevSeg.Compare(KDmAdNodeCertReq) == 0 || + prevSeg.Compare(KDmAdNodePrivKey) == 0 || + prevSeg.Compare(KDmAdNodePKCS12) == 0) // Added + { + if(prevSeg.Compare(KDmAdNodePKCS12) == 0) // Added + { + DEBUG_LOG(_L("prevSeg == KDmAdNodePKCS12, ret = TRUE")); + } + ret = ETrue; + } + else + { + DEBUG_LOG(_L("URI segment not found")); + User::Leave(KErrNotFound); + } + } + return ret; + } + +TBool CDmAdDdf::IsLeafUnderRtNodeL(const TDesC8& aUri) + { + TRACE("CDmAdDdf::IsLeafUnderRtNodeL"); + + TBool ret = EFalse; + TPtrC8 nodeUri(TDmAdUtil::RemoveLastUriSeg(aUri)); + ret = IsNodeRtNodeL(nodeUri); + return ret; + } + + +TPtrC8 CDmAdDdf::RtNodeUriForLeafL(const TDesC8& aLeafUri) + { + TRACE("CDmAdDdf::RtNodeUriForLeafL"); + + TPtrC8 ret; + TPtrC8 nodeUri(TDmAdUtil::RemoveLastUriSeg(aLeafUri)); + TPtrC8 prevNodeUri(TDmAdUtil::RemoveLastUriSeg(nodeUri)); + TPtrC8 prevNodeUriSeg(TDmAdUtil::LastUriSeg(prevNodeUri)); + + if (prevNodeUriSeg.Compare(KDmAdNodeCert) == 0 || + prevNodeUriSeg.Compare(KDmAdNodeCertReq) == 0 || + prevNodeUriSeg.Compare(KDmAdNodePrivKey) == 0 || + prevNodeUriSeg.Compare(KDmAdNodePKCS12) == 0) // Added + { + if (prevNodeUriSeg.Compare(KDmAdNodePKCS12) == 0) + { + DEBUG_LOG(_L("prevNodeUriSeg == KDmAdNodePKCS12")); + } + ret.Set(nodeUri); + } + else + { + DEBUG_LOG(_L("Unknown URI")); + User::Leave(KErrNotFound); + } + return ret; + } + +TBool CDmAdDdf::IsTopLevelRtNode(const TDesC8& /*aUri*/) + { + TRACE("CDmAdDdf::IsTopLevelRtNode"); + return ETrue; + } + +HBufC8* CDmAdDdf::ParentRtNodeUriForRtNodeLC(const TDesC8& /*aUri*/) + { + DEBUG_LOG(_L("Method CDmAdDdf::ParentRtNodeUriForRtNodeLC not implemented")); + User::Leave(KErrGeneral); + return 0; + } + +//--------------------------------------------------------------------------------------- + +void CDmAdDdf::BuildChildUriListLC(const TDesC8& aUri, const TDesC8& aParentLuid, const CArrayFix& aPreviousUriSegmentList, CBufBase*& aCurrentList) + { + CBufBase *currentList = CBufFlat::NewL(128); + CleanupStack::PushL(currentList); + + TPtrC8 lastSeg = TDmAdUtil::LastUriSeg(aUri); + if (lastSeg.Compare(KDmAdNodeNokiaPki) == 0) + { + currentList->InsertL(0, KDmAdListOfNokiaPkiChildren); + } + else if (lastSeg.Compare(KDmAdNodeGeneral) == 0) + { + currentList->InsertL(0, KDmAdListOfPkiGeneralChildren); + } + else if (lastSeg.Compare(KDmAdNodeCert) == 0 || + lastSeg.Compare(KDmAdNodeCertReq) == 0 || + lastSeg.Compare(KDmAdNodePrivKey) == 0 || + lastSeg.Compare(KDmAdNodePKCS12) == 0) // Added + { + if (lastSeg.Compare(KDmAdNodePKCS12) == 0) + { + // Special treatment for PKCS12 nodes + DEBUG_LOG(_L("lastSeg == KDmAdNodePKCS12")); + TPtrC8 lastSeg = TDmAdUtil::LastUriSeg(aUri); + TInt slashcount = 0; + TInt urisegcount = aPreviousUriSegmentList.Count(); + + DEBUG_LOG1(_L(" URI segment count: %d:"), urisegcount); + + for (TInt i=0; i < urisegcount; i++) + { + const TSmlDmMappingInfo& mappingInfo = aPreviousUriSegmentList.At(i); + + DEBUG_LOG1(_L(" SetResult URI seg entry %d:"), i); + DEBUG_LOG1(_L8(" Uri seg: '%S'"), &(mappingInfo.iURISeg)); + DEBUG_LOG_HEX(mappingInfo.iURISegLUID); + + // Add slash to separate between URIs (no slash after the last one or + // before the first one) + if ((slashcount > 0) && (slashcount <= urisegcount)) + { + currentList->InsertL(currentList->Size(), KDmAdSeparator); + } + + currentList->InsertL(currentList->Size(), mappingInfo.iURISeg); + slashcount++; + } + } + else + { + TDmAdUtil::BuildRtNodeChildUriListL(iCallBack, iStore, aUri, aParentLuid, aPreviousUriSegmentList, *currentList); + } + +#if 0 + if (currentList->Size() > 0) + { + currentList->InsertL(currentList->Size(), KDmAdAppendChildSlashExt); + } + else + { + currentList->InsertL(currentList->Size(), KDmAdAppendChildExt); + } +#endif + } + else + { + TPtrC8 prevSeg = TDmAdUtil::LastUriSeg(TDmAdUtil::RemoveLastUriSeg(aUri)); + if (prevSeg.Compare(KDmAdNodeCert) == 0 || + prevSeg.Compare(KDmAdNodeCertReq) == 0 || + prevSeg.Compare(KDmAdNodePrivKey) == 0 || + prevSeg.Compare(KDmAdNodePKCS12) == 0) // Added + { + if (prevSeg.Compare(KDmAdNodePKCS12) == 0) + { + DEBUG_LOG(_L("prevSeg == KDmAdNodePKCS12")); + } + if (!iStore->FindRtNodeL(aParentLuid, aUri)) + { + DEBUG_LOG(_L("Node not found")); + User::Leave(KErrNotFound); + } + + if (prevSeg.Compare(KDmAdNodeCert) == 0) + { + currentList->InsertL(0, KDmAdListOfCertXChildren); + } + else if (prevSeg.Compare(KDmAdNodeCertReq) == 0) + { + currentList->InsertL(0, KDmAdListOfCertReqXChildren); + } + else if (prevSeg.Compare(KDmAdNodePrivKey) == 0) + { + currentList->InsertL(0, KDmAdListOfPrivKeyXChildren); + } + else if (prevSeg.Compare(KDmAdNodePKCS12) == 0) + { + DEBUG_LOG(_L("inserting KDmAdListOfPKCS12XChildren to currentList")); + + // Added handler for pkcs#12 + currentList->InsertL(0, KDmAdListOfPKCS12XChildren); + } + } + else + { + DEBUG_LOG(_L("Unknown URI")); + User::Leave(KErrNotFound); + } + } + + aCurrentList = currentList; + }