persistentstorage/sql/SRC/Security/SqlSecurityImpl.cpp
branchRCL_3
changeset 24 cc28652e0254
parent 23 26645d81f48d
equal deleted inserted replaced
23:26645d81f48d 24:cc28652e0254
     1 // Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
     1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     3 // This component and the accompanying materials are made available
     4 // under the terms of "Eclipse Public License v1.0"
     4 // under the terms of "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
    41 
    41 
    42 @return CSqlSecurityPolicy::TPolicyItem pointer, which can be used for R/W operations on the database security policy data.
    42 @return CSqlSecurityPolicy::TPolicyItem pointer, which can be used for R/W operations on the database security policy data.
    43 */
    43 */
    44 inline CSqlSecurityPolicy::TPolicyItem* CSqlSecurityPolicy::PolicyItemPtr(const RSqlBufFlat::TCell* aBegin, const RSqlBufFlat::TCell* aCurrent)
    44 inline CSqlSecurityPolicy::TPolicyItem* CSqlSecurityPolicy::PolicyItemPtr(const RSqlBufFlat::TCell* aBegin, const RSqlBufFlat::TCell* aCurrent)
    45 	{
    45 	{
    46 	__ASSERT_DEBUG(aBegin != NULL && aCurrent != NULL, __SQLPANIC2(ESqlPanicBadArgument));
    46 	__SQLASSERT(aBegin != NULL && aCurrent != NULL, ESqlPanicBadArgument);
    47 	__ASSERT_DEBUG(aCurrent->iPos != 0, __SQLPANIC2(ESqlPanicBadArgument));
    47 	__SQLASSERT(aCurrent->iPos != 0, ESqlPanicBadArgument);
    48 	const TUint8* begin = reinterpret_cast <const TUint8*> (aBegin);
    48 	const TUint8* begin = reinterpret_cast <const TUint8*> (aBegin);
    49 	return reinterpret_cast <CSqlSecurityPolicy::TPolicyItem*> (const_cast <TUint8*> (begin) + aCurrent->iPos);
    49 	return reinterpret_cast <CSqlSecurityPolicy::TPolicyItem*> (const_cast <TUint8*> (begin) + aCurrent->iPos);
    50 	}
    50 	}
    51 
    51 
    52 /**
    52 /**
    61 */
    61 */
    62 const CSqlSecurityPolicy::TPolicyItem* CSqlSecurityPolicy::FindPolicyItemPtr(RSqlSecurityPolicy::TObjectType aObjectType, 
    62 const CSqlSecurityPolicy::TPolicyItem* CSqlSecurityPolicy::FindPolicyItemPtr(RSqlSecurityPolicy::TObjectType aObjectType, 
    63 																	   		 const TDesC& aObjectName) const
    63 																	   		 const TDesC& aObjectName) const
    64 	{
    64 	{
    65 	const RSqlBufFlat::TCell* begin = iBufFlat.Header();
    65 	const RSqlBufFlat::TCell* begin = iBufFlat.Header();
    66 	__ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
    66 	__SQLASSERT(begin != NULL, ESqlPanicInternalError);
    67 	const RSqlBufFlat::TCell* end = begin + Count();
    67 	const RSqlBufFlat::TCell* end = begin + Count();
    68 	const RSqlBufFlat::TCell* current = begin + CSqlSecurityPolicy::EDbPolicyIdx;//ignore default and database policiy types ("current" points before the first non-database policy)
    68 	const RSqlBufFlat::TCell* current = begin + CSqlSecurityPolicy::EDbPolicyIdx;//ignore default and database policiy types ("current" points before the first non-database policy)
    69 	while(++current < end)
    69 	while(++current < end)
    70 		{
    70 		{
    71 		if(current->iPos > 0 && current->Type() == (TInt)aObjectType) //if present and the same type as aObjectType
    71 		if(current->iPos > 0 && current->Type() == (TInt)aObjectType) //if present and the same type as aObjectType
    72 			{
    72 			{
    73 			const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, current);
    73 			const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, current);
    74 			__ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
    74 			__SQLASSERT(item != NULL, ESqlPanicInternalError);
    75 			__ASSERT_DEBUG(((current->Size() - sizeof(CSqlSecurityPolicy::TPolicyItem) - sizeof(TInt)) / sizeof(TUint16)) == item->NameSize(), __SQLPANIC(ESqlPanicInternalError));
    75 			__SQLASSERT(((current->Size() - sizeof(CSqlSecurityPolicy::TPolicyItem) - sizeof(TInt)) / sizeof(TUint16)) == item->NameSize(), ESqlPanicInternalError);
    76 			if(::CompareNoCase16(aObjectName, TPtrC(item->NamePtr(), item->NameSize())) == 0)
    76 			if(::CompareNoCase16(aObjectName, TPtrC(item->NamePtr(), item->NameSize())) == 0)
    77 				{
    77 				{
    78 				return item;	
    78 				return item;	
    79 				}
    79 				}
    80 			}
    80 			}
   145         one default security policy entry and one database security policy entry.
   145         one default security policy entry and one database security policy entry.
   146 */
   146 */
   147 TInt CSqlSecurityPolicy::Count() const
   147 TInt CSqlSecurityPolicy::Count() const
   148 	{
   148 	{
   149 	const RSqlBufFlat::TCell* begin = iBufFlat.Header();
   149 	const RSqlBufFlat::TCell* begin = iBufFlat.Header();
   150 	__ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
   150 	__SQLASSERT(begin != NULL, ESqlPanicInternalError);
   151 	return *reinterpret_cast <const TInt*> (reinterpret_cast <const TUint8*> (begin) + (begin + CSqlSecurityPolicy::ECountIdx)->iPos);
   151 	return *reinterpret_cast <const TInt*> (reinterpret_cast <const TUint8*> (begin) + (begin + CSqlSecurityPolicy::ECountIdx)->iPos);
   152 	}
   152 	}
   153 
   153 
   154 /**
   154 /**
   155 Sets the number of database security entries.
   155 Sets the number of database security entries.
   156 */
   156 */
   157 void CSqlSecurityPolicy::SetCount(TInt aCount)
   157 void CSqlSecurityPolicy::SetCount(TInt aCount)
   158 	{
   158 	{
   159 	__ASSERT_DEBUG(aCount >= 0, __SQLPANIC(ESqlPanicBadArgument));
   159 	__SQLASSERT(aCount >= 0, ESqlPanicBadArgument);
   160 	RSqlBufFlat::TCell* begin = iBufFlat.Header();
   160 	RSqlBufFlat::TCell* begin = iBufFlat.Header();
   161 	__ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
   161 	__SQLASSERT(begin != NULL, ESqlPanicInternalError);
   162 	*reinterpret_cast <TInt*> (reinterpret_cast <TUint8*> (begin) + (begin + CSqlSecurityPolicy::ECountIdx)->iPos) = aCount;
   162 	*reinterpret_cast <TInt*> (reinterpret_cast <TUint8*> (begin) + (begin + CSqlSecurityPolicy::ECountIdx)->iPos) = aCount;
   163 	}
   163 	}
   164 
   164 
   165 /**
   165 /**
   166 Sets the default policy.
   166 Sets the default policy.
   167 */
   167 */
   168 void CSqlSecurityPolicy::SetDefaultPolicy(const TSecurityPolicy& aPolicy)
   168 void CSqlSecurityPolicy::SetDefaultPolicy(const TSecurityPolicy& aPolicy)
   169 	{
   169 	{
   170 	RSqlBufFlat::TCell* begin = iBufFlat.Header();
   170 	RSqlBufFlat::TCell* begin = iBufFlat.Header();
   171 	__ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
   171 	__SQLASSERT(begin != NULL, ESqlPanicInternalError);
   172 	CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDefaultPolicyIdx);
   172 	CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDefaultPolicyIdx);
   173 	__ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
   173 	__SQLASSERT(item != NULL, ESqlPanicInternalError);
   174 	item->iPolicy[0] = aPolicy;
   174 	item->iPolicy[0] = aPolicy;
   175 	}
   175 	}
   176 	
   176 	
   177 /**
   177 /**
   178 @param aPolicyType Database security policy type: RSqlSecurityPolicy::ESchemaPolicy, 
   178 @param aPolicyType Database security policy type: RSqlSecurityPolicy::ESchemaPolicy, 
   182 @panic SqlDb 4 In _DEBUG mode. Invalid policy type.
   182 @panic SqlDb 4 In _DEBUG mode. Invalid policy type.
   183 */
   183 */
   184 void CSqlSecurityPolicy::SetDbPolicy(RSqlSecurityPolicy::TPolicyType aPolicyType, const TSecurityPolicy& aPolicy)
   184 void CSqlSecurityPolicy::SetDbPolicy(RSqlSecurityPolicy::TPolicyType aPolicyType, const TSecurityPolicy& aPolicy)
   185 	{
   185 	{
   186 	const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
   186 	const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
   187 	__ASSERT_DEBUG((TUint)KPolicyIndex < EPolicyTypeCount, __SQLPANIC(ESqlPanicBadArgument));
   187 	__SQLASSERT((TUint)KPolicyIndex < EPolicyTypeCount, ESqlPanicBadArgument);
   188 	RSqlBufFlat::TCell* begin = iBufFlat.Header();
   188 	RSqlBufFlat::TCell* begin = iBufFlat.Header();
   189 	__ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
   189 	__SQLASSERT(begin != NULL, ESqlPanicInternalError);
   190 	CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDbPolicyIdx);
   190 	CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDbPolicyIdx);
   191 	__ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
   191 	__SQLASSERT(item != NULL, ESqlPanicInternalError);
   192 	//KPolicyIndex value is tested at the beginning of the function
   192 	//KPolicyIndex value is tested at the beginning of the function
   193 	//coverity[overrun-local]
   193 	//coverity[overrun-local]
   194 	item->iPolicy[KPolicyIndex] = aPolicy;
   194 	item->iPolicy[KPolicyIndex] = aPolicy;
   195 	}
   195 	}
   196 
   196 
   218 */
   218 */
   219 TInt CSqlSecurityPolicy::SetPolicy(RSqlSecurityPolicy::TObjectType aObjectType, const TDesC& aObjectName,
   219 TInt CSqlSecurityPolicy::SetPolicy(RSqlSecurityPolicy::TObjectType aObjectType, const TDesC& aObjectName,
   220 							   	   RSqlSecurityPolicy::TPolicyType aPolicyType, const TSecurityPolicy& aPolicy)
   220 							   	   RSqlSecurityPolicy::TPolicyType aPolicyType, const TSecurityPolicy& aPolicy)
   221 	{
   221 	{
   222 	const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
   222 	const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
   223 	__ASSERT_DEBUG((TUint)KPolicyIndex < EPolicyTypeCount, __SQLPANIC(ESqlPanicBadArgument));
   223 	__SQLASSERT((TUint)KPolicyIndex < EPolicyTypeCount, ESqlPanicBadArgument);
   224 	__ASSERT_DEBUG(aObjectName.Length() > 0, __SQLPANIC(ESqlPanicBadArgument));
   224 	__SQLASSERT(aObjectName.Length() > 0, ESqlPanicBadArgument);
   225 	CSqlSecurityPolicy::TPolicyItem* item = const_cast <CSqlSecurityPolicy::TPolicyItem*> (FindPolicyItemPtr(aObjectType, aObjectName));
   225 	CSqlSecurityPolicy::TPolicyItem* item = const_cast <CSqlSecurityPolicy::TPolicyItem*> (FindPolicyItemPtr(aObjectType, aObjectName));
   226 	if(item)
   226 	if(item)
   227 		{//There is a field in the flat buffer for {aObjectType, aObjectName}. Set the policy.
   227 		{//There is a field in the flat buffer for {aObjectType, aObjectName}. Set the policy.
   228 		//KPolicyIndex value is tested at the beginning of the function
   228 		//KPolicyIndex value is tested at the beginning of the function
   229 		//coverity[overrun-local]
   229 		//coverity[overrun-local]
   244 		return KErrNoMemory;	
   244 		return KErrNoMemory;	
   245 		}
   245 		}
   246 	item = reinterpret_cast <CSqlSecurityPolicy::TPolicyItem*> (buf);
   246 	item = reinterpret_cast <CSqlSecurityPolicy::TPolicyItem*> (buf);
   247 	//coverity[DEADCODE]
   247 	//coverity[DEADCODE]
   248 	//The ASSERT might be useful in catching future defect in this function
   248 	//The ASSERT might be useful in catching future defect in this function
   249 	__ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
   249 	__SQLASSERT(item != NULL, ESqlPanicInternalError);
   250 	TSecurityPolicy defaultPolicy = DefaultPolicy();
   250 	TSecurityPolicy defaultPolicy = DefaultPolicy();
   251 	for(TInt i=0;i<CSqlSecurityPolicy::EPolicyTypeCount;++i)
   251 	for(TInt i=0;i<CSqlSecurityPolicy::EPolicyTypeCount;++i)
   252 		{
   252 		{
   253 		item->iPolicy[i] = defaultPolicy;
   253 		item->iPolicy[i] = defaultPolicy;
   254 		}
   254 		}
   271 @return The default security policy.
   271 @return The default security policy.
   272 */
   272 */
   273 TSecurityPolicy CSqlSecurityPolicy::DefaultPolicy() const
   273 TSecurityPolicy CSqlSecurityPolicy::DefaultPolicy() const
   274 	{
   274 	{
   275 	const RSqlBufFlat::TCell* begin = iBufFlat.Header();
   275 	const RSqlBufFlat::TCell* begin = iBufFlat.Header();
   276 	__ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
   276 	__SQLASSERT(begin != NULL, ESqlPanicInternalError);
   277 	const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDefaultPolicyIdx);
   277 	const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDefaultPolicyIdx);
   278 	__ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
   278 	__SQLASSERT(item != NULL, ESqlPanicInternalError);
   279 	return item->iPolicy[0];
   279 	return item->iPolicy[0];
   280 	}
   280 	}
   281 	
   281 	
   282 /**
   282 /**
   283 @param aPolicyType Database security policy type: RSqlSecurityPolicy::ESchemaPolicy, 
   283 @param aPolicyType Database security policy type: RSqlSecurityPolicy::ESchemaPolicy, 
   290 @panic SqlDb 4 In _DEBUG mode. Invalid policy type.
   290 @panic SqlDb 4 In _DEBUG mode. Invalid policy type.
   291 */
   291 */
   292 TSecurityPolicy CSqlSecurityPolicy::DbPolicy(RSqlSecurityPolicy::TPolicyType aPolicyType) const
   292 TSecurityPolicy CSqlSecurityPolicy::DbPolicy(RSqlSecurityPolicy::TPolicyType aPolicyType) const
   293 	{
   293 	{
   294 	const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
   294 	const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
   295 	__ASSERT_DEBUG((TUint)KPolicyIndex < EPolicyTypeCount, __SQLPANIC(ESqlPanicBadArgument));
   295 	__SQLASSERT((TUint)KPolicyIndex < EPolicyTypeCount, ESqlPanicBadArgument);
   296 	const RSqlBufFlat::TCell* begin = iBufFlat.Header();
   296 	const RSqlBufFlat::TCell* begin = iBufFlat.Header();
   297 	__ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
   297 	__SQLASSERT(begin != NULL, ESqlPanicInternalError);
   298 	const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDbPolicyIdx);
   298 	const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDbPolicyIdx);
   299 	__ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
   299 	__SQLASSERT(item != NULL, ESqlPanicInternalError);
   300 	//KPolicyIndex value is tested at the beginning of the function
   300 	//KPolicyIndex value is tested at the beginning of the function
   301 	//coverity[overrun-local]
   301 	//coverity[overrun-local]
   302 	return item->iPolicy[KPolicyIndex];
   302 	return item->iPolicy[KPolicyIndex];
   303 	}
   303 	}
   304 	
   304 	
   322 */
   322 */
   323 TSecurityPolicy CSqlSecurityPolicy::Policy(RSqlSecurityPolicy::TObjectType aObjectType, 
   323 TSecurityPolicy CSqlSecurityPolicy::Policy(RSqlSecurityPolicy::TObjectType aObjectType, 
   324 										   const TDesC& aObjectName, RSqlSecurityPolicy::TPolicyType aPolicyType)
   324 										   const TDesC& aObjectName, RSqlSecurityPolicy::TPolicyType aPolicyType)
   325 	{
   325 	{
   326 	const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
   326 	const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
   327 	__ASSERT_DEBUG((TUint)KPolicyIndex < EPolicyTypeCount, __SQLPANIC(ESqlPanicBadArgument));
   327 	__SQLASSERT((TUint)KPolicyIndex < EPolicyTypeCount, ESqlPanicBadArgument);
   328 	__ASSERT_DEBUG(aObjectName.Length() > 0, __SQLPANIC(ESqlPanicBadArgument));
   328 	__SQLASSERT(aObjectName.Length() > 0, ESqlPanicBadArgument);
   329 	const CSqlSecurityPolicy::TPolicyItem* item = FindPolicyItemPtr(aObjectType, aObjectName);
   329 	const CSqlSecurityPolicy::TPolicyItem* item = FindPolicyItemPtr(aObjectType, aObjectName);
   330 	//KPolicyIndex value is tested at the beginning of the function
   330 	//KPolicyIndex value is tested at the beginning of the function
   331 	//coverity[overrun-local]
   331 	//coverity[overrun-local]
   332 	return item ? item->iPolicy[KPolicyIndex] : DefaultPolicy();
   332 	return item ? item->iPolicy[KPolicyIndex] : DefaultPolicy();
   333 	}
   333 	}
   375 	iBegin(aSqlSecurityPolicy.iBufFlat.Header()),
   375 	iBegin(aSqlSecurityPolicy.iBufFlat.Header()),
   376 	iCurrent(iBegin + CSqlSecurityPolicy::EDbPolicyIdx),//ignore the default and database policies
   376 	iCurrent(iBegin + CSqlSecurityPolicy::EDbPolicyIdx),//ignore the default and database policies
   377 	iEnd(iBegin + aSqlSecurityPolicy.Count()),
   377 	iEnd(iBegin + aSqlSecurityPolicy.Count()),
   378 	iCurPolicyIdx(CSqlSecurityPolicy::EPolicyTypeCount)
   378 	iCurPolicyIdx(CSqlSecurityPolicy::EPolicyTypeCount)
   379 	{
   379 	{
   380 	__ASSERT_DEBUG(iBegin != NULL, __SQLPANIC(ESqlPanicInternalError));
   380 	__SQLASSERT(iBegin != NULL, ESqlPanicInternalError);
   381 	}
   381 	}
   382 	
   382 	
   383 /**
   383 /**
   384 Moves the iterator one step forward and gives a read-only access to the next database object security policy.
   384 Moves the iterator one step forward and gives a read-only access to the next database object security policy.
   385 
   385 
   400 			{
   400 			{
   401 			return EFalse;	
   401 			return EFalse;	
   402 			}
   402 			}
   403 		}
   403 		}
   404 	const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(iBegin, iCurrent);
   404 	const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(iBegin, iCurrent);
   405 	__ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
   405 	__SQLASSERT(item != NULL, ESqlPanicInternalError);
   406 	aObjectType = static_cast <RSqlSecurityPolicy::TObjectType> (iCurrent->Type());
   406 	aObjectType = static_cast <RSqlSecurityPolicy::TObjectType> (iCurrent->Type());
   407 	aPolicyType = static_cast <RSqlSecurityPolicy::TPolicyType> (iCurPolicyIdx);
   407 	aPolicyType = static_cast <RSqlSecurityPolicy::TPolicyType> (iCurPolicyIdx);
   408 	aPolicy = item->iPolicy[iCurPolicyIdx];
   408 	aPolicy = item->iPolicy[iCurPolicyIdx];
   409 	aObjectName.Set(item->NamePtr(), item->NameSize());
   409 	aObjectName.Set(item->NamePtr(), item->NameSize());
   410 	return ETrue;		
   410 	return ETrue;