--- a/cryptoservices/filebasedcertificateandkeystores/source/keystore/Server/keystorepassphrase.cpp Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptoservices/filebasedcertificateandkeystores/source/keystore/Server/keystorepassphrase.cpp Thu Sep 10 14:01:51 2009 +0300
@@ -1,449 +1,449 @@
-/*
-* Copyright (c) 2004-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 "keystorepassphrase.h"
-#include "FSDialog.h"
-#include "pbedata.h"
-#include "fstokenutil.h"
-#include <mctauthobject.h>
-#include <securityerr.h>
-
-const int KRetryCount = 3;
-
-// TPasswordManager ////////////////////////////////////////////////////////////
-
-/*static*/ void TPasswordManager::GetPassword(FSResources::TStrings aLabel,
- TPINValue& aValue,
- TRequestStatus& aStatus,
- TBool aRetry)
- {
- TPINParams params;
-
- params.iPINLabel = FSResources::Strings()[aLabel];
- params.iMinLength = 0;
- params.iMaxLength = KMaxPINLength;
-
- FSDialog::Dialog()->EnterPIN(params, aRetry, aValue, aStatus);
- }
-
-/*static*/ void TPasswordManager::KeystorePassword(TPINValue& aValue,
- TRequestStatus& aStatus,
- TBool aRetry)
- {
- GetPassword(FSResources::EPinGLabel, aValue, aStatus, aRetry);
- }
-
-/*static*/ void TPasswordManager::CreatePassword(TPINValue& aValue,
- TRequestStatus& aStatus)
- {
- GetPassword(FSResources::ECreatePinGLabel, aValue, aStatus);
- }
-
-/*static*/ void TPasswordManager::ImportPassword(TPINValue& aValue,
- TRequestStatus& aStatus)
- {
- GetPassword(FSResources::EImportPassphraseLabel, aValue, aStatus);
- }
-
-/*static*/ void TPasswordManager::ExportPassword(TPINValue& aValue,
- TRequestStatus& aStatus)
- {
- GetPassword(FSResources::EExportPassphraseLabel, aValue, aStatus);
- }
-
-/*static*/ void TPasswordManager::Cancel()
- {
- FSDialog::Dialog()->Cancel();
- }
-
-
-// CPassphrase /////////////////////////////////////////////////////////////////
-
-CPassphrase* CPassphrase::NewLC(TInt aTimeout, CStreamStore& aStore,
- TStreamId aStreamId, const TDesC& aPassphrase)
- {
- CPassphrase* self = new (ELeave) CPassphrase(aStore, aTimeout);
- CleanupStack::PushL(self);
- self->ConstructL(aStreamId, aPassphrase);
- return self;
- }
-
-CPassphrase* CPassphrase::NewL(TInt aTimeout, CStreamStore& aStore,
- TStreamId aStreamId, const TDesC& aPassphrase)
- {
- CPassphrase* self = NewLC(aTimeout, aStore, aStreamId, aPassphrase);
- CleanupStack::Pop(self);
- return self;
- }
-
-CPassphrase* CPassphrase::NewLC(TInt aTimeout, CStreamStore& aStore,
- const TDesC& aPassphrase)
- {
- CPassphrase* self = new (ELeave) CPassphrase(aStore, aTimeout);
- CleanupStack::PushL(self);
- self->ConstructL(aPassphrase);
- return self;
- }
-
-CPassphrase* CPassphrase::NewL(TInt aTimeout, CStreamStore& aStore,
- const TDesC& aPassphrase)
- {
- CPassphrase* self = NewLC(aTimeout, aStore, aPassphrase);
- CleanupStack::Pop(self);
- return self;
- }
-
-CPassphrase::CPassphrase(CStreamStore& aStore, TInt aTimeout)
- : iStore(aStore)
- {
- iExpires = (aTimeout != KTimeoutNever);
- if (iExpires)
- {
- iExpiryTime.UniversalTime();
- iExpiryTime += TTimeIntervalSeconds(aTimeout);
- }
- }
-
-void CPassphrase::ConstructL(TStreamId aStreamId, const TDesC& aPassphrase)
- {
- iStreamId = aStreamId;
-
- RStoreReadStream stream;
- stream.OpenLC(iStore, iStreamId);
- HBufC8* encryptedMasterKey = HBufC8::NewLC(stream, 10000); //some large number
- CPBEncryptionData* encryptionData = CPBEncryptionData::NewLC(stream);
- iSecurity = CPBEncryptSet::NewL(*encryptionData, *encryptedMasterKey, aPassphrase);
- CleanupStack::PopAndDestroy(3); // encryptionData, encryptedMasterKey, stream
- iSecureStore = CSecureStore::NewL(iStore, *iSecurity);
- }
-
-void CPassphrase::ConstructL(const TDesC& aPassphrase)
- {
- TPBPassword password(aPassphrase);
- iSecurity = CPBEncryptSet::NewL(password, ECipherAES_CBC_256);
-
- RStoreWriteStream stream;
- iStreamId = stream.CreateLC(iStore);
- stream << iSecurity->EncryptedMasterKey();
- iSecurity->EncryptionData().ExternalizeL(stream);
- stream.CommitL();
- CleanupStack::PopAndDestroy(); // stream
-
- iSecureStore = CSecureStore::NewL(iStore, *iSecurity);
- }
-
-CPassphrase::~CPassphrase()
- {
- delete iSecurity;
- delete iSecureStore;
- }
-
-TInt CPassphrase::TimeRemainingL(const TTime& aCurrentTime) const
- {
- if (iExpires)
- {
- TTimeIntervalSeconds seconds;
- User::LeaveIfError(iExpiryTime.SecondsFrom(aCurrentTime, seconds));
- TInt result = seconds.Int();
- if (result < 0)
- {
- result = 0;
- }
- return result;
- }
- else
- {
- return KTimeoutNever;
- }
- }
-
-void CPassphrase::RevertStore(TAny* aStore)
- {
- // This is a CleanupItem
- CStreamStore* store = reinterpret_cast<CStreamStore*>(aStore);
- TRAP_IGNORE(store->RevertL());
- }
-
-void CPassphrase::ChangePassphraseL(const TDesC& aNewPassphrase)
- {
- iSecurity->ChangePasswordL(aNewPassphrase);
-
- TCleanupItem cleanupStore(RevertStore, &iStore);
- CleanupStack::PushL(cleanupStore);
-
- RStoreWriteStream stream;
- stream.ReplaceLC(iStore, iStreamId);
- stream << iSecurity->EncryptedMasterKey();
- iSecurity->EncryptionData().ExternalizeL(stream);
- stream.CommitL();
- CleanupStack::PopAndDestroy(); // stream
- iStore.CommitL();
- CleanupStack::Pop(); // cleanupStore
- }
-
-CStreamStore& CPassphrase::Store() const
- {
- return *iSecureStore;
- }
-
-TStreamId CPassphrase::StreamId() const
- {
- return iStreamId;
- }
-
-// CPassphraseManager //////////////////////////////////////////////////////////
-
-CPassphraseManager* CPassphraseManager::NewL(CStreamStore& aStore)
- {
- return new (ELeave) CPassphraseManager(aStore);
- }
-
-CPassphraseManager::CPassphraseManager(CStreamStore& aStore)
- : CActive(EPriorityNormal), iStore(aStore)
- {
- CActiveScheduler::Add(this);
- }
-
-CPassphraseManager::~CPassphraseManager()
- {
- Cancel();
- iCache.ResetAndDestroy();
- }
-
-/** Return a cached passphrase if present, otherwise return NULL. */
-CPassphrase* CPassphraseManager::GetCachedPassphrase(TStreamId aStreamId)
- {
- for (TInt i = 0 ; i < iCache.Count() ; ++i)
- {
- CPassphrase* p = iCache[i];
- if (p->StreamId() == aStreamId)
- {
- return p;
- }
- }
-
- return NULL;
- }
-
-void CPassphraseManager::GetPassphrase(TStreamId aStreamId,
- TInt aTimeout,
- CPassphrase*& aPassphrase,
- TRequestStatus& aStatus)
- {
- ASSERT(iTimeout >= KTimeoutNever);
- CPassphrase* p = GetCachedPassphrase(aStreamId);
- if (p)
- {
- aPassphrase = p;
- TRequestStatus* status = &aStatus;
- User::RequestComplete(status, KErrNone);
- }
- else
- {
- iRetries = KRetryCount;
- iClientStatus = &aStatus;
- aStatus = KRequestPending;
- iNewPassphraseStream = aStreamId;
- iTimeout = aTimeout;
- iNewPassphrasePtr = &aPassphrase;
- iState = EGetPassphrase;
- TPasswordManager::KeystorePassword(iNewPassphrase, iStatus);
- SetActive();
- }
- }
-
-void CPassphraseManager::CreatePassphrase(TInt aTimeout,
- CPassphrase*& aPassphrase,
- TRequestStatus& aStatus)
- {
- ASSERT(iTimeout >= -1);
- iClientStatus = &aStatus;
- aStatus = KRequestPending;
- iTimeout = aTimeout;
- iNewPassphrasePtr = &aPassphrase;
- iState = ECreatePassphrase;
- TPasswordManager::CreatePassword(iNewPassphrase, iStatus);
- SetActive();
- }
-
-void CPassphraseManager::ChangePassphrase(TStreamId aStreamId, TRequestStatus& aStatus)
- {
- iRetries = KRetryCount;
- iClientStatus = &aStatus;
- aStatus = KRequestPending;
- iNewPassphraseStream = aStreamId;
- iState = EChangePassphrase;
-
- TPINParams params;
- params.iPINLabel =
- FSResources::Strings()[FSResources::EPinGLabel];
- params.iMinLength = 0;
- params.iMaxLength = KMaxPINLength;
-
- FSDialog::Dialog()->ChangePIN(params, EFalse, iOldPassphrase, iNewPassphrase, iStatus);
- SetActive();
- }
-
-void CPassphraseManager::RunL()
- {
- User::LeaveIfError(iStatus.Int());
-
- switch (iState)
- {
- case EGetPassphrase:
- {
- TRAPD(err, HandleGetPassphraseL());
- if (err == KErrBadPassphrase && --iRetries > 0)
- {
- TPasswordManager::KeystorePassword(iNewPassphrase, iStatus, ETrue);
- SetActive();
- }
- else
- {
- User::LeaveIfError(err);
- }
- }
- break;
-
- case ECreatePassphrase:
- {
- CPassphrase* phrase = CPassphrase::NewLC(iTimeout, iStore,
- iNewPassphrase);
- *iNewPassphrasePtr = phrase;
- User::LeaveIfError(iCache.Append(phrase));
- CleanupStack::Pop(phrase);
- Complete(KErrNone);
- }
- break;
-
- case EChangePassphrase:
- {
- CPassphrase* phrase = NULL;
- TRAPD(err, phrase = CPassphrase::NewL( 0,
- iStore,
- iNewPassphraseStream,
- iOldPassphrase));
-
- if(KErrBadPassphrase == err && --iRetries > 0)
- {
- TPINParams params;
- params.iPINLabel = FSResources::Strings()[FSResources::EPinGLabel];
- params.iMinLength = 0;
- params.iMaxLength = KMaxPINLength;
-
- FSDialog::Dialog()->ChangePIN(params, ETrue, iOldPassphrase, iNewPassphrase, iStatus);
- SetActive();
- break;
- }
-
- if(KErrNone != err)
- {
- User::Leave(err);
- }
-
- CleanupStack::PushL(phrase);
-
- phrase->ChangePassphraseL(iNewPassphrase);
- RemoveCachedPassphrases(phrase->StreamId());
- CleanupStack::PopAndDestroy(phrase);
- Complete(KErrNone);
- }
- break;
-
- default:
- PanicServer(EPanicInvalidState);
- }
-
- }
-
-void CPassphraseManager::HandleGetPassphraseL()
- {
- CPassphrase* phrase = CPassphrase::NewLC(iTimeout, iStore,
- iNewPassphraseStream,
- iNewPassphrase);
- *iNewPassphrasePtr = phrase;
- User::LeaveIfError(iCache.Append(phrase));
- CleanupStack::Pop(phrase);
- Complete(KErrNone);
- }
-
-TInt CPassphraseManager::RunError(TInt aError)
- {
- Complete(aError);
- return KErrNone;
- }
-
-void CPassphraseManager::DoCancel()
- {
- TPasswordManager::Cancel();
- RunError(KErrCancel);
- }
-
-void CPassphraseManager::Complete(TInt aError)
- {
- iNewPassphrasePtr = NULL;
- iState = EIdle;
- if (iClientStatus)
- {
- User::RequestComplete(iClientStatus, aError);
- }
- }
-
-void CPassphraseManager::ExpireCacheL()
- {
- TTime timeNow;
- timeNow.UniversalTime();
-
- for (TInt i = iCache.Count() - 1; i >= 0; --i)
- {
- CPassphrase* passphrase = iCache[i];
- if (passphrase->TimeRemainingL(timeNow) == 0)
- {
- iCache.Remove(i);
- delete passphrase;
- }
- }
- }
-
-void CPassphraseManager::RemoveCachedPassphrases(TStreamId aStreamId)
- {
- for (TInt i = iCache.Count() - 1; i >= 0; --i)
- {
- CPassphrase* passphrase = iCache[i];
- if (aStreamId == KNullStreamId || passphrase->StreamId() == aStreamId)
- {
- iCache.Remove(i);
- delete passphrase;
- }
- }
- }
-
-TInt CPassphraseManager::TimeRemainingL(TStreamId aStreamId)
- {
- CPassphrase* passphrase = GetCachedPassphrase(aStreamId);
- if (passphrase)
- {
- TTime timeNow;
- timeNow.UniversalTime();
- return passphrase->TimeRemainingL(timeNow);
- }
- else
- {
- return 0;
- }
- }
+/*
+* Copyright (c) 2004-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 "keystorepassphrase.h"
+#include "FSDialog.h"
+#include "pbedata.h"
+#include "fstokenutil.h"
+#include <mctauthobject.h>
+#include <securityerr.h>
+
+const int KRetryCount = 3;
+
+// TPasswordManager ////////////////////////////////////////////////////////////
+
+/*static*/ void TPasswordManager::GetPassword(FSResources::TStrings aLabel,
+ TPINValue& aValue,
+ TRequestStatus& aStatus,
+ TBool aRetry)
+ {
+ TPINParams params;
+
+ params.iPINLabel = FSResources::Strings()[aLabel];
+ params.iMinLength = 0;
+ params.iMaxLength = KMaxPINLength;
+
+ FSDialog::Dialog()->EnterPIN(params, aRetry, aValue, aStatus);
+ }
+
+/*static*/ void TPasswordManager::KeystorePassword(TPINValue& aValue,
+ TRequestStatus& aStatus,
+ TBool aRetry)
+ {
+ GetPassword(FSResources::EPinGLabel, aValue, aStatus, aRetry);
+ }
+
+/*static*/ void TPasswordManager::CreatePassword(TPINValue& aValue,
+ TRequestStatus& aStatus)
+ {
+ GetPassword(FSResources::ECreatePinGLabel, aValue, aStatus);
+ }
+
+/*static*/ void TPasswordManager::ImportPassword(TPINValue& aValue,
+ TRequestStatus& aStatus)
+ {
+ GetPassword(FSResources::EImportPassphraseLabel, aValue, aStatus);
+ }
+
+/*static*/ void TPasswordManager::ExportPassword(TPINValue& aValue,
+ TRequestStatus& aStatus)
+ {
+ GetPassword(FSResources::EExportPassphraseLabel, aValue, aStatus);
+ }
+
+/*static*/ void TPasswordManager::Cancel()
+ {
+ FSDialog::Dialog()->Cancel();
+ }
+
+
+// CPassphrase /////////////////////////////////////////////////////////////////
+
+CPassphrase* CPassphrase::NewLC(TInt aTimeout, CStreamStore& aStore,
+ TStreamId aStreamId, const TDesC& aPassphrase)
+ {
+ CPassphrase* self = new (ELeave) CPassphrase(aStore, aTimeout);
+ CleanupStack::PushL(self);
+ self->ConstructL(aStreamId, aPassphrase);
+ return self;
+ }
+
+CPassphrase* CPassphrase::NewL(TInt aTimeout, CStreamStore& aStore,
+ TStreamId aStreamId, const TDesC& aPassphrase)
+ {
+ CPassphrase* self = NewLC(aTimeout, aStore, aStreamId, aPassphrase);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CPassphrase* CPassphrase::NewLC(TInt aTimeout, CStreamStore& aStore,
+ const TDesC& aPassphrase)
+ {
+ CPassphrase* self = new (ELeave) CPassphrase(aStore, aTimeout);
+ CleanupStack::PushL(self);
+ self->ConstructL(aPassphrase);
+ return self;
+ }
+
+CPassphrase* CPassphrase::NewL(TInt aTimeout, CStreamStore& aStore,
+ const TDesC& aPassphrase)
+ {
+ CPassphrase* self = NewLC(aTimeout, aStore, aPassphrase);
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+CPassphrase::CPassphrase(CStreamStore& aStore, TInt aTimeout)
+ : iStore(aStore)
+ {
+ iExpires = (aTimeout != KTimeoutNever);
+ if (iExpires)
+ {
+ iExpiryTime.UniversalTime();
+ iExpiryTime += TTimeIntervalSeconds(aTimeout);
+ }
+ }
+
+void CPassphrase::ConstructL(TStreamId aStreamId, const TDesC& aPassphrase)
+ {
+ iStreamId = aStreamId;
+
+ RStoreReadStream stream;
+ stream.OpenLC(iStore, iStreamId);
+ HBufC8* encryptedMasterKey = HBufC8::NewLC(stream, 10000); //some large number
+ CPBEncryptionData* encryptionData = CPBEncryptionData::NewLC(stream);
+ iSecurity = CPBEncryptSet::NewL(*encryptionData, *encryptedMasterKey, aPassphrase);
+ CleanupStack::PopAndDestroy(3); // encryptionData, encryptedMasterKey, stream
+ iSecureStore = CSecureStore::NewL(iStore, *iSecurity);
+ }
+
+void CPassphrase::ConstructL(const TDesC& aPassphrase)
+ {
+ TPBPassword password(aPassphrase);
+ iSecurity = CPBEncryptSet::NewL(password, ECipherAES_CBC_256);
+
+ RStoreWriteStream stream;
+ iStreamId = stream.CreateLC(iStore);
+ stream << iSecurity->EncryptedMasterKey();
+ iSecurity->EncryptionData().ExternalizeL(stream);
+ stream.CommitL();
+ CleanupStack::PopAndDestroy(); // stream
+
+ iSecureStore = CSecureStore::NewL(iStore, *iSecurity);
+ }
+
+CPassphrase::~CPassphrase()
+ {
+ delete iSecurity;
+ delete iSecureStore;
+ }
+
+TInt CPassphrase::TimeRemainingL(const TTime& aCurrentTime) const
+ {
+ if (iExpires)
+ {
+ TTimeIntervalSeconds seconds;
+ User::LeaveIfError(iExpiryTime.SecondsFrom(aCurrentTime, seconds));
+ TInt result = seconds.Int();
+ if (result < 0)
+ {
+ result = 0;
+ }
+ return result;
+ }
+ else
+ {
+ return KTimeoutNever;
+ }
+ }
+
+void CPassphrase::RevertStore(TAny* aStore)
+ {
+ // This is a CleanupItem
+ CStreamStore* store = reinterpret_cast<CStreamStore*>(aStore);
+ TRAP_IGNORE(store->RevertL());
+ }
+
+void CPassphrase::ChangePassphraseL(const TDesC& aNewPassphrase)
+ {
+ iSecurity->ChangePasswordL(aNewPassphrase);
+
+ TCleanupItem cleanupStore(RevertStore, &iStore);
+ CleanupStack::PushL(cleanupStore);
+
+ RStoreWriteStream stream;
+ stream.ReplaceLC(iStore, iStreamId);
+ stream << iSecurity->EncryptedMasterKey();
+ iSecurity->EncryptionData().ExternalizeL(stream);
+ stream.CommitL();
+ CleanupStack::PopAndDestroy(); // stream
+ iStore.CommitL();
+ CleanupStack::Pop(); // cleanupStore
+ }
+
+CStreamStore& CPassphrase::Store() const
+ {
+ return *iSecureStore;
+ }
+
+TStreamId CPassphrase::StreamId() const
+ {
+ return iStreamId;
+ }
+
+// CPassphraseManager //////////////////////////////////////////////////////////
+
+CPassphraseManager* CPassphraseManager::NewL(CStreamStore& aStore)
+ {
+ return new (ELeave) CPassphraseManager(aStore);
+ }
+
+CPassphraseManager::CPassphraseManager(CStreamStore& aStore)
+ : CActive(EPriorityNormal), iStore(aStore)
+ {
+ CActiveScheduler::Add(this);
+ }
+
+CPassphraseManager::~CPassphraseManager()
+ {
+ Cancel();
+ iCache.ResetAndDestroy();
+ }
+
+/** Return a cached passphrase if present, otherwise return NULL. */
+CPassphrase* CPassphraseManager::GetCachedPassphrase(TStreamId aStreamId)
+ {
+ for (TInt i = 0 ; i < iCache.Count() ; ++i)
+ {
+ CPassphrase* p = iCache[i];
+ if (p->StreamId() == aStreamId)
+ {
+ return p;
+ }
+ }
+
+ return NULL;
+ }
+
+void CPassphraseManager::GetPassphrase(TStreamId aStreamId,
+ TInt aTimeout,
+ CPassphrase*& aPassphrase,
+ TRequestStatus& aStatus)
+ {
+ ASSERT(iTimeout >= KTimeoutNever);
+ CPassphrase* p = GetCachedPassphrase(aStreamId);
+ if (p)
+ {
+ aPassphrase = p;
+ TRequestStatus* status = &aStatus;
+ User::RequestComplete(status, KErrNone);
+ }
+ else
+ {
+ iRetries = KRetryCount;
+ iClientStatus = &aStatus;
+ aStatus = KRequestPending;
+ iNewPassphraseStream = aStreamId;
+ iTimeout = aTimeout;
+ iNewPassphrasePtr = &aPassphrase;
+ iState = EGetPassphrase;
+ TPasswordManager::KeystorePassword(iNewPassphrase, iStatus);
+ SetActive();
+ }
+ }
+
+void CPassphraseManager::CreatePassphrase(TInt aTimeout,
+ CPassphrase*& aPassphrase,
+ TRequestStatus& aStatus)
+ {
+ ASSERT(iTimeout >= -1);
+ iClientStatus = &aStatus;
+ aStatus = KRequestPending;
+ iTimeout = aTimeout;
+ iNewPassphrasePtr = &aPassphrase;
+ iState = ECreatePassphrase;
+ TPasswordManager::CreatePassword(iNewPassphrase, iStatus);
+ SetActive();
+ }
+
+void CPassphraseManager::ChangePassphrase(TStreamId aStreamId, TRequestStatus& aStatus)
+ {
+ iRetries = KRetryCount;
+ iClientStatus = &aStatus;
+ aStatus = KRequestPending;
+ iNewPassphraseStream = aStreamId;
+ iState = EChangePassphrase;
+
+ TPINParams params;
+ params.iPINLabel =
+ FSResources::Strings()[FSResources::EPinGLabel];
+ params.iMinLength = 0;
+ params.iMaxLength = KMaxPINLength;
+
+ FSDialog::Dialog()->ChangePIN(params, EFalse, iOldPassphrase, iNewPassphrase, iStatus);
+ SetActive();
+ }
+
+void CPassphraseManager::RunL()
+ {
+ User::LeaveIfError(iStatus.Int());
+
+ switch (iState)
+ {
+ case EGetPassphrase:
+ {
+ TRAPD(err, HandleGetPassphraseL());
+ if (err == KErrBadPassphrase && --iRetries > 0)
+ {
+ TPasswordManager::KeystorePassword(iNewPassphrase, iStatus, ETrue);
+ SetActive();
+ }
+ else
+ {
+ User::LeaveIfError(err);
+ }
+ }
+ break;
+
+ case ECreatePassphrase:
+ {
+ CPassphrase* phrase = CPassphrase::NewLC(iTimeout, iStore,
+ iNewPassphrase);
+ *iNewPassphrasePtr = phrase;
+ User::LeaveIfError(iCache.Append(phrase));
+ CleanupStack::Pop(phrase);
+ Complete(KErrNone);
+ }
+ break;
+
+ case EChangePassphrase:
+ {
+ CPassphrase* phrase = NULL;
+ TRAPD(err, phrase = CPassphrase::NewL( 0,
+ iStore,
+ iNewPassphraseStream,
+ iOldPassphrase));
+
+ if(KErrBadPassphrase == err && --iRetries > 0)
+ {
+ TPINParams params;
+ params.iPINLabel = FSResources::Strings()[FSResources::EPinGLabel];
+ params.iMinLength = 0;
+ params.iMaxLength = KMaxPINLength;
+
+ FSDialog::Dialog()->ChangePIN(params, ETrue, iOldPassphrase, iNewPassphrase, iStatus);
+ SetActive();
+ break;
+ }
+
+ if(KErrNone != err)
+ {
+ User::Leave(err);
+ }
+
+ CleanupStack::PushL(phrase);
+
+ phrase->ChangePassphraseL(iNewPassphrase);
+ RemoveCachedPassphrases(phrase->StreamId());
+ CleanupStack::PopAndDestroy(phrase);
+ Complete(KErrNone);
+ }
+ break;
+
+ default:
+ PanicServer(EPanicInvalidState);
+ }
+
+ }
+
+void CPassphraseManager::HandleGetPassphraseL()
+ {
+ CPassphrase* phrase = CPassphrase::NewLC(iTimeout, iStore,
+ iNewPassphraseStream,
+ iNewPassphrase);
+ *iNewPassphrasePtr = phrase;
+ User::LeaveIfError(iCache.Append(phrase));
+ CleanupStack::Pop(phrase);
+ Complete(KErrNone);
+ }
+
+TInt CPassphraseManager::RunError(TInt aError)
+ {
+ Complete(aError);
+ return KErrNone;
+ }
+
+void CPassphraseManager::DoCancel()
+ {
+ TPasswordManager::Cancel();
+ RunError(KErrCancel);
+ }
+
+void CPassphraseManager::Complete(TInt aError)
+ {
+ iNewPassphrasePtr = NULL;
+ iState = EIdle;
+ if (iClientStatus)
+ {
+ User::RequestComplete(iClientStatus, aError);
+ }
+ }
+
+void CPassphraseManager::ExpireCacheL()
+ {
+ TTime timeNow;
+ timeNow.UniversalTime();
+
+ for (TInt i = iCache.Count() - 1; i >= 0; --i)
+ {
+ CPassphrase* passphrase = iCache[i];
+ if (passphrase->TimeRemainingL(timeNow) == 0)
+ {
+ iCache.Remove(i);
+ delete passphrase;
+ }
+ }
+ }
+
+void CPassphraseManager::RemoveCachedPassphrases(TStreamId aStreamId)
+ {
+ for (TInt i = iCache.Count() - 1; i >= 0; --i)
+ {
+ CPassphrase* passphrase = iCache[i];
+ if (aStreamId == KNullStreamId || passphrase->StreamId() == aStreamId)
+ {
+ iCache.Remove(i);
+ delete passphrase;
+ }
+ }
+ }
+
+TInt CPassphraseManager::TimeRemainingL(TStreamId aStreamId)
+ {
+ CPassphrase* passphrase = GetCachedPassphrase(aStreamId);
+ if (passphrase)
+ {
+ TTime timeNow;
+ timeNow.UniversalTime();
+ return passphrase->TimeRemainingL(timeNow);
+ }
+ else
+ {
+ return 0;
+ }
+ }