diff -r f18401adf8e1 -r 641f389e9157 authenticationservices/authenticationserver/test/tAuthSvr/src/step_authenticate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/authenticationservices/authenticationserver/test/tAuthSvr/src/step_authenticate.cpp Tue Aug 31 17:00:08 2010 +0300 @@ -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(); + }