authenticationservices/authenticationserver/test/reftestplugin/pinplugin/pinpluginao.cpp
changeset 102 deec7e509f66
parent 94 0e6c5a9328b5
child 108 ca9a0fc2f082
--- a/authenticationservices/authenticationserver/test/reftestplugin/pinplugin/pinpluginao.cpp	Thu Aug 19 11:18:56 2010 +0530
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,477 +0,0 @@
-/*
-* 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: 
-* CPinPluginAO implementation
-*
-*/
-
-
-/**
- @file 
-*/
-
-#include "pinpluginao.h"
-#include <hash.h>
-#include <authserver/auth_srv_errs.h>
-#include <authserver/authtypes.h>
-#include <e32math.h>
-
-using namespace AuthServer;
-
-/** 
- KDefaultPinDigit is used to generate the default pinvalue for the DefaultData().
- The default pinvalue is generated by appending KDefaultPinDigit for iPinSize times.
- */
-const TUint KDefaultPinDigit = 1;
-
-/** 
- The selected pin index for the Train/Retrain operation, returned by
- Dialog Notifier should be in the range KIndexLow and KIndexHigh. This should
- be validated in the Dialog implementation. If Pinplugin receives any other
- values, then pinplugin will panic.
- */
-const TInt KIndexLow = 0;
-const TInt KIndexHigh = 3;
-
-CPinPluginAO* CPinPluginAO::NewL(TInt aPinSize, TInt aPinMinSize, TInt aPinMaxSize, TInt aRetryCount)
-	{
-	CPinPluginAO* self = CPinPluginAO::NewLC(aPinSize, aPinMinSize, aPinMaxSize, aRetryCount);
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-CPinPluginAO* CPinPluginAO::NewLC(TInt aPinSize, TInt aPinMinSize, TInt aPinMaxSize, TInt aRetryCount)
-	{
-	CPinPluginAO* self = new(ELeave) CPinPluginAO(aPinSize, aPinMinSize, aPinMaxSize, aRetryCount);
-	CleanupStack::PushL(self);
-	self->ConstructL();
-	return self;
-	}
-	
-CPinPluginAO::CPinPluginAO(TInt aPinSize, TInt aPinMinSize, TInt aPinMaxSize, TInt aRetryCount)
-	:CActive(EPriorityStandard), iRetryCount(aRetryCount), iPinSize(aPinSize), iPinMinSize(aPinMinSize),
-	iPinMaxSize(aPinMaxSize)
-	{
-	CActiveScheduler::Add(this);
-	}
-	
-void CPinPluginAO::ConstructL()
-	{
-	iNewPinSize = iPinSize;
-	
-	// construct PinpluginDialog
-	iPinPluginDialog = CPinPluginDialog::NewL();
-	// construct the DB
-	iPinPluginDb = CPinPluginDB::NewL();
-	iDialogResult = new (ELeave) TPinPluginDialogResult;
-	iRetryRefCount = iRetryCount;
-	}
-
-CPinPluginAO::~CPinPluginAO()
-	{
-	Deque();
-	delete iDialogResult;
-	delete iPinPluginDialog;
-	delete iPinPluginDb;
-	iPinList.ResetAndDestroy();
-	iIdKeyList.ResetAndDestroy();
-	iIdKeyHashList.ResetAndDestroy();
-	}
-	
-void CPinPluginAO::Identify(TIdentityId& aId, const TDesC& aClientMessage,
-							HBufC8*& aResult, TRequestStatus& aRequest)
-	{
-	iState = EIdentify;
-	iIdentityId = aId;
-	iIdentityIdPtr = &aId;
-	
-	aRequest = KRequestPending;
-	iRequestStatus = &aRequest;
-
-	iClientMessage = static_cast<const HBufC*>(&aClientMessage);
-	iResult = &aResult;
-	aResult = NULL;	
- 
-	SetActive();
-	TRequestStatus* stat = &iStatus;
-	User::RequestComplete(stat, KErrNone);
-	}
-
-void CPinPluginAO::Train(TIdentityId aId, HBufC8*& aResult, TRequestStatus& aRequest)
-	{
-	iState = ETrain;
-	iIdentityId = aId;
-
-	aRequest = KRequestPending;
-	iRequestStatus = &aRequest;
-
-	iResult = &aResult;
-	aResult = NULL;	
-
-	SetActive();
-	TRequestStatus* stat = &iStatus;
-	User::RequestComplete(stat, KErrNone);
-    }
-	
-TInt CPinPluginAO::DefaultData(TIdentityId aId, HBufC8*& aOutputBuf)
-	{
-	aOutputBuf = NULL;
-	TPinValue defaultPin;
-	for (TInt i = 0; i < iPinSize; i++)
-		{
-		defaultPin.AppendNum(KDefaultPinDigit);	
-		}
-		
-	HBufC8* identityKey = NULL;
-	HBufC8* identityKeyHash = NULL;
-	TRAPD(err, 
-		identityKeyHash = GenerateKeyHashL(defaultPin, identityKey);
-		CleanupStack::PushL(identityKeyHash);
-		CleanupStack::PushL(identityKey);
-		aOutputBuf = (*identityKey).AllocL();
-		iPinPluginDb->AddPinL(aId, *identityKeyHash);
-		CleanupStack::PopAndDestroy(2, identityKeyHash));
-		
-	return err;
-	}
-
-TInt CPinPluginAO::Forget(TIdentityId aId)
-	{
-	TInt err = KErrNone;
-	TRAP(err, iPinPluginDb->RemovePinL(aId));
-	if (err == KErrNotFound)
-		{
-		err = KErrAuthServNoSuchIdentity;
-		}
-	return err;
-	}
-
-void CPinPluginAO::ResetL(TIdentityId aIdentityId, const TDesC& aRegistrationData, HBufC8*& aResult)
-	{
-	// Remove the current trained information and register using the newly supplied registration
-	// data (Since pin plugin is a knowledge based plugin, the registration data supplied is assumed to be the pin)
-	// For other plugin types this information is ignored and the identity is simply set as untrained
-
-	// If no registration data is supplied then just perform a forget
-	if (aRegistrationData == KNullDesC)
-		{
-		aResult = NULL;
-		TInt err = Forget(aIdentityId);
-		User::LeaveIfError(err);
-		return;
-		}
-
-	// Ensure registration data length is less than or equal to max allowed pin length
-	TInt pinLen = aRegistrationData.Length();
-	if (pinLen > KMaxPinLength)
-		{
-		User::Leave(KErrArgument);
-		}
-
-	// Convert registration data to 8 bit 
-	// Note that no unicode conversion is being done here since a pin cannot be in unicode
-	RBuf8 pinBuf;
-	pinBuf.CreateL(pinLen);
-	CleanupClosePushL(pinBuf);
-	pinBuf.Copy(aRegistrationData.Left(pinLen));
-	TPinValue pin(pinBuf);
-	CleanupStack::PopAndDestroy(&pinBuf);
-
-	// Generate the identity key and identity key hash
-	HBufC8* identityKey = NULL;
-	HBufC8* identityKeyHash = GenerateKeyHashL(pin, identityKey);
-	CleanupStack::PushL(identityKeyHash);
-	CleanupStack::PushL(identityKey);
-
-	// Ensure another identity doesn't have the same pin
-	TIdentityId tempId = iPinPluginDb->IdFromPin(*identityKeyHash);
-	if ((tempId != aIdentityId) && (tempId != KUnknownIdentity))
-		{
-		CleanupStack::PopAndDestroy(2, identityKeyHash);
-		// This appears to be the most appropriate error code - The important point is to convery Reset has failed.
-		User::Leave(KErrInUse);
-		}
-	else if (tempId == aIdentityId)
-		{
-		// Nothing to do
-		aResult = identityKey;		// Ownership transferred to caller
-		CleanupStack::Pop(identityKey);
-		CleanupStack::PopAndDestroy(identityKeyHash);
-		return;
-		}
-
-	// Replace the training data
-	iPinPluginDb->UpdatePinL(aIdentityId, *identityKeyHash);
-	aResult = identityKey;		// Ownership transferred to caller
-	CleanupStack::Pop(identityKey);
-	CleanupStack::PopAndDestroy(identityKeyHash);
-	}
-
-void CPinPluginAO::DoCancel()
-	{
-	iPinPluginDialog->Cancel();
-	if(iRequestStatus)
-		{
-		User::RequestComplete(iRequestStatus, KErrCancel);
-		}
-	}
-	
-void CPinPluginAO::RunL()
-	{
-	// Leave if there has been an error
-	User::LeaveIfError(iStatus.Int());
-	
-	switch(iState)
-		{
-		case EIdentify:
-			{
-			IdentifyId();	
-			}
-			break;
-		case EIdentifyResult:
-			{
-			if (*iDialogResult == EOk)
-				{
-				IdentifyResultL();
-				}
-			else if (*iDialogResult == ECancel)
-				{
-				User::RequestComplete(iRequestStatus, KErrAuthServPluginCancelled);
-				}
-			else if (*iDialogResult == EQuit)
-				{
-				User::RequestComplete(iRequestStatus, KErrAuthServPluginQuit);
-				}
-			*iDialogResult = static_cast<TPinPluginDialogResult>(0);
-			}
-			break;
-		case ETrain:
-			{
-			TrainIdL();	
-			}
-			break;
-		case ETrainResult:
-			{
-			if (*iDialogResult == EOk)
-				{
-				AddTrainResultToDBL();
-				}
-			else if (*iDialogResult == ECancel)
-				{
-				User::RequestComplete(iRequestStatus, KErrAuthServPluginCancelled);
-				}
-			else if (*iDialogResult == EQuit)
-				{
-				User::RequestComplete(iRequestStatus, KErrAuthServPluginQuit);
-				}
-			else if (*iDialogResult == ENext)
-				{
-				iState = ETrain;
-				TRequestStatus* status = &iStatus;
-				User::RequestComplete(status, KErrNone);
-				SetActive();
-				}
-			*iDialogResult = static_cast<TPinPluginDialogResult>(0);
-			}
-			break;
-		case EInfo:
-			{
-			iPinPluginDialog->PinInfo(iMessage, iStatus);
-			iState = EFinished;
-			SetActive();
-			}
-			break;
-		case EFinished:
-			{
-			User::RequestComplete(iRequestStatus, iStatus.Int());
-			}
-			break;
-		default:
-			{
-			User::Leave(KErrNotSupported);
-			}
-			break;
-		}
-	}
-	
-TInt CPinPluginAO::RunError(TInt aError)
-	{
-	if(iRequestStatus)
-		{
-		User::RequestComplete(iRequestStatus, aError);
-		}
-	return KErrNone;
-	}
-
-void CPinPluginAO::IdentifyId()
-	{
-	if (iRetryRefCount--)
-		{
-		iPinPluginDialog->PinIdentify(iPinMinSize, iPinMaxSize, ETrue, iPinValue, *iDialogResult, iStatus);
-		iState = EIdentifyResult;
-		}
-	else
-		{
-		iRetryRefCount = iRetryCount;
-		*iIdentityIdPtr = KUnknownIdentity;
-		iMessage = EPinPluginIdentificationFailure;
-		TRequestStatus* status = &iStatus;
-		User::RequestComplete(status, KErrNone);
-		iState = EInfo;
-		}
-	SetActive();
-	}
-
-void CPinPluginAO::IdentifyResultL()
-	{
-	TIdentityId identityId;
-	HBufC8* identityKey = NULL;
-	HBufC8* identityKeyHash = GenerateKeyHashL(iPinValue, identityKey);
-	CleanupStack::PushL(identityKeyHash);
-	CleanupStack::PushL(identityKey);	
-	identityId = iPinPluginDb->IdFromPin(*identityKeyHash);
-	if (identityId != KUnknownIdentity)
-		{
-		*iIdentityIdPtr = identityId;
-		iRetryRefCount = iRetryCount;
-		*iResult = identityKey;
-		iMessage = EPinPluginIdentificationSuccess;
-		iState = EInfo;
-		CleanupStack::Pop(identityKey);
-		}
-	else
-		{	
-		CleanupStack::PopAndDestroy(identityKey);
-		iState = EIdentify;
-		}
-	CleanupStack::PopAndDestroy(identityKeyHash);
-	TRequestStatus* status = &iStatus;
-	User::RequestComplete(status, KErrNone);
-	SetActive();
-	}
-		
-void CPinPluginAO::TrainIdL()
-	{
-        // Check for invalid pinsize.
-	if( !(iNewPinSize >= iPinMinSize && iNewPinSize <= iPinMaxSize)  )
-                {
-                User::Leave(KErrAuthServRegistrationFailed);
-                }
-
-
-	iPinList.ResetAndDestroy();
-	iIdKeyList.ResetAndDestroy();
-	iIdKeyHashList.ResetAndDestroy();
-	GenerateUniquePinsL(iPinList, iIdKeyList, iIdKeyHashList);
-	TInt indexValue = iPinPluginDb->IdIndex(iIdentityId);
-	TPinPluginTrainingMessage trainMessage;
-	if (indexValue >= 0)
-		{
-		trainMessage = EReTraining;
-		}
-	else
-		{
-		trainMessage = ETraining;
-		}
-	iPinPluginDialog->PinTraining(trainMessage, iPinList, iPinMinSize, iPinMaxSize, iIndex, iNewPinSize, *iDialogResult, iStatus);
-	iState = ETrainResult;
-	SetActive();	
-	}
-
-void CPinPluginAO::AddTrainResultToDBL()
-	{
-	__ASSERT_ALWAYS(iIndex >= KIndexLow && iIndex <= KIndexHigh,
-		User::Panic(KPinPluginPanicString(), EPinPanicIncorrectIndex));
-
-	TInt indexValue = iPinPluginDb->IdIndex(iIdentityId);
-	if (indexValue >= 0)
-		{
-		iPinPluginDb->UpdatePinL(iIdentityId, *iIdKeyHashList[iIndex]);
-		iMessage = EPinPluginReTrainingSuccess;
-		}
-	else
-		{
-		iPinPluginDb->AddPinL(iIdentityId, *iIdKeyHashList[iIndex]);
-		iMessage = EPinPluginTrainingSuccess;
-		}
-	TPtrC8 idKeyPtr = *iIdKeyList[iIndex];
-	HBufC8* identityKey = idKeyPtr.AllocL();
-	*iResult = identityKey;
-	iNewPinSize = iPinSize;
-	iState = EInfo;
-	TRequestStatus* status = &iStatus;
-	User::RequestComplete(status, KErrNone);
-	SetActive();
-	}
-
-HBufC8* CPinPluginAO::GenerateKeyHashL(TPinValue& aPinValue, HBufC8*& aIdentityKey)
-	{
-	CSHA1* sha1 = CSHA1::NewL();
-	CleanupStack::PushL(sha1);
-	HBufC8* pinValue = aPinValue.AllocLC();
-	TPtrC8 hash = sha1->Hash(*pinValue);
-	CleanupStack::PopAndDestroy(pinValue);
-	aIdentityKey = hash.AllocLC();
-	TPtrC8 hash1 = sha1->Hash(hash);
-	HBufC8* idkeyHash = hash1.AllocL();
-	CleanupStack::Pop(aIdentityKey);
-	CleanupStack::PopAndDestroy(sha1);
-	return idkeyHash;
-	}
-	
-	
-void CPinPluginAO::GenerateUniquePinsL(RPointerArray<TPinValue>& aPinList,
-		RPointerArray<HBufC8>& aIdKeyList, RPointerArray<HBufC8>& aIdKeyHashList)
-	{
-	TInt count = 4; 
-	while (count)
-		{
-		TPinValue* randomPin = new (ELeave) TPinValue;
-		CleanupStack::PushL(randomPin);
-		for (TInt k = 0; k < iNewPinSize ; k++)
-			{
-			TUint8 num = Math::Random();
-			num = num % 10;
-			randomPin->AppendNum(num);
-			}
-		HBufC8* identityKey = NULL;
-		HBufC8* identityKeyHash = GenerateKeyHashL(*randomPin, identityKey);
-		CleanupStack::PushL(identityKeyHash);
-		CleanupStack::PushL(identityKey);
-		if (iPinPluginDb->IsUniquePin(*identityKeyHash))
-			{
-			aIdKeyList.AppendL(identityKey);
-			CleanupStack::Pop(identityKey);
-			aIdKeyHashList.AppendL(identityKeyHash);
-			CleanupStack::Pop(identityKeyHash);
-			aPinList.AppendL(randomPin);
-			CleanupStack::Pop(randomPin);
-			count--;
-			}
-		}
-	}
-
-
-
-
-
-
-
-
-
-
-	
-	
-	
-