--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/authenticationservices/authenticationserver/test/tAuthSvr/src/step_authenticate.cpp Tue Nov 24 09:06:03 2009 +0200
@@ -0,0 +1,681 @@
+/*
+* Copyright (c) 2006-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:
+* CTestStep derived implementation
+*
+*/
+
+
+#include "tAuthSvrStep.h"
+
+#include "authserver/authclient.h"
+#include "authserver/authmgrclient.h"
+#include "authrepository.h"
+#include "testutilclient.h"
+
+using namespace AuthServer;
+
+
+class CAuthActive2 : public CActive
+ {
+ public:
+ CAuthActive2(RAuthMgrClient& aClient, CAuthExpression* aExpression,
+ TInt aFresh, TBool aClientSpecific, TBool aAuthViaAlias, const TDesC& aClientMessage, TBool aStop = ETrue) :
+ CActive(EPriorityNormal),
+ iClient(aClient),
+ iResult(EFail),
+ iRunCount(0),
+ iAe(aExpression),
+ iStop(aStop),
+ iFresh(aFresh),
+ iIdToStore(0),
+ iClientSpecific(aClientSpecific),
+ iAuthViaAlias(aAuthViaAlias),
+ iClientMessage(aClientMessage)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+ void doAuth()
+ {
+ SetActive();
+ TRequestStatus* status = &iStatus;
+ User::RequestComplete(status, KErrNone);
+ iRunCount = 0;
+ }
+ void DoCancel()
+ {
+ }
+
+ TInt RunError(TInt aError)
+ {
+ iErr = aError;
+ CActiveScheduler::Stop();
+ return KErrNone;
+ }
+
+ void RunL()
+ {
+ iErr = iStatus.Int();
+
+ switch (iRunCount)
+ {
+ case 0:
+ {
+ iId = 0;
+ TUid clientSid = {0};
+ iClient.AuthenticateL(*iAe, iFresh, iClientSpecific, clientSid, EFalse, iClientMessage, iId, iStatus);
+
+ SetActive();
+
+ break;
+ }
+
+ case 1:
+ if (0 != iId)
+ {
+ iIdToStore = iId->Id();
+ delete iId;
+ iId = NULL;
+ }
+
+ iResult = iStatus == KErrNone ? EPass : EFail;
+ iErr = iStatus.Int();
+ if (iStop)
+ {
+ CActiveScheduler::Stop();
+ }
+
+ break;
+
+ default:
+ iResult = EFail;
+
+ if (iStop)
+ {
+ CActiveScheduler::Stop();
+ }
+ }
+ ++iRunCount;
+ }
+
+ ~CAuthActive2()
+ {
+ if(iId != NULL)
+ delete iId;
+ }
+
+
+ RAuthMgrClient& iClient;
+ TVerdict iResult;
+ TInt iRunCount;
+ CAuthExpression* iAe;
+ CIdentity* iId;
+ TBool iStop;
+ TInt iErr;
+ TInt iFresh;
+ TIdentityId iIdToStore;
+ TBool iClientSpecific;
+ TBool iAuthViaAlias;
+ const TDesC& iClientMessage;
+ };
+
+//====================================================================================================
+CTAuthenticate::CTAuthenticate(CTAuthSvrServer& aParent): iParent(aParent)
+/**
+ Constructor
+ */
+ {
+ // Call base class method to set up the human readable name for logging
+ SetTestStepName(KTAuthenticate);
+ }
+
+CTAuthenticate::~CTAuthenticate()
+/**
+ Destructor
+ */
+ {}
+
+TVerdict CTAuthenticate::doTestStepPreambleL()
+/**
+ @return - TVerdict code
+ Override of base class virtual
+ */
+ {
+ //Call the parent class preamble, setting up the file server, etc
+ CTStepActSch::doTestStepPreambleL();
+
+ return TestStepResult();
+ }
+
+TVerdict CTAuthenticate::doTestStepL()
+/**
+ @return - TVerdict code
+ Override of base class pure virtual
+
+ */
+ {
+ SetTestStepResult(EFail);
+
+__UHEAP_MARK; // Check for memory leaks
+
+ //-----------------------------------------------------------------------------------------------------
+ TPtrC displayMessage;
+ TBool messageSent = (GetStringFromConfig(ConfigSection(),_L("DisplayMessage"), displayMessage) != EFalse);
+ TBuf<100> message(displayMessage);
+ ClientMessage(messageSent, displayMessage);
+ if(!messageSent)
+ {
+ message = KNullDesC();
+ }
+ InitAuthServerFromFileL(); // Set things like 'iSupportsDefaultData' and 'DefaultPlugin'
+
+ // this method creates the dat file from where the test implementation
+ // of pin plugin notifier reads user input.
+ // as the pin plugin fails without this data it has been included
+ // in the code as a default step for initializing the pin plugin
+ // data.
+ // the pin value generate through the reference plugin is a random
+ // value which should be retrieved from the output file and given
+ // as an input back for creation of the input file again.
+ // If the ini file specified a pin use that instead
+ TPtrC pin;
+ if (GetStringFromConfig(ConfigSection(),_L("pinvalue"), pin))
+ {
+ TPinValue pinValue;
+ pinValue.Copy(pin);
+ //pinValue.
+ CreatePinPluginInputFileL(EPinPluginIdentify, pinValue);
+ }
+ else
+ {
+ TPinValue pinValue = GetPinFromOutputFileL();
+ CreatePinPluginInputFileL(EPinPluginIdentify, pinValue);
+ }
+
+ CActiveScheduler::Install(iActSchd);
+ //Connect to the AuthServer
+ AuthServer::RAuthMgrClient authMgrClient1;
+ TInt connectVal = authMgrClient1.Connect();
+ if (KErrNotFound == connectVal)
+ {
+ //Retry after a delay
+ TTimeIntervalMicroSeconds32 timeInterval = 2000; //2 Milliseconds
+ User::After(timeInterval);
+ connectVal = authMgrClient1.Connect();
+ }
+ if (KErrNone != connectVal)
+ {
+ ERR_PRINTF2(_L("Unable to start a session or other connection error. Err = %d"), connectVal);
+ User::LeaveIfError(connectVal);
+ }
+
+ CleanupClosePushL(authMgrClient1);
+
+ //-----------------------------------------------------------------------------------------------------
+ // Authenticate by reading the user input
+
+ //Check that alias or pluginId is quoted in the ini file
+ TPtrC exprString;
+ TBool authViaAlias = GetStringFromConfig(ConfigSection(),_L("alias"), exprString);
+ TBool authViaExpr = EFalse;
+ if(!authViaAlias)
+ {
+ authViaExpr = GetStringFromConfig(ConfigSection(),_L("plugin1Id"), exprString);
+ }
+
+ if( ! authViaAlias && ! authViaExpr)
+ {
+ INFO_PRINTF1(_L("Neither plugin1Id nor alias was specified in the ini file"));
+ }
+ else
+ {
+ TInt freshnessVal = 0; //Default value
+ //Retrieve the value of 'freshness' from the ini file, but if it's absent use the default value
+ if(GetIntFromConfig(ConfigSection(),_L("freshness"), freshnessVal) == EFalse)
+ {
+ freshnessVal = 10;
+ }
+
+ TBool clientSpecificKeyVal = EFalse;
+ //Retrieve the value of 'clientSpecificKey' from the ini file, but if it's absent use the default value
+ if(GetBoolFromConfig(ConfigSection(),_L("clientSpecificKey"), clientSpecificKeyVal) == EFalse)
+ {
+ clientSpecificKeyVal = EFalse;
+ }
+
+ TBool defaultpluginusage = EFalse;
+ if(GetBoolFromConfig(ConfigSection(),_L("defaultpluginusage"), defaultpluginusage ) == EFalse)
+ {
+ defaultpluginusage = EFalse;
+ }
+
+ TBool isSynchronous = EFalse;
+ //Retrieve the value of 'synchronous' from the ini file, but if it's absent use the default value
+ if(GetBoolFromConfig(ConfigSection(),_L("synchronous"), isSynchronous) != EFalse)
+ {
+ CallSyncAuthenticateL(authMgrClient1, exprString, freshnessVal, clientSpecificKeyVal, authViaAlias, defaultpluginusage, message);
+ }
+ else
+ {
+ CallAsyncAuthenticateL(authMgrClient1, exprString, freshnessVal, clientSpecificKeyVal, authViaAlias, defaultpluginusage, message);
+ }
+
+ }
+
+ CleanupStack::PopAndDestroy(&authMgrClient1); // authClient1
+ //Garbage collect the last previously destroyed implementation
+ // and close the REComSession if no longer in use
+ REComSession::FinalClose();
+__UHEAP_MARKEND;
+ return TestStepResult();
+ }
+
+
+TVerdict CTAuthenticate::doTestStepPostambleL()
+/**
+ @return - TVerdict code
+ Override of base class virtual
+ */
+ {
+ //Call the parent postamble, releasing the file handle, etc
+ CTStepActSch::doTestStepPostambleL();
+ return TestStepResult();
+ }
+
+
+void CTAuthenticate::setLastAuthIdL(AuthServer::TIdentityId idToStore)
+/**
+ Utility function that stores the most recently authenticated identity in the GlobalDb file
+ This should only be called by the Authenticate test step class
+ */
+ {
+ TBuf<100> bufToWrite;
+ _LIT16(KFormatLastAuth,"%u");
+
+ bufToWrite.Format(KFormatLastAuth, idToStore); //generates:
+
+ TDriveUnit sysDrive (RFs::GetSystemDrive());
+ TBuf<128> authSvrPolicyFile (sysDrive.Name());
+ authSvrPolicyFile.Append(KAuthSvrPolicyFile);
+
+ CIniData* policyFile=NULL;
+ TRAP_IGNORE(policyFile=CIniData::NewL(authSvrPolicyFile));
+ CleanupStack::PushL(policyFile);
+
+ TInt ret = writeToNamedConfig(policyFile, KLastAuthIdTag, bufToWrite);
+
+ policyFile->WriteToFileL();
+ CleanupStack::PopAndDestroy(policyFile);
+
+ if (KErrNotFound == ret)
+ {
+ ERR_PRINTF3(_L("Error while setting last AuthId. Tag %S not found in %S file"), KLastAuthIdTag, &authSvrPolicyFile);
+ }
+ else
+ {
+ INFO_PRINTF2(_L("Setting last AuthId was successful. Id = %S"), &bufToWrite);
+ }
+ }
+
+void CTAuthenticate::CallSyncAuthenticateL(RAuthMgrClient& aAuthMgrClient, const TDesC& aInputString, TInt aFreshness, TBool aClientSpecificKey, TBool aIsAlias, TBool aIsDefault, const TDesC& aClientMessage )
+ {
+ CIdentity* id = 0;
+ TInt error;
+ TUid val = TUid::Uid(0);
+
+ CAuthExpression* expr = NULL;
+
+ if(!aIsAlias)
+ {
+ if(!aIsDefault)
+ {
+ CAuthExpression* expr = CreateAuthExprLC(aInputString);
+ TRAP(error, id = aAuthMgrClient.AuthenticateL(*expr, aFreshness, aClientSpecificKey, val, EFalse, aClientMessage));
+ CleanupStack::PopAndDestroy(expr);
+ }
+ else
+ {
+ CAuthExpression* expr = CreateAuthExprLC(KNullDesC());
+ TRAP(error, id = aAuthMgrClient.AuthenticateL(*expr, aFreshness, aClientSpecificKey, val, EFalse, aClientMessage));
+ CleanupStack::PopAndDestroy(expr);
+ }
+ }
+
+ else
+ {
+ TRAPD(err,expr = aAuthMgrClient.CreateAuthExpressionL(aInputString));
+ if(err != KErrNone)
+ {
+ SetTestStepError(err);
+ return;
+ }
+
+ CleanupStack::PushL(expr);
+ TUid clientSid = {0};
+ TRAP(error, id = aAuthMgrClient.AuthenticateL(*expr, aFreshness, aClientSpecificKey, clientSid, EFalse, KNullDesC));
+ CleanupStack::PopAndDestroy(expr);
+ }
+
+ if(error != KErrNone)
+ {
+ ERR_PRINTF2(_L("Authentication Result error = %d"), error);
+ SetTestStepError(error);
+ return;
+ }
+
+ //Main check
+ if (0 == id->Id())
+ {
+ ERR_PRINTF1(_L("Authentication failed. No identity returned"));
+ delete id;
+ }
+
+ else
+ {
+ INFO_PRINTF1(_L("Authentication successful."));
+ CleanupStack::PushL(id);
+ //Store the id in the Global Db file
+ setLastAuthIdL(id->Id());
+ CleanupStack::PopAndDestroy(id);
+ SetTestStepResult(EPass);
+ }
+ }
+
+void CTAuthenticate::CallAsyncAuthenticateL(RAuthMgrClient& aAuthMgrClient, TDesC& aInputString, TInt aFreshness, TBool aClientSpecificKey, TBool aIsAlias, TBool aIsDefault, const TDesC& aClientMessage)
+ {
+ CAuthExpression* expr = 0;
+ if(!aIsAlias)
+ {
+ if(!aIsDefault)
+ {
+ expr = CreateAuthExprLC(aInputString);
+ }
+ else
+ {
+ expr = CreateAuthExprLC(KNullDesC());
+ }
+ }
+ else
+ {
+ TRAPD(err,expr = aAuthMgrClient.CreateAuthExpressionL(aInputString));
+ if(err != KErrNone)
+ {
+ SetTestStepError(err);
+ return;
+ }
+ CleanupStack::PushL(expr);
+ }
+
+ CAuthActive2 active1(aAuthMgrClient, expr, aFreshness, aClientSpecificKey, aIsAlias, aClientMessage);
+ active1.doAuth();
+ CActiveScheduler::Start();
+
+ if(expr)
+ {
+ CleanupStack::PopAndDestroy(expr);
+ }
+
+
+ if(EPass != active1.iResult)
+ {
+ ERR_PRINTF3(_L("Authentication Result error = %d, iResult = %d\n"), active1.iErr, active1.iResult);
+ SetTestStepError(active1.iErr);
+ }
+
+ else if ((KErrNone == active1.iErr) && (EPass == active1.iResult))
+ {
+ INFO_PRINTF1(_L("No Authentication Errors."));
+ }
+
+ else
+ {
+ ERR_PRINTF3(_L("Unexpected Authentication Result. error = %d, iResult = %d\n"), active1.iErr, active1.iResult);
+ }
+
+ //Main check
+ if (0 == active1.iIdToStore)
+ {
+ ERR_PRINTF1(_L("Authentication failed. No identity returned"));
+ }
+
+ else
+ {
+ INFO_PRINTF1(_L("Authentication successful."));
+ //Store the id in the Global Db file
+ setLastAuthIdL(active1.iIdToStore);
+ SetTestStepResult(EPass);
+ }
+ }
+
+//---------------------------------------------------------------------------------------------------------------------------------
+
+CTInitCenRep::CTInitCenRep(CTAuthSvrServer& aParent): iParent(aParent)
+/**
+ Constructor
+*/
+ {
+ // Call base class method to set up the human readable name for logging
+ SetTestStepName(KTInitCenRep);
+ }
+
+
+ CTInitCenRep::~CTInitCenRep()
+/**
+ Destructor
+*/
+ {}
+
+TVerdict CTInitCenRep::doTestStepPreambleL()
+/**
+ @return - TVerdict code
+ Override of base class virtual
+*/
+ {
+ //Call the parent class preamble, setting up the file server, etc
+ CTStepActSch::doTestStepPreambleL();
+ return TestStepResult();
+ }
+
+TVerdict CTInitCenRep::doTestStepL()
+/**
+ @return - TVerdict code
+ Override of base class pure virtual
+
+ */
+ {
+
+ __UHEAP_MARK; // Check for memory leaks
+
+ //Initialize the repository
+ CRepository* repository = CRepository::NewL(KUidAuthServerRepository);
+ CleanupStack::PushL(repository);
+
+ //If default plugin is specified, set it
+ TPtrC defaultPluginFromFile;
+ if(GetStringFromConfig(ConfigSection(),_L("default"), defaultPluginFromFile) != EFalse)
+ {
+ TLex pluginIdString = TLex(defaultPluginFromFile);
+ TPluginId defaultPluginId(0);
+
+ pluginIdString.Val(defaultPluginId, EHex );
+ SetDefaultPluginIdL(defaultPluginId);
+
+ //Retrieve the value
+ TInt value(0);
+ User::LeaveIfError(repository->Get(KAuthDefaultPlugin, value));
+ CleanupStack::PopAndDestroy(repository);
+ SetTestStepResult(EPass);
+ return TestStepResult();
+ }
+ TInt aliasCount = 0;
+
+ // Retrieve the value of 'aliasCount' from the ini file, but if it's absent use the default value.
+ // This value is used for validation of cenrep file.
+ if(GetIntFromConfig(ConfigSection(),_L("aliasCount"), aliasCount) != EFalse)
+ {
+ User::LeaveIfError(repository->Set(EAuthAliasesCount, aliasCount));
+ CleanupStack::PopAndDestroy(repository);
+ SetTestStepResult(EPass);
+ return TestStepResult();
+ }
+
+ User::LeaveIfError(repository->Get(EAuthAliasesCount, aliasCount));
+ // since we will only have four aliases in the cenrep file.
+ __ASSERT_DEBUG(aliasCount == 4, User::Leave(KErrArgument));
+
+ // Retrieve the value of 'unicode' from the ini file, but if it's absent use the default value.
+ // For unicode tests we need to set the aliases in addition to thier corresponding alias string.
+ TBool isUnicode = EFalse;
+ if(GetBoolFromConfig(ConfigSection(),_L("unicode"), isUnicode) != EFalse)
+ {
+ TBuf<24> alias;
+ TPtrC aliasValue;
+
+ for(TInt i = 0; i < aliasCount; ++i)
+ {
+ alias.Format(_L("alias%d"), i);
+ if (GetStringFromConfig(ConfigSection(), alias, aliasValue) != EFalse)
+ {
+ User::LeaveIfError(repository->Set(EAuthAliases+i, aliasValue));
+ }
+ }
+ }
+
+ // for each alias ,set the corresponding alias string expression.
+ TBuf<24> aliasString;
+ TPtrC aliasStringValue;
+
+ for(TInt i = 0; i < aliasCount; ++i)
+ {
+ aliasString.Format(_L("aliasString%d"), i);
+ if (GetStringFromConfig(ConfigSection(), aliasString, aliasStringValue) != EFalse)
+ {
+ User::LeaveIfError(repository->Set(EAuthAliasesExpr+i, aliasStringValue));
+ }
+ }
+
+ CleanupStack::PopAndDestroy(repository);
+ SetTestStepResult(EPass);
+
+__UHEAP_MARKEND;
+ return TestStepResult();
+ }
+
+TVerdict CTInitCenRep::doTestStepPostambleL()
+/**
+ @return - TVerdict code
+ Override of base class virtual
+ */
+ {
+ //Call the parent postamble, releasing the file handle, etc
+ CTStepActSch::doTestStepPostambleL();
+ return TestStepResult();
+ }
+
+//====================================================================================================
+
+CTSysTimeUpdate::CTSysTimeUpdate(CTAuthSvrServer& aParent): iParent(aParent)
+/**
+ Constructor
+ */
+ {
+ // Call base class method to set up the human readable name for logging
+ SetTestStepName(KTUpdateSysTime);
+ }
+
+
+CTSysTimeUpdate::~CTSysTimeUpdate()
+/**
+ Destructor
+ */
+ {}
+
+TVerdict CTSysTimeUpdate::doTestStepPreambleL()
+/**
+ @return - TVerdict code
+ Override of base class virtual
+ */
+ {
+ //Call the parent class preamble, setting up the file server, etc
+ CTStepActSch::doTestStepPreambleL();
+
+ return TestStepResult();
+ }
+
+TVerdict CTSysTimeUpdate::doTestStepL()
+/**
+ @return - TVerdict code
+ Override of base class pure virtual
+
+ */
+ {
+ SetTestStepResult(EFail);
+
+__UHEAP_MARK; // Check for memory leaks
+
+ //Get the "time" which must be added to the system time.
+ TInt timeVal(0);
+ GetIntFromConfig(ConfigSection(), _L("time"), timeVal);
+
+ TTime currentTime;
+ currentTime.UniversalTime();
+
+ if(timeVal == 0 )
+ {
+ //Set the secure clock time.
+ RTestUtilSession session;
+ session.Connect();
+ CleanupClosePushL(session);
+ TInt ret = session.SetSecureClock(0);
+ INFO_PRINTF2(_L("Set the secure clock --- %d"), ret);
+ CleanupStack::PopAndDestroy(&session);
+ }
+ else
+ {
+ //Increment the time only if secure clock is present
+ TInt err = currentTime.UniversalTimeSecure();
+ INFO_PRINTF2(_L("Getting the secure clock time returned %d"), err );
+ if(!err)
+ {
+ INFO_PRINTF1(_L("Secure clock found !"));
+ TTimeIntervalSeconds increment(timeVal);
+ currentTime += increment;
+ User::LeaveIfError(User::SetUTCTime(currentTime));
+ }
+ else
+ {
+ INFO_PRINTF1(_L("Secure clock not found !"));
+ }
+
+ }
+
+
+ SetTestStepResult(EPass);
+
+__UHEAP_MARKEND;
+ return TestStepResult();
+ }
+
+
+TVerdict CTSysTimeUpdate::doTestStepPostambleL()
+/**
+ @return - TVerdict code
+ Override of base class virtual
+ */
+ {
+ //Call the parent postamble, releasing the file handle, etc
+ CTStepActSch::doTestStepPostambleL();
+ return TestStepResult();
+ }