Skip to content

Commit c7da05a

Browse files
authored
Password check was comparing string to byte array (#1239)
1 parent f064b71 commit c7da05a

File tree

1 file changed

+40
-41
lines changed

1 file changed

+40
-41
lines changed

hivemq-edge/src/main/java/com/hivemq/http/handlers/AbstractHttpRequestResponseHandler.java

Lines changed: 40 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -35,22 +35,23 @@
3535
import java.io.OutputStream;
3636
import java.nio.charset.StandardCharsets;
3737
import java.util.Base64;
38+
import java.util.Objects;
3839

3940
public abstract class AbstractHttpRequestResponseHandler implements IHttpRequestResponseHandler {
4041

4142
protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
4243

4344
protected final ObjectMapper mapper;
4445

45-
public AbstractHttpRequestResponseHandler(ObjectMapper mapper) {
46+
public AbstractHttpRequestResponseHandler(final ObjectMapper mapper) {
4647
this.mapper = mapper;
4748
}
4849

49-
public void handleRequest(IHttpRequestResponse httpRequestResponse) throws IOException {
50+
public void handleRequest(final IHttpRequestResponse httpRequestResponse) throws IOException {
5051

51-
long start = System.currentTimeMillis();
52+
final var start = System.currentTimeMillis();
5253
try {
53-
UsernamePasswordRoles credentials = getRequiredCredentials(httpRequestResponse);
54+
final var credentials = getRequiredCredentials(httpRequestResponse);
5455
if (credentials != null) {
5556
if (!handleBasicHttpAuthentication(credentials, httpRequestResponse)) {
5657
return;
@@ -104,34 +105,34 @@ public void handleRequest(IHttpRequestResponse httpRequestResponse) throws IOExc
104105
}
105106
}
106107

107-
protected void handleHttpGet(IHttpRequestResponse request) throws HttpException, IOException {
108+
protected void handleHttpGet(final IHttpRequestResponse request) throws HttpException, IOException {
108109
sendNotFoundResponse(request);
109110
}
110111

111-
protected void handleHttpPost(IHttpRequestResponse request) throws HttpException, IOException {
112+
protected void handleHttpPost(final IHttpRequestResponse request) throws HttpException, IOException {
112113
sendNotFoundResponse(request);
113114
}
114115

115-
protected void sendUnsupportedOperationRequest(IHttpRequestResponse request) throws IOException {
116+
protected void sendUnsupportedOperationRequest(final IHttpRequestResponse request) throws IOException {
116117
writeASCIIResponse(request,
117118
HttpConstants.SC_METHOD_NOT_ALLOWED,
118119
Html.getErrorMessage(HttpConstants.SC_METHOD_NOT_ALLOWED, "Method not allowed"));
119120
}
120121

121-
protected void sendNotFoundResponse(IHttpRequestResponse request) throws IOException {
122+
protected void sendNotFoundResponse(final IHttpRequestResponse request) throws IOException {
122123
writeHTMLResponse(request,
123124
HttpConstants.SC_NOT_FOUND,
124125
Html.getErrorMessage(HttpConstants.SC_NOT_FOUND, "Resource Not found"));
125126
}
126127

127-
protected void sendBadRequestResponse(IHttpRequestResponse request, String message) throws IOException {
128+
protected void sendBadRequestResponse(final IHttpRequestResponse request, final String message) throws IOException {
128129
logger.info("resource not found {}", request);
129130
writeHTMLResponse(request,
130131
HttpConstants.SC_BAD_REQUEST,
131132
Html.getErrorMessage(HttpConstants.SC_BAD_REQUEST, message));
132133
}
133134

134-
protected void sendRedirect(IHttpRequestResponse request, String resourceUri) throws IOException {
135+
protected void sendRedirect(final IHttpRequestResponse request, final String resourceUri) throws IOException {
135136
try {
136137
logger.info("sending client side redirect to {}", resourceUri);
137138
request.addResponseHeader(HttpConstants.LOCATION_HEADER, resourceUri);
@@ -141,48 +142,48 @@ protected void sendRedirect(IHttpRequestResponse request, String resourceUri) th
141142
}
142143
}
143144

144-
protected void writeASCIIResponse(IHttpRequestResponse request, int responseCode, String message)
145+
protected void writeASCIIResponse(final IHttpRequestResponse request, final int responseCode, final String message)
145146
throws IOException {
146147
writeResponseInternal(request,
147148
responseCode,
148149
HttpConstants.PLAIN_MIME_TYPE,
149150
message != null ? message.getBytes(StandardCharsets.UTF_8) : new byte[0]);
150151
}
151152

152-
protected void writeHTMLResponse(IHttpRequestResponse request, int responseCode, String html) throws IOException {
153+
protected void writeHTMLResponse(final IHttpRequestResponse request, final int responseCode, final String html) throws IOException {
153154
writeResponseInternal(request,
154155
responseCode,
155156
HttpConstants.HTML_MIME_TYPE,
156157
html != null ? html.getBytes(StandardCharsets.UTF_8) : new byte[0]);
157158
}
158159

159-
protected void writeJSONResponse(IHttpRequestResponse request, int responseCode, byte[] bytes) throws IOException {
160+
protected void writeJSONResponse(final IHttpRequestResponse request, final int responseCode, final byte[] bytes) throws IOException {
160161
writeResponseInternal(request, responseCode, HttpConstants.JSON_MIME_TYPE, bytes);
161162
}
162163

163-
protected void writeJSONBeanResponse(IHttpRequestResponse request, int responseCode, Object bean)
164+
protected void writeJSONBeanResponse(final IHttpRequestResponse request, final int responseCode, final Object bean)
164165
throws IOException {
165166
writeJSONResponse(request, responseCode, mapper.writeValueAsBytes(bean));
166167
}
167168

168-
protected void writeMessageBeanResponse(IHttpRequestResponse request, int responseCode, Message message)
169+
protected void writeMessageBeanResponse(final IHttpRequestResponse request, final int responseCode, final Message message)
169170
throws IOException {
170171
writeJSONResponse(request, responseCode, mapper.writeValueAsBytes(message));
171172
}
172173

173-
protected void writeStreamResponse(IHttpRequestResponse request, int responseCode, String mimeType, InputStream is)
174+
protected void writeStreamResponse(final IHttpRequestResponse request, final int responseCode, final String mimeType, final InputStream is)
174175
throws IOException {
175-
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
176-
byte[] buf = new byte[1024];
176+
final var baos = new ByteArrayOutputStream(1024);
177+
final var buf = new byte[1024];
177178
int length;
178179
while ((length = is.read(buf)) != -1) {
179180
baos.write(buf, 0, length);
180181
}
181-
byte[] bytes = baos.toByteArray();
182+
final var bytes = baos.toByteArray();
182183
writeResponseInternal(request, responseCode, mimeType, bytes);
183184
}
184185

185-
protected void writeResponseInternal(IHttpRequestResponse request, int responseCode, String mimeType, byte[] bytes)
186+
protected void writeResponseInternal(final IHttpRequestResponse request, final int responseCode, final String mimeType, final byte[] bytes)
186187
throws IOException {
187188
OutputStream os = null;
188189
try {
@@ -198,7 +199,7 @@ protected void writeResponseInternal(IHttpRequestResponse request, int responseC
198199
}
199200
}
200201

201-
protected void writeSimpleOKResponse(IHttpRequestResponse request) throws IOException {
202+
protected void writeSimpleOKResponse(final IHttpRequestResponse request) throws IOException {
202203
try {
203204
request.setResponseContentType(HttpConstants.PLAIN_MIME_TYPE, StandardCharsets.UTF_8);
204205
request.sendResponseHeaders(HttpConstants.SC_OK, 0);
@@ -207,28 +208,27 @@ protected void writeSimpleOKResponse(IHttpRequestResponse request) throws IOExce
207208
}
208209
}
209210

210-
protected void writeDataFromResource(IHttpRequestResponse requestResponse, String resourcePath) throws IOException {
211+
protected void writeDataFromResource(final IHttpRequestResponse requestResponse, final String resourcePath) throws IOException {
211212
InputStream is = loadClasspathResource(resourcePath);
212213
logger.trace("loading resource from cp '{}' exists ? {}", resourcePath, is != null);
213214
if (is == null) {
214215
sendNotFoundResponse(requestResponse);
215216
} else {
216-
String fileName = Files.getFileName(resourcePath);
217-
String ext = Files.getFileExtension(resourcePath);
218-
String mimeType = HttpUtils.getMimeTypeFromFileExtension(ext);
217+
final var ext = Files.getFileExtension(resourcePath);
218+
final var mimeType = HttpUtils.getMimeTypeFromFileExtension(ext);
219219
writeStreamResponse(requestResponse, HttpConstants.SC_OK, mimeType, is);
220220
}
221221
}
222222

223-
protected <T> T readRequestBody(IHttpRequestResponse requestResponse, Class<T> cls) throws HttpInternalServerError {
223+
protected <T> T readRequestBody(final IHttpRequestResponse requestResponse, final Class<T> cls) throws HttpInternalServerError {
224224
try {
225225
return mapper.readValue(requestResponse.getRequestBody(), cls);
226226
} catch (Exception e) {
227227
throw new HttpInternalServerError("error reading request body", e);
228228
}
229229
}
230230

231-
protected InputStream loadClasspathResource(String resource) {
231+
protected InputStream loadClasspathResource(final String resource) {
232232
logger.trace("loading resource from path " + resource);
233233
InputStream is = AbstractHttpRequestResponseHandler.class.getClassLoader().getResourceAsStream(resource);
234234
if (is == null) {
@@ -237,30 +237,29 @@ protected InputStream loadClasspathResource(String resource) {
237237
return is;
238238
}
239239

240-
protected String getMandatoryParameter(IHttpRequestResponse requestResponse, String paramKey)
240+
protected String getMandatoryParameter(final IHttpRequestResponse requestResponse, final String paramKey)
241241
throws HttpBadRequestException {
242-
String value = requestResponse.getParameter(paramKey);
242+
final var value = requestResponse.getParameter(paramKey);
243243
if (value == null) {
244244
throw new HttpBadRequestException("mandatory request parameter not available " + paramKey);
245245
}
246246
return value;
247247
}
248248

249-
protected String getParameter(IHttpRequestResponse requestResponse, String paramKey) {
250-
String value = requestResponse.getParameter(paramKey);
251-
return value;
249+
protected String getParameter(final IHttpRequestResponse requestResponse, final String paramKey) {
250+
return requestResponse.getParameter(paramKey);
252251
}
253252

254253
protected boolean handleBasicHttpAuthentication(
255-
UsernamePasswordRoles usernamePassword, IHttpRequestResponse httpRequestResponse) throws IOException {
254+
final UsernamePasswordRoles usernamePassword,
255+
final IHttpRequestResponse httpRequestResponse) throws IOException {
256256

257257
String value = httpRequestResponse.getRequestHeader(HttpConstants.AUTH_HEADER);
258258
if (value != null) {
259259
value = value.substring(value.lastIndexOf(" ") + 1);
260260
value = new String(Base64.getDecoder().decode(value));
261-
String[] userNamePassword = value.split(":");
262-
if (usernamePassword.getUserName().equals(userNamePassword[0]) &&
263-
usernamePassword.getPassword().equals(userNamePassword[1])) {
261+
final var userNamePassword = value.split(":");
262+
if (usernamePassword.getUserName().equals(userNamePassword[0]) && Objects.deepEquals(usernamePassword.getPassword(), userNamePassword[1].getBytes(StandardCharsets.UTF_8))) {
264263
return true;
265264
}
266265
}
@@ -274,7 +273,7 @@ protected boolean handleBasicHttpAuthentication(
274273
return false;
275274
}
276275

277-
protected UsernamePasswordRoles getRequiredCredentials(IHttpRequestResponse request) {
276+
protected UsernamePasswordRoles getRequiredCredentials(final IHttpRequestResponse request) {
278277
return null;
279278
}
280279

@@ -288,23 +287,23 @@ public Message() {
288287

289288
}
290289

291-
public Message(String message) {
290+
public Message(final String message) {
292291
this.message = message;
293292
this.success = true;
294293
}
295294

296-
public Message(String title, String message) {
295+
public Message(final String title, final String message) {
297296
this.message = message;
298297
this.title = title;
299298
this.success = true;
300299
}
301300

302-
public Message(String message, boolean success) {
301+
public Message(final String message, final boolean success) {
303302
this.message = message;
304303
this.success = success;
305304
}
306305

307-
public Message(String title, String message, boolean success) {
306+
public Message(final String title, final String message, final boolean success) {
308307
this.title = title;
309308
this.message = message;
310309
this.success = success;

0 commit comments

Comments
 (0)