diff -r 000000000000 -r 62f9d29f7211 webservices/wsstar/wsstarpolicy/src/PolicyIntersecter.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webservices/wsstar/wsstarpolicy/src/PolicyIntersecter.cpp Thu Jan 07 16:19:19 2010 +0200 @@ -0,0 +1,259 @@ +/* +* Copyright (c) 2002-2005 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: +* +*/ + + + + +#include "PolicyIntersecter.h" + +#include +#include "wssecuritypolicy.h" +#include "Wspolicy.h" + + +using namespace WSPolicy; + +CPolicyIntersecter* CPolicyIntersecter::NewL() +{ + CPolicyIntersecter* pSelf = + CPolicyIntersecter::NewLC(); + CleanupStack::Pop(pSelf); + return pSelf; +} +CPolicyIntersecter* CPolicyIntersecter::NewLC() +{ + CPolicyIntersecter* pSelf = new (ELeave) CPolicyIntersecter(); + CleanupStack::PushL(pSelf); + pSelf->ConstructL(); + return pSelf; +} +void CPolicyIntersecter::ConstructL() +{ + iSecurityPolicyDomain = CWsSecurityPolicy::NewL(); + +} +CPolicyIntersecter::~CPolicyIntersecter() +{ + iPolicy1.Close(); + iPolicy2.Close(); + + delete iSecurityPolicyDomain; +} +CPolicyIntersecter::CPolicyIntersecter() +{ + +} + +TXmlEngElement CPolicyIntersecter::IntersectL(TDesC& /*aFirstPolicy*/, TDesC& /*aSecondPolicy*/) +{ +// TDOMImplementation domImpl = XmlEngine::DOM::DOMImplementationSource::DOMImplementationL (XmlEngine::DOM::KImplementationID); + RXmlEngDOMImplementation domImpl; + RXmlEngDocument doc; + doc.OpenL(domImpl); + +// RDOMParser parser = domImpl.CreateDOMParser(); + +// iPolicy1 = parser.ParseFileL( aFirstPolicy ); +// iPolicy2 = parser.ParseFileL( aSecondPolicy ); + + TXmlEngElement& pPolicy1 = iPolicy1.AsElement(); + TXmlEngElement& pPolicy2 = iPolicy2.AsElement(); + + + TXmlEngElement result = IntersectL(pPolicy1,pPolicy2); + return result; +} + + +TXmlEngElement CPolicyIntersecter::IntersectL(TXmlEngElement aFirstPolicy, TXmlEngElement aSecondPolicy) +{ + RXmlEngDocument policyDoc = aFirstPolicy.OwnerDocument().CloneDocumentL(); + TXmlEngElement& newIntersectedPolicy = policyDoc.AsElement(); + + RXmlEngNodeList listPolicynew; + newIntersectedPolicy.GetChildElements(listPolicynew); //get the children of policy + + if(listPolicynew.HasNext()) + { + iIntersectedPolicyElement = listPolicynew.Next(); + iIntersectedPolicyElement.RemoveChildren(); + } + + //now add all the intersecterd assertions in this AND Element + + RXmlEngNodeList listPolicyFirst; + aFirstPolicy.GetChildElements(listPolicyFirst); //get the children of policy + + RXmlEngNodeList listPolicySecond; + aSecondPolicy.GetChildElements(listPolicySecond); //get the children of policy + + TXmlEngElement XOR = iIntersectedPolicyElement.AddNewElementSameNsL(WSPolicy::KXorCompositeAssertion); + + if(listPolicyFirst.HasNext() && listPolicySecond.HasNext()) + { + TXmlEngElement policyElement = listPolicyFirst.Next(); + + TPtrC8 localName = policyElement.TagName(); + + RXmlEngNodeList xorList; //get the only xor element + policyElement.GetElementsByTagNameL(xorList, WSPolicy::KXorCompositeAssertion, WSPolicy::KWsPolicyNsUri); + TXmlEngElement pXORFirst = NULL; + + if(xorList.HasNext()) + pXORFirst = xorList.Next(); + //get all AND elements from the above xor. + + RXmlEngNodeList andListFirst; //get the only xor element from First Policy + pXORFirst.GetElementsByTagNameL(andListFirst, WSPolicy::KAndCompositeAssertion, WSPolicy::KWsPolicyNsUri); + + //second policy + TXmlEngElement policyElementSec = listPolicySecond.Next(); + + TPtrC8 localName2 = policyElementSec.TagName(); + + RXmlEngNodeList xorListSec; //get the only xor element + policyElementSec.GetElementsByTagNameL(xorListSec, WSPolicy::KXorCompositeAssertion, WSPolicy::KWsPolicyNsUri); + TXmlEngElement pXORSec = NULL; + + if(xorListSec.HasNext()) + pXORSec = xorListSec.Next(); + //we have to get all AND elements from the above xor. we will do it in loop + + + while (andListFirst.HasNext()) + { + TXmlEngElement AND = XOR.AddNewElementSameNsL(WSPolicy::KAndCompositeAssertion); + + TXmlEngElement andEleF = andListFirst.Next(); + + TPtrC8 localName = andEleF.TagName(); + //find all assertions in this AND element + + + IntersectCompareSecondAssertionsL(andEleF, pXORSec, AND); + } + + } + + + return XOR; + +} + +TXmlEngElement CPolicyIntersecter::IntersectCompareSecondAssertionsL(TXmlEngElement aFirstElement, TXmlEngElement aSecondElement, TXmlEngElement aIntersectedAND) +{ + + RXmlEngNodeList assertionListF; //get all of first assrtions + aFirstElement.GetChildElements(assertionListF); + + RXmlEngNodeList andListSec; //get all of AND elements + aSecondElement.GetElementsByTagNameL(andListSec, WSPolicy::KAndCompositeAssertion, WSPolicy::KWsPolicyNsUri); + + RArray result; + while(andListSec.HasNext()) + { + //for every of AND element, loop for every AND element in first policy + TXmlEngElement andEleS = andListSec.Next(); + + TPtrC8 localNameS = andEleS.TagName(); + //find all assertions in this AND element + + RXmlEngNodeList assertionListS; //get the only xor element + andEleS.GetChildElements(assertionListS); + //RESOLVE all assertion from same AND element + + IntersectAllANDAssertionsL(aFirstElement, andEleS, result); + if(result.Count() > 0) + { + for (TInt i = 0; i& aResult) +{ + TInt outcount = 0; + TInt inCount = 0; + + RXmlEngNodeList assertionListF; //get all of first assrtions + aFirstElement.GetChildElements(assertionListF); + + while (assertionListF.HasNext()) + { + TXmlEngElement assertionFirst = assertionListF.Next(); + + TPtrC8 localName1 = assertionFirst.TagName(); + + outcount++; + + RXmlEngNodeList assertionListS; //get all of AND elements + aSecondElement.GetChildElements(assertionListS); + + while(assertionListS.HasNext()) + { + TXmlEngElement assertionSecond = assertionListS.Next(); + + TPtrC8 localName2 = assertionSecond.TagName(); + inCount++; + if((localName1.Compare(localName2) == 0) && + VerifyNamespace(assertionFirst, assertionSecond)) + { + //call domain specific policy to resolve + //check the namespaces here to find which domain we need to process + //both namespaces should be checked and if they are same then we can intersect them + + TPtrC8 namespaceUri1 = assertionFirst.NamespaceUri(); + + //if its ws security policy + if(namespaceUri1.Compare(KWsSecurityPolicyNsUri) == 0) + { +/* + TXmlEngElement result = iSecurityPolicyDomain->Intersect(localName1, assertionFirst, assertionSecond); + if(result.NotNull()) + { + aResult.Append(assertionFirst); + aResult.Append(assertionSecond); + } +*/ + } + } + } + + } +} + +TInt CPolicyIntersecter::VerifyNamespace(TXmlEngElement aFirstElement, TXmlEngElement aSecondElement) +{ + + TPtrC8 namespaceUri1 = aFirstElement.NamespaceUri(); + TPtrC8 namespaceUri2 = aSecondElement.NamespaceUri(); + + if(namespaceUri1 != KNullDesC8() && namespaceUri2 != KNullDesC8()) + { + if(namespaceUri1.Compare(namespaceUri2) == 0) + return ETrue; + } + + return KErrNotFound; +}