authenticationservices/authenticationserver/test/tAuthSvr/src/step_clientsidsupport.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 24 Nov 2009 09:06:03 +0200
changeset 29 ece3df019add
permissions -rw-r--r--
Revision: 200948 Kit: 200948

/*
* Copyright (c) 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: 
*
*/


#include <bautils.h>
#include <s32file.h>
#include <test/testexecutelog.h>

#include "authserver/authmgrclient.h"
#include "authserver/authclient.h"
#include "authserver/identity.h"
#include "tAuthSvrStep.h"

using namespace AuthServer;

class CActiveObj : public CActive
    {
    public:
    CActiveObj(RAuthMgrClient& aClient, CAuthExpression* aExpression,
				 TInt aFresh, TBool aClientSpecific, TUid aClientSid, TBool aIdentityString, TPluginId aPluginId, TIdentityId aId) : 
         CActive(EPriorityNormal),
         iClient(aClient),
		 iResult(EFail),
         iRunCount(0),
         iAe(aExpression),
         iFresh(aFresh),
         iClientSpecific(aClientSpecific),
         iWithString(aIdentityString),
         iPluginId(aPluginId),
         iId(aId),
         iMode(-1)
        {
        CActiveScheduler::Add(this);
        iClientSid = aClientSid;
        }
   
    void Authenticate() 
        {
        SetActive();		
		TRequestStatus* status = &iStatus;		    
		User::RequestComplete(status, KErrNone);
		iRunCount = 0;
		iMode = 0;
        }
        
   void Retrain() 
        {
        SetActive();		
		TRequestStatus* status = &iStatus;		    
		User::RequestComplete(status, KErrNone);
		iRunCount = 0;
		iMode = 1;
        }
        
    void DoCancel() 
        {
        }
        
    TInt RunError(TInt aError)
    	{
    	iErr = aError;
	   	CActiveScheduler::Stop();
	   	return KErrNone;
    	}
        
    void RunL() 
        {
        switch (iRunCount)
		  {
		  case 0:
		  
		  switch (iMode)
			  {
			  
			  case 0:
				iClient.AuthenticateL(*iAe, iFresh, iClientSpecific, iClientSid, EFalse, KNullDesC(), iIdentity, iStatus);
			    break;
			    
			  case 1:
				iClient.TrainPlugin(iId, iPluginId, iStatus);
				break;
			  }
			  
			SetActive();
			break;
			
		  case 1:
   		  
   		  	iResult = iStatus.Int() == KErrNone ? EPass : EFail;
            iErr = iStatus.Int();
			CActiveScheduler::Stop();
			break;
			
     	  default:
			iResult = EFail;
			CActiveScheduler::Stop();
			 
		    }
		  ++iRunCount;
          }
          
    ~CActiveObj()
		{
		
		}
		
    RAuthMgrClient& iClient;
	TVerdict iResult;
	TInt iRunCount;
	CAuthExpression* iAe;
	CIdentity* iIdentity;
    TInt iErr;
    TInt iFresh;
    TBool iClientSpecific;
    TBool iWithString;
    TPluginId iPluginId;
    TIdentityId iId;
    TInt iMode;
    TUid iClientSid;
    };
    
 
 CTStepClientSidSupport::CTStepClientSidSupport(CTAuthSvrServer& aParent): iParent(aParent)
 	{
 	SetTestStepName(KTStepClientSidSupportCheck);
 	}
 	
 TVerdict CTStepClientSidSupport::doTestStepPreambleL()
 	{
 	SetTestStepResult(EFail);
 	
 	CTStepActSch::doTestStepPreambleL();
 	 	
 	if(GetHexFromConfig(ConfigSection(),_L("plugin1Id"), iPluginId) == EFalse)
		{
		INFO_PRINTF1(_L("Plugin Id not specified in the ini file"));
		return TestStepResult();
		}

	if(GetBoolFromConfig(ConfigSection(),_L("clientSpecificKey"), iClientSpecificKey) == EFalse)
	 	{
	 	INFO_PRINTF1(_L("Client Specific Key not specified in the ini file"));
		return TestStepResult();
	 	} 
		 	
	if(GetBoolFromConfig(ConfigSection(),_L("withString"), iWithString) == EFalse)
	 	{
	 	INFO_PRINTF1(_L("Identity String not specified in the ini file"));
		return TestStepResult();
	 	}
	 	
	TInt clientSid = 0;
   	if(GetHexFromConfig(ConfigSection(),_L("clientSid"), clientSid) == EFalse)
		{
		INFO_PRINTF1(_L("Client Sid not specified in the ini file"));
		return TestStepResult();
		}
	
	iClientSid.iUid = clientSid;
 	
	 	
	SetTestStepResult(EPass);
	return TestStepResult();
 	}
  
 TVerdict CTStepClientSidSupport::doTestStepL()
	{
    SetTestStepResult(EFail);
    
    InitAuthServerFromFileL();	// Set things like 'iSupportsDefaultData' and 'DefaultPlugin'
	
	CActiveScheduler::Install(iActSchd);
    
	//Connect to the AuthServer	
	AuthServer::RAuthMgrClient authMgrClient1;	
	TInt connectVal = authMgrClient1.Connect();
	CleanupClosePushL(authMgrClient1);
	
    TPtrC exprString;
	if(GetStringFromConfig(ConfigSection(),_L("plugin1Id"), exprString) == EFalse)
		{
		INFO_PRINTF1(_L("Plugin Id not specified in the ini file"));
		return TestStepResult();
		}
		
	CAuthExpression* authExpr = CreateAuthExprLC(exprString);
	CActiveObj active1(authMgrClient1, authExpr, 20, iClientSpecificKey, iClientSid, iWithString, iPluginId, 0);
	active1.Authenticate();
	CActiveScheduler::Start();
	
	if(EPass != active1.iResult)
		{
		ERR_PRINTF3(_L("Authentication Result error = %d, iResult = %d\n"), active1.iErr, active1.iResult);			
		SetTestStepError(active1.iErr);
		CleanupStack::PopAndDestroy(2, &authMgrClient1);
		return TestStepResult();
		}
	
	iIdentity = active1.iIdentity;
	CleanupStack::PushL(iIdentity);
	TIdentityId identityId = iIdentity->Id();
	
	// set plugin input train value.
	InitPluginDataFromFileL(ETrue);
	
	CActiveObj active2(authMgrClient1, authExpr, 0, iClientSpecificKey, iClientSid, iWithString, iPluginId, identityId);
	active2.Retrain();		
	CActiveScheduler::Start();
	
	if(EPass != active1.iResult)
		{
		ERR_PRINTF3(_L("Error encountered while training plugin = %d, iResult = %d\n"), active2.iErr, active2.iResult);			
		SetTestStepError(active2.iErr);
		CleanupStack::PopAndDestroy(3, &authMgrClient1);
		return TestStepResult();
		}
	
	// set plugin inputId value.
	InitPluginDataFromFileL(EFalse);
	
	CActiveObj active3(authMgrClient1, authExpr, 20, iClientSpecificKey, iClientSid, iWithString, iPluginId, 0);
	active3.Authenticate();		
	CActiveScheduler::Start();
	
	CleanupStack::Pop(iIdentity);	
	CleanupStack::PopAndDestroy(2, &authMgrClient1);
	
	if(EPass != active1.iResult)
		{
		ERR_PRINTF3(_L("Authentication Result error = %d, iResult = %d\n"), active3.iErr, active3.iResult);			
		SetTestStepError(active3.iErr);
		delete iIdentity;
		return TestStepResult();
		}

	iIdentityAfterRetrain = active3.iIdentity;
	
	TBool success = VerifyObtainedResultsWithExpectedL();
	if(success)
		{
		SetTestStepResult(EPass);
		}
	
	return TestStepResult();
    };
    
 TBool CTStepClientSidSupport::VerifyObtainedResultsWithExpectedL()
 	{
 	// required for ReadUserData capability test(when client sid is not equal
 	// to the calling application's sid or zero, ReadUserData is required for
 	// authentication.)
 	if(iClientSid.iUid == 0)
 		{
 		TInt clientSid;
 		if(GetHexFromConfig(ConfigSection(),_L("callingAppSid"), clientSid) == EFalse)
			{
			INFO_PRINTF1(_L("Sid of calling application not specified in the ini file"));
			return TestStepResult();
			}
			
		iClientSid.iUid = clientSid;
 		}
 		
 	CProtectionKey* protection = iIdentity->Key().ClientKeyL(iClientSid.iUid);
 	 	
 	const CProtectionKey& obtainedKey = iIdentityAfterRetrain->Key();
 	TBool success = EFalse;
 	if(protection->KeyData() == obtainedKey.KeyData())
 		{
 		success = ETrue;
 		}
 	
 	return success;
 	}
 	
 CTStepClientSidSupport::~CTStepClientSidSupport()
 	{
 	delete iIdentity;
 	delete iIdentityAfterRetrain;
 	}