From ad9a2b7dd4ddd33b2f74c8084c4b8e5ddb9cd6c7 Mon Sep 17 00:00:00 2001 From: devmrko Date: Mon, 29 Jun 2026 22:33:27 +0900 Subject: [PATCH] fix: preserve quoted DDS end user identity --- .../ddsbackoffice/service/DdsQueryService.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/dds-backoffice/src/main/java/com/cloudhandson/ddsbackoffice/service/DdsQueryService.java b/dds-backoffice/src/main/java/com/cloudhandson/ddsbackoffice/service/DdsQueryService.java index 869dabf..80c7a1d 100644 --- a/dds-backoffice/src/main/java/com/cloudhandson/ddsbackoffice/service/DdsQueryService.java +++ b/dds-backoffice/src/main/java/com/cloudhandson/ddsbackoffice/service/DdsQueryService.java @@ -85,7 +85,7 @@ public class DdsQueryService { var search = searchText == null ? "" : searchText.trim(); var timeoutSeconds = timeoutSeconds(properties.queryTimeout()); var connectionProperties = new Properties(); - connectionProperties.setProperty("user", user.username()); + connectionProperties.setProperty("user", jdbcUsername(user.username())); connectionProperties.setProperty("password", user.password()); connectionProperties.setProperty("oracle.net.CONNECT_TIMEOUT", String.valueOf(timeoutSeconds * 1000)); connectionProperties.setProperty("oracle.jdbc.ReadTimeout", String.valueOf(timeoutSeconds * 1000)); @@ -168,6 +168,19 @@ public class DdsQueryService { return normalized; } + private static String jdbcUsername(String username) { + var normalized = username == null ? "" : username.trim(); + if (normalized.length() >= 2 && normalized.startsWith("\"") && normalized.endsWith("\"")) { + return normalized; + } + // The standalone SQL creates quoted lower-case END USER names. Oracle's + // JDBC driver uppercases an unquoted username, so preserve that identity. + if (!normalized.isEmpty() && normalized.equals(normalized.toLowerCase(Locale.ROOT))) { + return "\"" + normalized.replace("\"", "\"\"") + "\""; + } + return normalized; + } + private static int timeoutSeconds(Duration duration) { return Math.max(1, (int) Math.ceil(duration.toMillis() / 1000.0)); }