Revision: 29272 Author: uhommes Date: 2011-08-02 15:11:47 +0200 (Tue, 02 Aug 2011) Log Message: ----------- CMS7-3657 add password validation to admin perspective
Modified Paths: -------------- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective.properties hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective_fr.properties hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective_it.properties hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective_nl.properties hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/AbstractPasswordValidator.java hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/ContainsNoNamePasswordValidator.java hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IPasswordValidationService.java hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IPasswordValidator.java hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IsNoPreviousPasswordValidator.java hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IsNoPreviousPasswordValidator.properties hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IsNoPreviousPasswordValidator_nl.properties hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/MinimalLengthPasswordValidator.java hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/PasswordValidationServiceImpl.java hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/RegexpPasswordValidator.java hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/plugins/ChangePasswordShortcutPlugin.java hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/CreateUserPanel.java hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/ListUsersPanel.java hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/SetPasswordPanel.java hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/User.java hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/ViewUserPanel.java hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator.java Added Paths: ----------- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator.properties hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator_fr.properties hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator_it.properties hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator_nl.properties Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective.properties =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective.properties 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective.properties 2011-08-02 13:11:47 UTC (rev 29272) @@ -5,7 +5,6 @@ # form validators UsernameValidator.exists='${input}' already exists, please think of another name GroupnameValidator.exists=Group '${input}' already exists, please think of another name -PasswordStrength.invalid=Password not strong enough, use minimally 4 characters EqualPasswordInputValidator=The password and confirm password do not match # form fields Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective_fr.properties =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective_fr.properties 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective_fr.properties 2011-08-02 13:11:47 UTC (rev 29272) @@ -5,7 +5,6 @@ # form validators UsernameValidator.exists=L'utilisateur ${input} existe d\u00e9j\u00e0 GroupnameValidator.exists=Le groupe ${input} existe d\u00e9j\u00e0 -PasswordStrength.invalid=Mot de passe trop court (4 caract\u00e8res minimum) EqualPasswordInputValidator=Le mot de passe et la confirmation de mot de passe ne correspondent pas # form fields Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective_it.properties =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective_it.properties 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective_it.properties 2011-08-02 13:11:47 UTC (rev 29272) @@ -5,7 +5,6 @@ # form validators UsernameValidator.exists='${input}' gi\u00e0 esiste, per favore scegliere un altro nome GroupnameValidator.exists=IL gruppo '${input}' gi\u00e0 esiste, per favore scegliere un altro nome -PasswordStrength.invalid=La password non è abbastanza sicura, usare almeno 4 caratteri EqualPasswordInputValidator=La password e la conferma non coincidono # form fields Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective_nl.properties =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective_nl.properties 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/AdminPerspective_nl.properties 2011-08-02 13:11:47 UTC (rev 29272) @@ -5,7 +5,6 @@ # form validators UsernameValidator.exists=Gebruiker '${input}' bestaat al, kies een andere naam GroupnameValidator.exists=Groep '${input}' bestaat al, kies een andere naam -PasswordStrength.invalid=Het wachtwoord is niet sterk genoeg, gebruik minimaal vier karakters EqualPasswordInputValidator=Het wachtwoord is niet gelijk aan het bevestigingswachtwoord # form fields Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/AbstractPasswordValidator.java =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/AbstractPasswordValidator.java 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/AbstractPasswordValidator.java 2011-08-02 13:11:47 UTC (rev 29272) @@ -15,10 +15,10 @@ */ package org.hippoecm.frontend.plugins.cms.admin.password.validation; -import javax.jcr.Node; import javax.jcr.RepositoryException; import org.hippoecm.frontend.plugin.config.IPluginConfig; +import org.hippoecm.frontend.plugins.cms.admin.users.User; import org.hippoecm.frontend.plugins.standards.ClassResourceModel; @@ -37,7 +37,7 @@ } @Override - public PasswordValidationStatus checkPassword(String password, Node user) throws RepositoryException { + public PasswordValidationStatus checkPassword(String password, User user) throws RepositoryException { PasswordValidationStatus result = null; if (isValid(password, user)) { result = new PasswordValidationStatus(null, true); @@ -62,6 +62,6 @@ return null; } - protected abstract boolean isValid(String password, Node user) throws RepositoryException; + protected abstract boolean isValid(String password, User user) throws RepositoryException; } Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/ContainsNoNamePasswordValidator.java =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/ContainsNoNamePasswordValidator.java 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/ContainsNoNamePasswordValidator.java 2011-08-02 13:11:47 UTC (rev 29272) @@ -17,7 +17,6 @@ import java.util.regex.Pattern; -import javax.jcr.Node; import javax.jcr.RepositoryException; import org.hippoecm.frontend.plugin.config.IPluginConfig; @@ -32,16 +31,10 @@ } @Override - protected boolean isValid(String password, Node user) throws RepositoryException { - String userName = user.getName(); - String firstName = null; - if (user.hasProperty(User.PROP_FIRSTNAME)) { - firstName = user.getProperty(User.PROP_FIRSTNAME).getString(); - } - String lastName = null; - if (user.hasProperty(User.PROP_LASTNAME)) { - lastName = user.getProperty(User.PROP_LASTNAME).getString(); - } + protected boolean isValid(String password, User user) throws RepositoryException { + String userName = user.getUsername(); + String firstName = user.getFirstName(); + String lastName = user.getLastName(); boolean valid = true; if (userName.length() > 2) { Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IPasswordValidationService.java =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IPasswordValidationService.java 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IPasswordValidationService.java 2011-08-02 13:11:47 UTC (rev 29272) @@ -17,13 +17,13 @@ import java.util.List; -import javax.jcr.Node; import javax.jcr.RepositoryException; import org.apache.wicket.IClusterable; +import org.hippoecm.frontend.plugins.cms.admin.users.User; public interface IPasswordValidationService extends IClusterable { - public List<PasswordValidationStatus> checkPassword(String password, Node user) throws RepositoryException; + public List<PasswordValidationStatus> checkPassword(String password, User user) throws RepositoryException; } Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IPasswordValidator.java =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IPasswordValidator.java 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IPasswordValidator.java 2011-08-02 13:11:47 UTC (rev 29272) @@ -17,12 +17,13 @@ import java.io.Serializable; -import javax.jcr.Node; import javax.jcr.RepositoryException; +import org.hippoecm.frontend.plugins.cms.admin.users.User; + public interface IPasswordValidator extends Serializable { - public PasswordValidationStatus checkPassword(String password, Node user) throws RepositoryException; + public PasswordValidationStatus checkPassword(String password, User user) throws RepositoryException; public boolean isOptional(); Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IsNoPreviousPasswordValidator.java =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IsNoPreviousPasswordValidator.java 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IsNoPreviousPasswordValidator.java 2011-08-02 13:11:47 UTC (rev 29272) @@ -15,20 +15,14 @@ */ package org.hippoecm.frontend.plugins.cms.admin.password.validation; -import javax.jcr.Node; import javax.jcr.RepositoryException; -import javax.jcr.Value; import org.hippoecm.frontend.plugin.config.IPluginConfig; -import org.hippoecm.repository.PasswordHelper; -import org.hippoecm.repository.api.HippoNodeType; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.hippoecm.frontend.plugins.cms.admin.users.User; public class IsNoPreviousPasswordValidator extends AbstractPasswordValidator { private static final long serialVersionUID = 1L; - private static final Logger log = LoggerFactory.getLogger(IsNoPreviousPasswordValidator.class); private int numberOfPreviousPasswords; @@ -38,21 +32,8 @@ } @Override - protected boolean isValid(String password, Node user) throws RepositoryException { - if (user.hasProperty(HippoNodeType.HIPPO_PREVIOUSPASSWORDS)) { - Value[] previousPasswords = user.getProperty(HippoNodeType.HIPPO_PREVIOUSPASSWORDS).getValues(); - for (int i = 0; i < previousPasswords.length && i < numberOfPreviousPasswords; i++) { - try { - if (PasswordHelper.checkHash(password.toCharArray(), previousPasswords[i].getString())) { - return false; - } - } - catch (Exception e) { - log.error("Error while checking if password was previously used", e); - } - } - } - return true; + protected boolean isValid(String password, User user) throws RepositoryException { + return !user.isPreviousPassword(password.toCharArray(), numberOfPreviousPasswords); } protected Object[] getDescriptionParameters() { Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IsNoPreviousPasswordValidator.properties =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IsNoPreviousPasswordValidator.properties 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IsNoPreviousPasswordValidator.properties 2011-08-02 13:11:47 UTC (rev 29272) @@ -1 +1 @@ -description=Wachtwoord mag niet hetzelfde zijn als {0} voorgaande wachtwoorden +description=Password may not be the same as previous {0} passwords Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IsNoPreviousPasswordValidator_nl.properties =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IsNoPreviousPasswordValidator_nl.properties 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/IsNoPreviousPasswordValidator_nl.properties 2011-08-02 13:11:47 UTC (rev 29272) @@ -1 +1 @@ -description=Password may not be the same as previous {0} passwords +description=Wachtwoord mag niet hetzelfde zijn als {0} voorgaande wachtwoorden Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/MinimalLengthPasswordValidator.java =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/MinimalLengthPasswordValidator.java 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/MinimalLengthPasswordValidator.java 2011-08-02 13:11:47 UTC (rev 29272) @@ -15,9 +15,8 @@ */ package org.hippoecm.frontend.plugins.cms.admin.password.validation; -import javax.jcr.Node; - import org.hippoecm.frontend.plugin.config.IPluginConfig; +import org.hippoecm.frontend.plugins.cms.admin.users.User; public class MinimalLengthPasswordValidator extends AbstractPasswordValidator implements IPasswordValidator { @@ -31,7 +30,7 @@ } @Override - protected boolean isValid(String password, Node user) { + protected boolean isValid(String password, User user) { return password.length() >= minimallength; } Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/PasswordValidationServiceImpl.java =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/PasswordValidationServiceImpl.java 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/PasswordValidationServiceImpl.java 2011-08-02 13:11:47 UTC (rev 29272) @@ -20,12 +20,12 @@ import java.util.List; import java.util.Set; -import javax.jcr.Node; import javax.jcr.RepositoryException; import org.hippoecm.frontend.plugin.IPluginContext; import org.hippoecm.frontend.plugin.Plugin; import org.hippoecm.frontend.plugin.config.IPluginConfig; +import org.hippoecm.frontend.plugins.cms.admin.users.User; import org.hippoecm.frontend.plugins.standards.ClassResourceModel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,9 +71,9 @@ "optional password validators. This way, no attempt at creating a new password can succeed."); } } - + @Override - public List<PasswordValidationStatus> checkPassword(String password, Node user) throws RepositoryException { + public List<PasswordValidationStatus> checkPassword(String password, User user) throws RepositoryException { List<PasswordValidationStatus> result = new ArrayList<PasswordValidationStatus>(validators.size()); int strength = 0; List<String> optionalValidatorDescriptions = new ArrayList<String>(validators.size()); Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/RegexpPasswordValidator.java =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/RegexpPasswordValidator.java 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/password/validation/RegexpPasswordValidator.java 2011-08-02 13:11:47 UTC (rev 29272) @@ -17,9 +17,8 @@ import java.util.regex.Pattern; -import javax.jcr.Node; - import org.hippoecm.frontend.plugin.config.IPluginConfig; +import org.hippoecm.frontend.plugins.cms.admin.users.User; public class RegexpPasswordValidator extends AbstractPasswordValidator implements IPasswordValidator { @@ -42,7 +41,7 @@ } @Override - protected boolean isValid(String password, Node user) { + protected boolean isValid(String password, User user) { return pattern.matcher(password).find(); } Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/plugins/ChangePasswordShortcutPlugin.java =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/plugins/ChangePasswordShortcutPlugin.java 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/plugins/ChangePasswordShortcutPlugin.java 2011-08-02 13:11:47 UTC (rev 29272) @@ -25,7 +25,6 @@ import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Value; -import javax.jcr.ValueFactory; import javax.jcr.query.Query; import javax.jcr.query.QueryResult; @@ -34,7 +33,6 @@ import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.model.IModel; -import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.util.value.IValueMap; @@ -45,6 +43,7 @@ import org.hippoecm.frontend.plugin.config.IPluginConfig; import org.hippoecm.frontend.plugins.cms.admin.password.validation.IPasswordValidationService; import org.hippoecm.frontend.plugins.cms.admin.password.validation.PasswordValidationStatus; +import org.hippoecm.frontend.plugins.cms.admin.users.User; import org.hippoecm.frontend.plugins.cms.admin.widgets.PasswordWidget; import org.hippoecm.frontend.service.render.RenderPlugin; import org.hippoecm.frontend.session.UserSession; @@ -130,7 +129,7 @@ */ private boolean canChangePassword() { try { - return !getUser().getPrimaryNodeType().getName().equals(HippoNodeType.NT_EXTERNALUSER); + return !getUser().isExternal(); } catch (RepositoryException e) { log.error("Error while checking primary type", e); return false; @@ -143,11 +142,7 @@ */ private boolean checkPassword(char[] password) { try { - return PasswordHelper.checkHash(password, getUser().getProperty(HippoNodeType.HIPPO_PASSWORD).getString()); - } catch (NoSuchAlgorithmException e) { - log.error("Unknown algorith for password", e); - } catch (UnsupportedEncodingException e) { - log.error("Unsupported encoding for password", e); + return getUser().checkPassword(password); } catch (RepositoryException e) { log.error("Error while checking user password", e); } @@ -161,34 +156,10 @@ */ private boolean setPassword(char[] password) { try { - // remember the old password - String oldPassword = getUser().getProperty(HippoNodeType.HIPPO_PASSWORD).getString(); - Value[] newValues = null; - if (getUser().hasProperty(HippoNodeType.HIPPO_PREVIOUSPASSWORDS)) { - Value[] oldValues = getUser().getProperty(HippoNodeType.HIPPO_PREVIOUSPASSWORDS).getValues(); - newValues = new Value[oldValues.length+1]; - System.arraycopy(oldValues, 0, newValues, 1, oldValues.length); - } - else { - newValues = new Value[1]; - } - newValues[0] = ((UserSession) Session.get()).getJcrSession().getValueFactory().createValue(oldPassword); - getUser().setProperty(HippoNodeType.HIPPO_PREVIOUSPASSWORDS, newValues); - // set the new password - getUser().setProperty(HippoNodeType.HIPPO_PASSWORD, PasswordHelper.getHash(password)); - getUser().save(); + getUser().savePassword(new String(password)); return true; } catch (RepositoryException e) { log.error("Error while setting user password", e); - try { - getUser().refresh(false); - } catch (RepositoryException e1) { - log.warn("Error while trying to refresh the user node after a failed save", e); - } - } catch (IOException e) { - log.error("IOError while setting user password", e); - } catch (NoSuchAlgorithmException e) { - log.error("Unknown algorith for password", e); } return false; } @@ -217,12 +188,12 @@ this.checkPassword = checkPassword; } - private Node getUser() throws RepositoryException { + private User getUser() throws RepositoryException { Node user = userModel.getNode(); if (user == null) { throw new ItemNotFoundException(); } - return user; + return new User(user); } public class Dialog extends AbstractDialog { @@ -237,6 +208,7 @@ setOkLabel(new StringResourceModel("change-label", ChangePasswordShortcutPlugin.this, null)); replace(feedback = new FeedbackPanel("feedback")); + // FIXME: [UH] Why set output markup id? feedback.setOutputMarkupId(true); currentWidget = new PasswordWidget("current-password", new PropertyModel(ChangePasswordShortcutPlugin.this, Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/CreateUserPanel.java =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/CreateUserPanel.java 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/CreateUserPanel.java 2011-08-02 13:11:47 UTC (rev 29272) @@ -37,6 +37,7 @@ import org.apache.wicket.model.StringResourceModel; import org.apache.wicket.validation.validator.EmailAddressValidator; import org.apache.wicket.validation.validator.StringValidator; +import org.hippoecm.frontend.plugin.IPluginContext; import org.hippoecm.frontend.plugins.cms.admin.AdminBreadCrumbPanel; import org.hippoecm.frontend.plugins.cms.admin.validators.PasswordStrengthValidator; import org.hippoecm.frontend.plugins.cms.admin.validators.UsernameValidator; @@ -59,7 +60,7 @@ private DetachableUser userModel = new DetachableUser(); - public CreateUserPanel(final String id, final IBreadCrumbModel breadCrumbModel) { + public CreateUserPanel(final String id, final IBreadCrumbModel breadCrumbModel, final IPluginContext context) { super(id, breadCrumbModel); setOutputMarkupId(true); @@ -88,7 +89,7 @@ final PasswordTextField passwordField = new PasswordTextField("password", new PropertyModel(this, "password")); passwordField.setResetPassword(false); - passwordField.add(new PasswordStrengthValidator()); + passwordField.add(new PasswordStrengthValidator(form, context, userModel)); form.add(passwordField); final PasswordTextField passwordCheckField = new PasswordTextField("password-check", new PropertyModel(this, "passwordCheck")); Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/ListUsersPanel.java =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/ListUsersPanel.java 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/ListUsersPanel.java 2011-08-02 13:11:47 UTC (rev 29272) @@ -61,7 +61,7 @@ add(new PanelPluginBreadCrumbLink("create-user", breadCrumbModel) { @Override protected IBreadCrumbParticipant getParticipant(final String componentId) { - return new CreateUserPanel(componentId, breadCrumbModel); + return new CreateUserPanel(componentId, breadCrumbModel, context); } }); Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/SetPasswordPanel.java =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/SetPasswordPanel.java 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/SetPasswordPanel.java 2011-08-02 13:11:47 UTC (rev 29272) @@ -31,6 +31,7 @@ import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.StringResourceModel; +import org.hippoecm.frontend.plugin.IPluginContext; import org.hippoecm.frontend.plugins.cms.admin.AdminBreadCrumbPanel; import org.hippoecm.frontend.plugins.cms.admin.validators.PasswordStrengthValidator; import org.hippoecm.frontend.session.UserSession; @@ -49,7 +50,7 @@ private String checkPassword; - public SetPasswordPanel(final String id, final IBreadCrumbModel breadCrumbModel, final IModel model) { + public SetPasswordPanel(final String id, final IBreadCrumbModel breadCrumbModel, final IModel model, final IPluginContext context) { super(id, breadCrumbModel); setOutputMarkupId(true); @@ -63,7 +64,7 @@ final PasswordTextField passwordField = new PasswordTextField("password", new PropertyModel(this, "password")); passwordField.setResetPassword(false); - passwordField.add(new PasswordStrengthValidator()); + passwordField.add(new PasswordStrengthValidator(form, context, model)); form.add(passwordField); final PasswordTextField passwordCheckField = new PasswordTextField("password-check", new PropertyModel(this, "checkPassword")); Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/User.java =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/User.java 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/User.java 2011-08-02 13:11:47 UTC (rev 29272) @@ -16,6 +16,7 @@ package org.hippoecm.frontend.plugins.cms.admin.users; import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.List; @@ -375,6 +376,49 @@ node.getSession().save(); } + + public boolean checkPassword(char[] password) { + try { + return PasswordHelper.checkHash(password, node.getProperty(HippoNodeType.HIPPO_PASSWORD).getString()); + } catch (NoSuchAlgorithmException e) { + log.error("Unknown algorith for password", e); + } catch (UnsupportedEncodingException e) { + log.error("Unsupported encoding for password", e); + } catch (RepositoryException e) { + log.error("Error while checking user password", e); + } + return false; + } + + public boolean isPreviousPassword(char[] password, int numberOfPreviousPasswords) throws RepositoryException { + // is current password? + if (node != null && node.hasProperty(HippoNodeType.HIPPO_PASSWORD)) { + String currentPassword = node.getProperty(HippoNodeType.HIPPO_PASSWORD).getString(); + try { + if (PasswordHelper.checkHash(password, currentPassword)) { + return true; + } + } + catch (Exception e) { + log.error("Error while checking if password was previously used", e); + } + } + // is previous password? + if (node != null && node.hasProperty(HippoNodeType.HIPPO_PREVIOUSPASSWORDS)) { + Value[] previousPasswords = node.getProperty(HippoNodeType.HIPPO_PREVIOUSPASSWORDS).getValues(); + for (int i = 0; i < previousPasswords.length && i < numberOfPreviousPasswords; i++) { + try { + if (PasswordHelper.checkHash(password, previousPasswords[i].getString())) { + return true; + } + } + catch (Exception e) { + log.error("Error while checking if password was previously used", e); + } + } + } + return false; + } //--------------------- default object -------------------// /** Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/ViewUserPanel.java =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/ViewUserPanel.java 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/users/ViewUserPanel.java 2011-08-02 13:11:47 UTC (rev 29272) @@ -114,7 +114,7 @@ PanelPluginBreadCrumbLink password = new PanelPluginBreadCrumbLink("set-user-password", breadCrumbModel) { @Override protected IBreadCrumbParticipant getParticipant(final String componentId) { - return new SetPasswordPanel(componentId, breadCrumbModel, model); + return new SetPasswordPanel(componentId, breadCrumbModel, model, context); } }; password.setVisible(!user.isExternal()); Modified: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator.java =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator.java 2011-08-02 13:08:36 UTC (rev 29271) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator.java 2011-08-02 13:11:47 UTC (rev 29272) @@ -15,26 +15,60 @@ */ package org.hippoecm.frontend.plugins.cms.admin.validators; +import java.util.List; + +import javax.jcr.RepositoryException; + +import org.apache.wicket.Component; +import org.apache.wicket.model.IModel; import org.apache.wicket.validation.IValidatable; -import org.apache.wicket.validation.validator.StringValidator; +import org.apache.wicket.validation.IValidator; +import org.hippoecm.frontend.plugin.IPluginContext; +import org.hippoecm.frontend.plugins.cms.admin.password.validation.IPasswordValidationService; +import org.hippoecm.frontend.plugins.cms.admin.password.validation.PasswordValidationStatus; +import org.hippoecm.frontend.plugins.cms.admin.users.User; +import org.hippoecm.frontend.plugins.standards.ClassResourceModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class PasswordStrengthValidator extends StringValidator { +public class PasswordStrengthValidator implements IValidator<String> { @SuppressWarnings("unused") private static final String SVN_ID = "$Id$"; private static final long serialVersionUID = 1L; + private static final Logger log = LoggerFactory.getLogger(PasswordStrengthValidator.class); + + private final Component form; + private final IPasswordValidationService passwordValidationService; + private final IModel<User> userModel; + + public PasswordStrengthValidator(Component form, IPluginContext context, IModel<User> userModel) { + this.form = form; + this.passwordValidationService = context.getService(IPasswordValidationService.class.getName(), IPasswordValidationService.class); + this.userModel = userModel; + } @Override - protected void onValidate(IValidatable validatable) { - String password = (String) validatable.getValue(); - // currently only check length - if (password.length() < 4) { - error(validatable); + public void validate(IValidatable<String> validatable) { + String password = validatable.getValue(); + + if (passwordValidationService != null) { + try { + List<PasswordValidationStatus> statuses = passwordValidationService.checkPassword(password, userModel.getObject()); + for (PasswordValidationStatus status : statuses) { + if (!status.accepted()) { + form.error(status.getMessage()); + } + } + } + catch (RepositoryException e) { + log.error("Failure validating password using password validation service", e); + } } + // fallback on pre 7.7 behavior + else if (password.length() < 4) { + form.error(new ClassResourceModel("PasswordStrength.invalid", getClass()).getObject()); + } } - @Override - protected String resourceKey() { - return "PasswordStrength.invalid"; - } } Added: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator.properties =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator.properties (rev 0) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator.properties 2011-08-02 13:11:47 UTC (rev 29272) @@ -0,0 +1 @@ +PasswordStrength.invalid=Password not strong enough, use minimally 4 characters \ No newline at end of file Added: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator_fr.properties =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator_fr.properties (rev 0) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator_fr.properties 2011-08-02 13:11:47 UTC (rev 29272) @@ -0,0 +1 @@ +PasswordStrength.invalid=Mot de passe trop court (4 caract\u00e8res minimum) Added: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator_it.properties =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator_it.properties (rev 0) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator_it.properties 2011-08-02 13:11:47 UTC (rev 29272) @@ -0,0 +1 @@ +PasswordStrength.invalid=La password non è abbastanza sicura, usare almeno 4 caratteri Added: hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator_nl.properties =================================================================== --- hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator_nl.properties (rev 0) +++ hippo-cms7/cms/trunk/admin/src/main/java/org/hippoecm/frontend/plugins/cms/admin/validators/PasswordStrengthValidator_nl.properties 2011-08-02 13:11:47 UTC (rev 29272) @@ -0,0 +1 @@ +PasswordStrength.invalid=Het wachtwoord is niet sterk genoeg, gebruik minimaal vier karakters _______________________________________________ Hippocms-svn mailing list Hippocms-svn@lists.hippocms.org http://lists.hippo.nl/mailman/listinfo/hippocms-svn