@@ -1679,6 +1679,139 @@ public async Task PhysicalConnectionInitializer_disposes_connection()
1679
1679
1680
1680
#endregion Physical connection initialization
1681
1681
1682
+ #region Require auth
1683
+
1684
+ [ Test ]
1685
+ public async Task Connect_with_any_auth ( )
1686
+ {
1687
+ await using var dataSource = CreateDataSource ( csb =>
1688
+ {
1689
+ csb . RequireAuth = $ "{ RequireAuthMode . Password } ,{ RequireAuthMode . MD5 } ,{ RequireAuthMode . GSS } ,{ RequireAuthMode . SSPI } ,{ RequireAuthMode . ScramSHA256 } ,{ RequireAuthMode . None } ";
1690
+ } ) ;
1691
+ await using var conn = await dataSource . OpenConnectionAsync ( ) ;
1692
+ }
1693
+
1694
+ [ Test ]
1695
+ [ NonParallelizable ] // Sets environment variable
1696
+ public async Task Connect_with_any_auth_env ( )
1697
+ {
1698
+ using var _ = SetEnvironmentVariable ( "PGREQUIREAUTH" , $ "{ RequireAuthMode . Password } ,{ RequireAuthMode . MD5 } ,{ RequireAuthMode . GSS } ,{ RequireAuthMode . SSPI } ,{ RequireAuthMode . ScramSHA256 } ,{ RequireAuthMode . None } ") ;
1699
+ await using var dataSource = CreateDataSource ( ) ;
1700
+ await using var conn = await dataSource . OpenConnectionAsync ( ) ;
1701
+ }
1702
+
1703
+ [ Test ]
1704
+ public async Task Connect_with_any_except_none_auth ( )
1705
+ {
1706
+ await using var dataSource = CreateDataSource ( csb =>
1707
+ {
1708
+ csb . RequireAuth = $ "!{ RequireAuthMode . None } ";
1709
+ } ) ;
1710
+ await using var conn = await dataSource . OpenConnectionAsync ( ) ;
1711
+ }
1712
+
1713
+ [ Test ]
1714
+ [ NonParallelizable ] // Sets environment variable
1715
+ public async Task Connect_with_any_except_none_auth_env ( )
1716
+ {
1717
+ using var _ = SetEnvironmentVariable ( "PGREQUIREAUTH" , $ "!{ RequireAuthMode . None } ") ;
1718
+ await using var dataSource = CreateDataSource ( ) ;
1719
+ await using var conn = await dataSource . OpenConnectionAsync ( ) ;
1720
+ }
1721
+
1722
+ [ Test ]
1723
+ public async Task Fail_connect_with_none_auth ( )
1724
+ {
1725
+ await using var dataSource = CreateDataSource ( csb =>
1726
+ {
1727
+ csb . RequireAuth = $ "{ RequireAuthMode . None } ";
1728
+ } ) ;
1729
+ var ex = Assert . ThrowsAsync < NpgsqlException > ( async ( ) => await dataSource . OpenConnectionAsync ( ) ) ! ;
1730
+ Assert . That ( ex . Message , Does . Contain ( "authentication method is not allowed" ) ) ;
1731
+ }
1732
+
1733
+ [ Test ]
1734
+ [ NonParallelizable ] // Sets environment variable
1735
+ public async Task Fail_connect_with_none_auth_env ( )
1736
+ {
1737
+ using var _ = SetEnvironmentVariable ( "PGREQUIREAUTH" , $ "{ RequireAuthMode . None } ") ;
1738
+ await using var dataSource = CreateDataSource ( ) ;
1739
+ var ex = Assert . ThrowsAsync < NpgsqlException > ( async ( ) => await dataSource . OpenConnectionAsync ( ) ) ! ;
1740
+ Assert . That ( ex . Message , Does . Contain ( "authentication method is not allowed" ) ) ;
1741
+ }
1742
+
1743
+ [ Test ]
1744
+ public async Task Connect_with_md5_auth ( )
1745
+ {
1746
+ await using var dataSource = CreateDataSource ( csb =>
1747
+ {
1748
+ csb . RequireAuth = $ "{ RequireAuthMode . MD5 } ";
1749
+ } ) ;
1750
+ try
1751
+ {
1752
+ await using var conn = await dataSource . OpenConnectionAsync ( ) ;
1753
+ }
1754
+ catch ( Exception e ) when ( ! IsOnBuildServer )
1755
+ {
1756
+ Console . WriteLine ( e ) ;
1757
+ Assert . Ignore ( "MD5 authentication doesn't seem to be set up" ) ;
1758
+ }
1759
+ }
1760
+
1761
+ [ Test ]
1762
+ [ NonParallelizable ] // Sets environment variable
1763
+ public async Task Connect_with_md5_auth_env ( )
1764
+ {
1765
+ using var _ = SetEnvironmentVariable ( "PGREQUIREAUTH" , $ "{ RequireAuthMode . MD5 } ") ;
1766
+ await using var dataSource = CreateDataSource ( ) ;
1767
+ try
1768
+ {
1769
+ await using var conn = await dataSource . OpenConnectionAsync ( ) ;
1770
+ }
1771
+ catch ( Exception e ) when ( ! IsOnBuildServer )
1772
+ {
1773
+ Console . WriteLine ( e ) ;
1774
+ Assert . Ignore ( "MD5 authentication doesn't seem to be set up" ) ;
1775
+ }
1776
+ }
1777
+
1778
+ [ Test ]
1779
+ public void Mixed_auth_methods_not_supported ( [ Values (
1780
+ $ "{ nameof ( RequireAuthMode . ScramSHA256 ) } ,!{ nameof ( RequireAuthMode . None ) } ",
1781
+ $ "!{ nameof ( RequireAuthMode . ScramSHA256 ) } ,{ nameof ( RequireAuthMode . None ) } ") ]
1782
+ string authMethods )
1783
+ {
1784
+ var csb = new NpgsqlConnectionStringBuilder ( ) ;
1785
+ Assert . Throws < ArgumentException > ( ( ) => csb . RequireAuth = authMethods ) ;
1786
+ }
1787
+
1788
+ [ Test ]
1789
+ public void Remove_all_auth_methods_throws ( )
1790
+ {
1791
+ var csb = new NpgsqlConnectionStringBuilder ( ) ;
1792
+ Assert . Throws < ArgumentException > ( ( ) =>
1793
+ csb . RequireAuth = $ "!{ RequireAuthMode . Password } ,!{ RequireAuthMode . MD5 } ,!{ RequireAuthMode . GSS } ,!{ RequireAuthMode . SSPI } ,!{ RequireAuthMode . ScramSHA256 } ,!{ RequireAuthMode . None } ") ;
1794
+ }
1795
+
1796
+ [ Test ]
1797
+ public void Unknown_auth_method_throws ( )
1798
+ {
1799
+ var csb = new NpgsqlConnectionStringBuilder ( ) ;
1800
+ Assert . Throws < ArgumentException > ( ( ) => csb . RequireAuth = "SuperSecure" ) ;
1801
+ }
1802
+
1803
+ [ Test ]
1804
+ public void Auth_methods_are_trimmed ( )
1805
+ {
1806
+ var csb = new NpgsqlConnectionStringBuilder
1807
+ {
1808
+ RequireAuth = $ "{ RequireAuthMode . Password } , { RequireAuthMode . MD5 } "
1809
+ } ;
1810
+ Assert . That ( csb . RequireAuthModes , Is . EqualTo ( RequireAuthMode . Password | RequireAuthMode . MD5 ) ) ;
1811
+ }
1812
+
1813
+ #endregion Require auth
1814
+
1682
1815
[ Test ]
1683
1816
[ NonParallelizable ] // Modifies global database info factories
1684
1817
[ IssueLink ( "https://github.com/npgsql/npgsql/issues/4425" ) ]
0 commit comments