/** * OLAT - Online Learning and Training<br> * http://www.olat.org * <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 * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <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> * Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> * University of Zurich, Switzerland. * <hr> * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * This file has been modified by the OpenOLAT community. Changes are licensed * under the Apache 2.0 license as the original file. */ package org.olat.user; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import org.olat.NewControllerFactory; import org.olat.admin.site.UserAdminSite; import org.olat.admin.user.UserAdminContextEntryControllerCreator; import org.olat.core.CoreSpringFactory; import org.olat.core.configuration.AbstractSpringModule; import org.olat.core.id.Identity; import org.olat.core.id.User; import org.olat.core.id.UserConstants; import org.olat.core.logging.OLog; import org.olat.core.logging.StartupException; import org.olat.core.logging.Tracing; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.ldap.LDAPLoginManager; import org.olat.ldap.LDAPLoginModule; import org.olat.user.propertyhandlers.UserPropertyHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; /** * Desciption: The user module represents an implementation of * the OLAT user with its database object, business managers and page actions. * * @author Florian Gnägi */ @Service public class UserModule extends AbstractSpringModule { private static OLog log = Tracing.createLoggerFor(UserModule.class); @Autowired @Qualifier("loginBlacklist") private ArrayList<String> loginBlacklist; private List<String> loginBlacklistChecked = new ArrayList<String>(); @Value("${password.change.allowed}") private boolean pwdchangeallowed; private String adminUserName = "administrator"; @Value("${user.logoByProfile:disabled}") private String enabledLogoByProfile; @Autowired private UserManager userManger; @Autowired public UserModule(CoordinatorManager coordinatorManager) { super(coordinatorManager); } @Override public void init() { int count = 0; for (String regexp : loginBlacklist) { try { Pattern.compile(regexp); loginBlacklistChecked.add(regexp); } catch (PatternSyntaxException pse) { log.error("Invalid pattern syntax in blacklist. Pattern: " + regexp+". Removing from this entry from list "); } count ++; } log.info("Successfully added " + count + " entries to login blacklist."); // Check if user manager is configured properly and has user property // handlers for the mandatory user properties used in OLAT checkMandatoryUserProperty(UserConstants.FIRSTNAME); checkMandatoryUserProperty(UserConstants.LASTNAME); checkMandatoryUserProperty(UserConstants.EMAIL); // Add controller factory extension point to launch user profile controller NewControllerFactory.getInstance().addContextEntryControllerCreator(Identity.class.getSimpleName(), new IdentityContextEntryControllerCreator()); NewControllerFactory.getInstance().addContextEntryControllerCreator("HomeSite", new IdentityContextEntryControllerCreator()); NewControllerFactory.getInstance().addContextEntryControllerCreator("HomePage", new HomePageContextEntryControllerCreator()); NewControllerFactory.getInstance().addContextEntryControllerCreator(User.class.getSimpleName(), new UserAdminContextEntryControllerCreator()); NewControllerFactory.getInstance().addContextEntryControllerCreator(UserAdminSite.class.getSimpleName(), new UserAdminContextEntryControllerCreator()); } @Override protected void initFromChangedProperties() { // } private void checkMandatoryUserProperty(String userPropertyIdentifyer) { List<UserPropertyHandler> propertyHandlers = userManger.getUserPropertiesConfig().getAllUserPropertyHandlers(); boolean propertyDefined = false; for (UserPropertyHandler propertyHandler : propertyHandlers) { if (propertyHandler.getName().equals(userPropertyIdentifyer)) { propertyDefined = true; break; } } if ( ! propertyDefined) { throw new StartupException("The user property handler for the mandatory user property " + userPropertyIdentifyer + " is not defined. Check your olat_userconfig.xml file!"); } } /** * @return List of logins on blacklist. */ public List<String> getLoginBlacklist() { return loginBlacklistChecked; } /** * Check wether a login is on the blacklist. * * @param login * @return True if login is in blacklist */ public boolean isLoginOnBlacklist(String login) { login = login.toLowerCase(); for (String regexp: getLoginBlacklist()) { if (login.matches(regexp)) { log.audit("Blacklist entry match for login '" + login + "' with regexp '" + regexp + "'."); return true; } } return false; } /** * checks whether the given identity is allowed to change it's own password. * default settings (olat.properties) : * <ul> * <li>LDAP-user are not allowed to change their pw</li> * <li>other users are allowed to change their pw</li> * </ul> * * @param id * @return */ public boolean isPwdChangeAllowed(Identity id) { if(id == null) { return isAnyPasswordChangeAllowed(); } // if this is set to false, noone can change their pw if (!pwdchangeallowed) { return false; } LDAPLoginManager ldapLoginManager = CoreSpringFactory.getImpl(LDAPLoginManager.class); if (ldapLoginManager.isIdentityInLDAPSecGroup(id)) { // it's an ldap-user return CoreSpringFactory.getImpl(LDAPLoginModule.class) .isPropagatePasswordChangedOnLdapServer(); } return pwdchangeallowed; } /** * use this if you don't have an identity-object (DMZ), and just want to * check, if anyone could change his password * * @return */ public boolean isAnyPasswordChangeAllowed() { return pwdchangeallowed; } public boolean isLogoByProfileEnabled() { return "enabled".equals(enabledLogoByProfile); } public String getAdminUserName() { return adminUserName; } }