authorisation/userpromptservice/policies/source/policyreader.cpp
changeset 8 35751d3474b7
child 61 641f389e9157
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/authorisation/userpromptservice/policies/source/policyreader.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -0,0 +1,272 @@
+/*
+* 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 "policyreader.h"
+#include <ups/ups.hrh>
+#include <ups/upserr.h>
+#include "upslog.h"
+
+using namespace UserPromptService;
+
+/// The policy resource format is versioned.
+static const TInt KPolicyFormatVersion = 1;
+
+TPolicyHeader::TPolicyHeader()
+/**
+Constructor
+*/
+	: iFormatVersion(0), iMajorVersion(0), iMinorVersion(0), iAuthPolicy(EAlwaysCheck),
+	iDefaultPolicyEvaluator(TUid::Null()), iDefaultDialogCreator(TUid::Null())
+	{	
+	}
+
+void CPolicyReader::ReadPolicyHeaderL() 
+/**
+Reads the header information from the policy file.
+*/
+	{
+	TUint16 formatVersion = iReader.ReadUint16L(); 
+	if (formatVersion != KPolicyFormatVersion)
+		{
+		User::Leave(KErrUpsBadPolicyFile);
+		}
+	
+	(void) iReader.ReadUint32L();	// Skip reserved LLINK	
+	
+	iHeader.iFormatVersion = formatVersion; 
+	iHeader.iMajorVersion = iReader.ReadUint16L();
+	iHeader.iMinorVersion = iReader.ReadUint16L();	
+	iHeader.iAuthPolicy = static_cast<TAuthorisationPolicy>(iReader.ReadInt8L());
+	iHeader.iDefaultPolicyEvaluator = TUid::Uid(iReader.ReadInt32L());
+	iHeader.iDefaultDialogCreator = TUid::Uid(iReader.ReadInt32L());	
+	if (iHeader.iDefaultDialogCreator.iUid == 0)
+		{
+		User::Leave(KErrUpsBadPolicyFile);
+		}
+	}
+
+EXPORT_C CPolicyReader* CPolicyReader::NewL(RFs& aRFs, const TDesC& aPolicyFileName)
+/**
+Creates a policy reader object.
+@param aRFs the file server session used by the resource parser.
+@param aPolicyFileName the name of the User Prompt Service policy file to read.
+
+@return The new policy reader.
+ */
+	{
+	CPolicyReader* self = CPolicyReader::NewLC(aRFs, aPolicyFileName);
+	CleanupStack::Pop(self);
+	return self;
+	}		
+	
+EXPORT_C CPolicyReader* CPolicyReader::NewLC(RFs& aRFs, const TDesC& aPolicyFileName)
+/**
+Creates a policy reader object and places the pointer on the cleanup stack.
+@param aRFs the file server session used by the resource parser.
+@param aPolicyFileName the name of the User Prompt Service policy file to read.
+
+@return The new policy reader.
+*/	
+	{
+	CPolicyReader* self = new(ELeave) CPolicyReader();
+	CleanupStack::PushL(self);
+	self->ConstructL(aRFs, aPolicyFileName);
+	return self;
+	}
+
+void CPolicyReader::ConstructL(RFs& aFs, const TDesC& aResourceFileName)
+/**
+Second phase constructor.
+ - Creates the resource reader.
+ - Reads the default policy evaluator and dialog creator UIDs.
+ - Reads the number of policies in the resource file.
+ 
+@param aRFs				The file server session used by the resource parser.
+@param aPolicyFileName	The name of the User Prompt Service policy file to read.
+*/
+	{
+	DEBUG_PRINTF2(_L("Loading UPS policy file %S"), &aResourceFileName);
+	
+	RFile r;
+	User::LeaveIfError(r.Open(aFs, aResourceFileName, EFileRead | EFileShareReadersOnly));
+	CleanupClosePushL(r);
+	TInt size;
+	User::LeaveIfError(r.Size(size));
+	CleanupStack::PopAndDestroy(&r);
+	
+	iResourceFile = CResourceFile::NewL(aFs, aResourceFileName, 0, size);
+	iReader.OpenL(iResourceFile, KPolicyResourceId);
+
+	TUidType u(iResourceFile->UidType());
+	if (u[1] != TUid::Uid(KUidUpsPolicyResourceFile))	
+		{
+		User::Leave(KErrUpsBadPolicyFile);
+		}	
+		
+	ReadPolicyHeaderL();
+
+	iPolicyCount = iReader.ReadUint16L(); 
+	if (iPolicyCount < 0)
+		{
+		User::Leave(KErrUpsBadPolicyFile);
+		}
+	}
+
+EXPORT_C const TPolicyHeader& CPolicyReader::Header() const
+/**
+Gets the header information for this policy file.
+@return A const reference to the policy header information.
+*/
+	{
+	return iHeader;
+	}
+
+CPolicyReader::CPolicyReader()
+/**
+Constructor
+*/
+	{
+	}
+
+CPolicyReader::~CPolicyReader() 
+/**
+Destructor
+*/
+	{
+	iReader.Close();
+	delete iResourceFile;
+	}
+
+EXPORT_C CPolicy* CPolicyReader::DefaultPolicyL()
+/**
+Factory method for creating a default policy object from the 
+information in the UPS policy file header.
+
+@return A pointer to the default policy object.
+*/
+	{
+	_LIT(KAllDestinations, "*");
+	TSidClasses allSidClasses(0xFFFF);
+	RArray<TSecureId> sidList;
+	CleanupClosePushL(sidList);
+	
+	CPolicy* p = CPolicy::NewL(
+		allSidClasses, sidList, KAllDestinations,
+		CPolicy::EYes | CPolicy::ENo, iHeader.iDefaultPolicyEvaluator, iHeader.iDefaultDialogCreator, 
+		0, CPolicy::ESystemServerSecurityPassedOrFailed,
+		iHeader.iMajorVersion, iHeader.iMinorVersion, ETrue);
+		
+	CleanupStack::PopAndDestroy(&sidList);
+	return p;
+	}
+
+EXPORT_C CPolicy* CPolicyReader::NextPolicyL()
+/**
+Gets the next policy from the resource file.
+
+@return A pointer to the new policy object or null if the end of
+		the file has been reached.
+*/
+	{
+	CPolicy* p(0);
+	if (iPolicyNum < iPolicyCount)
+		{
+		p = ReadPolicyL();
+		++iPolicyNum;
+		}
+	return p;
+	}
+
+EXPORT_C CPolicy* CPolicyReader::ReadPolicyL()
+/**
+Reads the next policy from the resource file.
+
+@return A pointer to the new policy object.
+ */
+	{
+	TUint32 classes = iReader.ReadUint32L();
+	TSidClasses sidClasses(classes);		
+
+	TInt numSids = iReader.ReadInt16L();
+	if (numSids < 0)
+		{
+		User::Leave(KErrUpsBadPolicyFile);
+		}		
+	RArray<TSecureId> sidList(8);
+	CleanupClosePushL(sidList);		
+	for (TInt i = 0; i < numSids; ++i)
+		{
+		sidList.AppendL(TSecureId(iReader.ReadUint32L()));
+		}
+	
+	TUint8 ssSecurity = iReader.ReadUint8L();
+	CPolicy::TSystemServerSecurity systemServerSecurity = 
+		CPolicy::ESystemServerSecurityPassedOrFailed;
+	switch (ssSecurity)
+		{
+		case CPolicy::ESystemServerSecurityPassedOrFailed:
+			systemServerSecurity = CPolicy::ESystemServerSecurityPassedOrFailed;
+			break;
+		case CPolicy::ESystemServerSecurityPassed:
+			systemServerSecurity = CPolicy::ESystemServerSecurityPassed;
+			break;
+		case CPolicy::ESystemServerSecurityFailed:
+			systemServerSecurity = CPolicy::ESystemServerSecurityFailed;
+			break;
+		default:
+			User::Leave(KErrUpsBadPolicyFile);
+			break;
+		}
+	
+	HBufC* destination(iReader.ReadHBufCL());
+	if (! destination)
+		{
+		destination = HBufC::NewL(0);
+		}
+	CleanupStack::PushL(destination);
+
+	TUint options(iReader.ReadUint32L());
+	if ((options & 
+		~(CPolicy::EYes|CPolicy::ENo|CPolicy::ESessionYes|CPolicy::ESessionNo|CPolicy::EAlways|CPolicy::ENever)) != 0)
+		{
+		User::Leave(KErrUpsBadPolicyFile);
+		}
+	
+	TUid policyEvaluator = TUid::Uid(iReader.ReadInt32L());
+	if (policyEvaluator == TUid::Null())
+		{
+		policyEvaluator = iHeader.iDefaultPolicyEvaluator;
+		}
+	
+	TUid dialogCreator = TUid::Uid(iReader.ReadInt32L());
+	if (dialogCreator == TUid::Null())
+		{
+		dialogCreator = iHeader.iDefaultDialogCreator;
+		}
+	
+	TUint16 flags(iReader.ReadUint16L());
+	iReader.ReadUint16L(); // skip over reserved flags
+	iReader.ReadUint32L(); // skip over reserved link
+
+	CPolicy* pol = CPolicy::NewL(sidClasses, sidList, *destination,
+		options, policyEvaluator, dialogCreator, flags, systemServerSecurity,
+		iHeader.iMajorVersion, iHeader.iMinorVersion);
+	
+	CleanupStack::PopAndDestroy(2, &sidList); // destination, sidList
+	return pol;
+	}