2020import static com .rabbitmq .client .amqp .impl .Cli .*;
2121import static com .rabbitmq .client .amqp .impl .TestUtils .environmentBuilder ;
2222import static com .rabbitmq .client .amqp .impl .TlsTestUtils .*;
23- import static java .lang .String .format ;
2423import static java .nio .charset .StandardCharsets .UTF_8 ;
2524import static org .assertj .core .api .Assertions .assertThatThrownBy ;
2625
2726import com .rabbitmq .client .amqp .*;
27+ import com .rabbitmq .client .amqp .AmqpException .AmqpSecurityException ;
2828import com .rabbitmq .client .amqp .impl .TestUtils .DisabledIfAuthMechanismSslNotEnabled ;
2929import com .rabbitmq .client .amqp .impl .TestUtils .DisabledIfTlsNotEnabled ;
3030import java .security .cert .X509Certificate ;
3333import java .util .stream .IntStream ;
3434import javax .net .ssl .*;
3535import org .junit .jupiter .api .*;
36+ import org .junit .jupiter .params .ParameterizedTest ;
37+ import org .junit .jupiter .params .provider .ValueSource ;
3638
3739@ DisabledIfTlsNotEnabled
3840@ AmqpTestInfrastructure
3941public class TlsTest {
4042
43+ private static final String VH = "test_tls" ;
44+ private static final String USERNAME = "tls" ;
45+ private static final String PASSWORD = "tls" ;
46+
4147 static Environment environment ;
4248
4349 @ Test
@@ -106,10 +112,10 @@ void connectionConfigurationShouldOverrideEnvironmentConfiguration() throws Exce
106112 () ->
107113 env .connectionBuilder ()
108114 .tls ()
109- .sslContext (sslContext (trustManagerFactory (TlsTestUtils . clientCertificate ())))
115+ .sslContext (sslContext (trustManagerFactory (clientCertificate ())))
110116 .connection ()
111117 .build ())
112- .isInstanceOf (AmqpException . AmqpSecurityException .class )
118+ .isInstanceOf (AmqpSecurityException .class )
113119 .hasCauseInstanceOf (SSLHandshakeException .class );
114120 }
115121 }
@@ -140,37 +146,52 @@ void verifiedConnectionWithCorrectServerCertificate() throws Exception {
140146
141147 @ Test
142148 void verifiedConnectionWithWrongServerCertificate () throws Exception {
143- SSLContext sslContext = sslContext (trustManagerFactory (TlsTestUtils . clientCertificate ()));
149+ SSLContext sslContext = sslContext (trustManagerFactory (clientCertificate ()));
144150 assertThatThrownBy (
145151 () -> environment .connectionBuilder ().tls ().sslContext (sslContext ).connection ().build ())
146- .isInstanceOf (AmqpException . AmqpSecurityException .class )
152+ .isInstanceOf (AmqpSecurityException .class )
147153 .hasCauseInstanceOf (SSLHandshakeException .class );
148154 }
149155
150- @ Test
156+ @ ParameterizedTest
157+ @ ValueSource (strings = {DefaultConnectionSettings .DEFAULT_VIRTUAL_HOST , VH })
151158 @ DisabledIfAuthMechanismSslNotEnabled
152- void saslExternalShouldSucceedWithUserForClientCertificate () throws Exception {
153- X509Certificate clientCertificate = TlsTestUtils . clientCertificate ();
159+ void saslExternalShouldSucceedWithUserForClientCertificate (String vh ) throws Exception {
160+ X509Certificate clientCertificate = clientCertificate ();
154161 SSLContext sslContext =
155162 sslContext (
156- TlsTestUtils . keyManagerFactory (TlsTestUtils . clientKey (), clientCertificate ),
163+ keyManagerFactory (clientKey (), clientCertificate ),
157164 trustManagerFactory (caCertificate ()));
158165 String username = clientCertificate .getSubjectX500Principal ().getName ();
159- Cli .rabbitmqctlIgnoreError (format ("delete_user %s" , username ));
160- Cli .rabbitmqctl (format ("add_user %s foo" , username ));
166+ Runnable connect =
167+ () -> {
168+ try (Connection ignored =
169+ environment
170+ .connectionBuilder ()
171+ .username (UUID .randomUUID ().toString ())
172+ .virtualHost (vh )
173+ .saslMechanism (ConnectionSettings .SASL_MECHANISM_EXTERNAL )
174+ .tls ()
175+ .sslContext (sslContext )
176+ .connection ()
177+ .build ()) {}
178+ };
179+ // there is no user with the client certificate's subject DN
180+ assertThatThrownBy (connect ::run ).isInstanceOf (AmqpSecurityException .class );
161181 try {
162- Cli . rabbitmqctl ( format ( "set_permissions %s '.*' '.*' '.*'" , username ) );
182+ setUpVirtualHost ( vh , username , username );
163183 try (Connection ignored =
164184 environment
165185 .connectionBuilder ()
166186 .username (UUID .randomUUID ().toString ())
187+ .virtualHost (vh )
167188 .saslMechanism (ConnectionSettings .SASL_MECHANISM_EXTERNAL )
168189 .tls ()
169190 .sslContext (sslContext )
170191 .connection ()
171192 .build ()) {}
172193 } finally {
173- Cli . rabbitmqctl ( format ( "delete_user %s" , username ) );
194+ tearDownVirtualHost ( vh , username );
174195 }
175196 }
176197
@@ -186,7 +207,7 @@ void hostnameVerificationShouldFailWhenSettingHostToLoopbackInterface() throws E
186207 .sslContext (sslContext )
187208 .connection ()
188209 .build ())
189- .isInstanceOf (AmqpException . AmqpSecurityException .class )
210+ .isInstanceOf (AmqpSecurityException .class )
190211 .cause ()
191212 .isInstanceOf (SSLHandshakeException .class )
192213 .hasMessageContaining ("subject alternative names" );
@@ -208,28 +229,41 @@ void connectToLoopbackInterfaceShouldWorkIfNoHostnameVerification() throws Excep
208229
209230 @ Test
210231 void connectToNonDefaultVirtualHostShouldSucceed () throws Exception {
211- String vhost = "test_tls" ;
212- String username = "tls" ;
213- String password = "tls" ;
214232 try {
215- addVhost (vhost );
216- addUser (username , password );
217- setPermissions (username , vhost , ".*" );
233+ setUpVirtualHost (VH , USERNAME , PASSWORD );
218234
219235 SSLContext sslContext = sslContext (trustManagerFactory (caCertificate ()));
220236 try (Connection ignored =
221237 environment
222238 .connectionBuilder ()
223- .username (username )
224- .password (password )
225- .virtualHost (vhost )
239+ .username (USERNAME )
240+ .password (PASSWORD )
241+ .virtualHost (VH )
226242 .tls ()
227243 .sslContext (sslContext )
228244 .connection ()
229245 .build ()) {}
230246 } finally {
231- deleteUser (username );
232- deleteVhost (vhost );
247+ tearDownVirtualHost (VH , USERNAME );
248+ }
249+ }
250+
251+ private static void setUpVirtualHost (String vh , String username , String password ) {
252+ if (!isDefaultVirtualHost (vh )) {
253+ addVhost (vh );
233254 }
255+ addUser (username , password );
256+ setPermissions (username , vh , ".*" );
257+ }
258+
259+ private static void tearDownVirtualHost (String vh , String username ) {
260+ deleteUser (username );
261+ if (!isDefaultVirtualHost (vh )) {
262+ deleteVhost (vh );
263+ }
264+ }
265+
266+ private static boolean isDefaultVirtualHost (String vh ) {
267+ return DefaultConnectionSettings .DEFAULT_VIRTUAL_HOST .equals (vh );
234268 }
235269}
0 commit comments