--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/ikev1lib/src/credentialcache.cpp Wed Sep 01 12:23:21 2010 +0100
@@ -0,0 +1,260 @@
+ /*
+* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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: Cache for authentication credentials
+*
+*/
+
+#include <f32file.h>
+
+#include "credentialcache.h"
+#include "ikedebug.h"
+#include "cmutils.h"
+
+
+_LIT( KFileName, "cache" );
+
+
+CCredentialCache* CCredentialCache::NewL( MIkeDebug& aDebug )
+{
+ CCredentialCache* cache = new (ELeave) CCredentialCache( aDebug );
+
+ CleanupStack::PushL( cache );
+
+ cache->ConstructL();
+
+ CleanupStack::Pop();
+
+ return cache;
+}
+
+
+CCredentialCache::CCredentialCache( MIkeDebug& aDebug )
+ : iDebug( aDebug )
+{
+}
+
+
+void CCredentialCache::ConstructL()
+{
+ User::LeaveIfError( iFs.Connect() );
+
+ DEBUG_LOG( _L( "CCredentialCache::ConstructL" ) );
+}
+
+
+CCredentialCache::~CCredentialCache()
+{
+ iFs.Close();
+}
+
+
+void CCredentialCache::SetUserName( const TDesC8& aUser )
+{
+ if( KErrNone != CheckCredential( aUser ) )
+ {
+ return;
+ }
+
+ iBuf.iUser.Copy( aUser );
+}
+
+
+void CCredentialCache::SetSecret( const TDesC8& aSecret )
+{
+ if( KErrNone != CheckCredential( aSecret ) )
+ {
+ return;
+ }
+
+ iBuf.iSecret.Copy( aSecret );
+}
+
+
+TInt CCredentialCache::GetCredentials(
+ const TUint32 aVpnApId, HBufC8*& aUser, HBufC8*& aSecret )
+{
+ TInt ret = KErrNone;
+
+ TRAPD( err, ret = GetCredentialsL( aVpnApId, aUser, aSecret ) );
+
+ if( KErrNone != err )
+ {
+ DEBUG_LOG1( _L("CCredentialCache::GetCredentials, err=%d"), err );
+ return err;
+ }
+
+ return ret;
+}
+
+
+TInt CCredentialCache::GetCredentialsL(
+ const TUint32 aVpnApId, HBufC8*& aUser, HBufC8*& aSecret )
+{
+ TInt ret = ReadFile();
+
+ if( KErrNone != ret )
+ {
+ return ret;
+ }
+
+ TVpnPolicyId id;
+
+ CmUtils::GetPolicyIdL( aVpnApId, id );
+
+ if( id != iBuf.iId )
+ {
+ DEBUG_LOG1(
+ _L("CCredentialCache::GetCredentialsL, pol=%S"), &iBuf.iId
+ );
+
+ return KErrNotFound;
+ }
+
+ aUser = iBuf.iUser.AllocL();
+ aSecret = iBuf.iSecret.AllocL();
+
+ return KErrNone;
+}
+
+
+void CCredentialCache::Store( const TUint32 aVpnApId )
+{
+ TRAPD( err, StoreL( aVpnApId ) );
+
+ if( KErrNone != err )
+ {
+ DEBUG_LOG1( _L("CCredentialCache::Store, err=%d"), err );
+ }
+}
+
+
+void CCredentialCache::StoreL( const TUint32 aVpnApId )
+{
+ CmUtils::GetPolicyIdL( aVpnApId, iBuf.iId );
+
+ StoreToFileL();
+}
+
+
+void CCredentialCache::Clear()
+{
+ TInt ret = CreateFileNameAndPath();
+
+ if( KErrNone != ret )
+ {
+ return;
+ }
+
+ ret = iFs.Delete( iFileName );
+
+ if( KErrNone != ret )
+ {
+ DEBUG_LOG1( _L("CCredentialCache::Clear, ret=%d"), ret );
+ }
+}
+
+
+TInt CCredentialCache::CheckCredential( const TDesC8& cr )
+{
+ TInt len = cr.Length();
+
+ if( 0 == len || KCredentialMaxLen < len )
+ {
+ DEBUG_LOG1( _L("CCredentialCache::CheckCredential, len=%d"), len );
+ return KErrArgument;
+ }
+
+ return KErrNone;
+}
+
+
+void CCredentialCache::StoreToFileL()
+{
+ RFile cache;
+
+ User::LeaveIfError( CreateFileNameAndPath() );
+
+ User::LeaveIfError( cache.Replace(
+ iFs, iFileName, EFileShareExclusive | EFileWrite
+ ) );
+
+ CleanupClosePushL( cache );
+
+ TPckg< TCacheBuffer > data( iBuf );
+
+ User::LeaveIfError( cache.Write( data ) );
+
+ CleanupStack::PopAndDestroy( &cache );
+}
+
+
+TInt CCredentialCache::ReadFile()
+{
+ RFile cache;
+
+ TInt ret = cache.Open( iFs, KFileName, EFileRead );
+
+ if( KErrNone != ret )
+ {
+ return ret;
+ }
+
+ TInt size = 0;
+
+ ret = cache.Size( size );
+
+ TPckg< TCacheBuffer > data( iBuf );
+
+ if( size != data.Size() )
+ {
+ DEBUG_LOG1( _L("CCredentialCache::ReadFile, size=%d"), size );
+ cache.Close();
+ Clear();
+ return KErrCorrupt;
+ }
+
+ ret = cache.Read( data );
+
+ cache.Close();
+
+ return ret;
+}
+
+
+TInt CCredentialCache::CreateFileNameAndPath()
+{
+ TInt ret = iFs.CreatePrivatePath( RFs::GetSystemDrive() );
+
+ if( KErrNone != ret &&
+ KErrAlreadyExists != ret )
+ {
+ DEBUG_LOG1( _L("CCredentialCache, CreatePrivatePath ret=%d"), ret );
+ return ret;
+ }
+
+ ret = iFs.PrivatePath( iFileName );
+
+ if( KErrNone != ret )
+ {
+ DEBUG_LOG1( _L("CCredentialCache, PrivatePath ret=%d"), ret );
+ return ret;
+ }
+
+ iFileName.Append( KFileName );
+
+ return KErrNone;
+}
+
+
+/***/