dbeaver/pro#6548 skip domain for ip addresses (#3647)

Co-authored-by: Daria Marutkina <125263541+dariamarutkina@users.noreply.github.com>
This commit is contained in:
Alexander Skoblikov
2025-08-12 19:03:25 +02:00
committed by GitHub
co-authored by Daria Marutkina
parent 0bb7803565
commit 27d8f4c011
3 changed files with 27 additions and 13 deletions
@@ -8,7 +8,8 @@ Bundle-Release-Date: 20250818
Bundle-RequiredExecutionEnvironment: JavaSE-21
Bundle-ActivationPolicy: lazy
Bundle-Activator: io.cloudbeaver.server.CBPlatformActivator
Require-Bundle: io.cloudbeaver.server;visibility:=reexport
Require-Bundle: io.cloudbeaver.server;visibility:=reexport,
com.google.guava
Export-Package: io.cloudbeaver,
io.cloudbeaver.model,
io.cloudbeaver.model.config,
@@ -16,11 +16,11 @@
*/
package io.cloudbeaver.model.config;
import com.google.common.net.InetAddresses;
import com.google.gson.annotations.SerializedName;
import io.cloudbeaver.auth.CBAuthConstants;
import io.cloudbeaver.model.app.WebServerConfiguration;
import io.cloudbeaver.server.CBConstants;
import io.cloudbeaver.utils.ServletAppUtils;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.Log;
@@ -209,12 +209,18 @@ public class CBServerConfig implements WebServerConfiguration {
host = "http://" + host; // Default to HTTP if no scheme is provided to avoid uri parse exception
}
URI uri = URI.create(host);
StringBuilder hostNameBuilder = new StringBuilder();
hostNameBuilder.append(ServletAppUtils.removeSideSlashes(uri.getHost() != null ? uri.getHost() : host));
String hostName = uri.getHost() != null ? uri.getHost() : host;
if (InetAddresses.isInetAddress(hostName)) {
log.warn("Host URI contains an IP address: " + hostName + ", skipped.");
continue;
}
StringBuilder hostNameBuilder = new StringBuilder(hostName);
if (uri.getPort() > 0) {
hostNameBuilder.append(':')
.append(uri.getPort());
}
uniqueHosts.add(hostNameBuilder.toString());
} catch (Exception e) {
log.error("Invalid host URI: " + host, e);
@@ -16,6 +16,7 @@
*/
package io.cloudbeaver.server.jetty;
import com.google.common.net.InetAddresses;
import io.cloudbeaver.model.config.CBServerConfig;
import io.cloudbeaver.server.CBApplication;
import io.cloudbeaver.utils.ServletAppUtils;
@@ -61,23 +62,30 @@ public class RequestHostFilter implements Filter {
chain.doFilter(request, response);
return;
}
boolean isIpAddress = InetAddresses.isInetAddress(originUri.getHost());
String servletPath = httpRequest.getServletPath();
if (CommonUtils.isNotEmpty(servletPath)) {
for (String excludedPath : excludedPaths) {
if (servletPath.contains(excludedPath)) {
chain.doFilter(request, response);
return;
if (!isIpAddress) {
if (CommonUtils.isNotEmpty(servletPath)) {
for (String excludedPath : excludedPaths) {
if (servletPath.contains(excludedPath)) {
chain.doFilter(request, response);
return;
}
}
}
validateHosts(serverConfig, httpRequest, response, originUri);
}
validateHosts(serverConfig, httpRequest, response, originUri);
validateSchema(serverConfig, httpRequest, response, originUri);
}
chain.doFilter(request, response);
}
private void validateSchema(CBServerConfig serverConfig, HttpServletRequest httpRequest, ServletResponse response, URI originUri) {
private void validateSchema(
@NotNull CBServerConfig serverConfig,
@NotNull HttpServletRequest httpRequest,
@NotNull ServletResponse response,
@NotNull URI originUri
) {
boolean httpsExpected = serverConfig.isForceHttps();
try {
if ("http".equals(originUri.getScheme()) && httpsExpected) {
@@ -93,7 +101,6 @@ public class RequestHostFilter implements Filter {
.append(httpRequest.getQueryString());
}
((HttpServletResponse) response).sendRedirect(redirectUrlBuilder.toString());
}
} catch (Exception e) {
log.error("Failed to redirect to HTTPS", e);