diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/SIPSec/TlsPlugin/src/csipsectlsplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/SIPSec/TlsPlugin/src/csipsectlsplugin.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,290 @@ +// 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 : csipsectlsplugin.cpp +// Part of : SIPSec TLS Plugin +// Version : %version: 2.1.1 % +// + + + +#include "TSIPTransportParams.h" +#include "MSIPTransportMgr.h" +#include "csipsectlsplugin.h" +#include "tsipsecmechanisminitparams.h" +#include "sipsecurityclientheader.h" +#include "sipsecurityserverheader.h" +#include "sipsecurityverifyheader.h" +#include "ctlscache.h" +#include "ctlsentry.h" + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::NewL +// ----------------------------------------------------------------------------- +// +CSIPSecTlsPlugin* CSIPSecTlsPlugin::NewL( TAny* aInitParams ) + { + __ASSERT_ALWAYS( aInitParams, User::Leave( KErrArgument ) ); + + CSIPSecTlsPlugin* self = new ( ELeave ) CSIPSecTlsPlugin( + static_cast< TSIPSecMechanismInitParams* > + ( aInitParams )->iTransportMgr ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::CSIPSecTlsPlugin +// ----------------------------------------------------------------------------- +// +CSIPSecTlsPlugin::CSIPSecTlsPlugin( MSIPTransportMgr& aTransportMgr ) : + iTransportMgr( aTransportMgr ) + { + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::ConstructL +// ----------------------------------------------------------------------------- +// +void CSIPSecTlsPlugin::ConstructL() + { + iCache = CTLSCache::NewL(); + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::~CSIPSecTlsPlugin +// ----------------------------------------------------------------------------- +// +CSIPSecTlsPlugin::~CSIPSecTlsPlugin() + { + delete iCache; + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::Name +// ----------------------------------------------------------------------------- +// +const TDesC8& CSIPSecTlsPlugin::Name() const + { + _LIT8( KSIPSecTLSName, "tls"); + return KSIPSecTLSName; + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::InitializeSecurityClientL +// Making the offer. +// ----------------------------------------------------------------------------- +// +void CSIPSecTlsPlugin::InitializeSecurityClientL( + CSIPSecurityClientHeader& aSecurityClient ) + { + aSecurityClient.SetMechanismNameL( Name() ); + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::ProcessSecurityVerifyL +// After the framework has chosen security mechanism. it calls this function of +// the selected mechanism for all outgoing requests using the security +// agreement. +// Check that both Security-Server and Security-Verify header exist for this +// mechanism. +// ----------------------------------------------------------------------------- +// +void CSIPSecTlsPlugin::ProcessSecurityVerifyL( + TSIPTransportParams& aTransportParams, + CSIPRequest& /*aRequest*/, + TInetAddr& aNextHop, + const CUri8& /*aRemoteTarget*/, + const TDesC8& /*aOutboundProxy*/, + MSIPSecUser* aUser, + TRegistrationId /*aRegistrationId*/, + RPointerArray& aSecurityServer, + RPointerArray& aSecurityVerify ) + { + __ASSERT_ALWAYS( aUser, User::Leave( KErrArgument ) ); + + TInt i = 0; + CSIPSecurityServerHeader* secServer = NULL; + for ( i = 0; i < aSecurityServer.Count() && !secServer; ++i ) + { + if ( aSecurityServer[i]->MechanismName().CompareF( Name() ) == 0 ) + { + secServer = aSecurityServer[i]; + } + } + __ASSERT_ALWAYS( secServer, User::Leave( KErrArgument ) ); + + CSIPSecurityVerifyHeader* secVerify = NULL; + for ( i = 0; i < aSecurityVerify.Count() && !secVerify; ++i ) + { + if ( aSecurityVerify[i]->MechanismName().CompareF( Name() ) == 0 ) + { + secVerify = aSecurityVerify[i]; + } + } + __ASSERT_ALWAYS( secVerify, User::Leave( KErrArgument ) ); + + ProcessRequestL( aTransportParams, aNextHop, *aUser ); + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::ProcessRequestL +// If no TLS connection to the next hop, create it. +// ----------------------------------------------------------------------------- +// +void CSIPSecTlsPlugin::ProcessRequestL( TSIPTransportParams& aTransportParams, + const TInetAddr& aNextHop, + const MSIPSecUser& aSIPSecUser ) + { + CTLSEntry* entry = iCache->SearchByNextHop( aNextHop ); + if ( !entry ) + { + iTransportMgr.CreateTLSTransportL( aTransportParams ); + + iCache->AddEntryL( aNextHop, + aTransportParams.TransportId(), + aSIPSecUser ); + } + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::AddSecurityParamsL +// Framework calls this function for all SIPSec plugins. +// ----------------------------------------------------------------------------- +// +void +CSIPSecTlsPlugin::AddSecurityParamsL( TSIPTransportParams& aTransportParams, + CSIPRequest& /*aRequest*/, + TRegistrationId /*aRegistrationId*/, + TTransactionId /*aTransactionId*/, + TInetAddr& aNextHop, + const CUri8& /*aRemoteTarget*/, + const TDesC8& /*aOutboundProxy*/, + MSIPSecUser* aUser ) + { + __ASSERT_ALWAYS( aUser, User::Leave( KErrArgument ) ); + + CTLSEntry* entry = iCache->SearchByNextHop( aNextHop ); + if ( entry ) + { + aTransportParams.SetTransportId( entry->TransportId() ); + } + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::ResponseReceivedL +// Framework calls this function for all SIPSec plugins. +// ----------------------------------------------------------------------------- +// +TBool CSIPSecTlsPlugin::ResponseReceivedL( + TSIPTransportParams& /*aTransportParams*/, + CSIPResponse& /*aResponse*/, + CSIPRequest& /*aRequest*/, + TRegistrationId /*aRegistrationId*/, + TTransactionId /*aTransactionId*/, + TInetAddr& /*aNextHop*/, + const CUri8& /*aRemoteTarget*/, + const TDesC8& /*aOutboundProxy*/, + MSIPSecUser* /*aUser*/, + MSIPSecSecurityMechanismObserver& /*aObserver*/ ) + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::IsServerInitiatedSecAgreeAllowed +// Framework calls this function if it has selected TLS as the security +// mechanism to use. +// Server initiated TLS must not be supported. +// ----------------------------------------------------------------------------- +// +TBool CSIPSecTlsPlugin::IsServerInitiatedSecAgreeAllowed() const + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::ParametersUpdatedL +// ----------------------------------------------------------------------------- +// +TBool CSIPSecTlsPlugin::ParametersUpdatedL( MSIPSecUser* /*aUser*/ ) + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::CancelPendingOperations +// ----------------------------------------------------------------------------- +// +void CSIPSecTlsPlugin::CancelPendingOperations( + MSIPSecSecurityMechanismObserver* /*aObserver*/ ) + { + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::ClearCache +// ----------------------------------------------------------------------------- +// +void CSIPSecTlsPlugin::ClearCache( MSIPSecUser* aUser ) + { + if ( aUser ) + { + iCache->RemoveSIPSecUser( iTransportMgr, *aUser ); + } + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::SetCredentialsL +// ----------------------------------------------------------------------------- +// +void CSIPSecTlsPlugin::SetCredentialsL( TTransactionId /*aTransactionId*/, + const TDesC8& /*aRealm*/, + const TDesC8& /*aOutboundProxy*/, + const TDesC8& /*aUserName*/, + const TDesC8& /*aPassword*/) + { + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::SetCredentialsL +// ----------------------------------------------------------------------------- +// +void CSIPSecTlsPlugin::SetCredentialsL( const MSIPSecUser& /*aUser*/, + const TDesC8& /*aRealm*/, + const TDesC8& /*aOutboundProxy*/, + const TDesC8& /*aUserName*/, + const TDesC8& /*aPassword*/) + { + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::IgnoreChallenge +// ----------------------------------------------------------------------------- +// +TInt CSIPSecTlsPlugin::IgnoreChallenge( TTransactionId /*aTransactionId*/, + const TDesC8& /*aRealm*/, + const MSIPSecUser* /*aTrustedUser*/ ) + { + return KErrNotFound; + } + +// ----------------------------------------------------------------------------- +// CSIPSecTlsPlugin::RemoveCredentials +// ----------------------------------------------------------------------------- +// +TInt CSIPSecTlsPlugin::RemoveCredentials( const TDesC8& /*aRealm*/ ) + { + return KErrNotFound; + }