diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/SIPSec/DigestPlugin/src/CSIPSecDigestCacheEntry.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/SIPSec/DigestPlugin/src/CSIPSecDigestCacheEntry.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,167 @@ +// Copyright (c) 2008-2009 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: +// Name : CSIPSecDigestCacheEntry.cpp +// Part of : SIPSec +// Version : SIP/6.0 +// + + + +#include "CSIPSecDigestCacheEntry.h" +#include "sipsecplugincontext.h" +#include "CSIPSecUserRecord.h" +#include "CSIPSecSIMRecord.h" +#include "MSIPSecUser.h" +#include + + +const TInt CSIPSecDigestCacheEntry::iSIPSecOffset = + _FOFF( CSIPSecDigestCacheEntry, iLink ); + + +// ============================ MEMBER FUNCTIONS =============================== + +// ---------------------------------------------------------------------------- +// CSIPSecDigestCacheEntry::CSIPSecDigestCacheEntry +// ---------------------------------------------------------------------------- +// +CSIPSecDigestCacheEntry::CSIPSecDigestCacheEntry( const MSIPSecUser& aUser ) : + iUser( aUser ) + { + } + +// ---------------------------------------------------------------------------- +// CSIPSecDigestCacheEntry::ConstructL +// ---------------------------------------------------------------------------- +// +void CSIPSecDigestCacheEntry::ConstructL( CSIPSecDigest::TChallengeType aType, + const CUri8& aRemoteTarget ) + { + if ( aType == CSIPSecDigest::EEndPoint ) + { + iRemoteTarget = CUri8::NewL( aRemoteTarget.Uri() ); + } + } + +// ---------------------------------------------------------------------------- +// CSIPSecDigestCacheEntry::~CSIPSecDigestCacheEntry +// ---------------------------------------------------------------------------- +// +CSIPSecDigestCacheEntry::~CSIPSecDigestCacheEntry() + { + delete iRemoteTarget; + } + +// ----------------------------------------------------------------------------- +// CSIPSecDigestCacheEntry::UserData +// Once CSIPSecDigestCacheEntry has been constructed, iUserCredentials always +// exist. +// ----------------------------------------------------------------------------- +// +CSIPSecUserRecord& CSIPSecDigestCacheEntry::UserData() + { + __ASSERT_ALWAYS( iUserCredentials, + User::Panic( _L( "DigestCacheEntry:UserData !cred" ), KErrNotFound ) ); + + return *iUserCredentials; + } + +// ----------------------------------------------------------------------------- +// CSIPSecDigestCacheEntry::HoldsUserData +// ----------------------------------------------------------------------------- +// +TBool CSIPSecDigestCacheEntry::HoldsUserData( + const CSIPSecUserRecord& aUserData ) const + { + return iUserCredentials == &aUserData; + } + +// ----------------------------------------------------------------------------- +// CSIPSecDigestCacheEntry::SetUserData +// ----------------------------------------------------------------------------- +// +void CSIPSecDigestCacheEntry::SetUserData( CSIPSecUserRecord& aUserData ) + { + iUserCredentials = &aUserData; + iUserCredentials->CredentialsAttach(); + } + +// ---------------------------------------------------------------------------- +// CSIPSecDigestCacheEntry::Match +// ---------------------------------------------------------------------------- +// +TBool CSIPSecDigestCacheEntry::Match( TSIPSecPluginContext& aContext ) const + { + __ASSERT_ALWAYS( iUserCredentials, + User::Panic( _L( "DigestCacheEntry:Match !cred" ), KErrNotFound ) ); + + if ( IsUsedByUser( aContext.SIPSecUser(), + aContext.AlsoTrustedUser(), + aContext.RegistrationId() ) ) + { + switch ( Type( aContext ) ) + { + case CSIPSecDigest::EOutboundProxy: + return iUserCredentials->OutboundProxy().CompareF( + aContext.OutboundProxy() ) == 0; + + case CSIPSecDigest::EProxy: + return ETrue; // IsUsedByUser checked that SIPSec user is same + + default: // CSIPSecDigest::EEndPoint: + return iRemoteTarget && + ( iRemoteTarget->Uri().Equivalent( + aContext.RemoteTarget().Uri() ) == KErrNone ); + } + } + + return EFalse; + } + +// ---------------------------------------------------------------------------- +// CSIPSecDigestCacheEntry::IsUsedByUser +// ---------------------------------------------------------------------------- +// +TBool CSIPSecDigestCacheEntry::IsUsedByUser( const MSIPSecUser& aUser, + TBool aAlsoTrustedUser, + TRegistrationId aRegistrationId ) const + { + return CompareUsers( aUser, iUser, aAlsoTrustedUser, aRegistrationId ); + } + +// ---------------------------------------------------------------------------- +// CSIPSecDigestCacheEntry::CompareUsers +// SIPSec user can have only one trusted user. I.e. a trusted user doesn't +// have another trusted user. +// ---------------------------------------------------------------------------- +// +TBool CSIPSecDigestCacheEntry::CompareUsers( const MSIPSecUser& aUser, + const MSIPSecUser& aCachedUser, + TBool aAlsoTrustedUser, + TRegistrationId aRegistrationId ) + { + MSIPSecUser* user = const_cast< MSIPSecUser* >( &aUser ); + return ( user == &aCachedUser ) || + ( aAlsoTrustedUser && + user->TrustedUser( aRegistrationId ) == &aCachedUser ); + } + +// ---------------------------------------------------------------------------- +// CSIPSecDigestCacheEntry::SIPSecUser +// ---------------------------------------------------------------------------- +// +const MSIPSecUser& CSIPSecDigestCacheEntry::SIPSecUser() const + { + return iUser; + }