Skip to content

Commit 0ae3a86

Browse files
committed
Add test for update secret
References rabbitmq/rabbitmq-server#9187
1 parent 124d074 commit 0ae3a86

File tree

5 files changed

+84
-26
lines changed

5 files changed

+84
-26
lines changed

src/main/java/com/rabbitmq/stream/Constants.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public final class Constants {
3535
public static final short RESPONSE_CODE_PRECONDITION_FAILED = 17;
3636
public static final short RESPONSE_CODE_PUBLISHER_DOES_NOT_EXIST = 18;
3737
public static final short RESPONSE_CODE_NO_OFFSET = 19;
38+
public static final short RESPONSE_CODE_SASL_CANNOT_CHANGE_MECHANISM = 20;
39+
public static final short RESPONSE_CODE_SASL_CANNOT_CHANGE_USERNAME = 21;
3840

3941
public static final short CODE_MESSAGE_ENQUEUEING_FAILED = 10_001;
4042
public static final short CODE_PRODUCER_NOT_AVAILABLE = 10_002;

src/main/java/com/rabbitmq/stream/impl/Client.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ public long applyAsLong(Object value) {
190190
private final Map<String, String> serverProperties;
191191
private final Map<String, String> connectionProperties;
192192
private final Duration rpcTimeout;
193+
private final List<String> saslMechanisms;
193194
private volatile ShutdownReason shutdownReason = null;
194195
private final Runnable exchangeCommandVersionsCheck;
195196
private final boolean filteringSupported;
@@ -367,7 +368,8 @@ public void initChannel(SocketChannel ch) {
367368
parameters.requestedMaxFrameSize, (int) parameters.requestedHeartbeat.getSeconds());
368369
this.clientProperties = clientProperties(parameters.clientProperties);
369370
this.serverProperties = peerProperties();
370-
authenticate();
371+
this.saslMechanisms = getSaslMechanisms();
372+
authenticate(this.credentialsProvider);
371373
this.tuneState.await(Duration.ofSeconds(10));
372374
this.maxFrameSize = this.tuneState.getMaxFrameSize();
373375
this.frameSizeCopped = this.maxFrameSize() > 0;
@@ -483,14 +485,13 @@ private Map<String, String> peerProperties() {
483485
}
484486
}
485487

486-
private void authenticate() {
487-
List<String> saslMechanisms = getSaslMechanisms();
488-
SaslMechanism saslMechanism = this.saslConfiguration.getSaslMechanism(saslMechanisms);
488+
void authenticate(CredentialsProvider credentialsProvider) {
489+
SaslMechanism saslMechanism = this.saslConfiguration.getSaslMechanism(this.saslMechanisms);
489490

490491
byte[] challenge = null;
491492
boolean authDone = false;
492493
while (!authDone) {
493-
byte[] saslResponse = saslMechanism.handleChallenge(challenge, this.credentialsProvider);
494+
byte[] saslResponse = saslMechanism.handleChallenge(challenge, credentialsProvider);
494495
SaslAuthenticateResponse saslAuthenticateResponse =
495496
sendSaslAuthenticate(saslMechanism, saslResponse);
496497
if (saslAuthenticateResponse.isOk()) {

src/test/java/com/rabbitmq/stream/Host.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,34 @@ public static Process killStreamLeaderProcess(String stream) throws IOException
147147
+ "\">>) of {ok, Pid} -> exit(Pid, kill); Pid -> exit(Pid, kill) end.'");
148148
}
149149

150+
public static void addUser(String username, String password) throws IOException {
151+
rabbitmqctl(format("add_user %s %s", username, password));
152+
}
153+
154+
public static void setPermissions(String username, String vhost, String permission)
155+
throws IOException {
156+
rabbitmqctl(
157+
format(
158+
"set_permissions --vhost %s %s '%s' '%s' '%s'",
159+
vhost, username, permission, permission, permission));
160+
}
161+
162+
public static void changePassword(String username, String newPassword) throws IOException {
163+
rabbitmqctl(format("change_password %s %s", username, newPassword));
164+
}
165+
166+
public static void deleteUser(String username) throws IOException {
167+
rabbitmqctl(format("delete_user %s", username));
168+
}
169+
170+
public static void addVhost(String vhost) throws IOException {
171+
rabbitmqctl("add_vhost " + vhost);
172+
}
173+
174+
public static void deleteVhost(String vhost) throws Exception {
175+
rabbitmqctl("delete_vhost " + vhost);
176+
}
177+
150178
public static void setEnv(String parameter, String value) throws IOException {
151179
rabbitmqctl(format("eval 'application:set_env(rabbitmq_stream, %s, %s).'", parameter, value));
152180
}

src/test/java/com/rabbitmq/stream/impl/AuthenticationTest.java

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
1414
package com.rabbitmq.stream.impl;
1515

16+
import static com.rabbitmq.stream.Host.*;
1617
import static org.assertj.core.api.Assertions.assertThat;
18+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
1719

1820
import com.rabbitmq.stream.AuthenticationFailureException;
1921
import com.rabbitmq.stream.Constants;
@@ -49,8 +51,8 @@ void authenticateShouldFailWhenUsingBadCredentials() {
4951
try {
5052
cf.get(new Client.ClientParameters().username("bad").password("bad"));
5153
} catch (AuthenticationFailureException e) {
52-
assertThat(
53-
e.getMessage().contains(String.valueOf(Constants.RESPONSE_CODE_AUTHENTICATION_FAILURE)));
54+
assertThat(e.getMessage())
55+
.contains(String.valueOf(Constants.RESPONSE_CODE_AUTHENTICATION_FAILURE));
5456
}
5557
}
5658

@@ -74,9 +76,8 @@ public byte[] handleChallenge(
7476
}
7577
}));
7678
} catch (StreamException e) {
77-
assertThat(
78-
e.getMessage()
79-
.contains(String.valueOf(Constants.RESPONSE_CODE_SASL_MECHANISM_NOT_SUPPORTED)));
79+
assertThat(e.getMessage())
80+
.contains(String.valueOf(Constants.RESPONSE_CODE_SASL_MECHANISM_NOT_SUPPORTED));
8081
}
8182
}
8283

@@ -100,7 +101,7 @@ public byte[] handleChallenge(
100101
}
101102
}));
102103
} catch (StreamException e) {
103-
assertThat(e.getMessage().contains(String.valueOf(Constants.RESPONSE_CODE_SASL_ERROR)));
104+
assertThat(e.getMessage()).contains(String.valueOf(Constants.RESPONSE_CODE_SASL_ERROR));
104105
}
105106
}
106107

@@ -109,9 +110,40 @@ void accessToNonExistingVirtualHostShouldFail() {
109110
try {
110111
cf.get(new Client.ClientParameters().virtualHost(UUID.randomUUID().toString()));
111112
} catch (StreamException e) {
112-
assertThat(
113-
e.getMessage()
114-
.contains(String.valueOf(Constants.RESPONSE_CODE_VIRTUAL_HOST_ACCESS_FAILURE)));
113+
assertThat(e.getMessage())
114+
.contains(String.valueOf(Constants.RESPONSE_CODE_VIRTUAL_HOST_ACCESS_FAILURE));
115115
}
116116
}
117+
118+
@Test
119+
@TestUtils.BrokerVersionAtLeast(TestUtils.BrokerVersion.RABBITMQ_3_13_0)
120+
void updateSecret() throws Exception {
121+
String username = "stream";
122+
String password = "stream";
123+
String newPassword = "new-password";
124+
try {
125+
addUser(username, password);
126+
setPermissions(username, "/", "^stream.*$");
127+
Client client = cf.get(new Client.ClientParameters().username("stream").password(username));
128+
changePassword(username, newPassword);
129+
// OK
130+
client.authenticate(credentialsProvider(username, newPassword));
131+
// wrong password
132+
assertThatThrownBy(() -> client.authenticate(credentialsProvider(username, "dummy")))
133+
.isInstanceOf(AuthenticationFailureException.class)
134+
.hasMessageContaining(String.valueOf(Constants.RESPONSE_CODE_AUTHENTICATION_FAILURE));
135+
// cannot change username
136+
assertThatThrownBy(() -> client.authenticate(credentialsProvider("guest", "guest")))
137+
.isInstanceOf(StreamException.class)
138+
.hasMessageContaining(
139+
String.valueOf(Constants.RESPONSE_CODE_SASL_CANNOT_CHANGE_USERNAME));
140+
client.close();
141+
} finally {
142+
deleteUser(username);
143+
}
144+
}
145+
146+
private static CredentialsProvider credentialsProvider(String username, String password) {
147+
return new DefaultUsernamePasswordCredentialsProvider(username, password);
148+
}
117149
}

src/test/java/com/rabbitmq/stream/impl/AuthorisationTest.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@
1313
1414
package com.rabbitmq.stream.impl;
1515

16+
import static com.rabbitmq.stream.Host.*;
1617
import static com.rabbitmq.stream.impl.TestUtils.b;
1718
import static com.rabbitmq.stream.impl.TestUtils.waitAtMost;
1819
import static java.util.concurrent.TimeUnit.SECONDS;
1920
import static org.assertj.core.api.Assertions.assertThat;
2021

2122
import com.rabbitmq.stream.Constants;
22-
import com.rabbitmq.stream.Host;
2323
import com.rabbitmq.stream.OffsetSpecification;
2424
import java.nio.charset.StandardCharsets;
2525
import java.time.Duration;
@@ -43,21 +43,16 @@ public class AuthorisationTest {
4343

4444
@BeforeAll
4545
static void init() throws Exception {
46-
Host.rabbitmqctl("add_vhost " + VH);
47-
Host.rabbitmqctl("add_user " + USERNAME + " " + PASSWORD);
48-
Host.rabbitmqctl(
49-
"set_permissions --vhost "
50-
+ VH
51-
+ " "
52-
+ USERNAME
53-
+ " '^stream.*$' '^stream.*$' '^stream.*$'");
54-
Host.rabbitmqctl("set_permissions --vhost " + VH + " guest '.*' '.*' '.*'");
46+
addVhost(VH);
47+
addUser(USERNAME, PASSWORD);
48+
setPermissions(USERNAME, VH, "^stream.*$");
49+
setPermissions("guest", VH, ".*");
5550
}
5651

5752
@AfterAll
5853
static void tearDown() throws Exception {
59-
Host.rabbitmqctl("delete_user stream");
60-
Host.rabbitmqctl("delete_vhost test_stream");
54+
deleteUser(USERNAME);
55+
deleteVhost(VH);
6156
}
6257

6358
static boolean await(CountDownLatch latch) {

0 commit comments

Comments
 (0)