realtimenetprots/sipfw/SIP/SIPSec/DigestPlugin/src/sipsecdigestcontext.cpp
changeset 0 307788aac0a8
--- /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<TSIPSecPluginCtxResponse&>( 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<TSIPSecPluginCtxRequest&>( Parent() ).
+		SIPRequest().Method().DesC();
+	}
+
+// -----------------------------------------------------------------------------
+// TSIPSecDigestCtxProcess::Message
+// -----------------------------------------------------------------------------
+//
+const TDesC8& TSIPSecDigestCtxProcess::Message()
+	{
+	return static_cast<TSIPSecPluginCtxRequest&>( 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<CSIPHeaderBase> 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