diff --git a/src/main/java/org/codelibs/fess/app/web/admin/general/AdminGeneralAction.java b/src/main/java/org/codelibs/fess/app/web/admin/general/AdminGeneralAction.java index e6a8bfd9d..73653a6f0 100644 --- a/src/main/java/org/codelibs/fess/app/web/admin/general/AdminGeneralAction.java +++ b/src/main/java/org/codelibs/fess/app/web/admin/general/AdminGeneralAction.java @@ -156,6 +156,7 @@ public class AdminGeneralAction extends FessAdminAction { fessConfig.setNotificationSearchTop(form.notificationSearchTop); fessConfig.storeSystemProperties(); + ComponentUtil.getLdapManager().updateConfig(); saveInfo(messages -> messages.addSuccessUpdateCrawlerParams(GLOBAL)); return redirect(getClass()); } diff --git a/src/main/java/org/codelibs/fess/helper/SystemHelper.java b/src/main/java/org/codelibs/fess/helper/SystemHelper.java index 41017e83c..f9a8913e6 100644 --- a/src/main/java/org/codelibs/fess/helper/SystemHelper.java +++ b/src/main/java/org/codelibs/fess/helper/SystemHelper.java @@ -301,6 +301,7 @@ public class SystemHelper { ComponentUtil.getSuggestHelper().init(); ComponentUtil.getPopularWordHelper().init(); ComponentUtil.getJobManager().reboot(); + ComponentUtil.getLdapManager().updateConfig(); } public String generateAccessToken() { diff --git a/src/main/java/org/codelibs/fess/ldap/LdapManager.java b/src/main/java/org/codelibs/fess/ldap/LdapManager.java index a894b8918..9dbff0c63 100644 --- a/src/main/java/org/codelibs/fess/ldap/LdapManager.java +++ b/src/main/java/org/codelibs/fess/ldap/LdapManager.java @@ -61,6 +61,8 @@ public class LdapManager { protected ThreadLocal contextLocal = new ThreadLocal<>(); + protected volatile boolean isBind = false; + protected Hashtable createEnvironment(final String initialContextFactory, final String securityAuthentication, final String providerUrl, final String principal, final String credntials) { final Hashtable env = new Hashtable<>(); @@ -99,6 +101,26 @@ public class LdapManager { fessConfig.getLdapAdminSecurityCredentials()); } + public void updateConfig() { + isBind = false; + } + + protected boolean validate() { + if (!isBind) { + final Hashtable env = createAdminEnv(); + try (DirContextHolder holder = getDirContext(() -> env)) { + final DirContext context = holder.get(); + if (logger.isDebugEnabled()) { + logger.debug("Logged in as Bind DN.", context); + } + isBind = true; + } catch (final Exception e) { + logger.warn("LDAP configuration is wrong.", e); + } + } + return false; + } + public OptionalEntity login(final String username, final String password) { final FessConfig fessConfig = ComponentUtil.getFessConfig(); @@ -106,6 +128,10 @@ public class LdapManager { return OptionalEntity.empty(); } + if (!validate()) { + return OptionalEntity.empty(); + } + final Hashtable env = createSearchEnv(username, password); try (DirContextHolder holder = getDirContext(() -> env)) { final DirContext context = holder.get();