@@ -51,6 +51,7 @@ public class CosmosClientOptions
51
51
52
52
private const string ConnectionStringAccountEndpoint = "AccountEndpoint" ;
53
53
private const string ConnectionStringAccountKey = "AccountKey" ;
54
+ private const string ConnectionStringDisableServerCertificateValidation = "DisableServerCertificateValidation" ;
54
55
55
56
private const ApiType DefaultApiType = ApiType . None ;
56
57
@@ -651,7 +652,9 @@ internal Protocol ConnectionProtocol
651
652
/// </summary>
652
653
/// <remarks>
653
654
/// <para>
654
- /// Customizing SSL verification is not recommended in production environments.
655
+ /// Emulator: To ignore SSL Certificate please suffix connectionstring with "DisableServerCertificateValidation=True;".
656
+ /// When CosmosClientOptions.HttpClientFactory is used, SSL certificate needs to be handled appropriately.
657
+ /// NOTE: DO NOT use this flag in production (only for emulator)
655
658
/// </para>
656
659
/// </remarks>
657
660
public Func < X509Certificate2 , X509Chain , SslPolicyErrors , bool > ServerCertificateCustomValidationCallback { get ; set ; }
@@ -843,34 +846,62 @@ internal virtual ConnectionPolicy GetConnectionPolicy(int clientId)
843
846
return ( Documents . ConsistencyLevel ) this . ConsistencyLevel . Value ;
844
847
}
845
848
846
- internal static string GetAccountEndpoint ( string connectionString )
847
- {
848
- return CosmosClientOptions . GetValueFromConnectionString ( connectionString , CosmosClientOptions . ConnectionStringAccountEndpoint ) ;
849
- }
850
-
851
- internal static string GetAccountKey ( string connectionString )
852
- {
853
- return CosmosClientOptions . GetValueFromConnectionString ( connectionString , CosmosClientOptions . ConnectionStringAccountKey ) ;
854
- }
855
-
856
- private static string GetValueFromConnectionString ( string connectionString , string keyName )
857
- {
858
- if ( connectionString == null )
859
- {
860
- throw new ArgumentNullException ( nameof ( connectionString ) ) ;
861
- }
862
-
863
- DbConnectionStringBuilder builder = new DbConnectionStringBuilder { ConnectionString = connectionString } ;
864
- if ( builder . TryGetValue ( keyName , out object value ) )
865
- {
866
- string keyNameValue = value as string ;
867
- if ( ! string . IsNullOrEmpty ( keyNameValue ) )
868
- {
869
- return keyNameValue ;
870
- }
871
- }
872
-
873
- throw new ArgumentException ( "The connection string is missing a required property: " + keyName ) ;
849
+ internal static string GetAccountEndpoint ( string connectionString )
850
+ {
851
+ return CosmosClientOptions . GetValueFromConnectionString < string > ( connectionString , CosmosClientOptions . ConnectionStringAccountEndpoint , null ) ;
852
+ }
853
+
854
+ internal static string GetAccountKey ( string connectionString )
855
+ {
856
+ return CosmosClientOptions . GetValueFromConnectionString < string > ( connectionString , CosmosClientOptions . ConnectionStringAccountKey , null ) ;
857
+ }
858
+
859
+ internal static bool IsConnectionStringDisableServerCertificateValidationFlag ( string connectionString )
860
+ {
861
+ return Convert . ToBoolean ( CosmosClientOptions . GetValueFromConnectionString < bool > ( connectionString , CosmosClientOptions . ConnectionStringDisableServerCertificateValidation , false ) ) ;
862
+ }
863
+
864
+ internal static CosmosClientOptions GetCosmosClientOptionsWithCertificateFlag ( string connectionString , CosmosClientOptions clientOptions )
865
+ {
866
+ clientOptions ??= new CosmosClientOptions ( ) ;
867
+ if ( CosmosClientOptions . IsConnectionStringDisableServerCertificateValidationFlag ( connectionString ) )
868
+ {
869
+ clientOptions . ServerCertificateCustomValidationCallback = ( _ , _ , _ ) => true ;
870
+ }
871
+
872
+ return clientOptions ;
873
+ }
874
+
875
+ private static T GetValueFromConnectionString < T > ( string connectionString , string keyName , T defaultValue )
876
+ {
877
+ if ( connectionString == null )
878
+ {
879
+ throw new ArgumentNullException ( nameof ( connectionString ) ) ;
880
+ }
881
+
882
+ DbConnectionStringBuilder builder = new DbConnectionStringBuilder { ConnectionString = connectionString } ;
883
+ if ( builder . TryGetValue ( keyName , out object value ) )
884
+ {
885
+ string keyNameValue = value as string ;
886
+ if ( ! string . IsNullOrEmpty ( keyNameValue ) )
887
+ {
888
+ try
889
+ {
890
+ return ( T ) Convert . ChangeType ( value , typeof ( T ) ) ;
891
+ }
892
+ catch ( InvalidCastException )
893
+ {
894
+ throw new ArgumentException ( "The connection string contains invalid property: " + keyName ) ;
895
+ }
896
+ }
897
+ }
898
+
899
+ if ( defaultValue != null )
900
+ {
901
+ return defaultValue ;
902
+ }
903
+
904
+ throw new ArgumentException ( "The connection string is missing a required property: " + keyName ) ;
874
905
}
875
906
876
907
private void ValidateLimitToEndpointSettings ( )
0 commit comments