From baf3ffb2589b3644d967aec6852f88095161e624 Mon Sep 17 00:00:00 2001 From: delchev Date: Thu, 27 Aug 2026 19:34:58 +0300 Subject: [PATCH] Print languages: backend-neutral codes from the CMS, and a malformed Accept-Language degrades instead of throwing The S3 CMS names child folders with their trailing separator (en/), so CmsStore.listLanguages served slash-suffixed language codes; the print dialog offered them and pinned the pick as Accept-Language, and Locale.LanguageRange.parse("en/") then threw out of UserFacade.getLanguage - every localized repository read in the print feeder answered 500 on S3-backed deployments. CmsStore now strips the separator so the language CODE contract does not depend on the CMS backend, and UserFacade.getLanguage treats a malformed client-controlled header as "no preference" (warn + empty) instead of propagating IllegalArgumentException. Fixes #6967 Co-Authored-By: Claude Fable 5 --- .../components/api/security/UserFacade.java | 12 +++++++++++- .../components/engine/document/CmsStore.java | 10 +++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/components/api/api-security/src/main/java/org/eclipse/dirigible/components/api/security/UserFacade.java b/components/api/api-security/src/main/java/org/eclipse/dirigible/components/api/security/UserFacade.java index d0ea5866a04..1d6d65bceda 100644 --- a/components/api/api-security/src/main/java/org/eclipse/dirigible/components/api/security/UserFacade.java +++ b/components/api/api-security/src/main/java/org/eclipse/dirigible/components/api/security/UserFacade.java @@ -399,7 +399,17 @@ public static String getLanguage() { if (language == null || language.isEmpty()) { language = ANY_LANGUAGE; } - List ranges = Locale.LanguageRange.parse(language); + List ranges; + try { + ranges = Locale.LanguageRange.parse(language); + } catch (IllegalArgumentException e) { + // The header is client-controlled: a malformed value must degrade to "no language + // preference", never turn every localized read on this request into a 500. + if (logger.isWarnEnabled()) { + logger.warn("Malformed Accept-Language header [{}] - ignoring it", language); + } + return ""; + } return ranges == null || ranges.isEmpty() ? "" : ranges.get(0) .getRange(); diff --git a/components/engine/engine-document/src/main/java/org/eclipse/dirigible/components/engine/document/CmsStore.java b/components/engine/engine-document/src/main/java/org/eclipse/dirigible/components/engine/document/CmsStore.java index 93370fc1e40..20288cf1cc9 100644 --- a/components/engine/engine-document/src/main/java/org/eclipse/dirigible/components/engine/document/CmsStore.java +++ b/components/engine/engine-document/src/main/java/org/eclipse/dirigible/components/engine/document/CmsStore.java @@ -95,7 +95,15 @@ List listLanguages(String entityName) throws IOException { for (CmisObject child : printFolder.get() .getChildren()) { if (child instanceof CmisFolder) { - languages.add(child.getName()); + // The S3 CMS names a child folder with its trailing separator (en/) while the + // internal CMS does not - normalize so the language CODE contract is backend-neutral. + String code = child.getName(); + while (code.endsWith(PATH_SEPARATOR)) { + code = code.substring(0, code.length() - 1); + } + if (!code.isEmpty()) { + languages.add(code); + } } } return languages;