realtimenetprots/sipfw/SIP/SIPSec/DigestPlugin/src/CSIPSecDigest.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/SIPSec/DigestPlugin/src/CSIPSecDigest.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,179 @@
+// 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          : CSIPSecDigest.cpp
+// Part of       : SIPDigestPlugin
+// Version       : SIP/6.0
+//
+
+
+
+#include "sipsecurityserverheader.h"
+#include "CSIPSecDigest.h"
+#include "sipsecdigestcache.h"
+#include "CSIPSecChallenge.h"
+#include "RSIPSecChallengeResolver.h"
+#include "CSIPSecCredentials.h"
+#include "sipsecdigestcontext.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+#include "MSIPSecUser.h"
+#include <hash.h>
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSIPSecDigest::NewL
+// -----------------------------------------------------------------------------
+//
+CSIPSecDigest* CSIPSecDigest::NewL()
+    {
+	CSIPSecDigest* self = new( ELeave )CSIPSecDigest();
+	CleanupStack::PushL( self );
+	self->ConstructL();
+	CleanupStack::Pop( self );
+	return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPSecDigest::CSIPSecDigest
+// -----------------------------------------------------------------------------
+//
+CSIPSecDigest::CSIPSecDigest()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPSecDigest::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CSIPSecDigest::ConstructL()
+    {
+    SIPStrings::OpenL();
+    iStringPoolOpened = ETrue;
+
+    iAlgorithm = SIPStrings::StringF( SipStrConsts::EEmpty );
+
+    iMessageDigest = CMD5::NewL();
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPSecDigest::~CSIPSecDigest
+// -----------------------------------------------------------------------------
+//
+CSIPSecDigest::~CSIPSecDigest()
+    {
+    delete iMessageDigest;
+    iAlgorithm.Close();
+
+    if ( iStringPoolOpened )
+    	{
+    	SIPStrings::Close();
+    	}
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPSecDigest::Name
+// -----------------------------------------------------------------------------
+//
+const TDesC8& CSIPSecDigest::Name() const
+    {
+    return KSIPSecDigestName;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPSecDigest::InitializeL
+// -----------------------------------------------------------------------------
+//
+void CSIPSecDigest::InitializeL( CSIPSecurityServerHeader& aSecurityServer )
+    {
+    SetDefaultAlgorithm( aSecurityServer.ParamValue(
+    	SIPStrings::StringF( SipStrConsts::EDigestAlgorithm ) ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPSecDigest::UpdateCacheL
+// -----------------------------------------------------------------------------
+//
+TBool CSIPSecDigest::UpdateCacheL( TSIPSecPluginCtxResponse& aContext )
+    {
+    TBool mustWait( EFalse );
+    // EFalse = all challenges in the SIP response have found credentials from
+    // the cache, or are already waiting credentials from application.
+    TBool askCredentials( EFalse );
+    CSIPSecChallenge* challenge( NULL );
+    CSIPSecCredentials* credentials( NULL );
+
+	RSIPSecChallengeResolver challenges( aContext, *this );
+    CleanupClosePushL( challenges );
+    challenges.OpenL( aContext.SIPSecUser() );
+
+    // Create one cache entry (CSIPSecCredentials) for each challenge.
+    while ( ( challenge = challenges.Pop() ) != NULL )
+        {
+        CleanupStack::PushL( challenge );
+		credentials = CSIPSecCredentials::NewL( challenge, *this, aContext );
+		CleanupStack::Pop( challenge );
+        aContext.Cache().AddEntry( credentials );
+
+        TSIPSecDigestCtxSetup ctx( *credentials,
+        						   aContext.TransactionId(),
+        						   &aContext );
+		TBool ask( EFalse );
+		// AKA challenges set "ask" to EFalse, as they use SIM card
+        mustWait = credentials->DigestUpdateL( ctx, ask ) || mustWait;
+        askCredentials = askCredentials || ask;
+        }
+
+	MSIPSecUser& sipSecUser = aContext.SIPSecUser();
+	MSIPSecUser* trustedUser = const_cast< MSIPSecUser* >
+		( sipSecUser.TrustedUser( aContext.RegistrationId() ) );
+	MSIPSecUser* user = trustedUser ? trustedUser : &sipSecUser;
+	if ( mustWait && !user->PassOnlyRealmsToUser() && askCredentials )
+		{
+		user->RequestCredentialsL( aContext.SIPResponse(),
+								  aContext.TransactionId(),
+								  KEmptyRefreshId );
+		}
+
+    CleanupStack::PopAndDestroy(); // challenges
+    return mustWait;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPSecDigest::CSIPSecDigest
+// -----------------------------------------------------------------------------
+//
+CMD5& CSIPSecDigest::MessageDigest()
+    {
+    return *iMessageDigest;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPSecDigest::Algorithm
+// -----------------------------------------------------------------------------
+//
+RStringF CSIPSecDigest::Algorithm() const
+    {
+    return iAlgorithm;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPSecDigest::SetDefaultAlgorithm
+// -----------------------------------------------------------------------------
+//
+void CSIPSecDigest::SetDefaultAlgorithm( RStringF aAlgorithm )
+	{
+	iAlgorithm.Close();
+	iAlgorithm = aAlgorithm.Copy();
+	}