persistentstorage/sql/SRC/Security/SqlSecurity.cpp
changeset 0 08ec8eefde2f
child 15 fcc16690f446
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/sql/SRC/Security/SqlSecurity.cpp	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,337 @@
+// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "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 "SqlSecurityImpl.h"
+#include "SqlPanic.h"
+#include "UTraceSql.h"
+
+const TInt32 KEndOfSPStream = -1;//If found in the stream, given as an argument to RSqlSecurityPolicy::InternalizeL(),
+							     //then there are no more policies in the stream.
+
+/**
+Initializes RSqlSecurityPolicy instance data members with their default values.
+
+@capability None
+*/
+EXPORT_C RSqlSecurityPolicy::RSqlSecurityPolicy() :
+	iImpl(NULL)
+	{
+	}
+
+/**
+Initializes RSqlSecurityPolicy instance.
+
+@param aDefaultPolicy Default security policy which will be used for the database and all database objects.
+
+@return KErrNone, the operation has completed successfully;
+		KErrNoMemory, an out of memory condition has occured.
+                      Note that database specific errors categorised as ESqlDbError, and
+                      other system-wide error codes may also be returned.
+
+@see TSecurityPolicy
+
+@capability None
+*/
+EXPORT_C TInt RSqlSecurityPolicy::Create(const TSecurityPolicy& aDefaultPolicy)
+	{
+	SQLUTRACE_PROFILER(this);
+	TRAPD(err, CreateL(aDefaultPolicy));
+	return err;
+	}
+
+/**
+Initializes RSqlSecurityPolicy instance.
+
+@param aDefaultPolicy Default security policy which will be used for the database and all database objects.
+
+@leave  KErrNoMemory, an out of memory condition has occured.
+                      Note that database specific errors categorised as ESqlDbError, and
+                      other system-wide error codes may also be returned.
+
+@see TSecurityPolicy
+
+@capability None
+*/
+EXPORT_C void RSqlSecurityPolicy::CreateL(const TSecurityPolicy& aDefaultPolicy)
+	{
+	SQLUTRACE_PROFILER(this);
+	iImpl = CSqlSecurityPolicy::NewL(aDefaultPolicy);
+	}
+
+/**
+Frees the allocated by RSqlSecurityPolicy instance memory and other resources.
+
+@capability None
+*/
+EXPORT_C void RSqlSecurityPolicy::Close()
+	{
+	SQLUTRACE_PROFILER(this);
+	delete iImpl;
+	iImpl = NULL;
+	}
+
+
+/**
+Sets a database security policy of a specific type.
+
+Sets database security policy (aPolicy argument) of aPolicyType type.
+If the aPolicyType database security policy has already been set then it will be replaced with the supplied policy.
+
+@param aPolicyType Database security policy type: RSqlSecurityPolicy::ESchema, RSqlSecurityPolicy::ERead, RSqlSecurityPolicy::EWrite.
+@param aPolicy The database security policy.
+
+@panic SqlDb 4 Invalid aPolicyType value.
+
+@return KErrNone
+
+@see RSqlSecurityPolicy::TPolicyType
+@see TSecurityPolicy
+
+@capability None
+*/
+EXPORT_C TInt RSqlSecurityPolicy::SetDbPolicy(TPolicyType aPolicyType, const TSecurityPolicy& aPolicy)
+	{
+	SQLUTRACE_PROFILER(this);
+	__SQLASSERT_ALWAYS(aPolicyType >= ESchemaPolicy && aPolicyType <= EWritePolicy, ESqlPanicBadArgument);
+	return Impl().SetDbPolicy(aPolicyType, aPolicy);
+	}
+	
+/**
+Sets a database object security policy of a specific type.
+
+If there is no entry in the security policy container for the object with aObjectName name, then a new entry for this 
+object will be created and all object security policies will be initialized with the default security policy. 
+The specific database object policy, refered by aPolicyType parameter, will be set after that.
+
+If an entry for aObjectName object already exists, its security policy of "aPolicyType" type will be 
+reinitialized with the data of aPolicy parameter.
+
+@param aObjectType Database object type. At the moment there is only one database object type - RSqlSecurityPolicy::ETable.
+@param aObjectName Database object name. It cannot be a null descriptor.
+@param aPolicyType Database object security policy type: RSqlSecurityPolicy::EReadPolicy, RSqlSecurityPolicy::EWritePolicy.
+@param aPolicy Database security policy.
+
+@return KErrNone, the operation has completed successfully;
+		KErrNoMemory, an out of memory condition has occured.
+
+@panic SqlDb 4 Invalid aPolicyType value.
+@panic SqlDb 4 Invalid aObjectType value (It has to be RSqlSecurityPolicy::ETable).
+@panic SqlDb 4 Invalid aObjectName value (Null descriptor).
+
+@see RSqlSecurityPolicy::TObjectType
+@see RSqlSecurityPolicy::TPolicyType
+@see TSecurityPolicy
+
+@capability None
+*/
+EXPORT_C TInt RSqlSecurityPolicy::SetPolicy(TObjectType aObjectType, const TDesC& aObjectName, 
+									  TPolicyType aPolicyType, const TSecurityPolicy& aPolicy)
+	{
+	SQLUTRACE_PROFILER(this);
+	__SQLASSERT_ALWAYS(aObjectType == ETable, ESqlPanicBadArgument);
+	__SQLASSERT_ALWAYS(aObjectName.Length() > 0, ESqlPanicBadArgument);
+	__SQLASSERT_ALWAYS(aPolicyType >= EReadPolicy && aPolicyType <= EWritePolicy, ESqlPanicBadArgument);
+	return Impl().SetPolicy(aObjectType, aObjectName, aPolicyType, aPolicy);
+	}
+
+/**
+Gets the default database security policy.
+
+@return The default security policy.
+				   
+@see TSecurityPolicy
+
+@capability None
+*/	
+EXPORT_C TSecurityPolicy RSqlSecurityPolicy::DefaultPolicy() const
+	{
+	SQLUTRACE_PROFILER(this);
+	return Impl().DefaultPolicy();
+	}
+
+/**
+Gets a database security policy of the specified type.
+
+@param aPolicyType Database security policy type: RSqlSecurityPolicy::ESchemaPolicy, RSqlSecurityPolicy::EReadPolicy, 
+				   RSqlSecurityPolicy::EWritePolicy.
+
+@return The requested database security policy.
+				   
+@panic SqlDb 4 Invalid aPolicyType value.
+
+@see RSqlSecurityPolicy::TPolicyType
+@see TSecurityPolicy
+
+@capability None
+*/	
+EXPORT_C TSecurityPolicy RSqlSecurityPolicy::DbPolicy(TPolicyType aPolicyType) const
+	{
+	SQLUTRACE_PROFILER(this);
+	__SQLASSERT_ALWAYS(aPolicyType >= ESchemaPolicy && aPolicyType <= EWritePolicy, ESqlPanicBadArgument);
+	return Impl().DbPolicy(aPolicyType);
+	}
+	
+/**
+Gets a database object security policy of the specified type.
+
+If no security policy of the specified type exists for that database object - the default security policy
+will be returned.
+
+@param aObjectType Database object type. At the moment there is only one database object type - RSqlSecurityPolicy::ETable.
+@param aObjectName Database object name. It cannot be a null descriptor.
+@param aPolicyType Database object security policy type: RSqlSecurityPolicy::EReadPolicy, RSqlSecurityPolicy::EWritePolicy.
+
+@return The requested security policy.
+
+@panic SqlDb 4 Invalid aPolicyType value.
+@panic SqlDb 4 Invalid aObjectType value (It has to be RSqlSecurityPolicy::ETable).
+@panic SqlDb 4 Invalid aObjectName value (Null descriptor).
+
+@see RSqlSecurityPolicy::TObjectType
+@see RSqlSecurityPolicy::TPolicyType
+@see TSecurityPolicy
+
+@capability None
+*/
+EXPORT_C TSecurityPolicy RSqlSecurityPolicy::Policy(TObjectType aObjectType, const TDesC& aObjectName, 
+												 TPolicyType aPolicyType) const
+	{
+	SQLUTRACE_PROFILER(this);
+	__SQLASSERT_ALWAYS(aObjectType == ETable, ESqlPanicBadArgument);
+	__SQLASSERT_ALWAYS(aObjectName.Length() > 0, ESqlPanicBadArgument);
+	__SQLASSERT_ALWAYS(aPolicyType >= EReadPolicy && aPolicyType <= EWritePolicy, ESqlPanicBadArgument);
+	return Impl().Policy(aObjectType, aObjectName, aPolicyType);
+	}
+
+/**
+Externalizes RSqlSecurityPolicy instance to a write stream.
+
+@param aStream Stream to which RSqlSecurityPolicy instance should be externalised.
+
+@leave KErrNoMemory, an out of memory condition has occured.
+
+@capability None
+*/
+EXPORT_C void RSqlSecurityPolicy::ExternalizeL(RWriteStream& aStream) const
+	{
+	SQLUTRACE_PROFILER(this);
+	RSqlSecurityPolicy::TObjectType objectType;
+	TPtrC objectName;
+	RSqlSecurityPolicy::TPolicyType policyType;
+	TSecurityPolicy policy;
+	//Default policy
+	policy = Impl().DefaultPolicy();
+	aStream << policy.Package();
+	//Database policies
+	policy = Impl().DbPolicy(RSqlSecurityPolicy::ESchemaPolicy);
+	aStream << policy.Package();
+	policy = Impl().DbPolicy(RSqlSecurityPolicy::EReadPolicy);
+	aStream << policy.Package();
+	policy = Impl().DbPolicy(RSqlSecurityPolicy::EWritePolicy);
+	aStream << policy.Package();
+	//Database object policies
+	TSqlSecurityPolicyIterator it(Impl());
+	while(it.Next(objectType, objectName, policyType, policy))
+		{
+		aStream << static_cast <TInt32> (objectType);
+		aStream << objectName;
+		aStream << static_cast <TInt32> (policyType);
+		aStream << policy.Package();
+		}
+	//Object policy stream - end
+	aStream << KEndOfSPStream;
+	}
+	
+/**
+Initializes RSqlSecurityPolicy instance from a stream.
+In case of an error the original security policy data is preserved.
+
+@param aStream A read stream containing the data with which the RSqlSecurityPolicy instance will be initialized.
+
+@leave KErrNoMemory, an out of memory condition has occured.
+                     Note that the function may leave with other system-wide error codes.
+
+@capability None
+*/
+EXPORT_C void RSqlSecurityPolicy::InternalizeL(RReadStream& aStream)
+	{
+	SQLUTRACE_PROFILER(this);
+	TSecurityPolicy policy;
+	TBuf8<sizeof(TSecurityPolicy)> policyBuf;
+	//Default policy
+	aStream >> policyBuf;
+	policy.Set(policyBuf);
+	//Create new sql security policy object	and initialize it with the policies read from the input stream
+	RSqlSecurityPolicy newPolicy;
+	newPolicy.CreateL(policy);
+	CleanupClosePushL(newPolicy);
+	//Database policies
+	aStream >> policyBuf;
+	policy.Set(policyBuf);
+	__SQLLEAVE_IF_ERROR(newPolicy.SetDbPolicy(RSqlSecurityPolicy::ESchemaPolicy, policy));
+	aStream >> policyBuf;
+	policy.Set(policyBuf);
+	__SQLLEAVE_IF_ERROR(newPolicy.SetDbPolicy(RSqlSecurityPolicy::EReadPolicy, policy));
+	aStream >> policyBuf;
+	policy.Set(policyBuf);
+	__SQLLEAVE_IF_ERROR(newPolicy.SetDbPolicy(RSqlSecurityPolicy::EWritePolicy, policy));
+	//Database object policies
+	for(;;)
+		{
+		TInt32 objectType;
+		aStream >> objectType;
+		if(objectType == KEndOfSPStream)
+			{
+			break;	
+			}
+		TBuf<KMaxFileName> objectName;
+		aStream >> objectName;
+		TInt32 policyType;
+		aStream >> policyType;
+		aStream >> policyBuf;
+		policy.Set(policyBuf);
+		__SQLLEAVE_IF_ERROR(newPolicy.SetPolicy(static_cast <RSqlSecurityPolicy::TObjectType> (objectType), objectName, static_cast <RSqlSecurityPolicy::TPolicyType> (policyType), policy));
+		}
+	//Swap the original sql security policy with the new sql security policy
+	CSqlSecurityPolicy* temp = newPolicy.iImpl;
+	newPolicy.iImpl = iImpl;
+	iImpl = temp;
+	//Destroy the old policy (which was swapped)
+	CleanupStack::PopAndDestroy(&newPolicy);
+	}
+
+/**
+Destroys the existing iImpl object and replaces it with aImpl parameter.
+
+@internalComponent
+*/
+void RSqlSecurityPolicy::Set(CSqlSecurityPolicy& aImpl)
+	{
+	delete iImpl;
+	iImpl = &aImpl;
+	}
+
+/**
+@return A reference to the implementation object.
+
+@panic SqlDb 2 Create() has not previously been called on  this RSqlSecurityPolicy object.
+
+@internalComponent
+*/
+CSqlSecurityPolicy& RSqlSecurityPolicy::Impl() const
+	{
+	__SQLASSERT_ALWAYS(iImpl != NULL, ESqlPanicInvalidObj);
+	return *iImpl;	
+	}