Skip to content

Commit 9d1000e

Browse files
chore: improve DebugWindow connection denied log message (#23454) (#23463)
Splits the message so that the exact cause of the problem is shown instead of presenting both the cases. Log the denied address and allowed hosts list at each rejection point in isAllowedDevToolsHost, so users can diagnose why their debug window connection was refused. Co-authored-by: Marco Collovati <marco@vaadin.com>
1 parent b69339a commit 9d1000e

File tree

2 files changed

+41
-9
lines changed

2 files changed

+41
-9
lines changed

flow-server/src/main/java/com/vaadin/flow/server/communication/IndexHtmlRequestHandler.java

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -472,13 +472,23 @@ static boolean isAllowedDevToolsHost(AbstractConfiguration configuration,
472472
&& !hostsAllowedFromCfg.isBlank()) ? hostsAllowedFromCfg : null;
473473

474474
if (!isAllowedDevToolsHost(remoteAddress, hostsAllowed, true)) {
475+
getLogger().debug(
476+
"Dev tools access denied for remote address '{}'. Allowed hosts: [{}]",
477+
remoteAddress, hostsAllowed);
475478
return false;
476479
}
477480
String remoteHeaderIp = configuration.getStringProperty(
478481
SERVLET_PARAMETER_DEVMODE_REMOTE_ADDRESS_HEADER, null);
479482
if (remoteHeaderIp != null) {
480-
return isAllowedDevToolsHost(request.getHeader(remoteHeaderIp),
481-
hostsAllowed, false);
483+
String headerValue = request.getHeader(remoteHeaderIp);
484+
boolean allowed = isAllowedDevToolsHost(headerValue, hostsAllowed,
485+
false);
486+
if (!allowed) {
487+
getLogger().debug(
488+
"Dev tools access denied for address '{}' from header '{}'. Allowed hosts: [{}]",
489+
headerValue, remoteHeaderIp, hostsAllowed);
490+
}
491+
return allowed;
482492
}
483493

484494
Enumeration<String> allForwardedForHeaders = request
@@ -495,18 +505,35 @@ static boolean isAllowedDevToolsHost(AbstractConfiguration configuration,
495505
// Validate all hops
496506
String[] hops = forwardedFor.split(",");
497507
if (hops.length > 0) {
498-
return Stream.of(hops).map(String::trim)
508+
boolean allAllowed = Stream.of(hops).map(String::trim)
499509
.allMatch(ip -> isAllowedDevToolsHost(ip,
500510
hostsAllowed, false));
511+
if (!allAllowed) {
512+
getLogger().debug(
513+
"Dev tools access denied. Not all X-Forwarded-For addresses are allowed."
514+
+ " X-Forwarded-For: '{}'. Allowed hosts: [{}]",
515+
forwardedFor, hostsAllowed);
516+
}
517+
return allAllowed;
501518
} else {
502519
// Potential fake header with no addresses, e.g.
503520
// 'X-Forwarded-For: ,,,'
521+
getLogger().debug(
522+
"Dev tools access denied because of empty or invalid X-Forwarded-For header");
504523
return false;
505524
}
506525

507526
} else {
508-
return isAllowedDevToolsHost(forwardedFor.trim(), hostsAllowed,
509-
false);
527+
String trimmedForwardedFor = forwardedFor.trim();
528+
boolean allowed = isAllowedDevToolsHost(trimmedForwardedFor,
529+
hostsAllowed, false);
530+
if (!allowed) {
531+
getLogger().debug(
532+
"Dev tools access denied for X-Forwarded-For address '{}'."
533+
+ " Allowed hosts: [{}]",
534+
trimmedForwardedFor, hostsAllowed);
535+
}
536+
return allowed;
510537
}
511538
}
512539

vaadin-dev-server/src/main/java/com/vaadin/base/devserver/DebugWindowConnection.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,17 @@ protected DevToolsInterface getDevToolsInterface(
188188

189189
@Override
190190
public void onConnect(AtmosphereResource resource) {
191-
if (DevToolsToken.getToken()
192-
.equals(resource.getRequest().getParameter("token"))) {
191+
String requestToken = resource.getRequest().getParameter("token");
192+
if (DevToolsToken.getToken().equals(requestToken)) {
193193
handleConnect(resource);
194194
} else {
195-
getLogger().debug(
196-
"Connection denied because of a missing or invalid token. Either the host is not on the 'vaadin.devmode.hosts-allowed' list or it is using an outdated token");
195+
if (requestToken == null) {
196+
getLogger().debug(
197+
"Connection denied because the host is not on the 'vaadin.devmode.hosts-allowed' list");
198+
} else {
199+
getLogger().debug(
200+
"Connection denied because of an invalid or outdated security token.");
201+
}
197202
try {
198203
resource.close();
199204
} catch (IOException e) {

0 commit comments

Comments
 (0)