networksecurity/tls/protocol/tlsconnection.cpp
branchRCL_3
changeset 58 8d540f55e491
parent 57 abbed5a4b42a
child 63 425d8f4f7fa5
--- a/networksecurity/tls/protocol/tlsconnection.cpp	Tue Aug 31 16:45:15 2010 +0300
+++ b/networksecurity/tls/protocol/tlsconnection.cpp	Wed Sep 01 12:33:58 2010 +0100
@@ -1,4 +1,4 @@
-// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
+// Copyright (c) 2003-2010 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"
@@ -26,6 +26,8 @@
 #include "applicationdata.h"
 #include <es_sock.h>
 #include <in_sock.h>
+#include <featdiscovery.h>
+#include <featureuids.h>
 
 #ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
 #include <ssl_internal.h>
@@ -154,7 +156,17 @@
 	User::LeaveIfError( SetProtocol(aProtocol) );
 	iTlsProvider->Attributes()->iCurrentCipherSuite.iLoByte = 0x00;
 	iTlsProvider->Attributes()->iCurrentCipherSuite.iHiByte = 0x00;
-	iTlsProvider->Attributes()->iDialogNonAttendedMode = EFalse;
+	TBool allowUntrustedCertificates = EFalse;
+	allowUntrustedCertificates = CFeatureDiscovery::IsFeatureSupportedL(NFeature::KFeatureIdFfHttpAllowUntrustedCertificates);
+	
+	if( allowUntrustedCertificates )
+	  {
+      iTlsProvider->Attributes()->iDialogMode = ETTLSDialogModeAllowAutomatic;
+	  }
+	else
+	  {
+	  iTlsProvider->Attributes()->iDialogNonAttendedMode = EFalse;
+	  }
 	iDialogMode = EDialogModeAttended;
 
 	iGenericSocket = new(ELeave)CGenericSecureSocket<RSocket>(aSocket);
@@ -163,18 +175,17 @@
   	LOG(Log::Printf(_L("iRecordParser %x - %x"), iRecordParser, (TUint)iRecordParser + sizeof( CRecordParser ));)
 	iRecordComposer = new(ELeave)CRecordComposer( *iGenericSocket, *iTlsProvider );
 	TBuf<32> tempBuf;
-   	tempBuf.Copy(aProtocol);
-   	tempBuf.UpperCase();
-   	TInt ret = tempBuf.Compare(KProtocolVerSSL30);
-   	if (!ret)
-   	    {
-	    iRecordComposer->SetVersion(&KSSL3_0);
-   	    }
-   	else
-   	    {
-	    iRecordComposer->SetVersion(&KTLS1_0);
-   	    }
-
+    tempBuf.Copy(aProtocol);
+    tempBuf.UpperCase();
+    TInt ret = tempBuf.Compare(KProtocolVerSSL30);
+    if (!ret)
+      {
+      iRecordComposer->SetVersion(&KSSL3_0);
+  	  }
+    else
+      {
+      iRecordComposer->SetVersion(&KTLS1_0);
+      }
   	LOG(Log::Printf(_L("iRecordComposer %x - %x"), iRecordComposer, (TUint)iRecordComposer + sizeof( CRecordComposer ));)
 
 #ifdef _DEBUG
@@ -207,7 +218,17 @@
 	User::LeaveIfError( SetProtocol(aProtocol) );
 	iTlsProvider->Attributes()->iCurrentCipherSuite.iLoByte = 0x00;
 	iTlsProvider->Attributes()->iCurrentCipherSuite.iHiByte = 0x00;
-	iTlsProvider->Attributes()->iDialogNonAttendedMode = EFalse;
+	TBool allowUntrustedCertificates = EFalse;
+	allowUntrustedCertificates = CFeatureDiscovery::IsFeatureSupportedL(NFeature::KFeatureIdFfHttpAllowUntrustedCertificates);
+
+	if( allowUntrustedCertificates )
+	  {
+	  iTlsProvider->Attributes()->iDialogMode = ETTLSDialogModeAttended;
+	  }
+	else
+	  {
+	  iTlsProvider->Attributes()->iDialogNonAttendedMode = EFalse;
+	  }
 	iDialogMode = EDialogModeAttended;
 
 	iRecordParser = new(ELeave)CRecordParser( aSocket, *iTlsProvider );
@@ -911,23 +932,56 @@
 	// TDialogMode enum or has the value EDialogModeUnattended/EDialogModeAttended. 
 	// Otherwise, it must return KErrArgument
 	TInt ret = KErrNone;
-   
-    switch(aDialogMode)
-    {
-        case EDialogModeUnattended:
-        case EDialogModeAttended:
-            iDialogMode = aDialogMode;
-        break;
-        
-        default:  //-- wrong mode
-            LOG(Log::Printf(_L("SetDialogMode() - Unknown dialog mode, default setting (Attended mode) being used"));)
-        return KErrArgument;    
-    };
+	TBool allowUntrustedCertificates = EFalse;
+	TRAP(ret, allowUntrustedCertificates = CFeatureDiscovery::IsFeatureSupportedL(NFeature::KFeatureIdFfHttpAllowUntrustedCertificates));
+	
+	if(KErrNone == ret)
+	{
+		TTLSDialogMode tlsDialogMode( ETTLSDialogModeAttended );
+		switch(aDialogMode)
+		{
+			case EDialogModeUnattended:
+				{
+				if( allowUntrustedCertificates )
+					{
+					tlsDialogMode = ETTLSDialogModeUnattended;
+					iDialogMode = aDialogMode;
+					break;        
+					}
+				}
+			case EDialogModeAttended:
+				{
+				if( allowUntrustedCertificates )
+					{
+					tlsDialogMode = ETTLSDialogModeAttended;
+					}
+				iDialogMode = aDialogMode;
+				break;
+				}
+			case EDialogModeAllowAutomatic:
+				{
+				tlsDialogMode = ETTLSDialogModeAllowAutomatic;
+				iDialogMode = aDialogMode;
+				break; 
+				}
+			
+			default:  //-- wrong mode
+				LOG(Log::Printf(_L("SetDialogMode() - Unknown dialog mode, default setting (Attended mode) being used"));)
+			return KErrArgument;    
+		};
 
-    if ( iTlsProvider )
-    {
-   	    iTlsProvider->Attributes()->iDialogNonAttendedMode = (iDialogMode == EDialogModeUnattended);
-    }	
+		if ( iTlsProvider )
+		{
+		if( allowUntrustedCertificates )
+			{
+			iTlsProvider->Attributes()->iDialogMode = tlsDialogMode;
+			}
+		else
+			{
+			iTlsProvider->Attributes()->iDialogNonAttendedMode = (iDialogMode == EDialogModeUnattended);
+			}
+		}
+	}
 
     return ret;
 }