@@ -1679,6 +1679,139 @@ public async Task PhysicalConnectionInitializer_disposes_connection()
16791679
16801680 #endregion Physical connection initialization
16811681
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+
16821815 [ Test ]
16831816 [ NonParallelizable ] // Modifies global database info factories
16841817 [ IssueLink ( "https://github.com/npgsql/npgsql/issues/4425" ) ]
0 commit comments