persistentstorage/dbms/security/SC_Policy.h
changeset 0 08ec8eefde2f
child 55 44f437012c90
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/dbms/security/SC_Policy.h	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,259 @@
+// Copyright (c) 2004-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:
+// CPolicyBase, CDbPolicy, CTblPolicy, CPolicyDomain, 
+// TPolicyDomainBuilder, TPolicyDomainReader classes.
+// MPolicyDomainPersister, MPolicyDomainLoader interfaces
+// 
+//
+
+#ifndef __SC_POLICY_H__
+#define __SC_POLICY_H__
+
+#include <e32base.h>		//CBase
+#include "D32Security.h"
+
+namespace DBSC
+{
+
+//Forward declarations
+class CPolicyDomain;
+
+/**
+CPolicyBase class implements MPolicy interface.
+It describes an object that manages a set of TSecurityPolicy objects.
+CPolicyBase::iPOType data member gives an information access to what kind of 
+database object (database or table) is controlled by the set of security policies.
+CPolicyBase::Check() can be used to check caller access rights against specified policy type.
+@see MPolicy
+@internalComponent
+*/
+NONSHARABLE_CLASS(CPolicyBase) : public CBase, public MPolicy
+	{
+public:
+	struct TPolicy
+		{
+		TPolicyType		iType;
+		TSecurityPolicy	iData;
+		};
+	typedef RArray<TPolicy> RPolicyCollection;
+	typedef enum {EPCNotFound, EPCPassed, EPCNotPassed} TPolicyCheckResult;
+
+public:
+	virtual ~CPolicyBase();
+	virtual TBool Check(const RMessage2& aMessage, TPolicyType aPolicyType) const = 0; 
+	virtual TInt Get(TPolicyType aPolicyType, TSecurityPolicy& aPolicy) const;
+	virtual void InvariantL() const;
+	DECLARE_DB_INVARIANT()
+	inline const RPolicyCollection& PolicyCollection() const;
+
+protected:
+	inline CPolicyBase();
+	void ConstructL(const RPolicyCollection& aPolicyCollection);
+	const TSecurityPolicy* Policy(TPolicyType aPolicyType) const;
+	TPolicyCheckResult DoCheck(const RMessage2& aMessage, TPolicyType aPolicyType) const; 
+	DECLARE_DB_DUMP2(aFile)
+
+private:
+	RPolicyCollection	iPolicyCollection;
+
+	};
+
+/**
+CDbPolicy class describes an object that manages the access to all databases, which
+have the same format UID.
+@see CPolicyBase
+@see MPolicy
+@internalComponent
+*/
+NONSHARABLE_CLASS(CDbPolicy) : public CPolicyBase
+	{
+public:
+	static CDbPolicy* NewLC(const RPolicyCollection& aPolicyCollection);
+	inline static CDbPolicy* NewL(const RPolicyCollection& aPolicyCollection);
+	virtual ~CDbPolicy();
+	virtual TBool Check(const RMessage2& aMessage, TPolicyType aPolicyType) const; 
+	virtual void InvariantL() const;
+	DECLARE_DB_DUMP2(aFile)
+
+private:
+	inline CDbPolicy();
+
+	};
+
+/**
+CTblPolicy class describes an object that manages the access to all tables, which
+have particular format UID and particular name.
+@see CPolicyBase
+@see MPolicy
+@internalComponent
+*/
+NONSHARABLE_CLASS(CTblPolicy) : public CPolicyBase
+	{
+public:
+	static CTblPolicy* NewLC(const TDesC& aTblName, 
+							 const RPolicyCollection& aPolicyCollection,
+							 const CDbPolicy* aDbPolicy);
+	inline static CTblPolicy* NewL(const TDesC& aTblName, 
+								   const RPolicyCollection& aPolicyCollection,
+								   const CDbPolicy* aDbPolicy);
+	virtual ~CTblPolicy();
+	virtual TBool Check(const RMessage2& aMessage, TPolicyType aPolicyType) const; 
+	virtual TInt Get(TPolicyType aPolicyType, TSecurityPolicy& aPolicy) const;
+	virtual void InvariantL() const;
+	inline const TDesC& TableName() const;
+	DECLARE_DB_DUMP2(aFile)
+
+private:
+	inline CTblPolicy(const CDbPolicy* aDbPolicy);
+	void ConstructL(const TDesC& aTblName, const RPolicyCollection& aPolicyCollection);
+
+private:
+	HBufC*	iTblName;
+	const CDbPolicy* iDbPolicy;
+
+	};
+
+/**
+TPolicyDomainBuilder class describes an object that can be used during the initialization
+to initialize CPolicyDomain objects. It is used by MPolicyDomainLoader interface.
+@internalComponent
+*/
+class TPolicyDomainBuilder
+	{
+public:
+	inline TPolicyDomainBuilder(CPolicyDomain& aPolicyDomain);
+	void SetDbPolicyL(CDbPolicy* aDbPolicy);
+	inline void AddTblPolicyL(CTblPolicy* aTblPolicy);
+	inline void SetBackupSID(TSecureId& aSecureId);
+private:
+	CPolicyDomain&	iPolicyDomain;
+	};
+
+/**
+TPolicyDomainBuilder class describes an object that can be used to explore the content of
+CPolicyDomain objects. It is used by MPolicyDomainPersister interface.
+@internalComponent
+*/
+class TPolicyDomainReader
+	{
+public:
+	inline TPolicyDomainReader(const CPolicyDomain& aPolicyDomain);
+	inline TUid Uid() const;
+	inline const CDbPolicy& DbPolicy() const;
+	inline void ResetTblPos() const;
+	inline TInt TblPolicyCount() const;
+	inline const CTblPolicy* NextTblPolicy() const;
+	inline TSecureId BackupSID() const;
+private:
+	const CPolicyDomain&	iPolicyDomain;
+	mutable TInt			iIndex;
+	};
+
+/**
+MPolicyDomainPersister interface has to be implemented by DBSC clients, who want to store
+the information from CPolicyDomain objects (set of security policies) somewhere - text files,
+streams, ... It uses TPolicyDomainReader class to traverse CPolicyDomain collection of
+security policies.
+@see TPolicyDomainReader
+@internalComponent
+*/
+class MPolicyDomainPersister
+	{
+public:
+	virtual void RunL(const TPolicyDomainReader& aPolicyDomainReader) = 0;
+	};
+
+/**
+MPolicyDomainPersister interface has to be implemented by DBSC clients, who want to load
+set of security policies to CPolicyDomain objects from somewhere - text files,
+streams, ... It uses TPolicyDomainBuilder class to add to CPolicyDomain collection new
+security policies.
+@see TPolicyDomainBuilder
+@internalComponent
+*/
+class MPolicyDomainLoader
+	{
+public:
+	virtual void RunL(TPolicyDomainBuilder& aPolicyDomainBuilder) = 0;
+	};
+
+/**
+CPolicyDomain object describes a set of all security policies related to particular format UID.
+It describes only a collection of security policies and offers some functionality for
+retrieving particular database/table MPolicy interfaces.
+The responsibility for adding new items to secirity policy collection is delegated to 
+TPolicyDomainBuilder class.
+The responsibility for traversing secirity policy collection is delegated to 
+TPolicyDomainReader class.
+Both, TPolicyDomainBuilder and TPolicyDomainReader classes are not used directly by 
+the CPolicyDomain class implementation. CPolicyDomain instances are created using 
+MPolicyDomainLoader interface and externalized using MPolicyDomainPersister interface and
+they (the interfaces) use TPolicyDomainBuilder and TPolicyDomainReader respectively.
+The delegation of responsibilities for creation/traversing of CPolicyDomain security policy collection
+was done because CPolicyDomain class is a part of shared sources used in DBMS server implementation
+and DbSpConv tool implementation.
+DBMS server creates CPolicyDomain security policy collection from a binary policy files using
+TPDStreamLoader class (which implements MPolicyDomainLoader) and TPolicyDomainBuilder class
+to insert created CDbPolicy and CTblPolicy instances into CPolicyDomain collection.
+The rest of the possibilities: creating CPolicyDomain collection from a text policy file,
+exporting CPolicyDomain collection to a binary policy file, 
+exporting CPolicyDomain collection to a text policy file, are used by the DbSpConv tool.
+So, CPolicyDomain class uses interfaces for its loading/storing, but their 
+implementations are part of separate exe-s - no waste of production code.
+@see MPolicy
+@see CDbPolicy
+@see CTblPolicy
+@see TPolicyDomainBuilder
+@see TPolicyDomainReader
+@see MPolicyDomainLoader
+@see MPolicyDomainPersister
+@internalComponent
+*/
+NONSHARABLE_CLASS(CPolicyDomain) : public CBase
+	{
+	friend class TPolicyDomainBuilder;
+	friend class TPolicyDomainReader;
+public:
+	static CPolicyDomain* NewLC(TUid aUid, MPolicyDomainLoader& aPDLoader);
+	inline static CPolicyDomain* NewL(TUid aUid, MPolicyDomainLoader& aPDLoader);
+	virtual ~CPolicyDomain();
+	void ExternalizeL(MPolicyDomainPersister& aPDPersister) const;
+
+	inline TUid Uid() const;
+	const MPolicy* DbPolicy() const;
+	const MPolicy* TblPolicy(const TDesC& aTblName) const;
+	inline TSecureId BackupSID() const;
+
+	virtual void InvariantL() const;
+	DECLARE_DB_DUMP3(aFile)
+
+private:
+	inline CPolicyDomain(TUid aUid);
+	void InternalizeL(MPolicyDomainLoader& aPDLoader);
+	void Destroy();
+	DECLARE_DB_INVARIANT2()
+
+private:
+	TUid						iUid;
+	CDbPolicy*					iDbPolicy;
+	RPointerArray<CTblPolicy>	iTPCollection;
+	TSecureId 					iBackupSID;
+
+	};
+
+} //end of - namespace DBSC
+
+#include "SC_Policy.inl"
+
+#endif//__SC_POLICY_H__