realtimenetprots/sipfw/SIP/SIPSec/DigestPlugin/src/CSIPSecDigestCacheEntry.cpp
changeset 0 307788aac0a8
--- /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 <uri8.h>
+
+
+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;
+	}