/** * Copyright (c) 2009--2014 Red Hat, Inc. * * This software is licensed to you under the GNU General Public License, * version 2 (GPLv2). There is NO WARRANTY for this software, express or * implied, including the implied warranties of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 * along with this software; if not, see * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. * * Red Hat trademarks are not licensed under GPLv2. No permission is * granted to use or replicate Red Hat trademarks that are incorporated * in this software or its documentation. */ package com.redhat.rhn.manager.user; import com.redhat.rhn.common.conf.UserDefaults; import com.redhat.rhn.common.localization.LocalizationService; import com.redhat.rhn.domain.role.Role; import com.redhat.rhn.domain.user.User; import org.apache.commons.lang.StringUtils; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.regex.Pattern; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; /** * UpdateUserCommand * @version $Rev$ */ public class UpdateUserCommand { private User user; private String unencryptedPassword; private String email; private String prefix; private String firstNames; private String lastName; private List validPrefixes; private boolean unencryptedPasswordChanged = false; private boolean emailChanged = false; private boolean prefixChanged = false; private boolean firstNamesChanged = false; private boolean lastNameChanged = false; private boolean rolesChanged = false; private boolean needsUpdate = false; private Set<Role> temporaryRoles; /** * Constructor * @param userToUpdate User that will get updated. */ public UpdateUserCommand(User userToUpdate) { if (userToUpdate == null) { throw new IllegalArgumentException("Null user not acceptable"); } user = userToUpdate; unencryptedPassword = null; email = null; prefix = null; firstNames = null; lastName = null; buildValidPrefixes(); } private void buildValidPrefixes() { Iterator i = LocalizationService.getInstance().availablePrefixes().iterator(); validPrefixes = new LinkedList(); while (i.hasNext()) { validPrefixes.add(i.next()); } } /** * Updates the user's password, email, prefix, first and last names. * @return The user updated. */ public User updateUser() { if (needsUpdate) { validateEmail(); validatePassword(); validatePrefix(); safePopulateUser(); // ok update it UserManager.storeUser(user); } return user; } private void safePopulateUser() { if (firstNamesChanged) { user.setFirstNames(firstNames); } if (lastNameChanged) { user.setLastName(lastName); } if (emailChanged) { user.setEmail(email); } if (prefixChanged) { user.setPrefix(prefix); } if (unencryptedPasswordChanged) { user.setPassword(unencryptedPassword); } if (rolesChanged) { UserManager.resetTemporaryRoles(user, temporaryRoles); } } /** * Private helper method to validate the password. This happens when the setPassword * method of this class is called. Puts errors into the passwordErrors list. */ private void validatePassword() { if (!unencryptedPasswordChanged) { return; // nothing to verify } String password = getUnencryptedPassword(); if (password == null || password.length() < UserDefaults.get().getMinPasswordLength()) { throw new IllegalArgumentException(LocalizationService.getInstance(). getMessage("error.minpassword", UserDefaults.get().getMinPasswordLength())); } else if (password.length() > UserDefaults.get().getMaxPasswordLength()) { throw new IllegalArgumentException(LocalizationService.getInstance(). getMessage("error.maxpassword")); } // Newlines and tab characters can slip through the API much easier than the UI: if (Pattern.compile("[\\t\\n]").matcher(password).find()) { throw new IllegalArgumentException( "Password contains tab or newline characters."); } } private void validatePrefix() { if (prefixChanged && !validPrefixes.contains(prefix)) { throw new IllegalArgumentException( "Invalid prefix [" + prefix + "]. Must be one of " + validPrefixes.toString()); } } /** * Private helper method to validate the user's email address. Puts errors into the * errors list. */ private void validateEmail() { if (!emailChanged) { return; // nothing to verify } // Make sure user and email are not null if (email == null) { throw new IllegalArgumentException("Email address is null"); } // Make email is not over the max length if (user.getEmail().length() > UserDefaults.get().getMaxEmailLength()) { throw new IllegalArgumentException(String.format( "Email address specified [%s] is too long", user.getEmail())); } // Make sure set email is valid try { new InternetAddress(email).validate(); } catch (AddressException e) { throw new IllegalArgumentException( "Email address invalid. Cause: " + e.toString()); } } /** * @param passwordIn The password to set */ public void setPassword(String passwordIn) { if (!StringUtils.equals(passwordIn, user.getPassword())) { unencryptedPasswordChanged = true; needsUpdate = true; unencryptedPassword = passwordIn; } } private String getUnencryptedPassword() { return unencryptedPassword; } /** * @param emailIn The email to set */ public void setEmail(String emailIn) { if (!StringUtils.equals(emailIn, user.getEmail())) { emailChanged = true; needsUpdate = true; email = emailIn; } } /** * @param prefixIn The prefix to set */ public void setPrefix(String prefixIn) { if (!StringUtils.equals(prefixIn, user.getPrefix())) { prefixChanged = true; needsUpdate = true; prefix = prefixIn; } } /** * @param firstNamesIn The first names to set */ public void setFirstNames(String firstNamesIn) { if (!StringUtils.equals(firstNamesIn, user.getFirstNames())) { firstNamesChanged = true; needsUpdate = true; firstNames = firstNamesIn; } } /** * @param lastNameIn The last name to set */ public void setLastName(String lastNameIn) { if (!StringUtils.equals(lastNameIn, user.getLastName())) { lastNameChanged = true; needsUpdate = true; lastName = lastNameIn; } } /** * @return Returns the roles. */ public Set<Role> getTemporaryRoles() { return temporaryRoles; } /** * @param rolesIn The roles to set. */ public void setTemporaryRoles(Set<Role> rolesIn) { if (!rolesIn.equals(user.getRoles())) { rolesChanged = true; needsUpdate = true; temporaryRoles = rolesIn; } } }