diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/SIPSec/DigestPlugin/src/sipsecdigestcontext.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/SIPSec/DigestPlugin/src/sipsecdigestcontext.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,455 @@ +// Copyright (c) 2007-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 : sipsecdigestcontext.cpp +// Part of : SIPSec/DigestPlugin +// Version : SIP/6.0 +// + + + +#include "sipresponse.h" +#include "siprequest.h" +#include "sipstrings.h" +#include "sipstrconsts.h" +#include "sipauthorizationheaderbase.h" +#include "sipsecurityverifyheader.h" +#include "sipsecdigestcontext.h" +#include "sipsecdigestcache.h" +#include "sipsecrequestdata.h" +#include "CSIPSecDigest.h" +#include "CSIPSecCredentials.h" +#include "CSIPSecUserRecord.h" +#include "SipSecUtils.h" +#include "CSIPSecDigestObserver.h" + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::TSIPSecDigestContext +// ----------------------------------------------------------------------------- +// +TSIPSecDigestContext::TSIPSecDigestContext( CSIPSecCredentials& aCredentials, + TSIPSecPluginContext* aParent ) : + iCredentials( aCredentials ), + iParent( aParent ) + { + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::Mechanism +// ----------------------------------------------------------------------------- +// +CSIPSecDigest& TSIPSecDigestContext::Mechanism() const + { + return iCredentials.Mechanism(); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::Parent +// ----------------------------------------------------------------------------- +// +TSIPSecPluginContext& TSIPSecDigestContext::Parent() + { + __ASSERT_ALWAYS( iParent, + User::Panic( _L( "SIPSecDigestCtx:Parent" ), KErrNotFound ) ); + + return *iParent; + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::UserData +// ----------------------------------------------------------------------------- +// +CSIPSecUserRecord& TSIPSecDigestContext::UserData() + { + return iCredentials.UserData(); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::SetUserData +// ----------------------------------------------------------------------------- +// +void TSIPSecDigestContext::SetUserData( CSIPSecUserRecord& aUserData ) + { + iCredentials.SetUserData( aUserData ); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::GetParam +// ----------------------------------------------------------------------------- +// +const TDesC8& TSIPSecDigestContext::GetParam( const CSIPAuthHeaderBase& aHeader, + TInt aParam ) + { + return aHeader.ParamValue( SIPStrings::StringF( aParam ) ).DesC(); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::GetDesParam +// ----------------------------------------------------------------------------- +// +const TDesC8& +TSIPSecDigestContext::GetDesParam( const CSIPAuthHeaderBase& aHeader, + TInt aParam ) + { + return aHeader.DesParamValue( SIPStrings::StringF( aParam ) ); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::SetParamValueL +// ----------------------------------------------------------------------------- +// +void TSIPSecDigestContext::SetParamValueL( CSIPAuthHeaderBase& aHeader, + TInt aParam, + const TDesC8& aValue ) + { + if ( aValue.Length() > 0 ) + { + RStringF value = SIPStrings::Pool().OpenFStringL( aValue ); + CleanupClosePushL( value ); + aHeader.SetParamL( SIPStrings::StringF( aParam ), value ); + CleanupStack::PopAndDestroy(); //value + } + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::SetDesParamValueL +// ----------------------------------------------------------------------------- +// +void TSIPSecDigestContext::SetDesParamValueL( CSIPAuthHeaderBase& aHeader, + TInt aParam, + const TDesC8& aValue ) + { + if ( aValue.Length() > 0 ) + { + aHeader.SetDesParamL( SIPStrings::StringF( aParam ), aValue ); + } + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::SetParamWithEmptyValueL +// ----------------------------------------------------------------------------- +// +void TSIPSecDigestContext::SetParamWithEmptyValueL( TInt aParam ) + { + iCredentials.Content().SetParamAndAddQuotesL( SIPStrings::StringF( aParam ), + KNullDesC8 ); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::GetParam +// ----------------------------------------------------------------------------- +// +const TDesC8& TSIPSecDigestContext::GetParam( TInt aParam ) const + { + return GetParam( iCredentials.Content(), aParam ); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::GetDesParam +// ----------------------------------------------------------------------------- +// +const TDesC8& TSIPSecDigestContext::GetDesParam( TInt aParam ) const + { + return GetDesParam( iCredentials.Content(), aParam ); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::SetParamValueL +// ----------------------------------------------------------------------------- +// +void TSIPSecDigestContext::SetParamValueL( TInt aParam, const TDesC8& aValue ) + { + SetParamValueL( iCredentials.Content(), aParam, aValue ); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::SetDesParamValueL +// ----------------------------------------------------------------------------- +// +void +TSIPSecDigestContext::SetDesParamValueL( TInt aParam, const TDesC8& aValue ) + { + SetDesParamValueL( iCredentials.Content(), aParam, aValue ); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::Nonce +// ----------------------------------------------------------------------------- +// +const TDesC8& TSIPSecDigestContext::Nonce() const + { + return GetDesParam( SipStrConsts::ENonce ); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::NonceCount +// ----------------------------------------------------------------------------- +// +const TDesC8& TSIPSecDigestContext::NonceCount() const + { + return GetParam( SipStrConsts::ENonceCount ); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::CNonce +// ----------------------------------------------------------------------------- +// +const TDesC8& TSIPSecDigestContext::CNonce() const + { + return GetDesParam( SipStrConsts::ECNonce ); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestContext::DigestURI +// ----------------------------------------------------------------------------- +// +const TDesC8& TSIPSecDigestContext::DigestURI() const + { + return GetParam( SipStrConsts::EUri ); + } + + + +// ============================ MEMBER FUNCTIONS =============================== + + +// ---------------------------------------------------------------------------- +// TSIPSecDigestCtxSetup::TSIPSecDigestCtxSetup +// ---------------------------------------------------------------------------- +// +TSIPSecDigestCtxSetup::TSIPSecDigestCtxSetup( + CSIPSecCredentials& aCredentials, + TTransactionId aTransactionId, + TSIPSecPluginCtxResponse* aParent ) : + TSIPSecDigestContext( aCredentials, aParent ), + iTransactionId( aTransactionId ) + { + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestCtxSetup::RequestUserCredentialsL +// ----------------------------------------------------------------------------- +// +TBool TSIPSecDigestCtxSetup::RequestUserCredentialsL() + { + TSIPSecPluginCtxResponse& parent = + static_cast( Parent() ); + CSIPSecDigestObserver* observer = + parent.Cache().RegisterObserverL( parent.Observer(), UserData() ); + return UserData().RequestL( *this, *observer ); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestCtxSetup::SetCNonceL +// ----------------------------------------------------------------------------- +// +void TSIPSecDigestCtxSetup::SetCNonceL( const TDesC8& aCnonce ) + { + SetDesParamValueL( SipStrConsts::ECNonce, aCnonce ); + } + +// ---------------------------------------------------------------------------- +// TSIPSecDigestCtxSetup::TransactionId +// ---------------------------------------------------------------------------- +// +TTransactionId TSIPSecDigestCtxSetup::TransactionId() const + { + return iTransactionId; + } + + +// ============================ MEMBER FUNCTIONS =============================== + + +// ---------------------------------------------------------------------------- +// TSIPSecDigestCtxProcess::TSIPSecDigestCtxProcess +// ---------------------------------------------------------------------------- +// +TSIPSecDigestCtxProcess::TSIPSecDigestCtxProcess( + CSIPSecCredentials& aCredentials, + TSIPSecPluginContext* aParent ) : + TSIPSecDigestContext( aCredentials, aParent ) + { + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestCtxProcess::Method +// ----------------------------------------------------------------------------- +// +const TDesC8& TSIPSecDigestCtxProcess::Method() + { + return static_cast( Parent() ). + SIPRequest().Method().DesC(); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestCtxProcess::Message +// ----------------------------------------------------------------------------- +// +const TDesC8& TSIPSecDigestCtxProcess::Message() + { + return static_cast( Parent() ). + SIPRequest().Content(); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestCtxProcess::SetResponseL +// ----------------------------------------------------------------------------- +// +void TSIPSecDigestCtxProcess::SetResponseL( const TDesC8& aResponse ) + { + SetDesParamValueL( SipStrConsts::EResponse, aResponse ); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestCtxProcess::RequestDataL +// ----------------------------------------------------------------------------- +// +CSIPSecRequestData* +TSIPSecDigestCtxProcess::RequestDataL( CSIPSecRequestData::TQop aQop ) + { + return CSIPSecRequestData::NewL( *this, aQop ); + } + + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// TSIPSecDigestVerifyContext::RequestData +// ----------------------------------------------------------------------------- +// +TSIPSecDigestVerifyContext::TSIPSecDigestVerifyContext( + CSIPSecCredentials& aCredentials, + const TDesC8& aUri, + TSIPSecPluginCtxVerify* aParent ) : + TSIPSecDigestCtxProcess( aCredentials, aParent ), + iUri( aUri ) + { + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestVerifyContext::DigestURI +// ----------------------------------------------------------------------------- +// +const TDesC8& TSIPSecDigestVerifyContext::DigestURI() const + { + return iUri; + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestVerifyContext::SetResponseL +// ----------------------------------------------------------------------------- +// +void TSIPSecDigestVerifyContext::SetResponseL( const TDesC8& aResponse ) + { + RStringF value = SIPStrings::Pool().OpenFStringL( aResponse ); + CleanupClosePushL( value ); + static_cast< TSIPSecPluginCtxVerify& >( Parent() ). + SecurityVerifyHeader().SetParamL( SIPStrings::StringF( + SipStrConsts::EDigestVerify ), value ); + CleanupStack::PopAndDestroy(); // value + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestVerifyContext::RequestDataL +// ----------------------------------------------------------------------------- +// +CSIPSecRequestData* +TSIPSecDigestVerifyContext::RequestDataL( CSIPSecRequestData::TQop aQop ) + { + return CSIPSecDigestVerifyData::NewL( *this, aQop ); + } + + + +// ---------------------------------------------------------------------------- +// TSIPSecDigestVerifyContext::SecurityServerHeaderL +// Example +// Security-Server: ipsec-ike;q=0.1 +// Security-Server: tls;q=0.2 +// Result +// Security-Server:ipsec-ike;q=0.1,tls;q=0.2 +// ---------------------------------------------------------------------------- +// +HBufC8* TSIPSecDigestVerifyContext::SecurityServerHeaderL() + { + HBufC8* serverHeader( NULL ); + + TSglQueIter headers( + static_cast< TSIPSecPluginCtxVerify& >( Parent() ). + SecurityServerHeaders() ); + + if ( headers ) + { + CBufBase* encoded = SipSecUtils::EncodeHeadersL( headers ); + CleanupStack::PushL( encoded ); + TPtr8 encodedPtr( encoded->Ptr( 0 ) ); + serverHeader = encodedPtr.AllocL(); + CleanupStack::PopAndDestroy( encoded ); + } + + return serverHeader; + } + + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// TSIPSecDigestAuthInfoContext::TSIPSecDigestAuthInfoContext +// ----------------------------------------------------------------------------- +// +TSIPSecDigestAuthInfoContext::TSIPSecDigestAuthInfoContext( + CSIPSecCredentials& aCredentials, + TDes8& aResponse, + TSIPSecPluginCtxResponse* aParent ) : + TSIPSecDigestCtxProcess( aCredentials, aParent ), + iResponse( aResponse ) + { + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestAuthInfoContext::SetResponseL +// ----------------------------------------------------------------------------- +// +void TSIPSecDigestAuthInfoContext::SetResponseL( const TDesC8& aResponse ) + { + __ASSERT_ALWAYS( iResponse.MaxLength() >= aResponse.Length(), + User::Leave( KErrArgument ) ); + iResponse.Copy( aResponse ); + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestAuthInfoContext::Method +// ----------------------------------------------------------------------------- +// +const TDesC8& TSIPSecDigestAuthInfoContext::Method() + { + return KNullDesC8; + } + +// ----------------------------------------------------------------------------- +// TSIPSecDigestAuthInfoContext::Message +// ----------------------------------------------------------------------------- +// +const TDesC8& TSIPSecDigestAuthInfoContext::Message() + { + return static_cast< TSIPSecPluginCtxResponse& >( Parent() ). + SIPResponse().Content(); + } + +// End of File