authorisation/userpromptservice/server/source/upsclient/upsclientserver.cpp
changeset 8 35751d3474b7
child 62 b23410e29e22
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/authorisation/userpromptservice/server/source/upsclient/upsclientserver.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -0,0 +1,595 @@
+/*
+* 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: 
+* Implements an interface to keep and access decision record fields.
+*
+*/
+
+
+/**
+ @file
+ @internalTechnology
+ @prototype
+*/
+#include <s32strm.h>
+#include <ups/upstypes.h>
+#include <ups/upsconst.h>
+#include "upslog.h"
+#include <ups/upserr.h>
+#include "upscommon.h"
+
+namespace UserPromptService {
+
+CDecisionRecord::CDecisionRecord()
+/**
+	Constructor for the decision record. 
+ */								 
+	{
+	
+	}
+
+CDecisionRecord::CDecisionRecord(const TSecureId& aClientSid,const TUid& aEvaluatorId,const TUid& aServiceId,const TSecureId& aServerSid,
+								 const TUint8 aResult, const TUint16& aMajorPolicyVersion, const TUint32 aEvaluatorInfo, const TUint32& aRecordId)
+/**
+	Constructor for the decision record. Assigns the ID values. 
+ */								 
+	:iClientSid(aClientSid),iEvaluatorId(aEvaluatorId),
+	 iServiceId(aServiceId),iServerSid(aServerSid),
+	 iResult(aResult),iMajorPolicyVersion(aMajorPolicyVersion),
+	 iRecordId(aRecordId),iEvaluatorInfo(aEvaluatorInfo)
+	{
+	
+	}
+
+
+CDecisionRecord::~CDecisionRecord()
+/**
+	Destructor for the decision record object
+ */
+	{
+	iFingerprint.Close();		
+	iClientEntity.Close();
+	iDescription.Close();
+	}
+	
+EXPORT_C CDecisionRecord* CDecisionRecord::NewL(const TSecureId& aClientSid,const TUid& aEvaluatorId,const TUid& aServiceId,const TSecureId& aServerSid,
+								 	            const TDesC8& aFingerprint,const TDesC8& aClientEntity,const TDesC& aDescription, const TUint8 aResult, 
+								 	            const TUint16& aMajorPolicyVersion, const TUint32 aEvaluatorInfo, const TUint32& aRecordId)
+/**
+	Creates a decision record object. The function leaves, if creation of the record object fails.
+	 
+	@param aClientSid	  Secure Id of client application
+	@param aEvaluatorId	  UID for the policy evaluator DLL
+	@param aServiceId 	  UID for service e.g. sms, mms, telephony, gprs
+	@param aServerSid  	  Secure Id for the system server that the decision applies to
+	@param aFingerprint   Hash of the destination and/or opaque data. Maximum length is 32 bytes.
+	@param aClientEntity  The name of the entity within the client that requested the service. Maximum length is 32 bytes. 
+	@param aDescription	  A copy of description and/or opaque. 
+	@param aResult		  Whether the request should be approved (=1) or denied (=0)
+	@param aMajorPolicyVersion The major version of the policy file.
+	@param aEvaluatorInfo Policy evaluator specific data
+	@param aRecordId	  An auto-incrementing record number.
+	
+	@return    			  A pointer to the newly allocated decision record object, if creation is successful.
+ */								 	   
+	{
+	CDecisionRecord* self = CDecisionRecord::NewLC(aClientSid,aEvaluatorId,aServiceId,aServerSid,aFingerprint,aClientEntity,
+												   aDescription,aResult,aMajorPolicyVersion,aEvaluatorInfo,aRecordId);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+
+EXPORT_C CDecisionRecord* CDecisionRecord::NewLC(const TSecureId& aClientSid,const TUid& aEvaluatorId,const TUid& aServiceId,const TSecureId& aServerSid,
+								 	    		 const TDesC8& aFingerprint,const TDesC8& aClientEntity,const TDesC& aDescription, const TUint8 aResult, 
+								 	    		 const TUint16& aMajorPolicyVersion, const TUint32 aEvaluatorInfo, const TUint32& aRecordId)
+/**
+	Creates a decision record object. The function leaves, if creation of the record object fails.
+	
+	@return    			  A pointer to the newly allocated decision record object, if creation is successful.
+				  		  The pointer is also put onto the cleanup stack.
+	@see CDecisionRecord::NewL()
+ */									 	   
+	{
+	CDecisionRecord* self = new (ELeave) CDecisionRecord(aClientSid,aEvaluatorId,aServiceId,aServerSid,aResult,
+														 aMajorPolicyVersion,aEvaluatorInfo,aRecordId);
+	CleanupStack::PushL(self);
+	self->ConstructL(aFingerprint,aClientEntity,aDescription);
+	return self;
+	}	
+
+EXPORT_C CDecisionRecord* CDecisionRecord::NewLC()
+/**
+	Creates a decision record object. The function leaves, if creation of the record object fails.
+	
+	@return    			  A pointer to the newly allocated decision record object, if creation is successful.
+				  		  The pointer is also put onto the cleanup stack.
+ */									 	   
+	{
+	CDecisionRecord* self = new (ELeave) CDecisionRecord();
+	CleanupStack::PushL(self);
+	return self;
+	}	
+	
+void CDecisionRecord::ConstructL(const TDesC8& aFingerprint,const TDesC8& aClientEntity,const TDesC& aDescription)
+/**
+	Second phase constructor for the decision record. Sets members allocated on the heap.
+	The function leaves, if any buffer allocation fails.
+	@see CDecisionRecord::NewL()
+ */
+	{
+		
+	iFingerprint.CreateL(aFingerprint);
+	
+	iClientEntity.CreateL(aClientEntity);
+	
+	iDescription.CreateL(aDescription);
+
+	ValidateL();
+	}
+
+void CDecisionRecord::ValidateL()
+/**
+	Check both the fingerprint and client entity are not too long.
+	An absent fingerprint or client entity is represent by an empty string.
+*/
+	{
+	if(iFingerprint.Length()  > (TInt)KUpsMaxFingerprintLength)
+	    {
+	    DEBUG_PRINTF2(_L8("The fingerprint length (%d) has not been satisfied during decision construction!"),iFingerprint.Length());
+	    User::Leave(KErrUpsBadFingerprintLength);
+	    }
+	    	
+	if(iClientEntity.Length() > (TInt)KUpsMaxClientEntityLength)
+		{
+		DEBUG_PRINTF2(_L8("The client entity length (%d) has not been satisfied during decision construction!"),iClientEntity.Length());
+		User::Leave(KErrUpsBadClientEntityLength);
+		}
+	}
+
+EXPORT_C void CDecisionRecord::ExternalizeL(RWriteStream& aStream) const
+/**
+	Externalise this CDecisionRecord object to the specified stream.
+*/
+	{
+	aStream.WriteUint32L(iClientSid.iId);
+	aStream.WriteInt32L(iEvaluatorId.iUid);
+	aStream.WriteInt32L(iServiceId.iUid);
+	aStream.WriteUint32L(iServerSid.iId);
+	aStream << iFingerprint;
+	aStream << iClientEntity;
+	aStream << iDescription;
+	aStream << iResult;
+	aStream << iMajorPolicyVersion;
+	aStream << iRecordId;
+	aStream << iEvaluatorInfo;
+	}
+
+EXPORT_C void CDecisionRecord::InternalizeL(RReadStream& aStream)
+/**
+	Internalise this CDecisionRecord object from the specified stream.
+*/
+	{
+	iClientSid.iId= aStream.ReadUint32L();
+	iEvaluatorId.iUid = aStream.ReadInt32L();
+	iServiceId.iUid = aStream.ReadInt32L();
+	iServerSid.iId = aStream.ReadUint32L();
+
+	iFingerprint.Close();
+	iFingerprint.CreateL(aStream, KMaskDesLength8);
+
+	iClientEntity.Close();
+	iClientEntity.CreateL(aStream, KMaskDesLength8);
+
+	iDescription.Close();
+	iDescription.CreateL(aStream, KMaskDesLength16);
+
+	aStream >> iResult;
+	aStream >> iMajorPolicyVersion;
+	aStream >> iRecordId;
+	aStream >> iEvaluatorInfo;
+
+	ValidateL();
+	}
+
+CDecisionFilter::CDecisionFilter()
+/**
+	Constructor for an empty decision filter.
+ */
+	{
+	
+	}
+
+	
+CDecisionFilter::CDecisionFilter(const TSecureId& aClientSid, const TUid& aEvaluatorId, 
+	const TUid& aServiceId, const TSecureId& aServerSid, const TUint16& aVersion)
+	:iClientSid(aClientSid),iEvaluatorId(aEvaluatorId),iServiceId(aServiceId),
+	iServerSid(aServerSid),iMajorPolicyVersion(aVersion)
+/**
+	Constructor for the decision filter. Assigns the ID values.
+ */
+	{
+	iSetFlag[KPosClientSid]	  = KSetClientSid	| UserPromptService::EEqual;
+	iSetFlag[KPosEvaluatorId] = KSetEvaluatorId | UserPromptService::EEqual;
+	iSetFlag[KPosServiceId]	  = KSetServiceId	| UserPromptService::EEqual;
+	iSetFlag[KPosServerSid]	  = KSetServerSid	| UserPromptService::EEqual;
+	iSetFlag[KPosMajorPolicyVersion] = KSetMajorPolicyVersion | UserPromptService::EEqual;
+	}
+		
+				
+CDecisionFilter::~CDecisionFilter()
+/**
+	Destructor for the decision filter
+ */
+	{
+	delete iFingerprint;
+	delete iClientEntity;	
+	}
+	
+	
+EXPORT_C CDecisionFilter* CDecisionFilter::NewL()
+/**
+	Creates an empty filter object. The function is used to define any number of filter keys.
+	It leaves, if the creation of the filter object fails.
+		
+	@return	   A pointer to the newly allocated filter object, if creation is successful. 
+ */
+	{
+	CDecisionFilter* self = CDecisionFilter::NewLC();
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+	
+EXPORT_C CDecisionFilter* CDecisionFilter::NewLC()
+/**
+	Creates an empty filter object. The function is used to define any number of filter keys.
+	It leaves, if the creation of the filter object fails.
+
+	@return	   A pointer to the newly allocated filter object, if creation is successful. 
+			   The pointer is also put onto the cleanup stack.
+ */
+	{
+	CDecisionFilter* self = new (ELeave) CDecisionFilter();
+	CleanupStack::PushL(self);
+	return self;
+	}
+	
+	
+EXPORT_C CDecisionFilter* CDecisionFilter::NewL(const TSecureId& aClientSid,const TUid& aEvaluatorId,const TUid& aServiceId,const TSecureId& aServerSid,
+												const TDesC8& aFingerprint,const TDesC8& aClientEntity,const TUint16& aVersion)
+/**
+	Creates a filter object and assigns all filter keys. The function leaves, if creation of the filter object fails.
+	 
+	@param aClientSid	 Secure Id of client application
+	@param aEvaluatorId	 UID for the policy evaluator DLL
+	@param aServiceId	 UID for service e.g. sms, mms, telephony, gprs
+	@param aServerSid	 Secure Id for the system server that the decision applies to
+	@param aFingerprint	 Hash of the destination and/or opaque data.
+	@param aClientEntity The name of the entity within the client that requested the service. 
+	@param aVersion      Major version of policy file.
+	@return				 A pointer to the newly allocated filter object, if creation is successful.
+ */									
+	{
+	CDecisionFilter* self = CDecisionFilter::NewLC(aClientSid,aEvaluatorId,aServiceId,aServerSid,aFingerprint,aClientEntity,aVersion);
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+	
+EXPORT_C CDecisionFilter* CDecisionFilter::NewLC(const TSecureId& aClientSid,const TUid& aEvaluatorId,const TUid& aServiceId,const TSecureId& aServerSid,
+												 const TDesC8& aFingerprint,const TDesC8& aClientEntity,const TUint16& aVersion)
+/**
+	Creates a filter object and assigns all filter keys. The function leaves, if creation of the filter object fails.
+	 
+	@param aClientSid	 Secure Id of client application
+	@param aEvaluatorId	 UID for the policy evaluator DLL
+	@param aServiceId	 UID for service e.g. sms, mms, telephony, gprs
+	@param aServerSid	 Secure Id for the system server that the decision applies to
+	@param aFingerprint	 Hash of the destination and/or opaque data.
+	@param aClientEntity The name of the entity within the client that requested the service.
+	@param aVersion      Major version of policy file.
+	@return				 A pointer to the newly allocated filter object, if creation is successful.
+						 The pointer is also put onto the cleanup stack.
+ */												 
+	{
+	CDecisionFilter* self = new (ELeave) CDecisionFilter(aClientSid,aEvaluatorId,aServiceId,aServerSid,aVersion);
+	CleanupStack::PushL(self);
+	self->ConstructL(aFingerprint,aClientEntity);
+	return self;
+	}	
+
+
+void CDecisionFilter::ConstructL(const TDesC8& aFingerprint, const TDesC8& aClientEntity)
+/**
+	Second phase constructor for the decision filter. Sets members allocated on the heap.
+	The function leaves, if any buffer allocation fails.
+ */
+	{
+		
+	iFingerprint = aFingerprint.AllocL();
+	iSetFlag[KPosFingerprint] |= KSetFingerprint;
+	
+	iClientEntity = aClientEntity.AllocL();
+	iSetFlag[KPosClientEntity] |= KSetClientEntity;
+
+	ValidateL();
+	}
+	
+void CDecisionFilter::ValidateL()
+/**
+	Check fingerprint and client entity lengths are valid.
+*/
+	{
+	if((iSetFlag[KPosFingerprint] & KSetFingerprint) &&
+		((iFingerprint == 0) || (iFingerprint->Length()	> KUpsMaxFingerprintLength)))
+		{
+		DEBUG_PRINTF2(_L8("The fingerprint length (%d) has not been satisfied during filter construction!"),(iFingerprint) ? (iFingerprint->Length()) : (0));
+		User::Leave(KErrUpsBadFingerprintLength);
+		}
+		
+	if((iSetFlag[KPosClientEntity] & KSetClientEntity) &&
+		((iClientEntity == 0) || (iClientEntity->Length() > KUpsMaxClientEntityLength)))
+		{
+		DEBUG_PRINTF2(_L8("The client entity length (%d) has not been satisfied during filter construction!"),(iClientEntity) ? (iClientEntity->Length()) : (0));
+		User::Leave(KErrUpsBadClientEntityLength);
+		}
+	}
+	
+EXPORT_C void CDecisionFilter::SetClientSid(const TSecureId& aSid, TComparisonOp aOp)
+/**
+	Sets the Secure ID of the client application.
+
+	@param aUid		SID for the client application
+	@param aOp		Comparision operator which is used to create SQL statement.
+ */
+	{
+	iClientSid = aSid;
+	iSetFlag[KPosClientSid] |= KSetClientSid;
+	iSetFlag[KPosClientSid] |= aOp;
+	}
+	
+	
+EXPORT_C void CDecisionFilter::SetEvaluatorId(const TUid& aUid, TComparisonOp aOp)
+/**
+	Sets the UID of the policy evaluator DLL.
+
+	@param aUid		UID for the policy evaluator DLL
+	@param aOp		Comparision operator which is used to create SQL statement.
+ */
+	{
+	iEvaluatorId = aUid;
+	iSetFlag[KPosEvaluatorId] |= KSetEvaluatorId;
+	iSetFlag[KPosEvaluatorId] |= aOp;
+	}
+
+
+EXPORT_C void CDecisionFilter::SetServiceId(const TUid& aUid, TComparisonOp aOp)
+/**
+	Sets the Secure ID of the service.
+
+	@param aUid		UID for the service
+	@param aOp		Comparision operator which is used to create SQL statement.
+ */
+	{
+	iServiceId = aUid;
+	iSetFlag[KPosServiceId] |= KSetServiceId;
+	iSetFlag[KPosServiceId] |= aOp;
+	}
+	
+		
+EXPORT_C void CDecisionFilter::SetServerSid(const TSecureId& aSid, TComparisonOp aOp)
+/**
+	Sets the Secure ID of the system server.
+	
+	@param aUid		UID for the system server
+	@param aOp		Comparision operator which is used to create SQL statement.
+ */
+	{
+	iServerSid = aSid;
+	iSetFlag[KPosServerSid] |= KSetServerSid;
+	iSetFlag[KPosServerSid] |= aOp;
+	}
+	
+	
+EXPORT_C void CDecisionFilter::SetFingerprintL(const TDesC8& aFingerprint, TComparisonOp aOp)
+/**
+	Sets the fingerprint. A buffer is allocated on the heap and aFingerprint copied into it.
+	The function leaves, if the buffer allocation fails.
+	 
+	@param aFingerprint		Hash of the destination and/or opaque data. (Maximum length is 32 bytes)
+	@param aOp		Comparision operator which is used to create SQL statement.
+ */
+	{
+	//Fingerprint's length can not be longer than KUpsMaxFingerprintLength
+	if(aFingerprint.Length() > KUpsMaxFingerprintLength)
+		{
+		User::Leave(KErrUpsBadFingerprintLength);
+		}
+
+	delete iFingerprint;
+	iFingerprint = 0;
+			
+	iFingerprint = aFingerprint.AllocL();
+	iSetFlag[KPosFingerprint] |= KSetFingerprint;
+	iSetFlag[KPosFingerprint] |= aOp;
+	}
+	
+	
+EXPORT_C void CDecisionFilter::SetClientEntityL(const TDesC8& aClientEntity, TComparisonOp aOp)
+/**
+	Sets the client entity. A buffer is allocated on the heap and aClientEntity copied into it.
+	The function leaves, if the buffer allocation fails.
+	 
+	@param aClientEntity	The name of the entity within the client. (Maximum length is 32 bytes) 
+	@param aOp		Comparision operator which is used to create SQL statement.
+ */
+	{
+	//ClientEntity's length can not be longer than KUpsMaxClientEntityLength
+	if(aClientEntity.Length() > KUpsMaxClientEntityLength)
+		{
+		User::Leave(KErrUpsBadClientEntityLength);
+		}
+		
+	delete iClientEntity;
+	iClientEntity = 0;
+		
+	iClientEntity = aClientEntity.AllocL();
+	iSetFlag[KPosClientEntity] |= KSetClientEntity;
+	iSetFlag[KPosClientEntity] |= aOp;
+	}
+
+
+EXPORT_C void CDecisionFilter::SetMajorPolicyVersion(const TUint16& aVersion, TComparisonOp aOp)
+/**
+	Sets the major version of the policy file.
+	
+	@param aVersion		Major policy version.
+	@param aOp		Comparision operator which is used to create SQL statement.
+ */
+	{
+	iMajorPolicyVersion = aVersion;
+	iSetFlag[KPosMajorPolicyVersion] |= KSetMajorPolicyVersion;
+	iSetFlag[KPosMajorPolicyVersion] |= aOp;
+	}
+
+
+EXPORT_C void CDecisionFilter::SetRecordId(const TUint32& aId, TComparisonOp aOp)
+/**
+	Sets the unique Id number of the decision record which is searched.
+	
+	@param aId	A unique record Id.
+	@param aOp		Comparision operator which is used to create SQL statement.
+ */
+	{
+	iRecordId = aId;
+	iSetFlag[KPosRecordId] |= KSetRecordId;
+	iSetFlag[KPosRecordId] |= aOp;
+	}
+
+
+EXPORT_C void CDecisionFilter::SetDescriptionL(const TDesC& aDescription, const TComparisonOp aOp)
+/**
+	Sets the description field. A buffer is allocated on the heap and aDescription copied into it.
+	The function leaves, if the buffer allocation fails.
+	 
+	@param aDescription	A copy of description and/or opaque. (Maximum length is 32 bytes) 
+	@param aOp			Comparision operator which is used to create SQL statement.
+ */
+	{	
+	delete iDescription;
+	iDescription = 0;
+		
+	iDescription = aDescription.AllocL();
+	iSetFlag[KPosDescription] |= KSetDescription;
+	iSetFlag[KPosDescription] |= aOp;
+	}
+	
+	
+EXPORT_C void CDecisionFilter::SetResult(const TUint8& aResult, const TComparisonOp aOp)
+/**
+	Sets the result field of the decision record which is searched.
+	
+	@param aResult	Whether the request should be approved.
+	@param aOp		Comparision operator which is used to create SQL statement.
+ */
+	{
+	iResult = aResult;
+	iSetFlag[KPosResult] |= KSetResult;
+	iSetFlag[KPosResult] |= aOp;
+	}
+	
+	
+EXPORT_C void CDecisionFilter::SetEvaluatorInfo(const TUint32& aEvaluatorInfo, const TComparisonOp aOp)
+/**
+	Sets the evaluator info field of the decision record which is searched.
+	
+	@param aEvaluatorInfo	Policy evaluator specific data
+	@param aOp				Comparision operator which is used to create SQL statement.
+ */
+	{
+	iEvaluatorInfo = aEvaluatorInfo;
+	iSetFlag[KPosEvaluatorInfo] |= KSetEvaluatorInfo;
+	iSetFlag[KPosEvaluatorInfo] |= aOp;
+	}
+	
+	
+EXPORT_C void CDecisionFilter::ExternalizeL(RWriteStream& aStream) const
+/**
+	Externalise this CDecisionFilter object to the specified stream.
+*/
+	{
+	aStream << iClientSid.iId;		// TSecureId 
+	aStream << iEvaluatorId.iUid;	// TUid 
+	aStream << iServiceId.iUid;		// TUid 
+	aStream << iServerSid.iId;		// TSecureId 
+
+	aStream << ((iFingerprint) ? (*iFingerprint) : (KNullDesC8())); 	// HBufC8* 
+	aStream << ((iClientEntity) ? (*iClientEntity) : (KNullDesC8()));	// HBufC8* 
+
+	for(int i = 0; i < KFilterKeysNumber; ++i)
+		{
+		aStream.WriteUint16L(iSetFlag[i]);// TUint16 
+		}
+
+	aStream << iMajorPolicyVersion;// TUint16 
+	aStream << iRecordId;// TUint32 
+	}
+EXPORT_C void CDecisionFilter::InternalizeL(RReadStream& aStream)
+/**
+	Internalise this CDecisionFilter object from the specified stream.
+*/
+	{
+	iClientSid.iId= aStream.ReadUint32L();		// TSecureId 
+	iEvaluatorId.iUid= aStream.ReadInt32L();	// TUid 
+	iServiceId.iUid= aStream.ReadInt32L();		// TUid 
+	iServerSid.iId= aStream.ReadUint32L();		// TSecureId 
+
+	// iFingerprint is always present in stream, so internalise it and then delete it if it is not setup.
+	delete iFingerprint;
+	iFingerprint = 0;
+	iFingerprint = HBufC8::NewL(aStream, KMaskDesLength8);
+
+	// iClientEntity is always present in stream, so internalise it and then delete it if it is not setup.
+	delete iClientEntity;
+	iClientEntity = 0;
+	iClientEntity = HBufC8::NewL(aStream, KMaskDesLength8);
+	
+	for(int i = 0; i < KFilterKeysNumber; ++i)
+		{
+		iSetFlag[i] = aStream.ReadUint16L();// TUint16 
+		}
+
+	// Delete iFingerprint if not setup
+	if((iSetFlag[KPosFingerprint] & KSetFingerprint) == 0)
+		{
+		delete iFingerprint;
+		iFingerprint = 0;
+		}
+
+	// Delete iClientEntity if not setup
+	if((iSetFlag[KPosClientEntity] & KSetClientEntity) == 0)
+		{
+		delete iClientEntity;
+		iClientEntity = 0;
+		}
+
+	iMajorPolicyVersion = aStream.ReadUint16L();// TUint16 
+	iRecordId = aStream.ReadUint32L();// TUint32 
+
+	ValidateL();
+	}
+
+} // End of  UserPromptService namespace
+// End of file