From f1894f70e1620889b18feb79eab4c2d374bfde0e Mon Sep 17 00:00:00 2001 From: Shinsuke Sugaya Date: Thu, 8 Feb 2024 14:03:19 +0900 Subject: [PATCH] fix #2804 Disable OSDD processing when SSO is active to enhance usability --- .../java/org/codelibs/fess/Constants.java | 6 + .../org/codelibs/fess/helper/OsddHelper.java | 51 ++++-- .../fess/mylasta/direction/FessConfig.java | 17 +- .../fess/mylasta/direction/FessProp.java | 4 + .../org/codelibs/fess/sso/SsoManager.java | 9 +- src/main/resources/fess_config.properties | 2 +- .../codelibs/fess/helper/OsddHelperTest.java | 169 ++++++++++++++++++ 7 files changed, 224 insertions(+), 34 deletions(-) create mode 100644 src/test/java/org/codelibs/fess/helper/OsddHelperTest.java diff --git a/src/main/java/org/codelibs/fess/Constants.java b/src/main/java/org/codelibs/fess/Constants.java index e3bce22b2..06ea8c475 100644 --- a/src/main/java/org/codelibs/fess/Constants.java +++ b/src/main/java/org/codelibs/fess/Constants.java @@ -53,6 +53,10 @@ public class Constants extends CoreLibConstants { public static final String STOP = "stop"; + public static final String AUTO = "auto"; + + public static final String NONE = "none"; + public static final String ITEM_LABEL = "label"; public static final String ITEM_VALUE = "value"; @@ -158,6 +162,8 @@ public class Constants extends CoreLibConstants { public static final String LTR_WINDOW_SIZE_PROPERTY = "ltr.window.size"; + public static final String SSO_TYPE_PROPERTY = "sso.type"; + public static final String REQUEST_QUERIES = "fess.Queries"; public static final String HIGHLIGHT_QUERIES = "fess.HighlightQueries"; diff --git a/src/main/java/org/codelibs/fess/helper/OsddHelper.java b/src/main/java/org/codelibs/fess/helper/OsddHelper.java index 90ca1b3e7..4f21495a9 100644 --- a/src/main/java/org/codelibs/fess/helper/OsddHelper.java +++ b/src/main/java/org/codelibs/fess/helper/OsddHelper.java @@ -23,6 +23,7 @@ import org.apache.logging.log4j.Logger; import org.codelibs.core.lang.StringUtil; import org.codelibs.fess.Constants; +import org.codelibs.fess.mylasta.direction.FessConfig; import org.codelibs.fess.util.ComponentUtil; import org.lastaflute.web.response.StreamResponse; import org.lastaflute.web.util.LaServletContextUtil; @@ -51,20 +52,44 @@ public void init() { if (logger.isDebugEnabled()) { logger.debug("Initialize {}", this.getClass().getSimpleName()); } - if (Constants.TRUE.equalsIgnoreCase(ComponentUtil.getFessConfig().getOsddLinkEnabled())) { - if (StringUtil.isNotBlank(osddPath)) { - final String path = LaServletContextUtil.getServletContext().getRealPath(osddPath); - osddFile = new File(path); - if (!osddFile.isFile()) { - osddFile = null; - logger.warn("{} was not found.", path); - } - } else { - logger.info("OSDD file is not found."); - } - } else { + osddFile = getOsddFile(); + } + + protected File getOsddFile() { + if (!isOsddLinkEnabled()) { logger.debug("OSDD is disabled."); + return null; + } + if (StringUtil.isBlank(osddPath)) { + logger.info("OSDD file is not found."); + return null; + } + final String path = LaServletContextUtil.getServletContext().getRealPath(osddPath); + if (path == null) { + logger.warn("{} was not found.", path); + return null; + } + final File osddFile = new File(path); + if (!osddFile.isFile()) { + logger.warn("{} was not a file.", path); + return null; } + return osddFile; + } + + protected boolean isOsddLinkEnabled() { + final FessConfig fessConfig = ComponentUtil.getFessConfig(); + final String osddLinkEnabled = fessConfig.getOsddLinkEnabled(); + if (Constants.TRUE.equalsIgnoreCase(osddLinkEnabled)) { + return true; + } + + if (!Constants.AUTO.equalsIgnoreCase(osddLinkEnabled)) { + return false; + } + + final String ssoType = fessConfig.getSsoType(); + return StringUtil.isBlank(ssoType) || Constants.NONE.equalsIgnoreCase(ssoType); } public boolean hasOpenSearchFile() { @@ -73,7 +98,7 @@ public boolean hasOpenSearchFile() { public StreamResponse asStream() { if (osddFile == null) { - throw ComponentUtil.getResponseManager().new404("Unsupported OpenSearch response."); + throw ComponentUtil.getResponseManager().new404("Unsupported Open Search Description Document response."); } return new StreamResponse(osddFile.getName()).contentType(contentType + "; charset=" + encoding).stream(out -> { diff --git a/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java b/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java index 228f00b99..1785c37a1 100644 --- a/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java +++ b/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java @@ -1194,7 +1194,7 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction /** The key of the configuration. e.g. __TEMPLATE__ */ String FORM_ADMIN_DEFAULT_TEMPLATE_NAME = "form.admin.default.template.name"; - /** The key of the configuration. e.g. true */ + /** The key of the configuration. e.g. auto */ String OSDD_LINK_ENABLED = "osdd.link.enabled"; /** The key of the configuration. e.g. true */ @@ -5569,18 +5569,11 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction /** * Get the value for the key 'osdd.link.enabled'.
- * The value is, e.g. true
+ * The value is, e.g. auto
* @return The value of found property. (NotNull: if not found, exception but basically no way) */ String getOsddLinkEnabled(); - /** - * Is the property for the key 'osdd.link.enabled' true?
- * The value is, e.g. true
- * @return The determination, true or false. (if not found, exception but basically no way) - */ - boolean isOsddLinkEnabled(); - /** * Get the value for the key 'clipboard.copy.icon.enabled'.
* The value is, e.g. true
@@ -9640,10 +9633,6 @@ public String getOsddLinkEnabled() { return get(FessConfig.OSDD_LINK_ENABLED); } - public boolean isOsddLinkEnabled() { - return is(FessConfig.OSDD_LINK_ENABLED); - } - public String getClipboardCopyIconEnabled() { return get(FessConfig.CLIPBOARD_COPY_ICON_ENABLED); } @@ -11147,7 +11136,7 @@ protected java.util.Map prepareGeneratedDefaultMap() { defaultMap.put(FessConfig.FORM_ADMIN_MAX_INPUT_SIZE, "10000"); defaultMap.put(FessConfig.FORM_ADMIN_LABEL_IN_CONFIG_ENABLED, "false"); defaultMap.put(FessConfig.FORM_ADMIN_DEFAULT_TEMPLATE_NAME, "__TEMPLATE__"); - defaultMap.put(FessConfig.OSDD_LINK_ENABLED, "true"); + defaultMap.put(FessConfig.OSDD_LINK_ENABLED, "auto"); defaultMap.put(FessConfig.CLIPBOARD_COPY_ICON_ENABLED, "true"); defaultMap.put(FessConfig.AUTHENTICATION_ADMIN_USERS, "admin"); defaultMap.put(FessConfig.AUTHENTICATION_ADMIN_ROLES, "admin"); diff --git a/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java b/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java index 4ccf47429..bf6fea82a 100644 --- a/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java +++ b/src/main/java/org/codelibs/fess/mylasta/direction/FessProp.java @@ -723,6 +723,10 @@ default boolean isAzureAdUseDomainServices() { return Constants.TRUE.equalsIgnoreCase(getSystemProperty("aad.use.ds", "true")); } + default String getSsoType() { + return getSystemProperty(Constants.SSO_TYPE_PROPERTY, Constants.NONE); + } + // // fess_*.properties // diff --git a/src/main/java/org/codelibs/fess/sso/SsoManager.java b/src/main/java/org/codelibs/fess/sso/SsoManager.java index cd87d19f4..364b86b55 100644 --- a/src/main/java/org/codelibs/fess/sso/SsoManager.java +++ b/src/main/java/org/codelibs/fess/sso/SsoManager.java @@ -20,6 +20,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.codelibs.fess.Constants; import org.codelibs.fess.mylasta.action.FessUserBean; import org.codelibs.fess.util.ComponentUtil; import org.lastaflute.web.login.credential.LoginCredential; @@ -28,10 +29,6 @@ public class SsoManager { private static final Logger logger = LogManager.getLogger(SsoManager.class); - protected static final String SSO_TYPE = "sso.type"; - - protected static final String NONE = "none"; - protected final List authenticatorList = new ArrayList<>(); public boolean available() { @@ -39,7 +36,7 @@ public boolean available() { if (logger.isDebugEnabled()) { logger.debug("sso.type: {}", ssoType); } - return !NONE.equals(ssoType); + return !Constants.NONE.equals(ssoType); } public LoginCredential getLoginCredential() { @@ -81,7 +78,7 @@ protected SsoAuthenticator getAuthenticator() { } protected String getSsoType() { - return ComponentUtil.getFessConfig().getSystemProperty(SSO_TYPE, NONE); + return ComponentUtil.getFessConfig().getSsoType(); } public SsoAuthenticator[] getAuthenticators() { diff --git a/src/main/resources/fess_config.properties b/src/main/resources/fess_config.properties index 20660ad73..becd3c521 100644 --- a/src/main/resources/fess_config.properties +++ b/src/main/resources/fess_config.properties @@ -633,7 +633,7 @@ logging.app.packages=org.codelibs,org.dbflute,org.lastaflute form.admin.max.input.size=10000 form.admin.label.in.config.enabled=false form.admin.default.template.name=__TEMPLATE__ -osdd.link.enabled=true +osdd.link.enabled=auto clipboard.copy.icon.enabled=true # ---------------------------------------------------------- diff --git a/src/test/java/org/codelibs/fess/helper/OsddHelperTest.java b/src/test/java/org/codelibs/fess/helper/OsddHelperTest.java new file mode 100644 index 000000000..1bd7e343d --- /dev/null +++ b/src/test/java/org/codelibs/fess/helper/OsddHelperTest.java @@ -0,0 +1,169 @@ +/* + * Copyright 2012-2023 CodeLibs Project and the Others. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ +package org.codelibs.fess.helper; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import org.codelibs.core.io.InputStreamUtil; +import org.codelibs.fess.Constants; +import org.codelibs.fess.mylasta.direction.FessConfig; +import org.codelibs.fess.unit.UnitFessTestCase; +import org.codelibs.fess.util.ComponentUtil; +import org.lastaflute.web.response.StreamResponse; +import org.lastaflute.web.servlet.request.stream.WrittenStreamOut; + +public class OsddHelperTest extends UnitFessTestCase { + + public void test_init_nofile() { + ComponentUtil.setFessConfig(new FessConfig.SimpleImpl() { + @Override + public String getOsddLinkEnabled() { + return "auto"; + } + + @Override + public String getSsoType() { + return "none"; + } + }); + final OsddHelper osddHelper = new OsddHelper(); + osddHelper.setContentType("application/opensearchdescription+xml"); + osddHelper.init(); + assertFalse(osddHelper.hasOpenSearchFile()); + + try { + osddHelper.asStream(); + fail(); + } catch (final Exception e) { + assertEquals("Unsupported Open Search Description Document response.", e.getMessage()); + } + } + + public void test_init_osddpath() throws IOException { + ComponentUtil.setFessConfig(new FessConfig.SimpleImpl() { + @Override + public String getOsddLinkEnabled() { + return "auto"; + } + + @Override + public String getSsoType() { + return "none"; + } + }); + final OsddHelper osddHelper = new OsddHelper(); + osddHelper.setOsddPath("osdd/osdd.xml"); + osddHelper.setEncoding(Constants.UTF_8); + osddHelper.init(); + assertTrue(osddHelper.hasOpenSearchFile()); + + final StreamResponse streamResponse = osddHelper.asStream(); + assertEquals("text/xml; charset=UTF-8", streamResponse.getContentType()); + streamResponse.getStreamCall().callback(new WrittenStreamOut() { + + @Override + public void write(final InputStream ins) throws IOException { + assertEquals(""" + + + Fess + Full Text Search for Your Documents. + Full Text Search + fess-user@lists.sourceforge.jp + http://localhost:8080/fess/ + + UTF-8 + UTF-8 + + """, new String(InputStreamUtil.getBytes(ins))); + } + + @Override + public OutputStream stream() { + return null; + } + }); + } + + public void test_init_osddpath_null() { + ComponentUtil.setFessConfig(new FessConfig.SimpleImpl() { + @Override + public String getOsddLinkEnabled() { + return "auto"; + } + + @Override + public String getSsoType() { + return "none"; + } + }); + final OsddHelper osddHelper = new OsddHelper(); + osddHelper.setOsddPath("osdd/none.xml"); + osddHelper.init(); + assertFalse(osddHelper.hasOpenSearchFile()); + } + + public void test_init_disabled() { + ComponentUtil.setFessConfig(new FessConfig.SimpleImpl() { + @Override + public String getOsddLinkEnabled() { + return "false"; + } + }); + final OsddHelper osddHelper = new OsddHelper(); + osddHelper.setOsddPath("osdd/osdd.xml"); + osddHelper.init(); + assertFalse(osddHelper.hasOpenSearchFile()); + } + + public void test_init_saml() { + ComponentUtil.setFessConfig(new FessConfig.SimpleImpl() { + @Override + public String getOsddLinkEnabled() { + return "auto"; + } + + @Override + public String getSsoType() { + return "saml"; + } + }); + final OsddHelper osddHelper = new OsddHelper(); + osddHelper.setOsddPath("osdd/osdd.xml"); + osddHelper.init(); + assertFalse(osddHelper.hasOpenSearchFile()); + } + + public void test_init_force() throws IOException { + ComponentUtil.setFessConfig(new FessConfig.SimpleImpl() { + @Override + public String getOsddLinkEnabled() { + return "true"; + } + + @Override + public String getSsoType() { + return "saml"; + } + }); + final OsddHelper osddHelper = new OsddHelper(); + osddHelper.setOsddPath("osdd/osdd.xml"); + osddHelper.init(); + assertTrue(osddHelper.hasOpenSearchFile()); + } +}