Skip to content

Commit 80812d3

Browse files
committed
Protect STOMP passcode from showing up in logs
Issue: SRP-10868
1 parent 1472e97 commit 80812d3

File tree

4 files changed

+58
-5
lines changed

4 files changed

+58
-5
lines changed

spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompHeaderAccessor.java

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444
*/
4545
public class StompHeaderAccessor extends SimpMessageHeaderAccessor {
4646

47+
private static final AtomicLong messageIdCounter = new AtomicLong();
48+
4749
// STOMP header names
4850

4951
public static final String STOMP_ID_HEADER = "id";
@@ -83,10 +85,9 @@ public class StompHeaderAccessor extends SimpMessageHeaderAccessor {
8385

8486
// Other header names
8587

86-
public static final String COMMAND_HEADER = "stompCommand";
88+
private static final String COMMAND_HEADER = "stompCommand";
8789

88-
89-
private static final AtomicLong messageIdCounter = new AtomicLong();
90+
private static final String CREDENTIALS_HEADER = "stompCredentials";
9091

9192

9293
/**
@@ -128,6 +129,12 @@ else if (StompCommand.MESSAGE.equals(command)) {
128129
super.setSubscriptionId(values.get(0));
129130
}
130131
}
132+
else if (StompCommand.CONNECT.equals(command)) {
133+
if (!StringUtils.isEmpty(getPasscode())) {
134+
setHeader(CREDENTIALS_HEADER, new StompPasscode(getPasscode()));
135+
setPasscode("PROTECTED");
136+
}
137+
}
131138
}
132139

133140
/**
@@ -197,6 +204,18 @@ public Map<String, List<String>> toNativeHeaderMap() {
197204
return result;
198205
}
199206

207+
public Map<String, List<String>> toStompHeaderMap() {
208+
if (StompCommand.CONNECT.equals(getCommand())) {
209+
StompPasscode credentials = (StompPasscode) getHeader(CREDENTIALS_HEADER);
210+
if (credentials != null) {
211+
Map<String, List<String>> headers = toNativeHeaderMap();
212+
headers.put(STOMP_PASSCODE_HEADER, Arrays.asList(credentials.passcode));
213+
return headers;
214+
}
215+
}
216+
return toNativeHeaderMap();
217+
}
218+
200219
public void setCommandIfNotSet(StompCommand command) {
201220
if (getCommand() == null) {
202221
setHeader(COMMAND_HEADER, command);
@@ -338,4 +357,18 @@ public void setVersion(String version) {
338357
setNativeHeader(STOMP_VERSION_HEADER, version);
339358
}
340359

360+
361+
private static class StompPasscode {
362+
363+
private final String passcode;
364+
365+
public StompPasscode(String passcode) {
366+
this.passcode = passcode;
367+
}
368+
369+
@Override
370+
public String toString() {
371+
return "[PROTECTED]";
372+
}
373+
}
341374
}

spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompMessageConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public byte[] fromMessage(Message<?> message) {
141141
try {
142142
out.write(stompHeaders.getCommand().toString().getBytes("UTF-8"));
143143
out.write(LF);
144-
for (Entry<String, List<String>> entry : stompHeaders.toNativeHeaderMap().entrySet()) {
144+
for (Entry<String, List<String>> entry : stompHeaders.toStompHeaderMap().entrySet()) {
145145
String key = entry.getKey();
146146
key = replaceAllOutbound(key);
147147
for (String value : entry.getValue()) {

spring-messaging/src/test/java/org/springframework/messaging/simp/stomp/StompHeaderAccessorTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,26 @@ public void createWithMessageFrameNativeHeaders() {
9090
assertEquals("s1", headers.getSubscriptionId());
9191
}
9292

93+
@Test
94+
public void createWithConnectNativeHeaders() {
95+
96+
MultiValueMap<String, String> extHeaders = new LinkedMultiValueMap<>();
97+
extHeaders.add(StompHeaderAccessor.STOMP_LOGIN_HEADER, "joe");
98+
extHeaders.add(StompHeaderAccessor.STOMP_PASSCODE_HEADER, "joe123");
99+
100+
StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.CONNECT, extHeaders);
101+
102+
assertEquals(StompCommand.CONNECT, headers.getCommand());
103+
assertEquals(SimpMessageType.CONNECT, headers.getMessageType());
104+
assertNotNull(headers.getHeader("stompCredentials"));
105+
assertEquals("joe", headers.getLogin());
106+
assertEquals("PROTECTED", headers.getPasscode());
107+
108+
Map<String, List<String>> output = headers.toStompHeaderMap();
109+
assertEquals("joe", output.get(StompHeaderAccessor.STOMP_LOGIN_HEADER).get(0));
110+
assertEquals("joe123", output.get(StompHeaderAccessor.STOMP_PASSCODE_HEADER).get(0));
111+
}
112+
93113
@Test
94114
public void toNativeHeadersSubscribe() {
95115

spring-websocket/src/main/java/org/springframework/web/socket/TextMessage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ protected int getPayloadSize() {
4949

5050
@Override
5151
protected String toStringPayload() {
52-
return (getPayloadSize() > 80) ? getPayload().substring(0, 80) + "..." : getPayload();
52+
return (getPayloadSize() > 10) ? getPayload().substring(0, 10) + ".." : getPayload();
5353
}
5454

5555
}

0 commit comments

Comments
 (0)