Update contrib.
1 // Copyright (c) 2006-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".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
17 #include "SqlSecurityImpl.h"
20 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
21 //////////////////////////// CSqlSecurityPolicy implementation ////////////////////////////////////////
22 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
25 Casts aPolicyType parameter to an integer value, which is used as policy index.
27 @param aPolicyType Security policy type: schema, write, read
29 @return Security policy type casted to an integer value, which is used as a poicy index
31 inline TInt CSqlSecurityPolicy::PolicyType2Index(RSqlSecurityPolicy::TPolicyType aPolicyType)
33 return static_cast <TInt> (aPolicyType);
37 Returns a pointer to the data of the current flat buffer cell. The pointer type is CSqlSecurityPolicy::TPolicyItem.
39 @param aBegin Points to the beginning of flat buffer header
40 @param aCurrent Points to a cell in the flat buffer header, to which data a pointer will be cast and returned.
42 @return CSqlSecurityPolicy::TPolicyItem pointer, which can be used for R/W operations on the database security policy data.
44 inline CSqlSecurityPolicy::TPolicyItem* CSqlSecurityPolicy::PolicyItemPtr(const RSqlBufFlat::TCell* aBegin, const RSqlBufFlat::TCell* aCurrent)
46 __ASSERT_DEBUG(aBegin != NULL && aCurrent != NULL, __SQLPANIC2(ESqlPanicBadArgument));
47 __ASSERT_DEBUG(aCurrent->iPos != 0, __SQLPANIC2(ESqlPanicBadArgument));
48 const TUint8* begin = reinterpret_cast <const TUint8*> (aBegin);
49 return reinterpret_cast <CSqlSecurityPolicy::TPolicyItem*> (const_cast <TUint8*> (begin) + aCurrent->iPos);
53 Searhes the flat buffer for an entry, which "object type" and "object name" attributes match aObjectType and aObjectName parameters.
54 If such entry exists, a pointer to the entry's data will be returned.
56 @param aObjectType Database object type
57 @param aObjectName Database object name
59 @return A pointer to the data of an entry which "object type" and "object name" attributes match aObjectType and aObjectName parameters.
60 If no such entry exists, the function returns NULL.
62 const CSqlSecurityPolicy::TPolicyItem* CSqlSecurityPolicy::FindPolicyItemPtr(RSqlSecurityPolicy::TObjectType aObjectType,
63 const TDesC& aObjectName) const
65 const RSqlBufFlat::TCell* begin = iBufFlat.Header();
66 __ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
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)
69 while(++current < end)
71 if(current->iPos > 0 && current->Type() == (TInt)aObjectType) //if present and the same type as aObjectType
73 const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, current);
74 __ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
75 __ASSERT_DEBUG(((current->Size() - sizeof(CSqlSecurityPolicy::TPolicyItem) - sizeof(TInt)) / sizeof(TUint16)) == item->NameSize(), __SQLPANIC(ESqlPanicInternalError));
76 if(::CompareNoCase16(aObjectName, TPtrC(item->NamePtr(), item->NameSize())) == 0)
86 Standard, phase-one CSqlSecurityPolicy factory method.
88 @param aDefaultPolicy Default security policy which will be used as a default replacement for all database and
89 database object security policies.
91 @return A pointer to the created CSqlSecurityPolicy instance.
93 @leave KErrNoMemory, an out of memory condition has occurred;
95 CSqlSecurityPolicy* CSqlSecurityPolicy::NewL(const TSecurityPolicy& aDefaultPolicy)
97 CSqlSecurityPolicy* self = CSqlSecurityPolicy::NewLC(aDefaultPolicy);
98 CleanupStack::Pop(self);
103 Standard, phase-one CSqlSecurityPolicy factory method.
105 @param aDefaultPolicy Default security policy which will be used as a default replacement for all database and
106 database object security policies.
108 @return A pointer to the created CSqlSecurityPolicy instance.
110 @leave KErrNoMemory, an out of memory condition has occurred;
112 CSqlSecurityPolicy* CSqlSecurityPolicy::NewLC(const TSecurityPolicy& aDefaultPolicy)
114 CSqlSecurityPolicy* self = new (ELeave) CSqlSecurityPolicy;
115 CleanupStack::PushL(self);
116 self->ConstructL(aDefaultPolicy);
122 CSqlSecurityPolicy::~CSqlSecurityPolicy()
128 @return A const reference to the flat buffer
130 const RSqlBufFlat& CSqlSecurityPolicy::BufFlat() const
136 @return A reference to the flat buffer
138 RSqlBufFlat& CSqlSecurityPolicy::BufFlat()
144 @return Database security policy entry count. This number is at least 2, because every CSqlSecurityPolicy object has by default
145 one default security policy entry and one database security policy entry.
147 TInt CSqlSecurityPolicy::Count() const
149 const RSqlBufFlat::TCell* begin = iBufFlat.Header();
150 __ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
151 return *reinterpret_cast <const TInt*> (reinterpret_cast <const TUint8*> (begin) + (begin + CSqlSecurityPolicy::ECountIdx)->iPos);
155 Sets the number of database security entries.
157 void CSqlSecurityPolicy::SetCount(TInt aCount)
159 __ASSERT_DEBUG(aCount >= 0, __SQLPANIC(ESqlPanicBadArgument));
160 RSqlBufFlat::TCell* begin = iBufFlat.Header();
161 __ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
162 *reinterpret_cast <TInt*> (reinterpret_cast <TUint8*> (begin) + (begin + CSqlSecurityPolicy::ECountIdx)->iPos) = aCount;
166 Sets the default policy.
168 void CSqlSecurityPolicy::SetDefaultPolicy(const TSecurityPolicy& aPolicy)
170 RSqlBufFlat::TCell* begin = iBufFlat.Header();
171 __ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
172 CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDefaultPolicyIdx);
173 __ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
174 item->iPolicy[0] = aPolicy;
178 @param aPolicyType Database security policy type: RSqlSecurityPolicy::ESchemaPolicy,
179 RSqlSecurityPolicy::EReadPolicy, RSqlSecurityPolicy::EWritePolicy.
180 @param aPolicy Security policy data used for setting the related database security policy.
182 @panic SqlDb 4 In _DEBUG mode. Invalid policy type.
184 void CSqlSecurityPolicy::SetDbPolicy(RSqlSecurityPolicy::TPolicyType aPolicyType, const TSecurityPolicy& aPolicy)
186 const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
187 __ASSERT_DEBUG((TUint)KPolicyIndex < EPolicyTypeCount, __SQLPANIC(ESqlPanicBadArgument));
188 RSqlBufFlat::TCell* begin = iBufFlat.Header();
189 __ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
190 CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDbPolicyIdx);
191 __ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
192 //KPolicyIndex value is tested at the beginning of the function
193 //coverity[overrun-local]
194 item->iPolicy[KPolicyIndex] = aPolicy;
198 If there is no entry in the container for the object with aObjectName name, a new entry for this object will be
199 created and all object security policies will be initialized with the default security policy. aPolicyType object
200 policy will be reinitialized with aPolicy argument after that.
202 If an entry for aObjectName object already exists, its aPolicyType security policy will be reinitialized with aPolicy
205 @param aObjectType Database object type. At the moment there is only one database object type allowed for use with
206 SetPolicy() - RSqlSecurityPolicy::ETable.
207 @param aObjectName Database object name. It cannot be a null descriptor.
208 @param aPolicyType Database object security policy type: RSqlSecurityPolicy::EReadPolicy,
209 RSqlSecurityPolicy::EWritePolicy.
210 @param aPolicy Security policy data used for setting the related database object security policy type.
212 @return KErrNone, operation completed successfully;
213 KErrNoMemory, an out of memory condition has occurred;
214 KErrNotSupported, the count of the security policies is too big.
216 @panic SqlDb 4 In _DEBUG mode. Invalid policy type.
217 @panic SqlDb 4 In _DEBUG mode. Invalid database object name (Null descriptor).
219 TInt CSqlSecurityPolicy::SetPolicy(RSqlSecurityPolicy::TObjectType aObjectType, const TDesC& aObjectName,
220 RSqlSecurityPolicy::TPolicyType aPolicyType, const TSecurityPolicy& aPolicy)
222 const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
223 __ASSERT_DEBUG((TUint)KPolicyIndex < EPolicyTypeCount, __SQLPANIC(ESqlPanicBadArgument));
224 __ASSERT_DEBUG(aObjectName.Length() > 0, __SQLPANIC(ESqlPanicBadArgument));
225 CSqlSecurityPolicy::TPolicyItem* item = const_cast <CSqlSecurityPolicy::TPolicyItem*> (FindPolicyItemPtr(aObjectType, aObjectName));
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
229 //coverity[overrun-local]
230 item->iPolicy[KPolicyIndex] = aPolicy;
233 //No field in the flat buffer for {aObjectType, aObjectName}.
235 if(idx >= iBufFlat.Count())
237 return KErrNotSupported;
239 //Create and fill a new CSqlSecurityPolicy::TPolicyItem object.
240 const TInt KPolicyDataLen = TPolicyItem::CalcSize(aObjectName.Length());
241 TUint8* buf = new TUint8[KPolicyDataLen];
246 item = reinterpret_cast <CSqlSecurityPolicy::TPolicyItem*> (buf);
248 //The ASSERT might be useful in catching future defect in this function
249 __ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
250 TSecurityPolicy defaultPolicy = DefaultPolicy();
251 for(TInt i=0;i<CSqlSecurityPolicy::EPolicyTypeCount;++i)
253 item->iPolicy[i] = defaultPolicy;
255 item->iPolicy[KPolicyIndex] = aPolicy;
256 //Set the object name length and the object name.
257 *item->NameSizePtr() = aObjectName.Length();
258 TPtr name(item->NamePtr(), item->NameSize());
259 name.Copy(aObjectName);
260 //Copy the item in iBufFlat and release the allocated memory.
261 TInt err = iBufFlat.SetField(idx, (TInt)aObjectType, item, KPolicyDataLen);
271 @return The default security policy.
273 TSecurityPolicy CSqlSecurityPolicy::DefaultPolicy() const
275 const RSqlBufFlat::TCell* begin = iBufFlat.Header();
276 __ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
277 const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDefaultPolicyIdx);
278 __ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
279 return item->iPolicy[0];
283 @param aPolicyType Database security policy type: RSqlSecurityPolicy::ESchemaPolicy,
284 RSqlSecurityPolicy::EReadPolicy, RSqlSecurityPolicy::EWritePolicy.
286 Note: By default all database security policies will be initialized with the default security policy.
288 @return The requested database security policy.
290 @panic SqlDb 4 In _DEBUG mode. Invalid policy type.
292 TSecurityPolicy CSqlSecurityPolicy::DbPolicy(RSqlSecurityPolicy::TPolicyType aPolicyType) const
294 const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
295 __ASSERT_DEBUG((TUint)KPolicyIndex < EPolicyTypeCount, __SQLPANIC(ESqlPanicBadArgument));
296 const RSqlBufFlat::TCell* begin = iBufFlat.Header();
297 __ASSERT_DEBUG(begin != NULL, __SQLPANIC(ESqlPanicInternalError));
298 const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(begin, begin + CSqlSecurityPolicy::EDbPolicyIdx);
299 __ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
300 //KPolicyIndex value is tested at the beginning of the function
301 //coverity[overrun-local]
302 return item->iPolicy[KPolicyIndex];
306 Searches the container for an entry belonging to an object with aObjectName name and aObjectType type. If such entry
307 exists the method returns aPolicyType object security policy.
309 If there is no entry for the object with aObjectName name, the default security policy will be returned.
311 @param aObjectType Database object type. At the moment there is only one database object type allowed for use with
312 Policy() - RSqlSecurityPolicy::ETable.
313 @param aObjectName Database object name. It cannot be a null descriptor.
314 @param aPolicyType Database object security policy type: RSqlSecurityPolicy::ERead, RSqlSecurityPolicy::EWrite.
316 Note: By default all database object security policies will be initialized with the default security policy.
318 @return The requested security policy
320 @panic SqlDb 4 In _DEBUG mode. Invalid policy type.
321 @panic SqlDb 4 In _DEBUG mode. Invalid onject name (Null descriptor).
323 TSecurityPolicy CSqlSecurityPolicy::Policy(RSqlSecurityPolicy::TObjectType aObjectType,
324 const TDesC& aObjectName, RSqlSecurityPolicy::TPolicyType aPolicyType)
326 const TInt KPolicyIndex = CSqlSecurityPolicy::PolicyType2Index(aPolicyType);
327 __ASSERT_DEBUG((TUint)KPolicyIndex < EPolicyTypeCount, __SQLPANIC(ESqlPanicBadArgument));
328 __ASSERT_DEBUG(aObjectName.Length() > 0, __SQLPANIC(ESqlPanicBadArgument));
329 const CSqlSecurityPolicy::TPolicyItem* item = FindPolicyItemPtr(aObjectType, aObjectName);
330 //KPolicyIndex value is tested at the beginning of the function
331 //coverity[overrun-local]
332 return item ? item->iPolicy[KPolicyIndex] : DefaultPolicy();
337 CSqlSecurityPolicy::CSqlSecurityPolicy()
342 Standard, phase-two CSqlSecurityPolicy construction method.
344 Note: By default all database security policies will be initialized with the default security policy.
346 @param aDefaultPolicy Security policy data used for setting the default database security policy and
347 database security policies.
349 @leave KErrNoMemory, an out of memory condition has occurred;
351 void CSqlSecurityPolicy::ConstructL(const TSecurityPolicy& aDefaultPolicy)
353 //Create the policy flat buffer.
354 __SQLLEAVE_IF_ERROR(iBufFlat.SetCount(CSqlSecurityPolicy::EMaxCount));
355 //Reserve places for the default policy and database policies.
356 CSqlSecurityPolicy::TPolicyItem item;
357 for(TInt i=0;i<CSqlSecurityPolicy::EPolicyTypeCount;++i)
359 item.iPolicy[i] = aDefaultPolicy;
361 TInt count = CSqlSecurityPolicy::EDbPolicyIdx + 1;//count + default policy + database policy;
362 __SQLLEAVE_IF_ERROR(iBufFlat.SetField(CSqlSecurityPolicy::ECountIdx, 0, &count, sizeof(count)));
363 __SQLLEAVE_IF_ERROR(iBufFlat.SetField(CSqlSecurityPolicy::EDefaultPolicyIdx, 0, &item, sizeof(item) - sizeof(TSecurityPolicy) * (CSqlSecurityPolicy::EPolicyTypeCount - 1)));
364 __SQLLEAVE_IF_ERROR(iBufFlat.SetField(CSqlSecurityPolicy::EDbPolicyIdx, 0, &item, sizeof(item)));
367 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
368 //////////////////// TSqlSecurityPolicyIterator implementation //////////////////////////////
369 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////
372 @param aSecuritySettings Const reference to CSqlSecurityPolicy object on which content the iterator will work.
374 TSqlSecurityPolicyIterator::TSqlSecurityPolicyIterator(const CSqlSecurityPolicy& aSqlSecurityPolicy) :
375 iBegin(aSqlSecurityPolicy.iBufFlat.Header()),
376 iCurrent(iBegin + CSqlSecurityPolicy::EDbPolicyIdx),//ignore the default and database policies
377 iEnd(iBegin + aSqlSecurityPolicy.Count()),
378 iCurPolicyIdx(CSqlSecurityPolicy::EPolicyTypeCount)
380 __ASSERT_DEBUG(iBegin != NULL, __SQLPANIC(ESqlPanicInternalError));
384 Moves the iterator one step forward and gives a read-only access to the next database object security policy.
386 @param aObjectType Output parameter. Next database object type, if the iteration was successful.
387 @param aObjectName Output parameter. Set to point to the next database object name, if the iteration was successful.
388 @param aPolicyType Output parameter. Next database object security policy type, if the iteration was successful.
389 @param aPolicy Output parameter. Next database object security policy, if the iteration was successful.
391 @return Non-zero - successful iteration step, zero otherwise (no more security policies in the CSqlSecurityPolicy container).
393 TBool TSqlSecurityPolicyIterator::Next(RSqlSecurityPolicy::TObjectType& aObjectType, TPtrC& aObjectName,
394 RSqlSecurityPolicy::TPolicyType& aPolicyType, TSecurityPolicy& aPolicy)
396 if(++iCurPolicyIdx >= CSqlSecurityPolicy::EPolicyTypeCount)
398 iCurPolicyIdx = static_cast <TInt> (RSqlSecurityPolicy::EReadPolicy);
399 if(++iCurrent >= iEnd)
404 const CSqlSecurityPolicy::TPolicyItem* item = CSqlSecurityPolicy::PolicyItemPtr(iBegin, iCurrent);
405 __ASSERT_DEBUG(item != NULL, __SQLPANIC(ESqlPanicInternalError));
406 aObjectType = static_cast <RSqlSecurityPolicy::TObjectType> (iCurrent->Type());
407 aPolicyType = static_cast <RSqlSecurityPolicy::TPolicyType> (iCurPolicyIdx);
408 aPolicy = item->iPolicy[iCurPolicyIdx];
409 aObjectName.Set(item->NamePtr(), item->NameSize());