diff -r 352850cbed81 -r 9f4e37332ce5 vpnengine/ikev1lib/src/credentialcache.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vpnengine/ikev1lib/src/credentialcache.cpp Thu Aug 19 10:54:34 2010 +0300 @@ -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 + +#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; +} + + +/***/