authenticationservices/authenticationserver/source/server/authserver.h
changeset 29 ece3df019add
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/authenticationservices/authenticationserver/source/server/authserver.h	Tue Nov 24 09:06:03 2009 +0200
@@ -0,0 +1,271 @@
+/*
+* 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 the License "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: 
+* CAuthServer class definition
+*
+*/
+
+
+/**
+ @file 
+ @released
+ @internalComponent
+*/
+#ifndef AUTHSERVER_H
+#define AUTHSERVER_H
+
+#include <e32cmn.h>
+#include <ct/rcpointerarray.h>
+#include <e32property.h>
+#include <f32file.h>
+#include <scs/scsserver.h>
+#include "authserveripc.h"
+#include "authrepository.h"
+
+ 
+namespace AuthServer 
+{
+
+/**
+ *Panic values associated with the AuthServer
+ */
+enum TAuthServerPanic
+	{
+	EPanicCorruptDescriptor = 0,
+	/// An invalid service request number has been receieved by the
+	/// server. This should not be received by those using the RAuthClient or
+	/// derived classes.
+	EPanicInvalidFunction = 1,
+	
+	EPanicAlreadyReceiving = 2,
+	/// An internal error indicating the received authentication expression 
+	/// is malformed. This should not be received by those using the 
+	/// RAuthClient or derived classes.
+	EPanicBadExternalizedAuthExpr = 3,
+	/// A request has been made that refers to a non-existent plugin.
+	EPanicNoSuchAuthPlugin = 4,
+	/// In order to create a first identity, the authserver requires that 
+	/// at least one plugin supports default data. 
+	EPanicNoFirstStartPlugin = 5,
+	/// A call has been made to the authserver's training manager while one 
+	/// is already in progress.
+	EPanicTrainingMgrBusy = 6,
+	/// A plugin has reported that it supports default data but has returned
+	/// an invalid data buffer.
+	EPanicInvalidDefaultData = 7        
+	};
+
+const TInt KPolicyRanges= 12;
+const TInt KPolicyElements = 7;
+
+const TInt KDefaultShutdownDelay = 3 * 1000 * 1000;	// 3 seconds
+
+class CIdentity;
+
+class CPluginMgr;
+class CPluginObserver;
+class CTrainingMgr;
+class CEvaluator;
+class CAuthExpression;
+class CAuthTransaction;
+struct TLastAuth;
+
+// The description for the default identity.
+_LIT(KDefaultUserDescription, "DefaultUser");
+
+/**
+ * Helper class to manage details during identity reset operation
+ **/
+class TPluginResetDetails
+	{
+public:
+	TPluginResetDetails(TPluginId aPluginId, const TDesC& aRegistrationData):
+		iPluginId(aPluginId),
+		iRegistrationData(aRegistrationData)
+		{}
+
+public:
+	TPluginId PluginId() const { return iPluginId;};
+	const TDesC& RegistrationData() const { return iRegistrationData;};
+
+private:
+	TPluginId iPluginId;
+	const TDesC& iRegistrationData;
+	};
+
+
+/**
+ * Provides authentication and identity management services.
+ *
+ * A CPolicyServer derived class providing management of identity
+ * authentication services. Responsible for managing identities in accordance
+ * with the requests made by clients.
+ * 
+ **/
+class CAuthServer : public CScsServer, public MEvaluatorPluginInterface,
+    public MEvaluatorClientInterface
+	{
+public:
+	// implement CScsServer.
+	virtual CScsSession* DoNewSessionL(const RMessage2& aMessage);
+	
+
+	// implement CScsServer.
+	virtual void DoPreHeapMarkOrCheckL();
+	
+	// implement CScsServer.
+	virtual void DoPostHeapMarkOrCheckL();
+	
+
+	static CAuthServer* NewLC(CActive::TPriority = CActive::EPriorityStandard);
+
+	void AuthenticateL(const RMessage2& aMessage);
+	
+	void DeauthenticateL(const RMessage2& aMessage);
+	void CancelL(const RMessage2& aMessage);
+	void PluginsL(const RMessage2& aMessage);
+	void ActivePluginsL(const RMessage2& aMessage);
+	void PluginsByTypeL(const RMessage2& aMessage);
+	void PluginsByTrainingL(const RMessage2& aMessage);
+	void IdentitiesL(const RMessage2& aMessage);
+	void SetIdentityStringL(const RMessage2& aMessage);
+	void IdentityStringL(const RMessage2& aMessage);
+	void RegisterIdentityL(const RMessage2& aMessage);
+	void RemoveIdentityL(const RMessage2& aMessage);
+	void TrainPluginL(const RMessage2& aMessage);
+	void ForgetPluginL(const RMessage2& aMessage);
+	void PreferredTypePluginL(const RMessage2& aMessage);
+	void SetPreferredTypePluginL(const RMessage2& aMessage);
+	void IdentitiesWithStringL(const RMessage2& aMessage);
+	void ListAuthAliasesL(const RMessage2& aMessage);
+	void ResolveExpressionL(const RMessage2& aMessage);
+	void ResetIdentityL(TInt aFunction, const RMessage2& aMessage);
+	void ResetIdentityByListL(const RMessage2& aMessage);
+
+	virtual void Evaluate(TPluginId aPluginId,
+						  TIdentityId& aIdentityId,
+						  CAuthExpressionImpl::TType aType,
+						  TRequestStatus& aStatus);
+	
+	virtual void Evaluate(TAuthPluginType aPluginType,
+						  TIdentityId& aIdentityId,
+						  CAuthExpressionImpl::TType aType,
+						  TRequestStatus& aStatus);
+
+	virtual void CancelEvaluate(); 
+	virtual void EvaluationSucceeded(TIdentityId aIdentityId);
+	virtual void EvaluationFailed(TInt aReason);
+
+private:
+	
+	CAuthServer(CActive::TPriority aPriority);
+
+	/// 2nd phase construction
+	void ConstructL();
+	
+	~CAuthServer();
+
+    CIdentity* CachedIdentity(const TTimeIntervalSeconds& timeout);						   
+
+	TBool FilterActivePlugins(const CAuthPluginInterface& aInterface);
+
+	void FirstStartL();
+	void CreatePropertiesL();
+	void ClearPropertiesL();
+
+	TBool ServerBusy();
+	
+	void EvaluationSucceededL(TIdentityId aIdentityId) ;
+	void CompleteAuthenticationL(const RMessagePtr2& aMessage, CIdentity* aId);
+
+	typedef TBool (CAuthServer::* TInterfaceFilter)(const CAuthPluginInterface&);
+	
+	void FilterPluginsL(
+		const RMessage2& aMessage, TInterfaceFilter aFilter);
+	
+	void GetDescriptionsFromEComLC(
+		TInterfaceFilter aFilter, RCPointerArray<const CPluginDesc>& aDescs);
+	
+	TBool FilterAllPlugins(const CAuthPluginInterface&);
+	TBool FilterPluginsByType(const CAuthPluginInterface&);
+	TBool FilterPluginsByTraining(const CAuthPluginInterface& aInterface);
+
+	void UpdateAuthL(TLastAuth& aAuth, TPluginId aPlugin);
+	
+	HBufC* StringOrNullLC(TBool aReturnString, TIdentityId id);
+
+	void EvaluateL(TPluginId aPluginId,
+				   TIdentityId& aIdentityId,
+				   CAuthExpressionImpl::TType aType,
+				   TRequestStatus& aStatus);
+	
+	void ProcessAliasStringL(RPointerArray<HBufC>& aAuthAliasList, const TDesC& aAliasStringToProcess , RBuf& aResultantAliasString);
+	
+	TBool CheckForAliasInAliasString(RPointerArray<HBufC>& aAuthAliasList, const TDes& aAliasString);
+	CTransientKeyInfo* CreateKeyInfoLC(TPluginId aPluginId, const TDesC8& aPluginData, const CProtectionKey& aProtKey);
+	TCustomResult CustomSecurityCheckL(const RMessage2& aMsg, 
+		TInt& aAction, TSecurityInfo& aMissing);
+	void TokenizeStringL( const TDesC& aStringToBeProcessed, RBuf& aResultantString );
+	void ResolveAliasL(	const TDesC& aAliasName, 
+						RPointerArray<HBufC>& aAliasList, 
+						RBuf& aResultantString);
+	
+
+	void FreeMemoryBeforeHeapMark();
+	void SetupVariablesAfterHeapMarkEndL();
+
+private:
+	RFs iFs;
+	/// The persistent authentication database
+	CAuthDb2*  iAuthDb2;
+	//plugin manager
+	CPluginMgr* iPluginMgr;
+	// The training manager 
+	CTrainingMgr* iTrainingMgr;
+	/// the auth expression evaluator
+	CEvaluator* iEvaluator;
+	/// the last authenticated identity
+	CIdentity* iLastIdentity;
+	/// the last authentication time
+	TTime iLastAuthTime;
+	/// holds the information about the authentication taking place
+	CAuthTransaction* iAuthTransaction;
+	/// used to publish information about the last authentication 
+	RProperty iAuthProperty;
+	/// used to notify subscribers of changes to the authenticated identity
+	RProperty iAuthEventProperty;
+	/// The authentication repository
+	CAuthRepository* iAuthRepository;
+	/// The key size to be used for protection keys
+	TInt iKeySize;
+	/// The parameters from the IPC Call
+	CAuthParams* iParams;
+	
+	
+	TAuthTrainingStatus iFilterTraining;
+	TAuthPluginType iFilterType;
+	CPluginObserver* iPluginObserver;
+	
+	// Server Policies
+	static const TUint iRangeCount;
+	static const TInt iRanges[KPolicyRanges];
+	static const TUint8 iElementsIndex[KPolicyRanges];
+	static const CPolicyServer::TPolicyElement iPolicyElements[KPolicyElements];
+	static const CPolicyServer::TPolicy iPolicy;
+	static const TStaticSecurityPolicy iPropertyWritePolicy;
+	static const TStaticSecurityPolicy iPropertyReadPolicy;
+	};
+} //namespace
+
+#endif // AUTHSERVER_H