authorisation/userpromptservice/policies/source/policy.cpp
changeset 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/authorisation/userpromptservice/policies/source/policy.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -0,0 +1,341 @@
+/*
+* Copyright (c) 2007-2009 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: 
+*
+*/
+
+
+#include <ups/policy.h>
+
+using namespace UserPromptService;
+
+EXPORT_C TSidClasses::TSidClasses(TUint16 aSidClasses)
+	: iSidClasses(aSidClasses)
+/**
+Constructor
+@param aSidClasses A 32 bit integers that represents the set of SID classes.
+*/
+	{
+	}
+
+EXPORT_C TBool TSidClasses::Contains(const TSecureId& aSid) const
+/**
+Determines the set of SID classes contains a given SID.
+@param aSid The SID to test.
+@return ETrue if aSID lies within one of the SID classes.
+*/
+	{
+	TInt sidClass = (aSid.iId & 0xf0000000) >> 28;	
+	return (1 << sidClass) & iSidClasses;
+	}
+
+EXPORT_C CPolicy* CPolicy::NewL(const TSidClasses& aSidClasses, const RArray<TSecureId>& aSidList, 
+		const TDesC& aDestination, TUint aOptions, const TUid& aPolicyEvaluator, 
+		const TUid& aDialogCreator, TUint16 aFlags, TSystemServerSecurity aSystemServerSecurity, 
+		TUint16 aMajorVersion, TUint16 aMinorVersion, TBool aDefault)
+/**
+Creates a new policy object.
+			   
+@param aSidClasses				The classes of SIDs that this policy applies to.
+@param aSidList					A list of individual SIDs that this policy applies to. This overrides aSidClasses.
+@param aDestination				The wildcard string to match against destination supplied by the system server.						   
+@param aOptions					A bit field that defines whether the prompt should be displayed and if so,
+								what buttons should be available.
+@param aPolicyEvaluator 		The implementation UID of the policy evaluator ECOM plug-in to use with this policy.
+@param aDialogCreator			The implementation UID of the dialog creator ECOM plug-in to use with this policy.
+@param aFlags					Flags specific to an individual policy evaluator.
+@param aSystemServerSecurity	Whether this policy is specific to clients that pass/fail 
+								the system server's security check.
+@param aMajorVersion			The major version of the UPS policy file.
+@param aMinorVersion			The minor version of the UPS policy file.
+@param aDefault					Set to ETrue if this is an automatically generated policy
+								because no match was found in the policy file.
+
+@return A pointer to the new policy object.
+ */
+	{
+	CPolicy* self = CPolicy::NewLC(aSidClasses, aSidList, aDestination, aOptions, 
+		aPolicyEvaluator, aDialogCreator, aFlags, aSystemServerSecurity, 
+		aMajorVersion, aMinorVersion, aDefault);
+	CleanupStack::Pop(self);
+	return self;
+	}		
+	
+EXPORT_C CPolicy* CPolicy::NewLC(const TSidClasses& aSidClasses, const RArray<TSecureId>& aSidList, 
+	const TDesC& aDestination, TUint aOptions, const TUid& aPolicyEvaluator, 
+	const TUid& aDialogCreator, TUint16 aFlags, TSystemServerSecurity aSystemServerSecurity, 
+	TUint16 aMajorVersion, TUint16 aMinorVersion, TBool aDefault)
+/**
+Creates a new policy object and puts the pointer on the cleanup stack.
+
+@param aSidClasses				The classes of SIDs that this policy applies to.
+@param aSidList					A list of individual SIDs that this policy applies to. This overrides aSidClasses.
+@param aDestination				The wildcard string to match against destination supplied by the system server.						   
+@param aOptions					A bit field that defines whether the prompt should be displayed and if so,
+								what buttons should be available.
+@param aPolicyEvaluator 		The implementation UID of the policy evaluator ECOM plug-in to use with this policy.
+@param aDialogCreator			The implementation UID of the dialog creator ECOM plug-in to use with this policy.
+@param aFlags					Flags specific to an individual policy evaluator.
+@param aSystemServerSecurity	Whether this policy is specific to clients that pass/fail 
+								the system server's security check.
+@param aMajorVersion			The major version of the UPS policy file.
+@param aMinorVersion			The minor version of the UPS policy file.
+@param aDefault					Set to ETrue if this is an automatically generated policy
+								because no match was found in the policy file.
+
+@return A pointer to the new policy object.
+ */
+	{
+	CPolicy* self = new(ELeave) CPolicy(
+		aSidClasses, aOptions, aPolicyEvaluator, 
+		aDialogCreator, aFlags, aSystemServerSecurity, 
+		aMajorVersion, aMinorVersion, aDefault);
+	CleanupStack::PushL(self);
+	self->ConstructL(aSidList, aDestination);
+	return self;
+	}
+
+EXPORT_C TBool CPolicy::Matches(const TSecureId& aClientSid, const TDesC& aDestination, TBool aSecurityResult) const
+/**
+Determines whether a request matches this policy.
+The request matches if and only if the following conditions are true.
+
+- aClientSid matches an entry in the SID list or lies within one of the classes of SIDs
+- aDestination matches the destination wildcard string in the policy.
+- The result of the system server's securitiy check for this client matches the rule defined
+  for this policy.
+  - iSystemServerSecurity  == ESystemServerSecurityPassedOrFailed OR
+  - aSecurityResult == ETrue and iSystemServerSecurity == ESystemServerSecurityPassed OR
+  - aSecurityResult == EFalse and iSystemServerSecurity == ESystemServerSecurityFailed 
+
+@param aClientSid		The SID of the client application
+@param aDestination		A descriptor containing the destination supplied by the system server.
+@param aSecurityResult	ETrue, if the client passed the system server's security check, otherwise, EFalse.
+@return 				ETrue If the policy matches the request; otherwise EFalse is returned.
+*/
+	{	
+	if (iSystemServerSecurity == CPolicy::ESystemServerSecurityPassed &&
+		! aSecurityResult)
+		{
+		return EFalse;
+		}
+	else if (iSystemServerSecurity == CPolicy::ESystemServerSecurityFailed &&
+		aSecurityResult)
+		{
+		return EFalse;
+		}
+	
+	TBool sidMatch(EFalse);
+	TInt sidListCount = iSidList.Count();
+	if (sidListCount > 0)
+		{
+		for (TInt i = 0; i < sidListCount; ++i)
+			{
+			if (iSidList[i] == aClientSid.iId)
+				{				
+				sidMatch = ETrue;
+				break;
+				}
+			}
+		}
+	else 
+		{
+		sidMatch = iSidClasses.Contains(aClientSid);
+		}	
+	
+	return sidMatch && (aDestination.MatchF(*iDestination) != KErrNotFound);
+	}
+
+EXPORT_C const TDesC& CPolicy::Destination() const
+/**
+Gets the destination wildcard string.
+@return A reference to a descriptor containing the wildcard string to
+		match against the destination supplied by the system server.
+ */
+	{
+	return *iDestination;
+	}
+
+EXPORT_C const TSidClasses& CPolicy::SidClasses() const 
+/**
+Gets the classes of SIDs that are applicable to this policy.
+@return The set of SID classes that this policy applies to.
+ */
+	{
+	return iSidClasses;
+	}
+
+EXPORT_C const RArray<TSecureId>& CPolicy::SidList() const 
+/**
+Gets the list of individual SIDs that are applicable to this policy.
+The SID list takes precedent over the SID classes when matching policies.
+ 
+@return The list of SIDs that this policy applies to as an array of 
+		unsigned integers.
+*/
+	{
+	return iSidList;
+	}	
+
+EXPORT_C CPolicy::TOptions CPolicy::Options() const 
+/**
+Gets the options field for this policy. 
+@see CPolicy::TOptions
+@return A 32bit integer containing the options.
+*/
+	{		
+	return TOptions(iOptions);
+	}
+
+EXPORT_C const TUid& CPolicy::PolicyEvaluator() const
+/**
+Gets the implementation UID of the policy evaluator to use with this policy.
+@return The implementation UID of the Policy Evaluator 
+*/
+	{
+	return iPolicyEvaluator;
+	}
+
+EXPORT_C const TUid& CPolicy::DialogCreator() const
+/**
+Identifies the Dialog Creator to use with this policy.
+@return The implementation UID of the Dialog Creator. 
+*/
+	{
+	return iDialogCreator;
+	}
+
+EXPORT_C TUint16 CPolicy::Flags() const
+/**
+Gets the flags field. The contents of this field is specific to individual 
+policy evaluator plug-ins.
+
+@return The 16-bit flags field
+*/
+	{
+	return iFlags;
+	}
+
+EXPORT_C TBool CPolicy::Default() const
+/**
+If a policy file is defined for a request but no policy matches the request
+then a default policy object is created to allow the user to authorise a one-shot 
+request.\n
+This function allows the Policy Evaluator to check whether this policy 
+is the default policy.
+N.B. This can be overriden by simply defining a policy at the end of the file
+that matches all SIDs and has '*' as the destination wildcard.
+
+@return ETrue if this policy is the default (automatically generated) policy.
+*/
+	{
+	return iDefault;
+	}
+
+EXPORT_C TBool CPolicy::PromptRequired() const
+/**
+Examines the set of options to determine whether the policy requires a prompt to be
+displayed.
+
+If the options fields only contains authorizations (EYes, ESessionYes or EAlways) or conversely 
+the options field only contains rejections (ENo,ESessionNo or ENever) then this function will 
+return EFalse.\n
+
+@return ETrue if a prompt is required or EFalse if a prompt is not required
+		(in which case the request will probably be silently accepted / rejected).
+*/
+	{
+	// (a yes option) && (a no option)
+	return ((iOptions & (EYes|ESessionYes|EAlways)) && (iOptions & (ENo|ESessionNo|ENever)));
+	}	
+	
+EXPORT_C CPolicy::TSystemServerSecurity CPolicy::SystemServerSecurity() const
+/**
+Whether this policy is specific to clients's that pass or fail the system
+server's securitiy check.
+@return An enum that dictates whether this policy only applies if the client 
+ 		process passed/failed the system server's security check.
+*/
+	{
+	return iSystemServerSecurity;
+	}
+	
+EXPORT_C TUint16 CPolicy::MajorVersion() const 
+/**
+Gets the major version of the UPS policy file containing this policy.
+@return A 16-bit unsigned number containing the major version number.
+*/
+	{
+	return iMajorVersion;
+	}
+
+EXPORT_C TUint16 CPolicy::MinorVersion() const 
+/**
+Gets the minor version of the UPS policy file containing this policy.
+@return A 16-bit unsigned number containing the minor version number.
+*/
+	{
+	return iMinorVersion;
+	}
+
+CPolicy::CPolicy(const TSidClasses& aSidClasses, TUint aOptions,
+		const TUid& aPolicyEvaluator, const TUid& aDialogCreator, 
+		TUint16 aFlags, TSystemServerSecurity aSystemServerSecurity, 
+		TUint16 aMajorVersion, TUint16 aMinorVersion, TBool aDefault) 
+	  
+/**
+Constructor
+@param aSidClasses				The classes of SIDs that this policy applies to.
+@param aOptions					A bit field that defines whether the prompt should be displayed and if so,
+								what buttons should be available.
+@param aPolicyEvaluator 		The implementation UID of the policy evaluator ECOM plug-in to use with this policy.
+@param aDialogCreator			The implementation UID of the dialog creator ECOM plug-in to use with this policy.
+@param aFlags					Flags specific to an individual policy evaluator.
+@param aSystemServerSecurity	Whether this policy is specific to clients that pass/fail 
+								the system server's security check.
+@param aMajorVersion			The major version of the UPS policy file.
+@param aMinorVersion			The minor version of the UPS policy file.								
+@param aDefault					Set to ETrue if this is an automatically generated policy
+								because no match was found in the policy file.							 
+*/
+	: 	iSidClasses(aSidClasses), iOptions(aOptions),
+		iPolicyEvaluator(aPolicyEvaluator), iDialogCreator(aDialogCreator),
+		iFlags(aFlags), iSystemServerSecurity(aSystemServerSecurity), 
+		iMajorVersion(aMajorVersion), iMinorVersion(aMinorVersion), iDefault(aDefault)
+	{		
+	}
+
+void CPolicy::ConstructL(const RArray<TSecureId>& aSidList, const TDesC& aDestination)
+/**
+Second phase constructor
+@param aSidList		A list (possibly empty) of SIDs that this policy applies to.
+@param aDestination The destination wildcard string.
+*/
+	{
+	TInt numSids = aSidList.Count();		
+	for (TInt i = 0; i < numSids; ++i)
+		{
+		iSidList.AppendL(aSidList[i]);
+		}
+	iDestination = aDestination.AllocL();	
+	}
+
+CPolicy::~CPolicy()
+/**
+Destructor
+*/
+	{
+	delete iDestination;
+	iSidList.Close();
+	}