rtsecuritymanager/rtsecuritymanagerserver/src/rtsecmgrpolicyparser.cpp
changeset 57 61b27eec6533
parent 45 7aa6007702af
--- a/rtsecuritymanager/rtsecuritymanagerserver/src/rtsecmgrpolicyparser.cpp	Fri Apr 16 15:54:49 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1158 +0,0 @@
-/*
-* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "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:       Utility XML parser to parse trust and access policy files
- *
-*/
-
-
-
-
-
-
-#include <e32std.h>
-#include <w32std.h>
-#include <f32file.h>
-
-#include "rtsecmgrpolicyparser.h"
-#include "rtsecmgrdata.h"
-#include "rtsecmgrserverdef.h"
-
-#include <gmxmldocument.h>
-#include <gmxmlelement.h>
-#include <gmxmlcharacterdata.h>
-#include <gmxmltext.h>
-#include <gmxmlnode.h>
-
-_LIT (KPolicy, "policy");
-_LIT (KAllow, "allow");
-_LIT (KUser, "user");
-_LIT (KDomain, "domain");
-_LIT (KNameAttr, "name");
-_LIT (KCondition, "condition");
-_LIT (KCapabilities, "capabilities");
-_LIT (KDefCondition, "defaultCondition");
-_LIT (KText, "#TEXT");
-_LIT (KComment, "comment");
-_LIT (KAlias, "alias");
-
-CPolicyParser::CPolicyParser()
-	{
-	}
-
-CPolicyParser* CPolicyParser::NewL()
-	{
-	CPolicyParser* self = CPolicyParser::NewLC ();
-	//nothing to construct as of now
-	CleanupStack::Pop (self);
-	return self;
-	}
-
-CPolicyParser* CPolicyParser::NewLC()
-	{
-	CPolicyParser* self = new (ELeave) CPolicyParser();
-	CleanupStack::PushL (self);
-	//nothing to construct as of now
-	return self;
-	}
-
-CPolicyParser::~CPolicyParser()
-	{
-	if ( iDomParser)
-		{
-		delete iDomParser;
-		iDomParser = NULL;
-		}
-	}
-
-TInt CPolicyParser::GetPolicyInfo(RFile& aSecPolicy,
-		RProtectionDomains& aPolicyInfo, RAliasGroup& aAliasGroup)
-	{
-	isTrustInfo = EFalse;
-
-	if ( iDomParser)
-		{
-		delete iDomParser;
-		iDomParser = NULL;
-		}
-
-	iDomParser = CMDXMLParser::NewL (this);
-	iLastError = KErrNone;
-	
-	RFile parseHandle;
-	User::LeaveIfError ( parseHandle.Duplicate ( aSecPolicy));
-
-	iPolicyInfo.Reset (); //cleans-up the array, but doesn't delete the entries..
-	iAliasGroup.Reset ();
-
-	iLastError = iDomParser->ParseFile (parseHandle); //xml file read operation
-	
-	if ( KErrNone == iLastError)
-		iWaitScheduler.Start (); //actual parsing starts here asynchronously
-
-	if ( KErrNone==iLastError)   //parsing is successful
-	{
-		aPolicyInfo = iPolicyInfo;
-		aAliasGroup = iAliasGroup;
-	}
-
-	return iLastError;
-	}
-
-// Call back function called when a parsing operation completes.
-void CPolicyParser::ParseFileCompleteL()
-	{
-	iLastError = iDomParser->Error();
-	
-	if(iLastError == KErrXMLMissingDocTypeTag)
-	    iLastError = KErrNone;
-	
-	iWaitScheduler.AsyncStop ();
-	    	
-	if(iLastError!=KErrNone)
-		{
-		    return;
-		}
-	else
-	    {
-          	if ( iDomParser && !isTrustInfo) //pre-requisite that the DOM instance is intact
-        		{
-        		CMDXMLDocument* documentNode = iDomParser->DetachXMLDoc ();
-        
-        		if ( documentNode)
-        			{
-        			CleanupStack::PushL(documentNode);
-        			//Gets the root element of the DOM tree.
-        			CMDXMLElement* rootElemNode = documentNode->DocumentElement ();
-        
-        			CMDXMLNode* rootNode = rootElemNode->FirstChild ();
-        
-        			if ( !rootNode)
-        				{
-        				iLastError = EErrInvalidRootNode;
-        				CleanupStack::PopAndDestroy(documentNode);
-        				return;
-        				}
-        
-        			TBool isValid = EFalse;
-        
-        			for (; rootNode;rootNode=rootNode->NextSibling ())
-        				{
-        				if ( rootNode->NodeType ()==CMDXMLNode::EElementNode)
-        					{
-        					if ( 0==rootNode->NodeName().CompareF (KPolicy ()))
-        						{
-        						isValid = ETrue;
-        						break;
-        						}
-        					else
-        						continue;
-        					}
-        				else
-        					{
-        					 if(KErrNone == rootNode->NodeName().CompareF(KText))
-        						{
-        						iLastError = EErrJunkContent;
-        						iPolicyInfo.ResetAndDestroy ();
-        						iAliasGroup.ResetAndDestroy ();
-        						CleanupStack::PopAndDestroy(documentNode);
-        						return;										
-        						}
-        					}
-        				}
-        
-        			if ( !isValid)
-        				{
-        				iLastError = EErrInvalidRootNode;
-        				iPolicyInfo.ResetAndDestroy ();
-        				iAliasGroup.ResetAndDestroy ();
-        				CleanupStack::PopAndDestroy(documentNode);
-        				return;
-        				}
-        
-        			TPtrC attrVal;
-        
-        			if ( rootNode->HasChildNodes ())
-        				{
-        				CMDXMLNode* childNode = rootNode->FirstChild ();
-        
-        				//Now get the list of <alias> nodes
-        				while ( childNode)
-        					{
-        					TPtrC nodeName = childNode->NodeName ();
-        
-        					//ALIAS PARSING
-        					if ( nodeName.CompareF (KAlias)== 0)
-        						{
-        						CMDXMLElement
-        								* aliasNode = dynamic_cast<CMDXMLElement*>(childNode);
-        					
-        						//store alias information in object
-        						CPermission* aliasObj = NULL;
-        																					
-        							{//Get the attribute "name" to get the alias name		    								    		
-        							aliasNode->GetAttribute(KNameAttr, attrVal);
-        
-        							if ( attrVal.Length ()>0)
-        								{
-        									if ( isAliasPresent (attrVal))
-        									{
-        									//invalid xml file
-        									if(aliasObj)
-        										delete aliasObj;
-        									iPolicyInfo.ResetAndDestroy ();
-        									iAliasGroup.ResetAndDestroy ();
-        									iLastError = EErrRepeatedAliasTag;
-        									CleanupStack::PopAndDestroy(documentNode);
-        									return;
-        									}
-        									
-        									aliasObj = CPermission::NewL();
-        									aliasObj->SetPermName(attrVal);
-        								}
-        							else
-        								{
-        								//alias name is invalid
-        								//check whether TPerm / alias name should be deleted
-        								if(aliasObj)
-        									delete aliasObj;
-        								iPolicyInfo.ResetAndDestroy ();
-        								iAliasGroup.ResetAndDestroy ();
-        								iLastError = EErrInvalidAliasName;
-        								CleanupStack::PopAndDestroy(documentNode);
-        								return;
-        								}
-        							
-        							if ( aliasNode->HasChildNodes ())
-        								{
-        									CPermissionSet *aliasCaps = CPermissionSet::NewL();
-        						
-        									TBool result = GetCapabilitiesForGroup(
-        														(CMDXMLElement*)aliasNode,
-        														*aliasCaps, *aliasObj); //get list of uncond caps
-        									
-        									if(result < 0)
-        									{
-        										//Invalid capability string in policy file
-        										if(aliasObj)
-        											delete aliasObj;
-        										if(aliasCaps)
-        											delete aliasCaps;
-        										iPolicyInfo.ResetAndDestroy ();
-        										iAliasGroup.ResetAndDestroy ();
-        										iLastError = result;  //EErrInvalidCapability or EErrRepeatedCaps
-        										CleanupStack::PopAndDestroy(documentNode);
-        										return;
-        									}
-        									if(aliasCaps)
-        										delete aliasCaps;
-        									
-        								}
-        							}
-        							
-        							if(aliasObj)
-        								iAliasGroup.AppendL(aliasObj); 
-        						}
-        						
-        					//check if the domain name is already present..
-        					//need to check to avoid repeated domain tags..
-        					if ( nodeName.CompareF (KDomain)== 0)
-        						{
-        						CMDXMLElement
-        								* domainNode = dynamic_cast<CMDXMLElement*>(childNode);
-        						CProtectionDomain* pPolicy=  NULL;
-        
-        							{//Get the attribute "name" to get the domain name		    								    		
-        							domainNode->GetAttribute (KNameAttr, attrVal);
-        
-        							if ( attrVal.Length ()>0)
-        								{
-        								if ( isDomainPresent (attrVal))
-        									{
-        									//invalid xml file
-        									//delete pPolicy;
-        									iPolicyInfo.ResetAndDestroy ();
-        									iAliasGroup.ResetAndDestroy ();
-        									iLastError = EErrRepeatedDomainTag;
-        									CleanupStack::PopAndDestroy(documentNode);
-        									return;
-        									}
-        
-        								pPolicy = CProtectionDomain::NewL ();
-        								pPolicy->SetDomainName (attrVal);
-        								}
-        							else
-        								{
-        								//domain name is invalid
-        								if ( pPolicy)
-        									delete pPolicy;
-        								iPolicyInfo.ResetAndDestroy ();
-        								iAliasGroup.ResetAndDestroy ();
-        								iLastError = EErrInvalidDomainName;
-        								CleanupStack::PopAndDestroy(documentNode);
-        								return;
-        								}
-        
-        							if ( domainNode->HasChildNodes ())
-        								{
-        								CPermissionSet* caps = CPermissionSet::NewL ();
-        
-        								CMDXMLNode
-        										* domainChildNode = domainNode->FirstChild ();
-        								for (; domainChildNode;domainChildNode=domainChildNode->NextSibling ())
-        									{
-        									if ( domainChildNode->NodeType ()==CMDXMLNode::EElementNode)
-        										{
-        										if ( 0==domainChildNode->NodeName().CompareF (KAllow))//<Allow> unconditional node
-        											{
-        												TBool result = GetCapabilities(
-        														(CMDXMLElement*)domainChildNode,
-        														*caps); //get list of uncond caps
-        														
-        												if(result < 0)
-        												{
-        													//Invalid capability string in policy file
-        													if ( pPolicy)
-        														delete pPolicy;
-        													if(caps)
-        														delete caps;
-        													iPolicyInfo.ResetAndDestroy ();
-        													iAliasGroup.ResetAndDestroy ();
-        													iLastError = result;  //EErrInvalidCapability or EErrRepeatedCaps
-        													CleanupStack::PopAndDestroy(documentNode);
-        													return;
-        												}
-        											}	
-        										else if ( 0==domainChildNode->NodeName().CompareF (KUser))//<User> Conditional node
-        											{
-        												//Get UGCaps
-        												TUserPromptOption upOption(RTUserPrompt_UnDefined);
-        												
-        												TInt error = GetConditions ((CMDXMLElement*)domainChildNode, upOption);//Get conditions
-        												
-        												if(EErrInvalidPermission == error)
-        												{
-        													// invalid permission is specified
-        													if ( pPolicy)
-        														delete pPolicy;
-        													if(caps)
-        														delete caps;
-        													iLastError = EErrInvalidPermission;
-        													iPolicyInfo.ResetAndDestroy ();
-        													iAliasGroup.ResetAndDestroy ();
-        													CleanupStack::PopAndDestroy(documentNode);
-        													return;
-        												}
-        													
-        												TUserPromptOption
-        														defCond = GetDefaultCondition ((CMDXMLElement*)domainChildNode);
-        
-        												if(RTUserPrompt_UnDefined == defCond)
-        													{
-        													//default condition is not specified
-        													if ( pPolicy)
-        														delete pPolicy;
-        													if(caps)
-        														delete caps;
-        													iLastError = EErrNoDefaultCondition;
-        													iPolicyInfo.ResetAndDestroy ();
-        													iAliasGroup.ResetAndDestroy ();
-        													CleanupStack::PopAndDestroy(documentNode);
-        													return;
-        													}
-        													
-        												//default condition is specified
-        												error = GetCapabilities (
-        															(CMDXMLElement*)domainChildNode,
-        															*caps,
-        															upOption,
-        															ETrue, defCond); //get list of ug caps	
-        												if(error < 0)
-        												{
-        													//Invalid capability string in policy file
-        													if ( pPolicy)
-        														delete pPolicy;
-        													if(caps)
-        														delete caps;
-        													iPolicyInfo.ResetAndDestroy ();
-        													iAliasGroup.ResetAndDestroy ();
-        													iLastError = error;  //EErrInvalidCapability or EErrRepeatedCaps
-        													CleanupStack::PopAndDestroy(documentNode);
-        													return;
-        												}
-        											}
-        											else  	// neither USER nor ALLOW node
-        											{
-        												//checking for misplaced alias tag
-        												if((KErrNone == domainChildNode->NodeName().CompareF(KAlias)))
-        												{
-        													if ( pPolicy)
-        														delete pPolicy;
-        													if(caps)
-        														delete caps;
-        													iLastError = EErrMisplacedAlias;
-        													iAliasGroup.ResetAndDestroy ();
-        													iPolicyInfo.ResetAndDestroy ();
-        													CleanupStack::PopAndDestroy(documentNode);
-        													return;										
-        												}
-        											}
-        										}
-        										else
-        										{
-        											//the node is not an element node
-        											//hence it should be comment / junk content
-        											if((KErrNone == domainChildNode->NodeName().CompareF(KText)))
-        											{
-        												if ( pPolicy)
-        													delete pPolicy;
-        												if (caps)
-        													delete caps;
-        												iLastError = EErrJunkContent;
-        												iPolicyInfo.ResetAndDestroy ();
-        												iAliasGroup.ResetAndDestroy ();
-        												CleanupStack::PopAndDestroy(documentNode);
-        												return;										
-        											}
-        											else if(KErrNone == domainChildNode->NodeName().CompareF(KComment))
-        												continue;
-        										}
-        									}									
-        								if ( pPolicy)
-        									pPolicy->SetCapInfo (caps);
-        
-        								}
-        							}
-        
-        						if ( pPolicy)
-        							iPolicyInfo.AppendL (pPolicy);
-        						}
-        						else if((KErrNone == nodeName.CompareF(KText)))
-        						{
-        							iLastError = EErrJunkContent;
-        							iPolicyInfo.ResetAndDestroy ();
-        							iAliasGroup.ResetAndDestroy ();
-        							CleanupStack::PopAndDestroy(documentNode);
-        							return;										
-        						}
-        						
-        					childNode = childNode->NextSibling (); //traverse to the next sibling node			    			
-        
-        					}
-        				} //rootNode->HasChildNodes()
-        			else
-        				{
-        				//No policy information in the xml file
-        				//Treat this as an error
-        				iLastError = EErrNoPolicyInfo;
-        				iPolicyInfo.ResetAndDestroy ();
-        				iAliasGroup.ResetAndDestroy ();
-        				CleanupStack::PopAndDestroy(documentNode);
-        				return;
-        				}
-        
-        			CleanupStack::PopAndDestroy(documentNode);
-        			}
-        		else
-        			{
-        			iLastError = EErrInvalidDocNode;
-        			return;
-        			}
-        		}
-	    }
-	}
-
-TInt CPolicyParser::GetCapsNode(CMDXMLElement* aParentDomainNode,
-		RPointerArray<CMDXMLElement>& aCapNodes, const TDesC& aNodeName)
-	{
-	if ( aParentDomainNode->HasChildNodes ())
-		{
-		CMDXMLNode* childNode = aParentDomainNode->FirstChild ();
-
-		do
-			{
-			if ( childNode)
-				{
-				if ( 0==childNode->NodeName().Compare (aNodeName))
-					{
-					CMDXMLElement* pAllowNode = dynamic_cast<CMDXMLElement*>(childNode);
-					aCapNodes.AppendL (pAllowNode);
-					}
-
-				childNode = childNode->NextSibling ();
-				}
-
-			}
-		while (NULL != childNode);
-		}
-
-	return EErrNone; //No other possible return err code...
-	}
-
-CMDXMLElement* CPolicyParser::GetCapsNode(CMDXMLElement* aParentDomainNode,
-		const TDesC& aNodeName)
-	{
-	if ( aParentDomainNode->HasChildNodes ())
-		{
-		CMDXMLNode* childNode = aParentDomainNode->FirstChild ();
-
-		do
-			{
-			if ( childNode)
-				{
-				if ( 0==childNode->NodeName().Compare (aNodeName))
-					{
-					CMDXMLElement* pAllowNode = dynamic_cast<CMDXMLElement*>(childNode);
-					return pAllowNode;
-					}
-
-				childNode = childNode->NextSibling ();
-				}
-
-			}
-		while (NULL != childNode);
-		}
-	return NULL;
-	}
-
-TInt CPolicyParser::GetCapabilities(CMDXMLElement* aParentNode,
-		CPermissionSet& aCapInfo, TUserPromptOption aUpOpt, TBool aUGCaps,
-		TUserPromptOption aDefUpOpt)
-	{
-	if ( aParentNode->HasChildNodes ())
-		{
-		CMDXMLNode* childNode = aParentNode->FirstChild ();
-
-		do
-			{
-			if ( childNode)
-				{
-				CMDXMLNode* capabilitiesNode=  NULL;
-				if ( 0==childNode->NodeName().CompareF (KCapabilities))
-					{
-					capabilitiesNode = dynamic_cast<CMDXMLElement*>(childNode);
-
-					//traverse <capability/> nodes under <capabilities/>
-					if ( capabilitiesNode->HasChildNodes ())
-						{
-						RCapabilityArray capabilities;
-						
-						for (CMDXMLNode
-								* capabilityNode=capabilitiesNode->FirstChild (); capabilityNode;capabilityNode=capabilityNode->NextSibling ())
-							{
-							//Get the textnode under <capability/>
-							if ( capabilityNode)
-								{
-								for (CMDXMLNode
-										* capChildNode=capabilityNode->FirstChild (); capChildNode;capChildNode=capChildNode->NextSibling ())
-									{
-									//Get the textnode under <capability/>
-									if ( CMDXMLNode::ETextNode==capChildNode->NodeType ())
-										{
-										CMDXMLText
-												* capTextNode = dynamic_cast<CMDXMLText*>(capChildNode);
-										//Extract text out of this node
-										TCapability
-												cap = GetCapability (capTextNode->Data ());
-
-										if ((ECapability_None!=cap))
-											{
-											
-											// Get LOGIC for the storage of Group capability
-											
-											if ( aUGCaps)
-												{
-												if ( (!IsPresent(aCapInfo,cap)) && (!IsUserGrantPresent(aCapInfo,cap)))
-													{
-														capabilities.Append(cap);
-														
-														if ( RTUserPrompt_UnDefined==aUpOpt)								
-															{
-																CPermission* perm = CPermission::NewL(capabilities, aDefUpOpt,aDefUpOpt);
-																aCapInfo.AppendPermission (*perm);
-															}
-																
-															else
-															{
-																CPermission* perm = CPermission::NewL(capabilities, aDefUpOpt,aUpOpt);
-																aCapInfo.AppendPermission (*perm);
-															}
-													}
-													else
-													{
-														return EErrRepeatedCaps;	
-													}
-												}
-											else
-												{
-													//Check before appending unconditional capability that
-													//whether the capability is already added or not...
-													if ( (!IsPresent(aCapInfo,cap)) && (!IsUserGrantPresent(aCapInfo,cap)))
-													{
-														aCapInfo.AppendUncondCap (cap);	
-													}
-													else
-													{
-														//capability string given more than once.. hence invalid
-														return EErrRepeatedCaps;		
-													}
-												}
-											}
-										else
-											{
-												TBool invalidCaps = ETrue;
-												
-												for(TInt idx = 0; idx < iAliasGroup.Count(); idx++)
-												{
-													CPermission *tempObj = iAliasGroup[idx];
-													TPtrC name = tempObj->PermName();
-													
-													if ((KErrNone == capTextNode->Data().CompareF(name)))
-													{
-													//it is not a text node. so is an alias group
-													
-													//alias group name is found. so obtain the caps
-													TUint32 capAlias = tempObj->PermissionData();
-													invalidCaps = EFalse;
-													if( aUGCaps)
-														{
-															for(TInt idx1 = 0; idx1 < 20; idx1++)
-															{
-																TUint32 tempCapToCheck(KDefaultEnableBit);
-																tempCapToCheck = tempCapToCheck << (idx1);
-																
-																if(capAlias & tempCapToCheck)
-																	capabilities.Append((TCapability)idx1);
-																
-															}
-															if ( RTUserPrompt_UnDefined==aUpOpt)								
-															{
-																CPermission* perm = CPermission::NewL(capabilities, aDefUpOpt,aDefUpOpt);
-																perm->SetPermName(name);
-																aCapInfo.AppendPermission (*perm);
-															}
-																
-															else
-															{
-																CPermission* perm = CPermission::NewL(capabilities, aDefUpOpt,aUpOpt);
-																perm->SetPermName(name);
-																aCapInfo.AppendPermission (*perm);
-															}
-														}
-													else
-														{
-														TUint32 capPresent = aCapInfo.UnconditionalCaps();
-														TUint32 capAfter = capAlias | capPresent;
-														TUint32 capRep = capAlias ^ capPresent;
-														TUint32 errChk = capRep & capAfter; //error if capAfter and error are different
-														
-														if(!(errChk & capAfter))
-															{
-															//capability string given more than once.. hence invalid
-															return EErrRepeatedCaps;
-															}
-															
-														aCapInfo.AppendUncondCapabilities(capAfter);	
-														}
-													}
-												}
-
-												if (invalidCaps)
-												{
-												//just log the error message
-												RDebug::Print (_L ("CPolicyParser::GetCapabilities : Invalid capability string"));
-												return EErrInvalidCapability;
-												}
-											}
-
-										}
-									}
-								}
-								capabilities.Close();						
-							}
-						}
-					else
-						{
-						RDebug::Print (_L ("CPolicyParser::GetCapabilities : No <capability> under <capabilities/>"));
-						}
-
-					}
-
-				childNode = childNode->NextSibling ();
-				}
-			else
-				{
-				RDebug::Print (_L ("CPolicyParser::GetCapabilities : Childnode NULL"));
-				}
-			}
-		while (NULL != childNode);
-		}
-		
-	return EErrNone;
-	}
-
-TInt CPolicyParser::GetCapabilitiesForGroup(CMDXMLElement* aParentNode,
-		CPermissionSet& aCapInfo, CPermission& aAliasInfo, TUserPromptOption aUpOpt, TBool aUGCaps,
-		TUserPromptOption aDefUpOpt)
-	{
-	if ( aParentNode->HasChildNodes ())
-		{
-		CMDXMLNode* childNode = aParentNode->FirstChild ();
-
-		do
-			{
-			if ( childNode)
-				{
-				CMDXMLNode* capabilitiesNode=  NULL;
-				if ( 0==childNode->NodeName().CompareF (KCapabilities))
-					{
-					capabilitiesNode = dynamic_cast<CMDXMLElement*>(childNode);
-
-					//traverse <capability/> nodes under <capabilities/>
-					if ( capabilitiesNode->HasChildNodes ())
-						{
-						RCapabilityArray capabilities;
-						
-						for (CMDXMLNode
-								* capabilityNode=capabilitiesNode->FirstChild (); capabilityNode;capabilityNode=capabilityNode->NextSibling ())
-							{
-							//Get the textnode under <capability/>
-							if ( capabilityNode)
-								{
-								for (CMDXMLNode
-										* capChildNode=capabilityNode->FirstChild (); capChildNode;capChildNode=capChildNode->NextSibling ())
-									{
-									//Get the textnode under <capability/>
-									if ( CMDXMLNode::ETextNode==capChildNode->NodeType ())
-										{
-										CMDXMLText
-												* capTextNode = dynamic_cast<CMDXMLText*>(capChildNode);
-										//Extract text out of this node
-										TCapability
-												cap = GetCapability (capTextNode->Data ());
-
-										
-										if ((ECapability_None!=cap))
-											{
-											
-											// Get LOGIC for the storage of Group capability
-											
-											if ( aUGCaps)
-												{
-												//For ALIAS GROUP this condition is not true and foll stm are not executed
-												if ( (!IsPresent(aCapInfo,cap)) && (!IsUserGrantPresent(aCapInfo,cap)))
-													{
-													capabilities.Append(cap);
-													
-													if ( RTUserPrompt_UnDefined==aUpOpt)								
-															{
-																CPermission* perm = CPermission::NewL(capabilities, aDefUpOpt,aDefUpOpt);
-																
-																aCapInfo.AppendPermission (*perm);
-															}
-																
-															else
-															{
-																CPermission* perm = CPermission::NewL(capabilities, aDefUpOpt,aUpOpt);
-																
-																aCapInfo.AppendPermission (*perm);
-															}
-													}
-													else
-													{
-													return EErrRepeatedCaps;	
-													}
-												}
-											else
-												{
-													//Check before appending unconditional capability that
-													//whether the capability is already added or not...
-													if ( (!IsPresent(aCapInfo,cap) && (!IsUserGrantPresent(aCapInfo,cap))) && (!IsCapsAliasPresent(aAliasInfo,cap)))
-													{
-														aCapInfo.AppendUncondCap (cap);	
-														aAliasInfo.AppendCapPermData(cap);
-													}
-													else
-													{
-														//capability string given more than once.. hence invalid
-														return EErrRepeatedCaps;		
-													}
-												}
-											}
-										else
-											{
-												TBool invalidCaps = ETrue;
-												for(TInt idx = 0; idx < iAliasGroup.Count(); idx++)
-												{
-													CPermission *tempObj = iAliasGroup[idx];
-													TPtrC name = tempObj->PermName();
-													
-													if ((KErrNone == capTextNode->Data().CompareF(name)))
-													{
-													invalidCaps = EFalse;
-													//it is not a text node. so is an alias group
-													
-													//alias group name is found. so obtain the caps
-													TUint32 capAlias = tempObj->PermissionData();
-													TUint32 capPresent = aCapInfo.UnconditionalCaps();
-													TUint32 capAfter = capAlias | capPresent;
-													TUint32 capRep = capAlias ^ capPresent;
-													TUint32 errChk = capRep & capAfter; //error if capAfter and error are different
-													
-													if(!(errChk & capAfter))
-														{
-														//capability string given more than once.. hence invalid
-														return EErrRepeatedCaps;
-														}
-														
-													aCapInfo.AppendUncondCapabilities(capAfter);
-													aAliasInfo.SetPermissionData(capAfter);
-													}
-												}
-
-												if (invalidCaps)
-												{
-												//just log the error message
-												RDebug::Print (_L ("CPolicyParser::GetCapabilities : Invalid capability string"));
-												return EErrInvalidCapability;
-												}
-											}
-
-										}										
-									}
-								}
-						
-							
-							capabilities.Close();						
-							}
-						}
-					else
-						{
-						RDebug::Print (_L ("CPolicyParser::GetCapabilities : No <capability> under <capabilities/>"));
-						}
-
-					}
-
-				childNode = childNode->NextSibling ();
-				}
-			else
-				{
-				RDebug::Print (_L ("CPolicyParser::GetCapabilities : Childnode NULL"));
-				}
-
-			}
-		while (NULL != childNode);
-		}
-		
-		return EErrNone;
-	}
-
-TInt CPolicyParser::GetConditions(CMDXMLElement* aParentNode, TUserPromptOption& aUserPromptOpt)
-	{
-	TUint32 ret(RTUserPrompt_UnDefined);
-	
-	if ( aParentNode->HasChildNodes ())
-		{
-		CMDXMLNode* childNode = aParentNode->FirstChild ();
-
-		do
-			{
-			if ( childNode)
-				{
-				CMDXMLNode* condNode=  NULL;
-				if ( 0==childNode->NodeName().CompareF (KCondition))
-					{
-					condNode = dynamic_cast<CMDXMLElement*>(childNode);
-
-					if ( condNode->HasChildNodes ())
-						{
-						for (CMDXMLNode* condChildNode=condNode->FirstChild (); condChildNode;condChildNode=condChildNode->NextSibling ())
-							{
-							//Get the textnode under <condition/>
-							if ( CMDXMLNode::ETextNode==condChildNode->NodeType ())
-								{
-								CMDXMLText
-										* condition = dynamic_cast<CMDXMLText*>(condChildNode);
-
-								if ( condition)
-									{
-									TInt32 returnVal = GetUserPromptOption (condition->Data ());
-									
-										if(RTUserPrompt_UnDefined == returnVal)
-										{
-										  aUserPromptOpt = (TUserPromptOption)returnVal;
-										  return EErrInvalidPermission;						
-										}
-									
-									ret |= returnVal;
-									}
-								}
-							}
-						}
-					}
-				childNode = childNode->NextSibling ();
-				}
-
-			}
-		while (NULL != childNode);
-		}
-
-	aUserPromptOpt = (TUserPromptOption)ret;
-	return EErrNone;
-	}
-
-TBool CPolicyParser::isDomainPresent(const TDesC& aDomainName)
-	{
-	TBool isPresent(EFalse);
-
-	for (TInt i(0); i!=iPolicyInfo.Count ();++i)
-		{
-		if ( 0==iPolicyInfo[i]->DomainName().CompareF (aDomainName))
-			{
-			isPresent=ETrue;
-			break;
-			}
-		}
-
-	return isPresent;
-	}
-	
-TBool CPolicyParser::IsPresent(const CPermissionSet& aCapInfo, TCapability aCap)
-	{
-	TUint32 uncondCaps = aCapInfo.UnconditionalCaps ();
-
-	TUint32 tempCapToCheck(KDefaultEnableBit);
-	tempCapToCheck = tempCapToCheck << (aCap);
-
-	return (uncondCaps & tempCapToCheck);
-	}
-
-TBool CPolicyParser::IsCapsAliasPresent(const CPermission& aAliasInfo, TCapability aCap)
-	{
-	TUint32 uncondCaps = aAliasInfo.PermissionData ();
-
-	TUint32 tempCapToCheck(KDefaultEnableBit);
-	tempCapToCheck = tempCapToCheck << (aCap);
-
-	return (uncondCaps & tempCapToCheck);
-	}
-
-TBool CPolicyParser::IsUserGrantPresent(const CPermissionSet& aCapInfo,
-		TCapability aCap)
-	{
-	TUint32 perms(KDefaultNullBit);
-	//RPermissions tempPerms = aCapInfo.Permissions();
-	for (TInt i(0); i!=(aCapInfo.Permissions()).Count ();++i)
-		{
-		TUint32 temp(KDefaultEnableBit);
-		RCapabilityArray capabilities;
-		(aCapInfo.Permissions())[i]->Capabilitilites(capabilities);
-		for(TInt capIdx(0);capIdx!=capabilities.Count();++capIdx)
-			{
-			temp = temp << (capabilities[capIdx]);
-			perms |= temp;
-			}		
-		capabilities.Close();
-		}
-
-	TUint32 temp(KDefaultEnableBit);
-	temp = temp << (aCap);
-	return (perms & temp);
-	}
-
-TUserPromptOption CPolicyParser::GetDefaultCondition(CMDXMLElement* aParentNode)
-	{
-	if ( aParentNode->HasChildNodes ())
-		{
-		CMDXMLNode* childNode = aParentNode->FirstChild ();
-
-		do
-			{
-			if ( childNode)
-				{
-				CMDXMLNode* condNode=  NULL;
-				if ( 0==childNode->NodeName().CompareF (KDefCondition))
-					{
-					condNode = dynamic_cast<CMDXMLElement*>(childNode);
-
-					if ( condNode->HasChildNodes ())
-						{
-						for (CMDXMLNode* condChildNode=condNode->FirstChild (); condChildNode;condChildNode=condChildNode->NextSibling ())
-							{
-							if ( CMDXMLNode::ETextNode==condChildNode->NodeType ())
-								{
-								CMDXMLText
-										* condition = dynamic_cast<CMDXMLText*>(condChildNode);
-
-								if ( condition)
-									{
-									return GetUserPromptOption (condition->Data ());
-									}
-								}
-							}
-						}
-					}
-
-				childNode = childNode->NextSibling ();
-				}
-
-			}
-		while (NULL != childNode);
-		}
-
-	return RTUserPrompt_UnDefined;
-	}
-
-TCapability CPolicyParser::GetCapability(const TDesC& aUserPromptOpt)
-	{
-	TCapability cap(ECapability_None);
-
-	if ( 0==aUserPromptOpt.CompareF (KCapabilityTCB))
-		{
-		cap=ECapabilityTCB;
-		}
-	else
-		if ( 0==aUserPromptOpt.CompareF (KCapabilityCommDD))
-			{
-			cap=ECapabilityCommDD;
-			}
-		else
-			if ( 0==aUserPromptOpt.CompareF (KCapabilityPowerMgmt))
-				{
-				cap=ECapabilityPowerMgmt;
-				}
-			else
-				if ( 0==aUserPromptOpt.CompareF (KCapabilityMultimediaDD))
-					{
-					cap=ECapabilityMultimediaDD;
-					}
-				else
-					if ( 0==aUserPromptOpt.CompareF (KCapabilityReadDeviceData))
-						{
-						cap=ECapabilityReadDeviceData;
-						}
-					else
-						if ( 0==aUserPromptOpt.CompareF (KCapabilityWriteDeviceData))
-							{
-							cap=ECapabilityWriteDeviceData;
-							}
-						else
-							if ( 0==aUserPromptOpt.CompareF (KCapabilityDRM))
-								{
-								cap=ECapabilityDRM;
-								}
-							else
-								if ( 0==aUserPromptOpt.CompareF (KCapabilityTrustedUI))
-									{
-									cap=ECapabilityTrustedUI;
-									}
-								else
-									if ( 0==aUserPromptOpt.CompareF (KCapabilityProtServ))
-										{
-										cap=ECapabilityProtServ;
-										}
-									else
-										if ( 0==aUserPromptOpt.CompareF (KCapabilityDiskAdmin))
-											{
-											cap=ECapabilityDiskAdmin;
-											}
-										else
-											if ( 0==aUserPromptOpt.CompareF (KCapabilityNetworkControl))
-												{
-												cap=ECapabilityNetworkControl;
-												}
-											else
-												if ( 0==aUserPromptOpt.CompareF (KCapabilityAllFiles))
-													{
-													cap=ECapabilityAllFiles;
-													}
-												else
-													if ( 0==aUserPromptOpt.CompareF (KCapabilitySwEvent))
-														{
-														cap=ECapabilitySwEvent;
-														}
-													else
-														if ( 0==aUserPromptOpt.CompareF (KCapabilityNetworkServices))
-															{
-															cap=ECapabilityNetworkServices;
-															}
-														else
-															if ( 0==aUserPromptOpt.CompareF (KCapabilityLocalServices))
-																{
-																cap=ECapabilityLocalServices;
-																}
-															else
-																if ( 0==aUserPromptOpt.CompareF (KCapabilityReadUserData))
-																	{
-																	cap=ECapabilityReadUserData;
-																	}
-																else
-																	if ( 0==aUserPromptOpt.CompareF (KCapabilityWriteUserData))
-																		{
-																		cap=ECapabilityWriteUserData;
-																		}
-																	else
-																		if ( 0==aUserPromptOpt.CompareF (KCapabilityLocation))
-																			{
-																			cap=ECapabilityLocation;
-																			}
-																		else
-																			if ( 0==aUserPromptOpt.CompareF (KCapabilitySurroundingsDD))
-																				{
-																				cap=ECapabilitySurroundingsDD;
-																				}
-																			else
-																				if ( 0==aUserPromptOpt.CompareF (KCapabilityUserEnvironment))
-																					{
-																					cap=ECapabilityUserEnvironment;
-																					}
-	return cap;
-	}
-
-TUserPromptOption CPolicyParser::GetUserPromptOption(const TDesC& aUserPromptOpt)
-	{
-	TUserPromptOption userPromptOpt = RTUserPrompt_UnDefined;
-
-	if ( 0==aUserPromptOpt.CompareF (KUserPromptOneShot))
-		{
-		userPromptOpt=RTUserPrompt_OneShot;
-		}
-	else
-		if ( 0==aUserPromptOpt.CompareF (KUserPromptSession))
-			{
-			userPromptOpt=RTUserPrompt_Session;
-			}
-		else
-			if ( 0==aUserPromptOpt.CompareF (KUserPromptBlanket))
-				{
-				userPromptOpt=RTUserPrompt_Permanent;
-				}
-	return userPromptOpt;
-	}
-
-TBool CPolicyParser::isAliasPresent(const TDesC& aAliasName)
-	{
-		TBool isPresent(EFalse);
-
-		for(TInt idx = 0; idx < iAliasGroup.Count(); idx++)
-		{
-			if( KErrNone == iAliasGroup[idx]->PermName().CompareF(aAliasName))
-			{
-				isPresent = ETrue;
-				break;
-			}
-			
-		}
-		
-		return isPresent;
-	}