no jira: strong password validation is implemented

Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo
Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/e81d12ea
Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/e81d12ea
Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/e81d12ea

Branch: refs/heads/master
Commit: e81d12eaf4989a006425847a2d5aa981931c3a9b
Parents: f2a22dc
Author: Maxim Solodovnik <[email protected]>
Authored: Wed May 24 08:11:00 2017 +0700
Committer: Maxim Solodovnik <[email protected]>
Committed: Wed May 24 08:12:29 2017 +0700

----------------------------------------------------------------------
 .../openmeetings/core/remote/MobileService.java |   6 +-
 .../core/util/StrongPasswordValidator.java      | 147 +++++++++++++++++++
 .../openmeetings/db/dao/basic/ErrorDao.java     |   6 +-
 .../openmeetings/db/dao/label/LabelDao.java     |   4 +-
 .../openmeetings/db/dao/user/UserDao.java       |   9 +-
 .../openmeetings/db/entity/user/User.java       |  36 ++---
 .../apache/openmeetings/db/util/UserHelper.java |   4 -
 .../openmeetings/backup/BackupImport.java       |   6 +-
 .../java/org/apache/openmeetings/cli/Admin.java |  24 +--
 .../installation/ImportInitvalues.java          |  20 ++-
 .../src/site/xdoc/GeneralConfiguration.xml      |  12 +-
 .../service/calendar/AppointmentLogic.java      |  14 +-
 .../service/quartz/scheduler/CleanupJob.java    |  37 +++--
 .../util/OpenmeetingsVariables.java             |   2 +-
 .../web/app/Application.properties.xml          |   6 +
 .../web/app/Application_ar.properties.xml       |   6 +
 .../web/app/Application_bg.properties.xml       |   6 +
 .../web/app/Application_ca.properties.xml       |   6 +
 .../web/app/Application_cs.properties.xml       |   6 +
 .../web/app/Application_da.properties.xml       |   6 +
 .../web/app/Application_de.properties.xml       |   6 +
 .../web/app/Application_el.properties.xml       |   6 +
 .../web/app/Application_es.properties.xml       |   6 +
 .../web/app/Application_fa.properties.xml       |   6 +
 .../web/app/Application_fi.properties.xml       |   6 +
 .../web/app/Application_fr.properties.xml       |   6 +
 .../web/app/Application_gl.properties.xml       |   6 +
 .../web/app/Application_hu.properties.xml       |   6 +
 .../web/app/Application_id.properties.xml       |   6 +
 .../web/app/Application_it.properties.xml       |   6 +
 .../web/app/Application_ja.properties.xml       |   6 +
 .../web/app/Application_ko.properties.xml       |   6 +
 .../web/app/Application_nl.properties.xml       |   6 +
 .../web/app/Application_pl.properties.xml       |   6 +
 .../web/app/Application_pt.properties.xml       |   6 +
 .../web/app/Application_pt_BR.properties.xml    |   6 +
 .../web/app/Application_ru.properties.xml       |   6 +
 .../web/app/Application_sk.properties.xml       |   6 +
 .../web/app/Application_sv.properties.xml       |   6 +
 .../web/app/Application_th.properties.xml       |   6 +
 .../web/app/Application_tr.properties.xml       |   6 +
 .../web/app/Application_uk.properties.xml       |   6 +
 .../web/app/Application_zh_CN.properties.xml    |   6 +
 .../web/app/Application_zh_TW.properties.xml    |   6 +
 .../web/common/GeneralUserForm.java             |   7 +-
 .../openmeetings/web/pages/ActivatePage.java    |  16 +-
 .../web/pages/auth/ForgetPasswordDialog.java    |   4 +-
 .../web/pages/auth/ResetPasswordDialog.java     |  22 +--
 .../web/pages/install/InstallWizard.java        |   5 +-
 .../web/room/menu/StartSharingButton.java       |   3 +-
 .../WEB-INF/classes/applicationContext.xml      |  26 +++-
 openmeetings-web/src/main/webapp/css/theme.css  |   2 +-
 .../test/selenium/AbstractTestDefaults.java     |   6 +-
 .../webservice/ErrorWebService.java             |  18 +--
 .../openmeetings/webservice/UserWebService.java |  16 ++
 55 files changed, 493 insertions(+), 139 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
index a0d25fc..63f6460 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/MobileService.java
@@ -82,8 +82,6 @@ public class MobileService {
        @Autowired
        private RoomDao roomDao;
        @Autowired
-       private LabelDao labelDao;
-       @Autowired
        private ChatDao chatDao;
        @Autowired
        private ScopeApplicationAdapter scopeAdapter;
@@ -303,8 +301,8 @@ public class MobileService {
                User u = userDao.get(c.getUserId());
                //my rooms
                List<Room> myl = new ArrayList<>();
-               myl.add(roomDao.getUserRoom(u.getId(), Room.Type.conference, 
labelDao.getString(1306L, u.getLanguageId())));
-               myl.add(roomDao.getUserRoom(u.getId(), Room.Type.restricted, 
labelDao.getString(1307L, u.getLanguageId())));
+               myl.add(roomDao.getUserRoom(u.getId(), Room.Type.conference, 
LabelDao.getString(1306L, u.getLanguageId())));
+               myl.add(roomDao.getUserRoom(u.getId(), Room.Type.restricted, 
LabelDao.getString(1307L, u.getLanguageId())));
                myl.addAll(roomDao.getAppointedRoomsByUser(u.getId()));
                for (Room r : myl) {
                        addRoom("my", null, false, result, r);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/StrongPasswordValidator.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/StrongPasswordValidator.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/StrongPasswordValidator.java
new file mode 100644
index 0000000..d390596e
--- /dev/null
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/util/StrongPasswordValidator.java
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.core.util;
+
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+
+import java.util.Map;
+
+import org.apache.directory.api.util.Strings;
+import org.apache.openmeetings.db.dao.label.LabelDao;
+import org.apache.openmeetings.db.entity.user.User;
+import org.apache.wicket.util.collections.MicroMap;
+import org.apache.wicket.validation.IValidatable;
+import org.apache.wicket.validation.IValidator;
+import org.apache.wicket.validation.ValidationError;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+
+public class StrongPasswordValidator implements IValidator<String> {
+       private static final long serialVersionUID = 1L;
+       private static final Logger log = 
Red5LoggerFactory.getLogger(StrongPasswordValidator.class, webAppRootKey);
+       private final int minLength;
+       private final boolean web;
+       private User u;
+
+       public StrongPasswordValidator(final int minLength, final User u) {
+               this(true, minLength, u);
+       }
+
+       public StrongPasswordValidator(final boolean web, final int minLength, 
final User u) {
+               this.minLength = minLength;
+               this.web = web;
+               this.u = u;
+       }
+
+       private static boolean noDigit(String password) {
+               return password == null || !password.matches(".*\\d+.*");
+       }
+
+       private static boolean noSymbol(String password) {
+               return password == null || 
!password.matches(".*[!@#$%^&*\\]\\[]+.*");
+       }
+
+       private static boolean noUpperCase(String password) {
+               return password == null || 
password.equals(password.toLowerCase());
+       }
+
+       private static boolean noLowerCase(String password) {
+               return password == null || 
password.equals(password.toUpperCase());
+       }
+
+       private boolean badLength(String password) {
+               return password == null || password.length() < minLength;
+       }
+
+       private static boolean checkWord(String password, String word) {
+               if (Strings.isEmpty(word) || word.length() < 3) {
+                       return false;
+               }
+               for (int i = 0; i < word.length() - 3; ++i) {
+                       String substr = word.toLowerCase().substring(i, i + 3);
+                       if (password.toLowerCase().indexOf(substr) > -1) {
+                               return true;
+                       }
+               }
+               return false;
+       }
+
+       private boolean hasStopWords(String password) {
+               if (checkWord(password, u.getLogin())) {
+                       return true;
+               }
+               if (u.getAddress() != null) {
+                       String email = u.getAddress().getEmail();
+                       if (!Strings.isEmpty(email)) {
+                               for (String part : email.split("[.@]")) {
+                                       if (checkWord(password, part)) {
+                                               return true;
+                                       }
+                               }
+                       }
+               }
+               return false;
+       }
+
+       private void error(IValidatable<String> pass, String key) {
+               error(pass, key, null);
+       }
+
+       private void error(IValidatable<String> pass, String key, Map<String, 
Object> params) {
+               if (web) {
+                       pass.error(new 
ValidationError().addKey(key).setVariables(params));
+               } else {
+                       String msg = LabelDao.getString(key, 1L);
+                       if (params != null && !params.isEmpty() && 
!Strings.isEmpty(msg)) {
+                               for (Map.Entry<String, Object> e : 
params.entrySet()) {
+                                       msg.replace(String.format("${%s}", 
e.getKey()), "" + e.getValue());
+                               }
+                       }
+                       System.err.print(msg); // for command line
+                       log.warn(msg);
+                       pass.error(new ValidationError(msg));
+               }
+       }
+
+       @Override
+       public void validate(IValidatable<String> pass) {
+               if (badLength(pass.getValue())) {
+                       error(pass, "bad.password.short", new MicroMap<String, 
Object>("0", minLength));
+               }
+               if (noLowerCase(pass.getValue())) {
+                       error(pass, "bad.password.lower");
+               }
+               if (noUpperCase(pass.getValue())) {
+                       error(pass, "bad.password.upper");
+               }
+               if (noDigit(pass.getValue())) {
+                       error(pass, "bad.password.digit");
+               }
+               if (noSymbol(pass.getValue())) {
+                       error(pass, "bad.password.special");
+               }
+               if (hasStopWords(pass.getValue())) {
+                       error(pass, "bad.password.stop");
+               }
+       }
+
+       public void setUser(User u) {
+               this.u = u;
+       }
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ErrorDao.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ErrorDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ErrorDao.java
index a57491f..c526055 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ErrorDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/basic/ErrorDao.java
@@ -32,7 +32,6 @@ import org.apache.openmeetings.db.entity.basic.ErrorValue;
 import org.apache.openmeetings.db.entity.basic.ErrorValue.Type;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
 @Transactional
@@ -42,9 +41,6 @@ public class ErrorDao {
        @PersistenceContext
        private EntityManager em;
 
-       @Autowired
-       private LabelDao labelDao;
-
        public Long add(Long id, Type type, Long labelId) {
                try {
                        ErrorValue eValue = new ErrorValue();
@@ -85,6 +81,6 @@ public class ErrorDao {
                if (ev == null) {
                        return null;
                }
-               return labelDao.getString(ev.getLabelId(), langId);
+               return LabelDao.getString(ev.getLabelId(), langId);
        }
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java
index efcdaaa..1730056 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/label/LabelDao.java
@@ -102,11 +102,11 @@ public class LabelDao implements 
IDataProviderDao<StringLabel>{
                labelCache.put(l, new ArrayList<StringLabel>());
        }
 
-       public String getString(long fieldValuesId, long langId) {
+       public static String getString(long fieldValuesId, long langId) {
                return ensureApplication(langId).getOmString(fieldValuesId, 
langId);
        }
 
-       public String getString(String key, long langId) {
+       public static String getString(String key, long langId) {
                return ensureApplication(langId).getOmString(key, langId);
        }
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
index 23eb445..2998497 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/user/UserDao.java
@@ -511,7 +511,7 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
         * @param hash
         * @return
         */
-       public User getUserByActivationHash(String hash) {
+       public User getByActivationHash(String hash) {
                TypedQuery<User> query = em.createQuery("SELECT u FROM User as 
u WHERE u.activatehash = :activatehash"
                                + " AND u.deleted = false", User.class);
                query.setParameter("activatehash", hash);
@@ -674,7 +674,6 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
                u.setSendSMS(sendSMS);
                u.setRights(rights);
                u.setLastlogin(new Date());
-               u.setLasttrans(new Long(0));
                u.setSalutation(Salutation.mr);
                u.setActivatehash(hash);
                u.setTimeZoneId(timezone.getID());
@@ -705,4 +704,10 @@ public class UserDao implements 
IGroupAdminDataProviderDao<User> {
 
                return update(u, null);
        }
+
+       public List<User> getByExpiredHash(long ttl) {
+               return em.createNamedQuery("getUserByExpiredHash", User.class)
+                               .setParameter("date", new 
Date(System.currentTimeMillis() - ttl))
+                               .getResultList();
+       }
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
index 3417837..c38a75a 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/user/User.java
@@ -18,8 +18,6 @@
  */
 package org.apache.openmeetings.db.entity.user;
 
-import static org.apache.openmeetings.db.util.UserHelper.invalidPassword;
-
 import java.security.NoSuchAlgorithmException;
 import java.util.ArrayList;
 import java.util.Date;
@@ -82,6 +80,7 @@ import org.simpleframework.xml.Root;
        @NamedQuery(name = "getUserByLogin", query = "SELECT u FROM User u 
WHERE u.deleted = false AND u.type = :type AND u.login = :login AND ((:domainId 
= 0 AND u.domainId IS NULL) OR (:domainId > 0 AND u.domainId = :domainId))"),
        @NamedQuery(name = "getUserByEmail", query = "SELECT u FROM User u 
WHERE u.deleted = false AND u.type = :type AND u.address.email = :email AND 
((:domainId = 0 AND u.domainId IS NULL) OR (:domainId > 0 AND u.domainId = 
:domainId))"),
        @NamedQuery(name = "getUserByHash",  query = "SELECT u FROM User u 
WHERE u.deleted = false AND u.type = :type AND u.resethash = :resethash"),
+       @NamedQuery(name = "getUserByExpiredHash",  query = "SELECT u FROM User 
u WHERE u.resetDate < :date"),
        @NamedQuery(name = "getContactByEmailAndUser", query = "SELECT u FROM 
User u WHERE u.deleted = false AND u.address.email = :email AND u.type = :type 
AND u.ownerId = :ownerId"),
        @NamedQuery(name = "selectMaxFromUsersWithSearch", query = "select 
count(c.id) from User c "
                        + "where c.deleted = false " + "AND ("
@@ -193,10 +192,6 @@ public class User implements IDataProviderEntity {
        @Element(data = true, required = false)
        private String lastname;
 
-       @Column(name = "lasttrans")
-       @Element(data = true, required = false)
-       private Long lasttrans;
-
        @Column(name = "login")
        @Element(data = true, required = false)
        private String login;
@@ -238,6 +233,10 @@ public class User implements IDataProviderEntity {
        @Element(data = true, required = false)
        private String resethash;
 
+       @Column(name = "resetdate")
+       @Element(data = true, required = false)
+       private Date resetDate;
+
        @Column(name = "activatehash")
        @Element(data = true, required = false)
        private String activatehash;
@@ -372,14 +371,6 @@ public class User implements IDataProviderEntity {
                this.lastname = lastname;
        }
 
-       public Long getLasttrans() {
-               return lasttrans;
-       }
-
-       public void setLasttrans(Long lasttrans) {
-               this.lasttrans = lasttrans;
-       }
-
        public String getLogin() {
                return login;
        }
@@ -389,15 +380,6 @@ public class User implements IDataProviderEntity {
        }
 
        public void updatePassword(ConfigurationDao configDao, String pass) 
throws NoSuchAlgorithmException {
-               updatePassword(configDao, pass, false);
-       }
-
-       public void updatePassword(ConfigurationDao configDao, String pass, 
boolean empty) throws NoSuchAlgorithmException {
-               if (!empty) {
-                       if (invalidPassword(pass, configDao)) {
-                               throw new RuntimeException("Password of invalid 
length is provided");
-                       }
-               }
                if (configDao.isSipEnabled()) {
                        AsteriskSipUser u = getSipUser();
                        if (u == null) {
@@ -498,6 +480,14 @@ public class User implements IDataProviderEntity {
                this.resethash = resethash;
        }
 
+       public Date getResetDate() {
+               return resetDate;
+       }
+
+       public void setResetDate(Date resetDate) {
+               this.resetDate = resetDate;
+       }
+
        public String getActivatehash() {
                return activatehash;
        }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/UserHelper.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/UserHelper.java 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/UserHelper.java
index 232db04..32a0945 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/UserHelper.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/UserHelper.java
@@ -33,8 +33,4 @@ public class UserHelper {
        public static int getMinPasswdLength(ConfigurationDao cfgDao) {
                return cfgDao.getConfValue(CONFIG_PASS_MIN_LENGTH_KEY, 
Integer.class, "" + USER_PASSWORD_MINIMUM_LENGTH);
        }
-
-       public static boolean invalidPassword(String pass, ConfigurationDao 
cfgDao) {
-               return (pass == null || pass.length() < 
getMinPasswdLength(cfgDao));
-       }
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
 
b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
index c92eb40..f7c4230 100644
--- 
a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
+++ 
b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
@@ -114,6 +114,7 @@ import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.entity.user.User.Salutation;
 import org.apache.openmeetings.db.entity.user.UserContact;
+import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.db.util.TimezoneUtil;
 import org.apache.openmeetings.util.CalendarPatterns;
 import org.apache.openmeetings.util.OmFileHelper;
@@ -348,8 +349,6 @@ public class BackupImport {
                                if (u.getType() == User.Type.contact && 
u.getLogin().length() < minLoginLength) {
                                        
u.setLogin(UUID.randomUUID().toString());
                                }
-                               //FIXME: OPENMEETINGS-750
-                               //Convert old Backups with OmTimeZone to new 
schema
 
                                String tz = u.getTimeZoneId();
                                if (tz == null) {
@@ -375,6 +374,9 @@ public class BackupImport {
                                if (!Strings.isEmpty(u.getExternalType())) {
                                        u.setType(User.Type.external);
                                }
+                               if (AuthLevelUtil.hasLoginLevel(u.getRights()) 
&& !Strings.isEmpty(u.getActivatehash())) {
+                                       u.setActivatehash(null);
+                               }
                                userDao.update(u, Long.valueOf(-1));
                                userMap.put(userId, u.getId());
                        }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java 
b/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
index 2162223..5fa6aae 100644
--- a/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
+++ b/openmeetings-install/src/main/java/org/apache/openmeetings/cli/Admin.java
@@ -21,7 +21,6 @@ package org.apache.openmeetings.cli;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static 
org.apache.openmeetings.db.util.ApplicationHelper.destroyApplication;
 import static org.apache.openmeetings.db.util.UserHelper.getMinPasswdLength;
-import static org.apache.openmeetings.db.util.UserHelper.invalidPassword;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.USER_LOGIN_MINIMUM_LENGTH;
 import static 
org.apache.openmeetings.util.OpenmeetingsVariables.USER_PASSWORD_MINIMUM_LENGTH;
 
@@ -50,10 +49,12 @@ import org.apache.openmeetings.backup.BackupExport;
 import org.apache.openmeetings.backup.BackupImport;
 import org.apache.openmeetings.backup.ProgressHolder;
 import org.apache.openmeetings.core.ldap.LdapLoginManagement;
+import org.apache.openmeetings.core.util.StrongPasswordValidator;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
 import org.apache.openmeetings.db.dao.record.RecordingDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.util.ApplicationHelper;
 import org.apache.openmeetings.installation.ImportInitvalues;
 import org.apache.openmeetings.installation.InstallationConfig;
@@ -65,6 +66,8 @@ import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.util.OpenmeetingsVariables;
 import org.apache.openmeetings.util.mail.MailUtil;
 import org.apache.wicket.util.string.StringValue;
+import org.apache.wicket.validation.IValidator;
+import org.apache.wicket.validation.Validatable;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 import org.springframework.scheduling.quartz.SchedulerFactoryBean;
@@ -416,16 +419,19 @@ public class Admin {
                        System.out.println("User group was not provided, or too 
short, should be at least 1 character long: " + cfg.group);
                        System.exit(1);
                }
-               cfg.setPassword(cmdl.getOptionValue("password"));
-               ConfigurationDao cfgDao = 
getApplicationContext().getBean(ConfigurationDao.class);
-               if (invalidPassword(cfg.getPassword(), cfgDao)) {
+               if (!cmdl.hasOption("password")) {
                        System.out.print("Please enter password for the user '" 
+ cfg.username + "':");
-                       cfg.setPassword(new BufferedReader(new 
InputStreamReader(System.in, UTF_8)).readLine());
-                       if (invalidPassword(cfg.getPassword(), cfgDao)) {
-                               System.out.println("Password was not provided, 
or too short, should be at least " + getMinPasswdLength(cfgDao) + " character 
long.");
-                               System.exit(1);
-                       }
+               } else {
+                       cfg.setPassword(cmdl.getOptionValue("password"));
                }
+               ConfigurationDao cfgDao = 
getApplicationContext().getBean(ConfigurationDao.class);
+               IValidator<String> passValidator = new 
StrongPasswordValidator(true, getMinPasswdLength(cfgDao), new User());
+               Validatable<String> passVal;
+               do {
+                       passVal = new Validatable<>(cfg.getPassword());
+                       passValidator.validate(passVal);
+                       cfg.setPassword(new BufferedReader(new 
InputStreamReader(System.in, UTF_8)).readLine());
+               } while (!passVal.isValid());
                Map<String, String> tzMap = 
ImportHelper.getAllTimeZones(TimeZone.getAvailableIDs());
                cfg.ical_timeZone = null;
                if (cmdl.hasOption("tz")) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
 
b/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
index b7b7b81..c620c7e 100644
--- 
a/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
+++ 
b/openmeetings-install/src/main/java/org/apache/openmeetings/installation/ImportInitvalues.java
@@ -123,8 +123,6 @@ public class ImportInitvalues {
        private GroupDao groupDao;
        @Autowired
        private RoomDao roomDao;
-       @Autowired
-       private LabelDao labelDao;
 
        private int progress = 0;
 
@@ -330,7 +328,7 @@ public class ImportInitvalues {
                                "Number of chars needed in a user login");
 
                cfgDao.add(CONFIG_PASS_MIN_LENGTH_KEY, "" + 
USER_PASSWORD_MINIMUM_LENGTH, null,
-                               "Number of chars needed in a user login");
+                               "Number of chars needed in a user password");
 
                cfgDao.add("calendar.conference.rooms.default.size", "50", null,
                                "Default number of participants conference room 
created via calendar");
@@ -415,22 +413,22 @@ public class ImportInitvalues {
 
        public void loadDefaultRooms(boolean createRooms, long langId) {
                if (createRooms) {
-                       
createRoom(labelDao.getString("install.room.public.interview", langId), 
Type.interview, 16L, true, null);
-                       
createRoom(labelDao.getString("install.room.public.conference", langId), 
Type.conference, 32L, true, null);
-                       Room r = 
createRoom(labelDao.getString("install.room.public.video.only", langId), 
Type.conference, 32L, true, null);
+                       
createRoom(LabelDao.getString("install.room.public.interview", langId), 
Type.interview, 16L, true, null);
+                       
createRoom(LabelDao.getString("install.room.public.conference", langId), 
Type.conference, 32L, true, null);
+                       Room r = 
createRoom(LabelDao.getString("install.room.public.video.only", langId), 
Type.conference, 32L, true, null);
                        r.hide(RoomElement.Whiteboard);
                        roomDao.update(r, null);
-                       
createRoom(labelDao.getString("install.room.public.video.wb", langId), 
Type.conference, 32L, true, null);
-                       
createRoom(labelDao.getString("install.room.public.restricted", langId), 
Type.restricted, 100L, true, null);
-                       r = 
createRoom(labelDao.getString("install.room.restricted.micro", langId), 
Type.restricted, 100L, true, null);
+                       
createRoom(LabelDao.getString("install.room.public.video.wb", langId), 
Type.conference, 32L, true, null);
+                       
createRoom(LabelDao.getString("install.room.public.restricted", langId), 
Type.restricted, 100L, true, null);
+                       r = 
createRoom(LabelDao.getString("install.room.restricted.micro", langId), 
Type.restricted, 100L, true, null);
                        r.getHiddenElements().clear();
                        roomDao.update(r, null);
 
-                       r = 
createRoom(labelDao.getString("install.room.conference.micro", langId), 
Type.conference, 32L, true, null);
+                       r = 
createRoom(LabelDao.getString("install.room.conference.micro", langId), 
Type.conference, 32L, true, null);
                        r.getHiddenElements().clear();
                        roomDao.update(r, null);
 
-                       
createRoom(labelDao.getString("install.room.private.conference", langId), 
Type.conference, 32L, false, 1L);
+                       
createRoom(LabelDao.getString("install.room.private.conference", langId), 
Type.conference, 32L, false, 1L);
                }
        }
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-server/src/site/xdoc/GeneralConfiguration.xml
----------------------------------------------------------------------
diff --git a/openmeetings-server/src/site/xdoc/GeneralConfiguration.xml 
b/openmeetings-server/src/site/xdoc/GeneralConfiguration.xml
index 750724b..20159ee 100644
--- a/openmeetings-server/src/site/xdoc/GeneralConfiguration.xml
+++ b/openmeetings-server/src/site/xdoc/GeneralConfiguration.xml
@@ -76,11 +76,9 @@
                                </tr>
                                <tr>
                                        <td> user.pass.minimum.length </td>
-                                       <td> 4 </td>
-                                       <td> minimum chars required for the 
password to create a
-                                               user
-                                       </td>
-                                       <td> 1.9.x </td>
+                                       <td> 8 </td>
+                                       <td> minimum chars required for the 
password to create a user </td>
+                                       <td> 1.9.x <b>default value changed in 
3.3.0</b> </td>
                                </tr>
                                <tr>
                                        <td> number.minutes.reminder.send </td>
@@ -93,9 +91,7 @@
                                <tr>
                                        <td> max_upload_size </td>
                                        <td> 1073741824 </td>
-                                       <td> Maximum size of upload file 
(bytes) 1073741824 bytes
-                                               = 1GB
-                                       </td>
+                                       <td> Maximum size of upload file 
(bytes) 1073741824 bytes = 1GB </td>
                                        <td> 1.8.x </td>
                                </tr>
                                <tr>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/AppointmentLogic.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/AppointmentLogic.java
 
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/AppointmentLogic.java
index 8e19356..b7ec0ed 100644
--- 
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/AppointmentLogic.java
+++ 
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/calendar/AppointmentLogic.java
@@ -61,8 +61,6 @@ public class AppointmentLogic {
        @Autowired
        private ConfigurationDao configurationDao;
        @Autowired
-       private LabelDao langDao;
-       @Autowired
        private RoomDao roomDao;
        @Autowired
        private IInvitationManager invitationManager;
@@ -85,7 +83,7 @@ public class AppointmentLogic {
                i.setRoom(a.getRoom());
                sendReminder(u, a, i);
        }
-       
+
        private void sendReminder(User u, Appointment a, Invitation inv) throws 
Exception {
                if (inv == null) {
                        log.error(String.format("Error retrieving Invitation 
for member %s in Appointment %s"
@@ -99,7 +97,7 @@ public class AppointmentLogic {
                // Get the required labels one time for all meeting members. The
                // Language of the email will be the system default language
 
-               String smsSubject = generateSMSSubject(langDao.getString(1158L, 
langId), a);
+               String smsSubject = 
generateSMSSubject(LabelDao.getString(1158L, langId), a);
 
                AbstractSubjectEmailTemplate t = 
AppointmentReminderTemplate.get(u, a, tz);
                invitationManager.sendInvitationLink(inv, MessageType.Create, 
t.getSubject(), t.getEmail(), false);
@@ -110,7 +108,7 @@ public class AppointmentLogic {
                        invitationDao.update(inv);
                }
        }
-       
+
        /**
         * Sending Reminder in Simple mail format 5 minutes before Meeting 
begins
         */
@@ -183,7 +181,7 @@ public class AppointmentLogic {
 
        private String generateSMSSubject(String labelid1158, Appointment ment) 
{
                String subj = configurationDao.getConfValue("sms.subject", 
String.class, null);
-               return subj == null || subj.length() == 0 ? 
+               return subj == null || subj.length() == 0 ?
                                labelid1158 + " " + ment.getTitle() : subj;
        }
 
@@ -231,7 +229,7 @@ public class AppointmentLogic {
 
        public MeetingMember getMeetingMember(Long userId, Long langId, String 
str) {
                String[] params = str.split(",");
-               
+
                try {
                        return meetingMemberDao.get(Long.valueOf(params[0]));
                } catch (Exception e) {
@@ -246,7 +244,7 @@ public class AppointmentLogic {
                if (mm.getUser() == null) {
                        mm.setUser(userDao.getContact(params[3], params[1], 
params[2], langId, params[5], userId));
                }
-               
+
                return mm;
        }
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
 
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
index 5dbdd2b..bcef9cf 100644
--- 
a/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
+++ 
b/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
@@ -25,6 +25,7 @@ import static 
org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
 import java.io.File;
 import java.io.FileFilter;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.io.FileUtils;
@@ -32,8 +33,10 @@ import org.apache.commons.lang3.math.NumberUtils;
 import org.apache.openmeetings.core.data.whiteboard.WhiteboardCache;
 import org.apache.openmeetings.core.session.SessionManager;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.room.Whiteboard;
 import org.apache.openmeetings.db.dto.room.Whiteboards;
+import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.util.InitializationContainer;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
@@ -44,6 +47,7 @@ public class CleanupJob extends AbstractJob {
        private long sessionTimeout = 30 * 60 * 1000L;
        private long testSetupTimeout = 60 * 60 * 1000L; // 1 hour
        private long roomFilesTtl = 60 * 60 * 1000L; // 1 hour
+       private long resetHashTtl = 24 * 60 * 60 * 1000L; // 1 day
 
        @Autowired
        private SessiondataDao sessionDao;
@@ -51,31 +55,25 @@ public class CleanupJob extends AbstractJob {
        private SessionManager sessionManager;
        @Autowired
        private WhiteboardCache wbManager;
-
-       public long getSessionTimeout() {
-               return sessionTimeout;
-       }
+       @Autowired
+       private UserDao userDao;
 
        public void setSessionTimeout(long sessionTimeout) {
                this.sessionTimeout = sessionTimeout;
        }
 
-       public long getTestSetupTimeout() {
-               return testSetupTimeout;
-       }
-
        public void setTestSetupTimeout(long testSetupTimeout) {
                this.testSetupTimeout = testSetupTimeout;
        }
 
-       public long getRoomFilesTtl() {
-               return roomFilesTtl;
-       }
-
        public void setRoomFilesTtl(long roomFilesTtl) {
                this.roomFilesTtl = roomFilesTtl;
        }
 
+       public void setResetHashTtl(long resetHashTtl) {
+               this.resetHashTtl = resetHashTtl;
+       }
+
        public void cleanTestSetup() {
                log.debug("CleanupJob.cleanTestSetup");
                if (!InitializationContainer.initComplete) {
@@ -176,4 +174,19 @@ public class CleanupJob extends AbstractJob {
                        }
                });
        }
+
+       public void cleanExpiredResetHash() {
+               log.debug("CleanupJob.cleanExpiredResetHash");
+               if (!InitializationContainer.initComplete) {
+                       return;
+               }
+               List<User> users = userDao.getByExpiredHash(resetHashTtl);
+               log.debug("... {} expired hashes were found", users.size());
+               for (User u : users) {
+                       u.setResetDate(null);
+                       u.setResethash(null);
+                       userDao.update(u, null);
+               }
+               log.debug("... DONE CleanupJob.cleanExpiredResetHash");
+       }
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
index 4ea8b8a..310d833 100644
--- 
a/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
+++ 
b/openmeetings-util/src/main/java/org/apache/openmeetings/util/OpenmeetingsVariables.java
@@ -74,7 +74,7 @@ public class OpenmeetingsVariables {
        public static String webAppRootPath = null;
        public static String configKeyCryptClassName = null;
        public static final int USER_LOGIN_MINIMUM_LENGTH = 4;
-       public static final int USER_PASSWORD_MINIMUM_LENGTH = 4;
+       public static final int USER_PASSWORD_MINIMUM_LENGTH = 8;
        public static Boolean whiteboardDrawStatus = null;
        public static String wicketApplicationName = null;
        public static String APPLICATION_NAME = null;

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
index b9b950d..916bf5f 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml
index 275adfd..deaf8a0 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ar.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml
index 045ab0e..c3b41c1 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_bg.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml
index fea2ddb..ebc2432 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ca.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml
index ab4ff0a..10b3b82 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_cs.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml
index c2bd1cc..e3bcbec 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_da.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_de.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_de.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_de.properties.xml
index b27e359..2cd4fd5 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_de.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_de.properties.xml
@@ -1919,4 +1919,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml
index c4c354f..2f8dea1 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_el.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_es.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_es.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_es.properties.xml
index ed46e85..e195e2f 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_es.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_es.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fa.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fa.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fa.properties.xml
index 85d175d..1c6d5b5 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fa.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fa.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml
index df7779f..1f3b8bf 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fi.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fr.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fr.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fr.properties.xml
index a052e86..8bb53b2 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fr.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_fr.properties.xml
@@ -1906,4 +1906,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml
index c527e8c..76b9df0 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_gl.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hu.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hu.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hu.properties.xml
index 57ed57d..694ab25 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hu.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_hu.properties.xml
@@ -1902,4 +1902,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_id.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_id.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_id.properties.xml
index 175d2fd..d2cb807 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_id.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_id.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_it.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_it.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_it.properties.xml
index b5f9e9e..9528111 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_it.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_it.properties.xml
@@ -1916,4 +1916,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ja.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ja.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ja.properties.xml
index 3158a91..082a4d2 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ja.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ja.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml
index 617f1f4..0244164 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ko.properties.xml
@@ -1916,4 +1916,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml
index b7ffbf9..f5a8ac1 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_nl.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml
index 07da9c4..fac249e 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pl.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml
index d270f87..4e18087 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml
index 6569531..185f570 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_pt_BR.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ru.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ru.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ru.properties.xml
index 283292e..19d4092 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ru.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_ru.properties.xml
@@ -1915,4 +1915,10 @@
        <entry key="right.presenter.request.self">Я хотел бы быть 
Докладчиком в этой комнате</entry>
        <entry key="captcha.text">Текст капчи</entry>
        <entry key="bad.captcha.text">Вы ввели неверный 
текст капчи</entry>
+       <entry key="bad.password.short"><![CDATA['Слабый' пароль: 
минимальная длина пароля ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Слабый' пароль: 
обязателена по крайней мере одна строчная 
буква]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Слабый' пароль: 
обязателена по крайней мере одна прописная 
буква]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Слабый' пароль: 
обязателена по крайней мере одна 
цифра]]></entry>
+       <entry key="bad.password.special"><![CDATA['Слабый' пароль: 
обязателен по крайней мере один символ из 
'!@#$%^&*][']]></entry>
+       <entry key="bad.password.stop"><![CDATA['Слабый' пароль: 
пароль не должен содержать частей 
пользовательского email или логина]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml
index f17a9cc..33af424 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sk.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sv.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sv.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sv.properties.xml
index 919bc4b..a3611ae 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sv.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_sv.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml
index c9f2e98..7713efd 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_th.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml
index 616b1c2..09396dd 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_tr.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_uk.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_uk.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_uk.properties.xml
index 95e2220..a884f2f 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_uk.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_uk.properties.xml
@@ -1916,4 +1916,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_CN.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_CN.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_CN.properties.xml
index 88b104a..b0cc276 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_CN.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_CN.properties.xml
@@ -1904,4 +1904,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml
index 0284170..48d2581 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/Application_zh_TW.properties.xml
@@ -1914,4 +1914,10 @@
        <entry key="right.presenter.request.self">I would like to have right to 
be presenter in this room</entry>
        <entry key="captcha.text">Captcha text</entry>
        <entry key="bad.captcha.text">You have entered incorrect captcha 
text</entry>
+       <entry key="bad.password.short"><![CDATA['Weak' password: minimum 
password length is ${0}]]></entry>
+       <entry key="bad.password.lower"><![CDATA['Weak' password: at least 1 
lower-case letter is required]]></entry>
+       <entry key="bad.password.upper"><![CDATA['Weak' password: at least 1 
upper-case letter is required]]></entry>
+       <entry key="bad.password.digit"><![CDATA['Weak' password: at least 1 
digit is required]]></entry>
+       <entry key="bad.password.special"><![CDATA['Weak' password: at least 1 
special symbol '!@#$%^&*][' is required]]></entry>
+       <entry key="bad.password.stop"><![CDATA['Weak' password: it shouldn't 
contain part of the user's email address or username]]></entry>
 </properties>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/e81d12ea/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
index 0070ede..7d1a71a 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/GeneralUserForm.java
@@ -24,7 +24,6 @@ import static 
org.apache.openmeetings.web.app.Application.getBean;
 import static org.apache.openmeetings.web.app.WebSession.AVAILABLE_TIMEZONES;
 import static org.apache.openmeetings.web.app.WebSession.getRights;
 import static org.apache.openmeetings.web.app.WebSession.getUserId;
-import static 
org.apache.wicket.validation.validator.StringValidator.minimumLength;
 
 import java.time.LocalDate;
 import java.util.ArrayList;
@@ -32,6 +31,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.openmeetings.core.util.StrongPasswordValidator;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
 import org.apache.openmeetings.db.dao.user.GroupDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
@@ -73,6 +73,7 @@ public class GeneralUserForm extends Form<User> {
        private final PasswordTextField passwordField;
        private final RequiredTextField<String> email;
        private final List<GroupUser> grpUsers = new ArrayList<>();
+       private final StrongPasswordValidator passValidator;
        private final boolean isAdminForm;
 
        public GeneralUserForm(String id, IModel<User> model, boolean 
isAdminForm) {
@@ -82,7 +83,8 @@ public class GeneralUserForm extends Form<User> {
                //TODO should throw exception if non admin User edit somebody 
else (or make all fields read-only)
                add(passwordField = new PasswordTextField("password", new 
Model<String>()));
                ConfigurationDao cfgDao = getBean(ConfigurationDao.class);
-               
passwordField.setResetPassword(false).setRequired(false).add(minimumLength(getMinPasswdLength(cfgDao)));
+               passwordField.setResetPassword(false)
+                               .add(passValidator = new 
StrongPasswordValidator(getMinPasswdLength(cfgDao), model.getObject()));
 
                updateModelObject(getModelObject(), isAdminForm);
                add(new DropDownChoice<>("salutation"
@@ -176,6 +178,7 @@ public class GeneralUserForm extends Form<User> {
        public void updateModelObject(User u, boolean isAdminForm) {
                grpUsers.clear();
                grpUsers.addAll(u.getGroupUsers());
+               passValidator.setUser(u);
                if (isAdminForm) {
                        List<Group> grpList = hasGroupAdminLevel(getRights())
                                        ? getBean(GroupDao.class).get(null, 
getUserId(), 0, Integer.MAX_VALUE, null)

Reply via email to