From 74659a687cea2e8698c5aa9433e1286f6f167d26 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 4 Dec 2012 09:00:38 +0100
Subject: [PATCH] OO-271: make the option "login blocked" persist across
 restart of OpenOLAT

---
 src/main/java/org/olat/admin/AdminModule.java | 72 +++++++----------
 .../org/olat/admin/AdminModuleDispatcher.java | 16 ++--
 .../BlockLoginConfirmationController.java     | 80 +++++++++++++++++++
 .../sysinfo/FileSystemTestController.java     |  4 +-
 .../admin/sysinfo/FileSystemTestEvent.java    |  9 +--
 .../UserSessionConfigAdminController.java     | 48 ++++++++---
 .../olat/admin/sysinfo/_content/block.html    |  4 +
 .../sysinfo/_i18n/LocalStrings_de.properties  |  4 +
 .../login/LoginAuthprovidersController.java   | 27 +++----
 .../java/org/olat/login/_content/login.html   |  5 ++
 .../login/_i18n/LocalStrings_de.properties    |  1 +
 .../login/_i18n/LocalStrings_en.properties    |  1 +
 12 files changed, 183 insertions(+), 88 deletions(-)
 create mode 100644 src/main/java/org/olat/admin/sysinfo/BlockLoginConfirmationController.java
 create mode 100644 src/main/java/org/olat/admin/sysinfo/_content/block.html

diff --git a/src/main/java/org/olat/admin/AdminModule.java b/src/main/java/org/olat/admin/AdminModule.java
index 2f8e0a11f34..ceb91a884c9 100644
--- a/src/main/java/org/olat/admin/AdminModule.java
+++ b/src/main/java/org/olat/admin/AdminModule.java
@@ -40,7 +40,6 @@ import org.olat.core.configuration.AbstractOLATModule;
 import org.olat.core.configuration.PersistedProperties;
 import org.olat.core.id.User;
 import org.olat.core.id.context.SiteContextEntryControllerCreator;
-import org.olat.core.logging.Tracing;
 import org.olat.core.util.session.UserSessionManager;
 import org.olat.instantMessaging.rosterandchat.ChangePresenceJob;
 import org.olat.properties.Property;
@@ -57,6 +56,7 @@ import org.olat.properties.PropertyManager;
  */
 public class AdminModule extends AbstractOLATModule {
 
+	private static final String CONFIG_LOGIN_BLOCKED = "loginBlocked";
 	/** Category for system properties **/
 	public static String SYSTEM_PROPERTY_CATEGORY = "_o3_";
 	public static final String PROPERTY_MAINTENANCE_MESSAGE    = "maintenanceMessageToken";
@@ -95,22 +95,22 @@ public class AdminModule extends AbstractOLATModule {
 	 * The maintenance message itself is managed by the OLATContext from the brasato core
 	 * @param message
 	 */
-	public static void setMaintenanceMessage(String message) {
-			GlobalStickyMessage.setGlobalStickyMessage(message, true);
+	public void setMaintenanceMessage(String message) {
+		GlobalStickyMessage.setGlobalStickyMessage(message, true);
 	}
 	
-	public static boolean checkMaintenanceMessageToken(HttpServletRequest request, HttpServletResponse response) {
+	public boolean checkMaintenanceMessageToken(HttpServletRequest request, HttpServletResponse response) {
 		return checkToken(request, PROPERTY_MAINTENANCE_MESSAGE);
 	}
 
-	public static boolean checkSessionAdminToken(HttpServletRequest request, HttpServletResponse response) {
+	public boolean checkSessionAdminToken(HttpServletRequest request, HttpServletResponse response) {
 		return checkToken(request, PROPERTY_SESSION_ADMINISTRATION);
 	}
 
-	private static boolean checkToken(HttpServletRequest request, String tokenPropertyName) {
+	private boolean checkToken(HttpServletRequest request, String tokenPropertyName) {
 		String submittedToken = request.getParameter("token");
 		if (submittedToken == null) {
-			Tracing.logAudit("Trying to set maintenance message without using a token. Remote address::" + request.getRemoteAddr(), AdminModule.class);
+			logAudit("Trying to set maintenance message without using a token. Remote address::" + request.getRemoteAddr());
 			return false;
 		}
 		// get token and compare
@@ -120,7 +120,7 @@ public class AdminModule extends AbstractOLATModule {
 		if (token.matches(submittedToken)) { // limit access to token
 			return true;
 		} else {
-			Tracing.logAudit("Trying to set maintenance message using a wrong token. Remote address::" + request.getRemoteAddr(), AdminModule.class);
+			logAudit("Trying to set maintenance message using a wrong token. Remote address::" + request.getRemoteAddr());
 			return false;
 		}
 	}
@@ -129,16 +129,17 @@ public class AdminModule extends AbstractOLATModule {
 	 * Does not allow any further login except administrator-logins.
 	 * @param newLoginBlocked
 	 */
-	public static void setLoginBlocked(boolean newLoginBlocked) {
-		Tracing.logAudit("Session administration: Set login-blocked=" + newLoginBlocked, AdminModule.class);
+	public void setLoginBlocked(boolean newLoginBlocked, boolean persist) {
+		logAudit("Session administration: Set login-blocked=" + newLoginBlocked);
 		AuthHelper.setLoginBlocked(newLoginBlocked);
+		setBooleanProperty(CONFIG_LOGIN_BLOCKED, newLoginBlocked, persist);
 	}
 
 	/**
 	 * Check if login is blocked
 	 * @return  true = login is blocked 
 	 */
-	public static boolean isLoginBlocked() {
+	public boolean isLoginBlocked() {
 		return AuthHelper.isLoginBlocked();
 	}
 
@@ -146,8 +147,8 @@ public class AdminModule extends AbstractOLATModule {
 	 * Set the rejectDMZRequests flag - if true this will reject all requests to dmz to other nodes
 	 * @param rejectDMZRequests
 	 */
-	public static void setRejectDMZRequests(boolean rejectDMZRequests) {
-		Tracing.logAudit("Session administration: Set rejectDMZRequests=" + rejectDMZRequests, AdminModule.class);
+	public void setRejectDMZRequests(boolean rejectDMZRequests) {
+		logAudit("Session administration: Set rejectDMZRequests=" + rejectDMZRequests);
 		AuthHelper.setRejectDMZRequests(rejectDMZRequests);
 	}
 
@@ -155,7 +156,7 @@ public class AdminModule extends AbstractOLATModule {
 	 * Check if requests to DMZ are rejected resulting in clients to go to another node
 	 * @return  true = reject all requests to dmz (to other nodes)
 	 */
-	public static boolean isRejectDMZRequests() {
+	public boolean isRejectDMZRequests() {
 		return AuthHelper.isRejectDMZRequests();
 	}
 
@@ -164,36 +165,17 @@ public class AdminModule extends AbstractOLATModule {
 	 * 0 = unlimited number of sessions
 	 * @param maxSession
 	 */
-	public static void setMaxSessions(int maxSession) {
-		Tracing.logAudit("Session administration: Set maxSession=" + maxSession, AdminModule.class);
+	public void setMaxSessions(int maxSession) {
+		logAudit("Session administration: Set maxSession=" + maxSession);
 		AuthHelper.setMaxSessions(maxSession);
 	}
-	
-	/**
-	 * Invalidated all session except administrator-sessions. 
-	 * @return  Number of invalidated sessions
-	 */
-	public static int invalidateAllSessionsDepr() {
-		Tracing.logAudit("Session administration: Invalidate all sessions.", AdminModule.class);
-		return CoreSpringFactory.getImpl(UserSessionManager.class).invalidateAllSessions();
-	}
-
-	/**
-	 * Invalidate a number of oldest (last-click time) sessions.
-	 * @param nbrSessions
-	 * @return  Number of invalidated sessions
-	 */
-	public static int invalidateOldestSessionsDepr(int nbrSessions) {
-		Tracing.logAudit("Session administration: Invalidate oldest sessions Nbr-Sessions=" + nbrSessions, AdminModule.class);
-		return  CoreSpringFactory.getImpl(UserSessionManager.class).invalidateOldestSessions(nbrSessions);
-	}
 
 	/**
 	 * Set global session timeout in msec.
 	 * @param sessionTimeout
 	 */
-	public static void setSessionTimeoutDepr(int sessionTimeout) {
-		Tracing.logAudit("Session administration: Set session-timeout=" + sessionTimeout, AdminModule.class);
+	public void setSessionTimeoutDepr(int sessionTimeout) {
+		logAudit("Session administration: Set session-timeout=" + sessionTimeout);
 		//in seconds
 
 		CoreSpringFactory.getImpl(UserSessionManager.class).setGlobalSessionTimeout(sessionTimeout);
@@ -204,7 +186,7 @@ public class AdminModule extends AbstractOLATModule {
 	/**
 	 * @return  Current session timeout in msec.
 	 */
-	public static int getSessionTimeout() {
+	public int getSessionTimeout() {
 		//changepresencejob holds the session timeout so far in milliseconds
 		int sessionTimeoutSeconds = Math.round((ChangePresenceJob.getAutoLogOutCutTimeValue() / 1000));
 		return sessionTimeoutSeconds;
@@ -213,7 +195,7 @@ public class AdminModule extends AbstractOLATModule {
 	/**
 	 * @return  Current session-limit.
 	 */
-	public static int getMaxSessions() {
+	public int getMaxSessions() {
 		return AuthHelper.getMaxSessions();
 	}
 
@@ -233,6 +215,11 @@ public class AdminModule extends AbstractOLATModule {
 		initializeSystemTokenProperty(PROPERTY_MAINTENANCE_MESSAGE);
 		initializeSystemTokenProperty(PROPERTY_SESSION_ADMINISTRATION);
 		
+		boolean loginBlocked = getBooleanPropertyValue(CONFIG_LOGIN_BLOCKED);
+		if(loginBlocked) {
+			AuthHelper.setLoginBlocked(loginBlocked);
+		}
+		
 		// Add controller factory extension point to launch groups
 		NewControllerFactory.getInstance().addContextEntryControllerCreator(User.class.getSimpleName(),
 				new UserAdminContextEntryControllerCreator());
@@ -251,14 +238,11 @@ public class AdminModule extends AbstractOLATModule {
 
 	@Override
 	protected void initFromChangedProperties() {
-		// TODO Auto-generated method stub
-		
+		//nothin to do
 	}
 
 	@Override
 	public void setPersistedProperties(PersistedProperties persistedProperties) {
 		this.moduleConfigProperties = persistedProperties;
-		
 	}
-	
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/AdminModuleDispatcher.java b/src/main/java/org/olat/admin/AdminModuleDispatcher.java
index d4e226e1e1e..f6914302df8 100644
--- a/src/main/java/org/olat/admin/AdminModuleDispatcher.java
+++ b/src/main/java/org/olat/admin/AdminModuleDispatcher.java
@@ -66,12 +66,13 @@ public class AdminModuleDispatcher implements Dispatcher {
 	/** 
 	 * @see org.olat.core.dispatcher.Dispatcher#execute(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.String)
 	 */
-	public void execute(HttpServletRequest request, HttpServletResponse response, @SuppressWarnings("unused") String uriPrefix) {
+	@Override
+	public void execute(HttpServletRequest request, HttpServletResponse response, String uriPrefix) {
 		String cmd = request.getParameter(PARAMETER_CMD);
 		if (cmd.equalsIgnoreCase(CMD_SET_MAINTENANCE_MESSAGE) || cmd.equalsIgnoreCase(CMD_SET_INFO_MESSAGE)) {
 			handleSetMaintenanceOrInfoMessage(request, response, cmd);
 		} else {
-			if (AdminModule.checkSessionAdminToken(request, response)) {
+			if (CoreSpringFactory.getImpl(AdminModule.class).checkSessionAdminToken(request, response)) {
 				handleSessionsCommand(request, response, cmd);
 			} else {
 				DispatcherAction.sendForbidden(request.getPathInfo(), response);
@@ -85,10 +86,10 @@ public class AdminModuleDispatcher implements Dispatcher {
 	 */
 	private void handleSessionsCommand(HttpServletRequest request, HttpServletResponse response, String cmd) {
 		if (cmd.equalsIgnoreCase(CMD_SET_LOGIN_BLOCKED)) {
-			AdminModule.setLoginBlocked(true);
+			CoreSpringFactory.getImpl(AdminModule.class).setLoginBlocked(true, false);
 			ServletUtil.serveStringResource(request, response, "Ok, login blocked");
 		} else if (cmd.equalsIgnoreCase(CMD_SET_LOGIN_NOT_BLOCKED)) {
-			AdminModule.setLoginBlocked(false);
+			CoreSpringFactory.getImpl(AdminModule.class).setLoginBlocked(false, false);
 			ServletUtil.serveStringResource(request, response, "Ok, login no more blocked");
 		}else if (cmd.equalsIgnoreCase(CMD_SET_MAX_SESSIONS)) {
 			handleSetMaxSessions(request, response);
@@ -116,7 +117,7 @@ public class AdminModuleDispatcher implements Dispatcher {
 		} else {
 			try {
 				int maxSessions = Integer.parseInt(maxSessionsString);
-				AdminModule.setMaxSessions(maxSessions);
+				CoreSpringFactory.getImpl(AdminModule.class).setMaxSessions(maxSessions);
 				ServletUtil.serveStringResource(request, response, "Ok, max-session=" + maxSessions);
 			} catch (NumberFormatException nbrException) {
 				ServletUtil.serveStringResource(request, response, "NOT_OK, parameter " + PARAMETER_MAX_MESSAGE + " must be a number");
@@ -166,14 +167,15 @@ public class AdminModuleDispatcher implements Dispatcher {
 	 * @param response
 	 */
 	private void handleSetMaintenanceOrInfoMessage(HttpServletRequest request, HttpServletResponse response, String cmd) {
-		if (AdminModule.checkMaintenanceMessageToken(request, response)) {
+		AdminModule adminModule = CoreSpringFactory.getImpl(AdminModule.class);
+		if (adminModule.checkMaintenanceMessageToken(request, response)) {
 			String message = request.getParameter(PARAMETER_MSG);
 			if (cmd.equalsIgnoreCase(CMD_SET_INFO_MESSAGE)){
 				InfoMessageManager mrg = (InfoMessageManager) CoreSpringFactory.getBean(InfoMessageManager.class);
 				mrg.setInfoMessage(message);
 				ServletUtil.serveStringResource(request, response, "Ok, new infoMessage is::" + message);
 			} else if (cmd.equalsIgnoreCase(CMD_SET_MAINTENANCE_MESSAGE)){
-				AdminModule.setMaintenanceMessage(message);
+				adminModule.setMaintenanceMessage(message);
 				ServletUtil.serveStringResource(request, response, "Ok, new maintenanceMessage is::" + message);
 			}
 		} else {
diff --git a/src/main/java/org/olat/admin/sysinfo/BlockLoginConfirmationController.java b/src/main/java/org/olat/admin/sysinfo/BlockLoginConfirmationController.java
new file mode 100644
index 00000000000..64a3d278f63
--- /dev/null
+++ b/src/main/java/org/olat/admin/sysinfo/BlockLoginConfirmationController.java
@@ -0,0 +1,80 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.admin.sysinfo;
+
+import org.olat.core.gui.UserRequest;
+import org.olat.core.gui.components.form.flexible.FormItemContainer;
+import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
+import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
+import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
+import org.olat.core.gui.control.Controller;
+import org.olat.core.gui.control.Event;
+import org.olat.core.gui.control.WindowControl;
+
+/**
+ * 
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class BlockLoginConfirmationController extends FormBasicController {
+	
+	private static final String[] keys = { "persist" };
+	private MultipleSelectionElement persistEl;
+	
+	public BlockLoginConfirmationController(UserRequest ureq, WindowControl wControl) {
+		super(ureq, wControl, "block");
+		initForm(ureq);
+	}
+
+	@Override
+	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
+		FormLayoutContainer optionsCont = FormLayoutContainer.createDefaultFormLayout("options", getTranslator());
+		formLayout.add(optionsCont);
+		formLayout.add("options", optionsCont);
+		String[] values = new String[] { translate("persist.block.login")};
+		persistEl = uifactory.addCheckboxesVertical("block.login.options", "block.login.options", optionsCont, keys, values, null, 1);
+		persistEl.select(keys[0], true);
+
+		FormLayoutContainer buttonCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
+		formLayout.add(buttonCont);
+		formLayout.add("buttons", buttonCont);
+		uifactory.addFormSubmitButton("ok", buttonCont);
+		uifactory.addFormCancelButton("cancel", buttonCont, ureq, getWindowControl());
+	}
+	
+	public boolean isPersist() {
+		return persistEl.isSelected(0);
+	}
+	
+	@Override
+	protected void doDispose() {
+		//
+	}
+
+	@Override
+	protected void formOK(UserRequest ureq) {
+		fireEvent(ureq, Event.DONE_EVENT);
+	}
+
+	@Override
+	protected void formCancelled(UserRequest ureq) {
+		fireEvent(ureq, Event.CANCELLED_EVENT);
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/sysinfo/FileSystemTestController.java b/src/main/java/org/olat/admin/sysinfo/FileSystemTestController.java
index 1f1071aa1f5..c6aaa942201 100644
--- a/src/main/java/org/olat/admin/sysinfo/FileSystemTestController.java
+++ b/src/main/java/org/olat/admin/sysinfo/FileSystemTestController.java
@@ -67,8 +67,6 @@ public class FileSystemTestController extends BasicController implements Generic
 	private final static String STATUS_FILE_WRITTEN = "Written test dirs/files";
 	private final static String STATUS_CHECKING     = "Checking test dirs/files...";
 	private final static String STATUS_FILE_CHECKED = "File checked";
-	private final static String STATUS_WAIT_CHECK   = "Waiting for check-result...";
-	private final static String STATUS_FINISHED     = "Finished"; 
 	private String testStatus = STATUS_STOPPED;
 	
 	private int loops = 1;
@@ -313,7 +311,7 @@ public class FileSystemTestController extends BasicController implements Generic
 		int loopCounter = 1;
 		while (checkWithRetriesEnabled && loopCounter++ < maxRetries) {
 			try {
-				Thread.currentThread().sleep(loopCounter * 100);
+				Thread.sleep(loopCounter * 100);
 			} catch (InterruptedException e) {
 				log.error("Exception in checkFileExists, " + e);
 			}
diff --git a/src/main/java/org/olat/admin/sysinfo/FileSystemTestEvent.java b/src/main/java/org/olat/admin/sysinfo/FileSystemTestEvent.java
index 722a8769b1c..9685b2f2447 100644
--- a/src/main/java/org/olat/admin/sysinfo/FileSystemTestEvent.java
+++ b/src/main/java/org/olat/admin/sysinfo/FileSystemTestEvent.java
@@ -31,7 +31,7 @@ import org.olat.core.util.event.MultiUserEvent;
  * @author Christian Guretzki
  */
 public class FileSystemTestEvent extends MultiUserEvent {
-	
+	private static final long serialVersionUID = -2883321872261399010L;
 	protected static final String COMMAND_FILE_WRITTEN = "cmd_file_written";
 	protected static final String COMMAND_FILE_CHECKED = "cmd_file_checked";
 	
@@ -82,18 +82,11 @@ public class FileSystemTestEvent extends MultiUserEvent {
 		return fileCheckOk;
 	}
 
-
 	public long getDuration() {
 		return duration;
 	}
 
-
 	public boolean isCheckWithRetriesEnabled() {
 		return isCheckWithRetriesEnabled;
 	}
-
-	
-	
-
-	
 }
diff --git a/src/main/java/org/olat/admin/sysinfo/UserSessionConfigAdminController.java b/src/main/java/org/olat/admin/sysinfo/UserSessionConfigAdminController.java
index e6c0d96a91d..cf488a7504f 100644
--- a/src/main/java/org/olat/admin/sysinfo/UserSessionConfigAdminController.java
+++ b/src/main/java/org/olat/admin/sysinfo/UserSessionConfigAdminController.java
@@ -34,6 +34,7 @@ import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
+import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
 import org.olat.core.gui.control.generic.modal.DialogBoxController;
 import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory;
 import org.olat.core.util.coordinate.CoordinatorManager;
@@ -51,21 +52,24 @@ public class UserSessionConfigAdminController extends FormBasicController {
 	private IntegerElement sessionTimeoutAuthEl;
 	private IntegerElement maxSessionsEl;
 	private IntegerElement nbrSessionsEl;
-	
+
+	private CloseableModalController cmc;
 	private DialogBoxController invalidateAllConfirmController;
-	private DialogBoxController blockLoginConfirmController;
 	private DialogBoxController rejectDMZRequestsConfirmController;
+	private BlockLoginConfirmationController blockLoginConfirmController;
 	
 	private FormLink saveLink, invalidateOldSessionLink, invalidateAllSessionLink;
 	private FormLink allowLoginLink, blockLoginLink;
 	private FormLink rejectDMZRequestsLink, allowDMZRequestsLink;
 	
+	private final AdminModule adminModule;
 	private final UserSessionModule sessionModule;
 	private final UserSessionManager sessionManager;
 	
 	public UserSessionConfigAdminController(UserRequest ureq, WindowControl wControl) {
 		super(ureq, wControl);
 		
+		adminModule = CoreSpringFactory.getImpl(AdminModule.class);
 		sessionModule = CoreSpringFactory.getImpl(UserSessionModule.class);
 		sessionManager = CoreSpringFactory.getImpl(UserSessionManager.class);
 		
@@ -78,7 +82,7 @@ public class UserSessionConfigAdminController extends FormBasicController {
 		sessionTimeoutEl = uifactory.addIntegerElement("session.timeout", "session.timeout.label", sessionTimeout, formLayout);
 		int initialSessionAuth = sessionModule.getSessionTimeoutAuthenticated();
 		sessionTimeoutAuthEl = uifactory.addIntegerElement("session.timeout.auth", "session.timeout.auth.label", initialSessionAuth, formLayout);
-		int maxSessions = AdminModule.getMaxSessions();
+		int maxSessions = adminModule.getMaxSessions();
 		maxSessionsEl = uifactory.addIntegerElement("max.sessions", "max.sessions.label", maxSessions, formLayout);
 		
 		FormLayoutContainer buttonsLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
@@ -116,8 +120,8 @@ public class UserSessionConfigAdminController extends FormBasicController {
 	}
 	
 	private void updateLoginBlock() {
-		blockLoginLink.setVisible(!AdminModule.isLoginBlocked());
-		allowLoginLink.setVisible(AdminModule.isLoginBlocked());
+		blockLoginLink.setVisible(!adminModule.isLoginBlocked());
+		allowLoginLink.setVisible(adminModule.isLoginBlocked());
 	}
 	
 	@Override
@@ -138,7 +142,7 @@ public class UserSessionConfigAdminController extends FormBasicController {
 			int sessionTimeoutAuth = sessionTimeoutAuthEl.getIntValue();
 			sessionModule.setSessionTimeoutAuthenticated(sessionTimeoutAuth);
 			int maxSessions = maxSessionsEl.getIntValue();
-			AdminModule.setMaxSessions(maxSessions);
+			adminModule.setMaxSessions(maxSessions);
 			sessionManager.setGlobalSessionTimeout(sessionTimeoutAuth);
 		} else if(source == invalidateOldSessionLink) {
 			int nbrSessions = nbrSessionsEl.getIntValue();
@@ -147,14 +151,14 @@ public class UserSessionConfigAdminController extends FormBasicController {
 		} else if(source == invalidateAllSessionLink) {
 			invalidateAllConfirmController = activateYesNoDialog(ureq, null, translate("invalidate.all.sure"), invalidateAllConfirmController);
 		} else if(source == blockLoginLink) {	
-			blockLoginConfirmController = activateYesNoDialog(ureq, null, translate("block.login.sure"), blockLoginConfirmController);
+			doConfirmLoginBlocked(ureq);
 		} else if(source == allowLoginLink) {
-			AdminModule.setLoginBlocked(false);
+			adminModule.setLoginBlocked(false, true);
 			updateLoginBlock();
 		} else if(source == rejectDMZRequestsLink) {
 			rejectDMZRequestsConfirmController = activateYesNoDialog(ureq, null, translate("reject.dmz.requests.sure"), rejectDMZRequestsConfirmController);
 		} else if(source == allowDMZRequestsLink) {
-			AdminModule.setRejectDMZRequests(false);
+			adminModule.setRejectDMZRequests(false);
 			updateDmzBlock();
 			showInfo("allow.dmz.requests.done");
 		} else {
@@ -170,17 +174,37 @@ public class UserSessionConfigAdminController extends FormBasicController {
 				showInfo("invalidate.session.done", Integer.toString(nbrOfInvalidatedSessions));
 			}
 		} else if (source == blockLoginConfirmController) {
-			if (DialogBoxUIFactory.isYesEvent(event)) { 
-				AdminModule.setLoginBlocked(true);
+			if (event == Event.DONE_EVENT) { 
+				boolean persist = blockLoginConfirmController.isPersist();
+				adminModule.setLoginBlocked(true, persist);
 				showInfo("block.login.done");
 			}
+			cmc.deactivate();
 			updateLoginBlock();
 		} else if (source == rejectDMZRequestsConfirmController) {
 			if (DialogBoxUIFactory.isYesEvent(event)) { 
-				AdminModule.setRejectDMZRequests(true);
+				adminModule.setRejectDMZRequests(true);
 				showInfo("reject.dmz.requests.done");
 			}
 			updateDmzBlock();
+		} else if(source == cmc) {
+			cleanUp();
 		}
 	}
+	
+	private void cleanUp() {
+		removeAsListenerAndDispose(blockLoginConfirmController);
+		removeAsListenerAndDispose(cmc);
+		blockLoginConfirmController = null;
+		cmc = null;
+	}
+	
+	private void doConfirmLoginBlocked(UserRequest ureq) {
+		blockLoginConfirmController = new BlockLoginConfirmationController(ureq, getWindowControl());
+		listenTo(blockLoginConfirmController);
+
+		cmc = new CloseableModalController(getWindowControl(), translate("close"), blockLoginConfirmController.getInitialComponent(), true, translate("block.login.title"));
+		cmc.activate();
+		listenTo(cmc);
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/sysinfo/_content/block.html b/src/main/java/org/olat/admin/sysinfo/_content/block.html
new file mode 100644
index 00000000000..b6c4dc2fc37
--- /dev/null
+++ b/src/main/java/org/olat/admin/sysinfo/_content/block.html
@@ -0,0 +1,4 @@
+<p>$r.translate("block.login.sure")</p>
+<p>$r.translate("block.login.info")</p>
+$r.render("options")
+$r.render("buttons")
diff --git a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties
index e4d367a029d..f09c10d3a83 100644
--- a/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/admin/sysinfo/_i18n/LocalStrings_de.properties
@@ -1,7 +1,11 @@
 #Mon Mar 02 09:54:04 CET 2009
 allow.login.done=Loginsperrung ist wieder aufgehoben.
 block.login.done=Neue Logins sind ab jetzt gesperrt.
+block.login.title=Login sperren
 block.login.sure=Sind Sie sicher, dass Sie für alle neuen Benutzer das Login sperren wollen?
+block.login.info=Sie können den "Login sperren" speichern so dass er noch gultig ist nach dem Restart.
+block.login.options=Persistieren
+persist.block.login=ein
 buildinfo=Build Information
 clear.hibernate.statistics=Hibernate Statistik l\u00F6schen
 disable.hibernate.statistics=Hibernate Statistik ausschalten
diff --git a/src/main/java/org/olat/login/LoginAuthprovidersController.java b/src/main/java/org/olat/login/LoginAuthprovidersController.java
index c978897f301..182c02639f6 100644
--- a/src/main/java/org/olat/login/LoginAuthprovidersController.java
+++ b/src/main/java/org/olat/login/LoginAuthprovidersController.java
@@ -210,25 +210,30 @@ public class LoginAuthprovidersController extends MainLayoutBasicController impl
 		contentBorn.contextPut("locale", ureq.getLocale());
 
 		// prepare info message
-		InfoMessageManager mrg = (InfoMessageManager)CoreSpringFactory.getBean(InfoMessageManager.class);
+		InfoMessageManager mrg = CoreSpringFactory.getImpl(InfoMessageManager.class);
 		String infomsg = mrg.getInfoMessage();
-		if (infomsg != null && infomsg.length() > 0)
+		if (infomsg != null && infomsg.length() > 0) {
 			contentBorn.contextPut("infomsg", infomsg);
+		}
 		
 		String infomsgNode = mrg.getInfoMessageNodeOnly();
-		if (infomsgNode != null && infomsgNode.length() > 0)
+		if (infomsgNode != null && infomsgNode.length() > 0) {
 			contentBorn.contextPut("infomsgNode", infomsgNode);
-		
+		}
 		
 		// add additional login intro message for custom content
 		String customMsg = translate("login.custommsg");
-		if(!StringUtils.isBlank(customMsg))
+		if(!StringUtils.isBlank(customMsg)) {
 			contentBorn.contextPut("logincustommsg",customMsg);
+		}
+		
+		//login is blocked?
+		if(AuthHelper.isLoginBlocked()) {
+			contentBorn.contextPut("loginBlocked", Boolean.TRUE);
+		}
 		
 		return contentBorn;
 	}
-
-	
 	
 	/**
 	 * @see org.olat.core.gui.control.DefaultController#doDispose()
@@ -341,7 +346,6 @@ public class LoginAuthprovidersController extends MainLayoutBasicController impl
 		}
 	}
 
-	
 	private TreeModel buildTreeModel() {
 		GenericTreeNode root, gtn;
 		
@@ -387,9 +391,4 @@ public class LoginAuthprovidersController extends MainLayoutBasicController impl
 
 		return gtm;
 	}
-	
-	
-	
-	
-	
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/login/_content/login.html b/src/main/java/org/olat/login/_content/login.html
index 0ccf3ac8797..8835d6f8350 100644
--- a/src/main/java/org/olat/login/_content/login.html
+++ b/src/main/java/org/olat/login/_content/login.html
@@ -23,6 +23,11 @@
 			</div>
 		</div>
 	#end
+	#if($loginBlocked)
+		<div class="b_warning">
+			$r.translate("login.blocked.forAll")
+		</div>
+	#end
 	#if($browserWarningOn)
 		<div class="b_warning">
 			$r.translate("login.browserswitch")
diff --git a/src/main/java/org/olat/login/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/login/_i18n/LocalStrings_de.properties
index 2d2ef69f76c..3604c561fdf 100644
--- a/src/main/java/org/olat/login/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/login/_i18n/LocalStrings_de.properties
@@ -82,6 +82,7 @@ lf.login=OpenOLAT-Benutzername
 lf.pass=OpenOLAT-Passwort
 login.altprovider=Alternative M\u00F6glichkeiten f\u00FCr Login
 login.blocked=<b>Anmeldung ist f\u00FCr diesen Benutzernamen gesperrt.</b><p><font size\="-1">Es wurden zu viele ung\u00FCltige Anmeldeversuche registriert. Eine Anmeldung mit diesem Benutzernamen wurde aus Sicherheitsgr\u00FCnden f\u00FCr die n\u00E4chsten {0} Minuten gesperrt.</p></font>
+login.blocked.forAll=Login sind momentan gesperrt. Probieren Sie bitte später.
 login.browserswitch=Ihr Internet-Browser unterst\u00FCtzt nicht alle Funktionen in OpenOLAT. Beste Resultate erhalten Sie mit Internet Explorer ab Version 7 sowie <a href\="http\://www.mozilla-europe.org/en/products/firefox/">Mozilla Firefox ab Version 2.</a>
 login.button=Login
 login.error=Benutzername oder Passwort falsch. Bitte versuchen Sie es erneut oder nutzen Sie die Funktion "$:menu.pw".
diff --git a/src/main/java/org/olat/login/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/login/_i18n/LocalStrings_en.properties
index 56bf5ccaa62..af6c9f2e572 100644
--- a/src/main/java/org/olat/login/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/login/_i18n/LocalStrings_en.properties
@@ -79,6 +79,7 @@ lf.pass=OpenOLAT password
 loadtest.warn=Attention\! Load test mode is activated\!
 login.altprovider=Alternative login possibilities.
 login.blocked=<b>Login blocked for this user name.</b><p><font size\="-1">Too many failed login attempts. For security reasons, further attempts will be blocked for a period of {0} minutes.</p></font>
+login.blocked.forAll=Login are blocked. Please try later.
 login.browserswitch=Your Internet browser does not support all features of OpenOLAT. For best results we recommend Internet Explorer 7 (or a newer version) or <a href\="http\://www.mozilla-europe.org/en/products/firefox/">Mozilla Firefox 2 (or newer version).</a>
 login.button=Login
 login.error=User name or password wrong. Please try again or use the function "$:menu.pw".
-- 
GitLab