Skip to content

Commit 0afba80

Browse files
chore: improve DebugWindow connection denied log message (#23454) (#23462)
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 f9dd189 commit 0afba80

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
@@ -438,13 +438,23 @@ static boolean isAllowedDevToolsHost(AbstractConfiguration configuration,
438438
&& !hostsAllowedFromCfg.isBlank()) ? hostsAllowedFromCfg : null;
439439

440440
if (!isAllowedDevToolsHost(remoteAddress, hostsAllowed, true)) {
441+
getLogger().debug(
442+
"Dev tools access denied for remote address '{}'. Allowed hosts: [{}]",
443+
remoteAddress, hostsAllowed);
441444
return false;
442445
}
443446
String remoteHeaderIp = configuration.getStringProperty(
444447
SERVLET_PARAMETER_DEVMODE_REMOTE_ADDRESS_HEADER, null);
445448
if (remoteHeaderIp != null) {
446-
return isAllowedDevToolsHost(request.getHeader(remoteHeaderIp),
447-
hostsAllowed, false);
449+
String headerValue = request.getHeader(remoteHeaderIp);
450+
boolean allowed = isAllowedDevToolsHost(headerValue, hostsAllowed,
451+
false);
452+
if (!allowed) {
453+
getLogger().debug(
454+
"Dev tools access denied for address '{}' from header '{}'. Allowed hosts: [{}]",
455+
headerValue, remoteHeaderIp, hostsAllowed);
456+
}
457+
return allowed;
448458
}
449459

450460
Enumeration<String> allForwardedForHeaders = request
@@ -461,18 +471,35 @@ static boolean isAllowedDevToolsHost(AbstractConfiguration configuration,
461471
// Validate all hops
462472
String[] hops = forwardedFor.split(",");
463473
if (hops.length > 0) {
464-
return Stream.of(hops).map(String::trim)
474+
boolean allAllowed = Stream.of(hops).map(String::trim)
465475
.allMatch(ip -> isAllowedDevToolsHost(ip,
466476
hostsAllowed, false));
477+
if (!allAllowed) {
478+
getLogger().debug(
479+
"Dev tools access denied. Not all X-Forwarded-For addresses are allowed."
480+
+ " X-Forwarded-For: '{}'. Allowed hosts: [{}]",
481+
forwardedFor, hostsAllowed);
482+
}
483+
return allAllowed;
467484
} else {
468485
// Potential fake header with no addresses, e.g.
469486
// 'X-Forwarded-For: ,,,'
487+
getLogger().debug(
488+
"Dev tools access denied because of empty or invalid X-Forwarded-For header");
470489
return false;
471490
}
472491

473492
} else {
474-
return isAllowedDevToolsHost(forwardedFor.trim(), hostsAllowed,
475-
false);
493+
String trimmedForwardedFor = forwardedFor.trim();
494+
boolean allowed = isAllowedDevToolsHost(trimmedForwardedFor,
495+
hostsAllowed, false);
496+
if (!allowed) {
497+
getLogger().debug(
498+
"Dev tools access denied for X-Forwarded-For address '{}'."
499+
+ " Allowed hosts: [{}]",
500+
trimmedForwardedFor, hostsAllowed);
501+
}
502+
return allowed;
476503
}
477504
}
478505

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
@@ -191,12 +191,17 @@ protected DevToolsInterface getDevToolsInterface(
191191

192192
@Override
193193
public void onConnect(AtmosphereResource resource) {
194-
if (DevToolsToken.getToken()
195-
.equals(resource.getRequest().getParameter("token"))) {
194+
String requestToken = resource.getRequest().getParameter("token");
195+
if (DevToolsToken.getToken().equals(requestToken)) {
196196
handleConnect(resource);
197197
} else {
198-
getLogger().debug(
199-
"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");
198+
if (requestToken == null) {
199+
getLogger().debug(
200+
"Connection denied because the host is not on the 'vaadin.devmode.hosts-allowed' list");
201+
} else {
202+
getLogger().debug(
203+
"Connection denied because of an invalid or outdated security token.");
204+
}
200205
try {
201206
resource.close();
202207
} catch (IOException e) {

0 commit comments

Comments
 (0)