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

Reply via email to