os/security/authorisation/userpromptservice/policies/source/policyreader.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of the License "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
#include "policyreader.h"
sl@0
    20
#include <ups/ups.hrh>
sl@0
    21
#include <ups/upserr.h>
sl@0
    22
#include "upslog.h"
sl@0
    23
sl@0
    24
using namespace UserPromptService;
sl@0
    25
sl@0
    26
/// The policy resource format is versioned.
sl@0
    27
static const TInt KPolicyFormatVersion = 1;
sl@0
    28
sl@0
    29
TPolicyHeader::TPolicyHeader()
sl@0
    30
/**
sl@0
    31
Constructor
sl@0
    32
*/
sl@0
    33
	: iFormatVersion(0), iMajorVersion(0), iMinorVersion(0), iAuthPolicy(EAlwaysCheck),
sl@0
    34
	iDefaultPolicyEvaluator(TUid::Null()), iDefaultDialogCreator(TUid::Null())
sl@0
    35
	{	
sl@0
    36
	}
sl@0
    37
sl@0
    38
void CPolicyReader::ReadPolicyHeaderL() 
sl@0
    39
/**
sl@0
    40
Reads the header information from the policy file.
sl@0
    41
*/
sl@0
    42
	{
sl@0
    43
	TUint16 formatVersion = iReader.ReadUint16L(); 
sl@0
    44
	if (formatVersion != KPolicyFormatVersion)
sl@0
    45
		{
sl@0
    46
		User::Leave(KErrUpsBadPolicyFile);
sl@0
    47
		}
sl@0
    48
	
sl@0
    49
	(void) iReader.ReadUint32L();	// Skip reserved LLINK	
sl@0
    50
	
sl@0
    51
	iHeader.iFormatVersion = formatVersion; 
sl@0
    52
	iHeader.iMajorVersion = iReader.ReadUint16L();
sl@0
    53
	iHeader.iMinorVersion = iReader.ReadUint16L();	
sl@0
    54
	iHeader.iAuthPolicy = static_cast<TAuthorisationPolicy>(iReader.ReadInt8L());
sl@0
    55
	iHeader.iDefaultPolicyEvaluator = TUid::Uid(iReader.ReadInt32L());
sl@0
    56
	iHeader.iDefaultDialogCreator = TUid::Uid(iReader.ReadInt32L());	
sl@0
    57
	if (iHeader.iDefaultDialogCreator.iUid == 0)
sl@0
    58
		{
sl@0
    59
		User::Leave(KErrUpsBadPolicyFile);
sl@0
    60
		}
sl@0
    61
	}
sl@0
    62
sl@0
    63
EXPORT_C CPolicyReader* CPolicyReader::NewL(RFs& aRFs, const TDesC& aPolicyFileName)
sl@0
    64
/**
sl@0
    65
Creates a policy reader object.
sl@0
    66
@param aRFs the file server session used by the resource parser.
sl@0
    67
@param aPolicyFileName the name of the User Prompt Service policy file to read.
sl@0
    68
sl@0
    69
@return The new policy reader.
sl@0
    70
 */
sl@0
    71
	{
sl@0
    72
	CPolicyReader* self = CPolicyReader::NewLC(aRFs, aPolicyFileName);
sl@0
    73
	CleanupStack::Pop(self);
sl@0
    74
	return self;
sl@0
    75
	}		
sl@0
    76
	
sl@0
    77
EXPORT_C CPolicyReader* CPolicyReader::NewLC(RFs& aRFs, const TDesC& aPolicyFileName)
sl@0
    78
/**
sl@0
    79
Creates a policy reader object and places the pointer on the cleanup stack.
sl@0
    80
@param aRFs the file server session used by the resource parser.
sl@0
    81
@param aPolicyFileName the name of the User Prompt Service policy file to read.
sl@0
    82
sl@0
    83
@return The new policy reader.
sl@0
    84
*/	
sl@0
    85
	{
sl@0
    86
	CPolicyReader* self = new(ELeave) CPolicyReader();
sl@0
    87
	CleanupStack::PushL(self);
sl@0
    88
	self->ConstructL(aRFs, aPolicyFileName);
sl@0
    89
	return self;
sl@0
    90
	}
sl@0
    91
sl@0
    92
void CPolicyReader::ConstructL(RFs& aFs, const TDesC& aResourceFileName)
sl@0
    93
/**
sl@0
    94
Second phase constructor.
sl@0
    95
 - Creates the resource reader.
sl@0
    96
 - Reads the default policy evaluator and dialog creator UIDs.
sl@0
    97
 - Reads the number of policies in the resource file.
sl@0
    98
 
sl@0
    99
@param aRFs				The file server session used by the resource parser.
sl@0
   100
@param aPolicyFileName	The name of the User Prompt Service policy file to read.
sl@0
   101
*/
sl@0
   102
	{
sl@0
   103
	DEBUG_PRINTF2(_L("Loading UPS policy file %S"), &aResourceFileName);
sl@0
   104
	
sl@0
   105
	RFile r;
sl@0
   106
	User::LeaveIfError(r.Open(aFs, aResourceFileName, EFileRead | EFileShareReadersOnly));
sl@0
   107
	CleanupClosePushL(r);
sl@0
   108
	TInt size;
sl@0
   109
	User::LeaveIfError(r.Size(size));
sl@0
   110
	CleanupStack::PopAndDestroy(&r);
sl@0
   111
	
sl@0
   112
	iResourceFile = CResourceFile::NewL(aFs, aResourceFileName, 0, size);
sl@0
   113
	iReader.OpenL(iResourceFile, KPolicyResourceId);
sl@0
   114
sl@0
   115
	TUidType u(iResourceFile->UidType());
sl@0
   116
	if (u[1] != TUid::Uid(KUidUpsPolicyResourceFile))	
sl@0
   117
		{
sl@0
   118
		User::Leave(KErrUpsBadPolicyFile);
sl@0
   119
		}	
sl@0
   120
		
sl@0
   121
	ReadPolicyHeaderL();
sl@0
   122
sl@0
   123
	iPolicyCount = iReader.ReadUint16L(); 
sl@0
   124
	if (iPolicyCount < 0)
sl@0
   125
		{
sl@0
   126
		User::Leave(KErrUpsBadPolicyFile);
sl@0
   127
		}
sl@0
   128
	}
sl@0
   129
sl@0
   130
EXPORT_C const TPolicyHeader& CPolicyReader::Header() const
sl@0
   131
/**
sl@0
   132
Gets the header information for this policy file.
sl@0
   133
@return A const reference to the policy header information.
sl@0
   134
*/
sl@0
   135
	{
sl@0
   136
	return iHeader;
sl@0
   137
	}
sl@0
   138
sl@0
   139
CPolicyReader::CPolicyReader()
sl@0
   140
/**
sl@0
   141
Constructor
sl@0
   142
*/
sl@0
   143
	{
sl@0
   144
	}
sl@0
   145
sl@0
   146
CPolicyReader::~CPolicyReader() 
sl@0
   147
/**
sl@0
   148
Destructor
sl@0
   149
*/
sl@0
   150
	{
sl@0
   151
	iReader.Close();
sl@0
   152
	delete iResourceFile;
sl@0
   153
	}
sl@0
   154
sl@0
   155
EXPORT_C CPolicy* CPolicyReader::DefaultPolicyL()
sl@0
   156
/**
sl@0
   157
Factory method for creating a default policy object from the 
sl@0
   158
information in the UPS policy file header.
sl@0
   159
sl@0
   160
@return A pointer to the default policy object.
sl@0
   161
*/
sl@0
   162
	{
sl@0
   163
	_LIT(KAllDestinations, "*");
sl@0
   164
	TSidClasses allSidClasses(0xFFFF);
sl@0
   165
	RArray<TSecureId> sidList;
sl@0
   166
	CleanupClosePushL(sidList);
sl@0
   167
	
sl@0
   168
	CPolicy* p = CPolicy::NewL(
sl@0
   169
		allSidClasses, sidList, KAllDestinations,
sl@0
   170
		CPolicy::EYes | CPolicy::ENo, iHeader.iDefaultPolicyEvaluator, iHeader.iDefaultDialogCreator, 
sl@0
   171
		0, CPolicy::ESystemServerSecurityPassedOrFailed,
sl@0
   172
		iHeader.iMajorVersion, iHeader.iMinorVersion, ETrue);
sl@0
   173
		
sl@0
   174
	CleanupStack::PopAndDestroy(&sidList);
sl@0
   175
	return p;
sl@0
   176
	}
sl@0
   177
sl@0
   178
EXPORT_C CPolicy* CPolicyReader::NextPolicyL()
sl@0
   179
/**
sl@0
   180
Gets the next policy from the resource file.
sl@0
   181
sl@0
   182
@return A pointer to the new policy object or null if the end of
sl@0
   183
		the file has been reached.
sl@0
   184
*/
sl@0
   185
	{
sl@0
   186
	CPolicy* p(0);
sl@0
   187
	if (iPolicyNum < iPolicyCount)
sl@0
   188
		{
sl@0
   189
		p = ReadPolicyL();
sl@0
   190
		++iPolicyNum;
sl@0
   191
		}
sl@0
   192
	return p;
sl@0
   193
	}
sl@0
   194
sl@0
   195
CPolicy* CPolicyReader::ReadPolicyL()
sl@0
   196
/**
sl@0
   197
Reads the next policy from the resource file.
sl@0
   198
sl@0
   199
@return A pointer to the new policy object.
sl@0
   200
 */
sl@0
   201
	{
sl@0
   202
	TUint32 classes = iReader.ReadUint32L();
sl@0
   203
	TSidClasses sidClasses(classes);		
sl@0
   204
sl@0
   205
	TInt numSids = iReader.ReadInt16L();
sl@0
   206
	if (numSids < 0)
sl@0
   207
		{
sl@0
   208
		User::Leave(KErrUpsBadPolicyFile);
sl@0
   209
		}		
sl@0
   210
	RArray<TSecureId> sidList(8);
sl@0
   211
	CleanupClosePushL(sidList);		
sl@0
   212
	for (TInt i = 0; i < numSids; ++i)
sl@0
   213
		{
sl@0
   214
		sidList.AppendL(TSecureId(iReader.ReadUint32L()));
sl@0
   215
		}
sl@0
   216
	
sl@0
   217
	TUint8 ssSecurity = iReader.ReadUint8L();
sl@0
   218
	CPolicy::TSystemServerSecurity systemServerSecurity = 
sl@0
   219
		CPolicy::ESystemServerSecurityPassedOrFailed;
sl@0
   220
	switch (ssSecurity)
sl@0
   221
		{
sl@0
   222
		case CPolicy::ESystemServerSecurityPassedOrFailed:
sl@0
   223
			systemServerSecurity = CPolicy::ESystemServerSecurityPassedOrFailed;
sl@0
   224
			break;
sl@0
   225
		case CPolicy::ESystemServerSecurityPassed:
sl@0
   226
			systemServerSecurity = CPolicy::ESystemServerSecurityPassed;
sl@0
   227
			break;
sl@0
   228
		case CPolicy::ESystemServerSecurityFailed:
sl@0
   229
			systemServerSecurity = CPolicy::ESystemServerSecurityFailed;
sl@0
   230
			break;
sl@0
   231
		default:
sl@0
   232
			User::Leave(KErrUpsBadPolicyFile);
sl@0
   233
			break;
sl@0
   234
		}
sl@0
   235
	
sl@0
   236
	HBufC* destination(iReader.ReadHBufCL());
sl@0
   237
	if (! destination)
sl@0
   238
		{
sl@0
   239
		destination = HBufC::NewL(0);
sl@0
   240
		}
sl@0
   241
	CleanupStack::PushL(destination);
sl@0
   242
sl@0
   243
	TUint options(iReader.ReadUint32L());
sl@0
   244
	if ((options & 
sl@0
   245
		~(CPolicy::EYes|CPolicy::ENo|CPolicy::ESessionYes|CPolicy::ESessionNo|CPolicy::EAlways|CPolicy::ENever)) != 0)
sl@0
   246
		{
sl@0
   247
		User::Leave(KErrUpsBadPolicyFile);
sl@0
   248
		}
sl@0
   249
	
sl@0
   250
	TUid policyEvaluator = TUid::Uid(iReader.ReadInt32L());
sl@0
   251
	if (policyEvaluator == TUid::Null())
sl@0
   252
		{
sl@0
   253
		policyEvaluator = iHeader.iDefaultPolicyEvaluator;
sl@0
   254
		}
sl@0
   255
	
sl@0
   256
	TUid dialogCreator = TUid::Uid(iReader.ReadInt32L());
sl@0
   257
	if (dialogCreator == TUid::Null())
sl@0
   258
		{
sl@0
   259
		dialogCreator = iHeader.iDefaultDialogCreator;
sl@0
   260
		}
sl@0
   261
	
sl@0
   262
	TUint16 flags(iReader.ReadUint16L());
sl@0
   263
	iReader.ReadUint16L(); // skip over reserved flags
sl@0
   264
	iReader.ReadUint32L(); // skip over reserved link
sl@0
   265
sl@0
   266
	CPolicy* pol = CPolicy::NewL(sidClasses, sidList, *destination,
sl@0
   267
		options, policyEvaluator, dialogCreator, flags, systemServerSecurity,
sl@0
   268
		iHeader.iMajorVersion, iHeader.iMinorVersion);
sl@0
   269
	
sl@0
   270
	CleanupStack::PopAndDestroy(2, &sidList); // destination, sidList
sl@0
   271
	return pol;
sl@0
   272
	}