realtimenetprots/sipfw/SIP/SIPSec/DigestPlugin/src/sipsecdigestcontext.cpp
author Stefan Karlsson <stefan.karlsson@nokia.com>
Sat, 10 Apr 2010 13:41:16 +0100
branchCompilerCompatibility
changeset 13 4f4a686bcb0a
parent 0 307788aac0a8
permissions -rw-r--r--
Got rid of some trivial warnings (nested comments and tokens after #endif).

// 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