os/persistentdata/persistentstorage/sql/SRC/Security/SqlSecurity.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 // Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 //
    15 
    16 #include "SqlSecurityImpl.h"
    17 #include "SqlAssert.h"
    18 #include "OstTraceDefinitions.h"
    19 #ifdef OST_TRACE_COMPILER_IN_USE
    20 #include "SqlSecurityTraces.h"
    21 #endif
    22 #include "SqlTraceDef.h"
    23 
    24 const TInt32 KEndOfSPStream = -1;//If found in the stream, given as an argument to RSqlSecurityPolicy::InternalizeL(),
    25 							     //then there are no more policies in the stream.
    26 
    27 /**
    28 Initializes RSqlSecurityPolicy instance data members with their default values.
    29 
    30 @capability None
    31 */
    32 EXPORT_C RSqlSecurityPolicy::RSqlSecurityPolicy() :
    33 	iImpl(NULL)
    34 	{
    35 	}
    36 
    37 /**
    38 Initializes RSqlSecurityPolicy instance.
    39 
    40 @param aDefaultPolicy Default security policy which will be used for the database and all database objects.
    41 
    42 @return KErrNone, the operation has completed successfully;
    43 		KErrNoMemory, an out of memory condition has occured.
    44                       Note that database specific errors categorised as ESqlDbError, and
    45                       other system-wide error codes may also be returned.
    46 
    47 @see TSecurityPolicy
    48 
    49 @capability None
    50 */
    51 EXPORT_C TInt RSqlSecurityPolicy::Create(const TSecurityPolicy& aDefaultPolicy)
    52 	{
    53 	SQL_TRACE_BORDER(OstTraceExt2(TRACE_BORDER, RSQLSECURITYPOLICY_CREATE_ENTRY , "Entry;0x%X;RSqlSecurityPolicy::Create;aDefaultPolicy=0x%X", (TUint)this, (TUint)&aDefaultPolicy));
    54 	TRAPD(err, CreateL(aDefaultPolicy));
    55     SQL_TRACE_BORDER(OstTraceExt3(TRACE_BORDER, RSQLSECURITYPOLICY_CREATE_EXIT, "Exit;0x%X;RSqlSecurityPolicy::Create;iImpl=0x%X;err=%d", (TUint)this, (TUint)iImpl, err));
    56 	return err;
    57 	}
    58 
    59 /**
    60 Initializes RSqlSecurityPolicy instance.
    61 
    62 @param aDefaultPolicy Default security policy which will be used for the database and all database objects.
    63 
    64 @leave  KErrNoMemory, an out of memory condition has occured.
    65                       Note that database specific errors categorised as ESqlDbError, and
    66                       other system-wide error codes may also be returned.
    67 
    68 @see TSecurityPolicy
    69 
    70 @capability None
    71 */
    72 EXPORT_C void RSqlSecurityPolicy::CreateL(const TSecurityPolicy& aDefaultPolicy)
    73 	{
    74     SQL_TRACE_BORDER(OstTraceExt2(TRACE_BORDER, RSQLSECURITYPOLICY_CREATEL_ENTRY , "Entry;0x%X;RSqlSecurityPolicy::CreateL;aDefaultPolicy=0x%X", (TUint)this, (TUint)&aDefaultPolicy));
    75 	iImpl = CSqlSecurityPolicy::NewL(aDefaultPolicy);
    76     SQL_TRACE_BORDER(OstTraceExt2(TRACE_BORDER, RSQLSECURITYPOLICY_CREATEL_EXIT, "Exit;0x%X;RSqlSecurityPolicy::CreateL;iImpl=0x%X", (TUint)this, (TUint)iImpl));
    77 	}
    78 
    79 /**
    80 Frees the allocated by RSqlSecurityPolicy instance memory and other resources.
    81 
    82 @capability None
    83 */
    84 EXPORT_C void RSqlSecurityPolicy::Close()
    85 	{
    86     SQL_TRACE_BORDER(OstTrace1(TRACE_BORDER, RSQLSECURITYPOLICY_CLOSE_ENTRY , "Entry;0x%X;RSqlSecurityPolicy::Close", (TUint)this));
    87 	delete iImpl;
    88     SQL_TRACE_BORDER(OstTraceExt2(TRACE_BORDER, RSQLSECURITYPOLICY_CLOSE_EXIT, "Exit;0x%X;RSqlSecurityPolicy::Close;iImpl=0x%X", (TUint)this, (TUint)iImpl));
    89 	iImpl = NULL;
    90 	}
    91 
    92 
    93 /**
    94 Sets a database security policy of a specific type.
    95 
    96 Sets database security policy (aPolicy argument) of aPolicyType type.
    97 If the aPolicyType database security policy has already been set then it will be replaced with the supplied policy.
    98 
    99 @param aPolicyType Database security policy type: RSqlSecurityPolicy::ESchema, RSqlSecurityPolicy::ERead, RSqlSecurityPolicy::EWrite.
   100 @param aPolicy The database security policy.
   101 
   102 @panic SqlDb 4 Invalid aPolicyType value.
   103 
   104 @return KErrNone
   105 
   106 @see RSqlSecurityPolicy::TPolicyType
   107 @see TSecurityPolicy
   108 
   109 @capability None
   110 */
   111 EXPORT_C TInt RSqlSecurityPolicy::SetDbPolicy(TPolicyType aPolicyType, const TSecurityPolicy& aPolicy)
   112 	{
   113 	__ASSERT_ALWAYS(aPolicyType >= ESchemaPolicy && aPolicyType <= EWritePolicy, __SQLPANIC(ESqlPanicBadArgument));
   114 	Impl().SetDbPolicy(aPolicyType, aPolicy);
   115 	return KErrNone;
   116 	}
   117 	
   118 /**
   119 Sets a database object security policy of a specific type.
   120 
   121 If there is no entry in the security policy container for the object with aObjectName name, then a new entry for this 
   122 object will be created and all object security policies will be initialized with the default security policy. 
   123 The specific database object policy, refered by aPolicyType parameter, will be set after that.
   124 
   125 If an entry for aObjectName object already exists, its security policy of "aPolicyType" type will be 
   126 reinitialized with the data of aPolicy parameter.
   127 
   128 @param aObjectType Database object type. At the moment there is only one database object type - RSqlSecurityPolicy::ETable.
   129 @param aObjectName Database object name. It cannot be a null descriptor.
   130 @param aPolicyType Database object security policy type: RSqlSecurityPolicy::EReadPolicy, RSqlSecurityPolicy::EWritePolicy.
   131 @param aPolicy Database security policy.
   132 
   133 @return KErrNone, the operation has completed successfully;
   134 		KErrNoMemory, an out of memory condition has occured.
   135 
   136 @panic SqlDb 4 Invalid aPolicyType value.
   137 @panic SqlDb 4 Invalid aObjectType value (It has to be RSqlSecurityPolicy::ETable).
   138 @panic SqlDb 4 Invalid aObjectName value (Null descriptor).
   139 
   140 @see RSqlSecurityPolicy::TObjectType
   141 @see RSqlSecurityPolicy::TPolicyType
   142 @see TSecurityPolicy
   143 
   144 @capability None
   145 */
   146 EXPORT_C TInt RSqlSecurityPolicy::SetPolicy(TObjectType aObjectType, const TDesC& aObjectName, 
   147 									  TPolicyType aPolicyType, const TSecurityPolicy& aPolicy)
   148 	{
   149 	__ASSERT_ALWAYS(aObjectType == ETable, __SQLPANIC(ESqlPanicBadArgument));
   150 	__ASSERT_ALWAYS(aObjectName.Length() > 0, __SQLPANIC(ESqlPanicBadArgument));
   151 	__ASSERT_ALWAYS(aPolicyType >= EReadPolicy && aPolicyType <= EWritePolicy, __SQLPANIC(ESqlPanicBadArgument));
   152 	return Impl().SetPolicy(aObjectType, aObjectName, aPolicyType, aPolicy);
   153 	}
   154 
   155 /**
   156 Gets the default database security policy.
   157 
   158 @return The default security policy.
   159 				   
   160 @see TSecurityPolicy
   161 
   162 @capability None
   163 */	
   164 EXPORT_C TSecurityPolicy RSqlSecurityPolicy::DefaultPolicy() const
   165 	{
   166 	return Impl().DefaultPolicy();
   167 	}
   168 
   169 /**
   170 Gets a database security policy of the specified type.
   171 
   172 @param aPolicyType Database security policy type: RSqlSecurityPolicy::ESchemaPolicy, RSqlSecurityPolicy::EReadPolicy, 
   173 				   RSqlSecurityPolicy::EWritePolicy.
   174 
   175 @return The requested database security policy.
   176 				   
   177 @panic SqlDb 4 Invalid aPolicyType value.
   178 
   179 @see RSqlSecurityPolicy::TPolicyType
   180 @see TSecurityPolicy
   181 
   182 @capability None
   183 */	
   184 EXPORT_C TSecurityPolicy RSqlSecurityPolicy::DbPolicy(TPolicyType aPolicyType) const
   185 	{
   186 	__ASSERT_ALWAYS(aPolicyType >= ESchemaPolicy && aPolicyType <= EWritePolicy, __SQLPANIC(ESqlPanicBadArgument));
   187 	return Impl().DbPolicy(aPolicyType);
   188 	}
   189 	
   190 /**
   191 Gets a database object security policy of the specified type.
   192 
   193 If no security policy of the specified type exists for that database object - the default security policy
   194 will be returned.
   195 
   196 @param aObjectType Database object type. At the moment there is only one database object type - RSqlSecurityPolicy::ETable.
   197 @param aObjectName Database object name. It cannot be a null descriptor.
   198 @param aPolicyType Database object security policy type: RSqlSecurityPolicy::EReadPolicy, RSqlSecurityPolicy::EWritePolicy.
   199 
   200 @return The requested security policy.
   201 
   202 @panic SqlDb 4 Invalid aPolicyType value.
   203 @panic SqlDb 4 Invalid aObjectType value (It has to be RSqlSecurityPolicy::ETable).
   204 @panic SqlDb 4 Invalid aObjectName value (Null descriptor).
   205 
   206 @see RSqlSecurityPolicy::TObjectType
   207 @see RSqlSecurityPolicy::TPolicyType
   208 @see TSecurityPolicy
   209 
   210 @capability None
   211 */
   212 EXPORT_C TSecurityPolicy RSqlSecurityPolicy::Policy(TObjectType aObjectType, const TDesC& aObjectName, 
   213 												 TPolicyType aPolicyType) const
   214 	{
   215 	__ASSERT_ALWAYS(aObjectType == ETable, __SQLPANIC(ESqlPanicBadArgument));
   216 	__ASSERT_ALWAYS(aObjectName.Length() > 0, __SQLPANIC(ESqlPanicBadArgument));
   217 	__ASSERT_ALWAYS(aPolicyType >= EReadPolicy && aPolicyType <= EWritePolicy, __SQLPANIC(ESqlPanicBadArgument));
   218 	return Impl().Policy(aObjectType, aObjectName, aPolicyType);
   219 	}
   220 
   221 /**
   222 Externalizes RSqlSecurityPolicy instance to a write stream.
   223 
   224 @param aStream Stream to which RSqlSecurityPolicy instance should be externalised.
   225 
   226 @leave KErrNoMemory, an out of memory condition has occured.
   227 
   228 @capability None
   229 */
   230 EXPORT_C void RSqlSecurityPolicy::ExternalizeL(RWriteStream& aStream) const
   231 	{
   232     SQL_TRACE_BORDER(OstTraceExt3(TRACE_BORDER, RSQLSECURITYPOLICY_EXTERNALIZEL_ENTRY , "Entry;0x%X;RSqlSecurityPolicy::ExternalizeL;aStream=0x%X;aStream.Sink()=0x%X", (TUint)this, (TUint)&aStream, (TUint)aStream.Sink()));
   233 	RSqlSecurityPolicy::TObjectType objectType;
   234 	TPtrC objectName;
   235 	RSqlSecurityPolicy::TPolicyType policyType;
   236 	TSecurityPolicy policy;
   237 	//Default policy
   238 	policy = Impl().DefaultPolicy();
   239 	aStream << policy.Package();
   240 	//Database policies
   241 	policy = Impl().DbPolicy(RSqlSecurityPolicy::ESchemaPolicy);
   242 	aStream << policy.Package();
   243 	policy = Impl().DbPolicy(RSqlSecurityPolicy::EReadPolicy);
   244 	aStream << policy.Package();
   245 	policy = Impl().DbPolicy(RSqlSecurityPolicy::EWritePolicy);
   246 	aStream << policy.Package();
   247 	//Database object policies
   248 	TSqlSecurityPolicyIterator it(Impl());
   249 	while(it.Next(objectType, objectName, policyType, policy))
   250 		{
   251 		aStream << static_cast <TInt32> (objectType);
   252 		aStream << objectName;
   253 		aStream << static_cast <TInt32> (policyType);
   254 		aStream << policy.Package();
   255 		}
   256 	//Object policy stream - end
   257 	aStream << KEndOfSPStream;
   258     SQL_TRACE_BORDER(OstTrace1(TRACE_BORDER, RSQLSECURITYPOLICY_EXTERNALIZEL_EXIT, "Exit;0x%X;RSqlSecurityPolicy::ExternalizeL", (TUint)this));
   259 	}
   260 	
   261 /**
   262 Initializes RSqlSecurityPolicy instance from a stream.
   263 In case of an error the original security policy data is preserved.
   264 
   265 @param aStream A read stream containing the data with which the RSqlSecurityPolicy instance will be initialized.
   266 
   267 @leave KErrNoMemory, an out of memory condition has occured.
   268                      Note that the function may leave with other system-wide error codes.
   269 
   270 @capability None
   271 */
   272 EXPORT_C void RSqlSecurityPolicy::InternalizeL(RReadStream& aStream)
   273 	{
   274     SQL_TRACE_BORDER(OstTraceExt3(TRACE_BORDER, RSQLSECURITYPOLICY_INTERNALIZEL_ENTRY , "Entry;0x%X;RSqlSecurityPolicy::InternalizeL;aStream=0x%X;aStream.Source()=0x%X", (TUint)this, (TUint)&aStream, (TUint)aStream.Source()));
   275 	TSecurityPolicy policy;
   276 	TBuf8<sizeof(TSecurityPolicy)> policyBuf;
   277 	//Default policy
   278 	aStream >> policyBuf;
   279 	policy.Set(policyBuf);
   280 	//Create new sql security policy object	and initialize it with the policies read from the input stream
   281 	RSqlSecurityPolicy newPolicy;
   282 	newPolicy.CreateL(policy);
   283 	CleanupClosePushL(newPolicy);
   284 	//Database policies
   285 	aStream >> policyBuf;
   286 	policy.Set(policyBuf);
   287 	__SQLLEAVE_IF_ERROR(newPolicy.SetDbPolicy(RSqlSecurityPolicy::ESchemaPolicy, policy));
   288 	aStream >> policyBuf;
   289 	policy.Set(policyBuf);
   290 	__SQLLEAVE_IF_ERROR(newPolicy.SetDbPolicy(RSqlSecurityPolicy::EReadPolicy, policy));
   291 	aStream >> policyBuf;
   292 	policy.Set(policyBuf);
   293 	__SQLLEAVE_IF_ERROR(newPolicy.SetDbPolicy(RSqlSecurityPolicy::EWritePolicy, policy));
   294 	//Database object policies
   295 	for(;;)
   296 		{
   297 		TInt32 objectType;
   298 		aStream >> objectType;
   299 		if(objectType == KEndOfSPStream)
   300 			{
   301 			break;	
   302 			}
   303 		TBuf<KMaxFileName> objectName;
   304 		aStream >> objectName;
   305 		TInt32 policyType;
   306 		aStream >> policyType;
   307 		aStream >> policyBuf;
   308 		policy.Set(policyBuf);
   309 		__SQLLEAVE_IF_ERROR(newPolicy.SetPolicy(static_cast <RSqlSecurityPolicy::TObjectType> (objectType), objectName, static_cast <RSqlSecurityPolicy::TPolicyType> (policyType), policy));
   310 		}
   311 	//Swap the original sql security policy with the new sql security policy
   312 	CSqlSecurityPolicy* temp = newPolicy.iImpl;
   313 	newPolicy.iImpl = iImpl;
   314 	iImpl = temp;
   315 	//Destroy the old policy (which was swapped)
   316 	CleanupStack::PopAndDestroy(&newPolicy);
   317     SQL_TRACE_BORDER(OstTrace1(TRACE_BORDER, RSQLSECURITYPOLICY_INTERNALIZEL_EXIT, "Exit;0x%X;RSqlSecurityPolicy::InternalizeL", (TUint)this));
   318 	}
   319 
   320 /**
   321 Destroys the existing iImpl object and replaces it with aImpl parameter.
   322 
   323 @internalComponent
   324 */
   325 void RSqlSecurityPolicy::Set(CSqlSecurityPolicy& aImpl)
   326 	{
   327 	delete iImpl;
   328 	iImpl = &aImpl;
   329 	}
   330 
   331 /**
   332 @return A reference to the implementation object.
   333 
   334 @panic SqlDb 2 Create() has not previously been called on  this RSqlSecurityPolicy object.
   335 
   336 @internalComponent
   337 */
   338 CSqlSecurityPolicy& RSqlSecurityPolicy::Impl() const
   339 	{
   340 	__ASSERT_ALWAYS(iImpl != NULL, __SQLPANIC(ESqlPanicInvalidObj));
   341 	return *iImpl;	
   342 	}