Repository: openmeetings
Updated Branches:
  refs/heads/4.0.x 2c4af6934 -> c384a4a0e


[OPENMEETINGS-1812] admin password is checked during update of privileged user


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

Branch: refs/heads/4.0.x
Commit: c384a4a0e44dde7dbf17c7373423186338526f0e
Parents: 2c4af69
Author: Maxim Solodovnik <[email protected]>
Authored: Sat Jan 6 18:59:35 2018 +0700
Committer: Maxim Solodovnik <[email protected]>
Committed: Sat Jan 6 18:59:35 2018 +0700

----------------------------------------------------------------------
 .../web/admin/users/PasswordDialog.html         |  28 +++++
 .../web/admin/users/PasswordDialog.java         | 103 +++++++++++++++++++
 .../openmeetings/web/admin/users/UserForm.html  |   1 +
 .../openmeetings/web/admin/users/UserForm.java  |  50 ++++++---
 .../web/common/FormSaveRefreshPanel.java        |  11 +-
 .../openmeetings/web/common/NameDialog.html     |   2 +-
 .../web/room/activities/activities.js           |   2 +-
 .../openmeetings/web/user/chat/chat-base.js     |   1 -
 8 files changed, 179 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/c384a4a0/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.html
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.html
new file mode 100644
index 0000000..0d4e2bd
--- /dev/null
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.html
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+
+-->
+<html xmlns:wicket="http://wicket.apache.org";>
+<wicket:panel>
+       <form wicket:id="form">
+               <label style="padding: 0 20px;" 
wicket:for="password"><wicket:message key="current.password"/></label><input 
type="password" wicket:id="password"/>
+               <div wicket:id="feedback"></div>
+       </form>
+</wicket:panel>
+</html>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/c384a4a0/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
new file mode 100644
index 0000000..cac56a1
--- /dev/null
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/PasswordDialog.java
@@ -0,0 +1,103 @@
+/*
+ * 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.web.admin.users;
+
+import static org.apache.openmeetings.web.app.Application.getBean;
+import static org.apache.openmeetings.web.app.WebSession.getUserId;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.PasswordTextField;
+import org.apache.wicket.model.Model;
+
+import com.googlecode.wicket.jquery.core.Options;
+import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+public class PasswordDialog extends AbstractFormDialog<String> {
+       private static final long serialVersionUID = 1L;
+       private DialogButton ok;
+       private DialogButton cancel;
+       protected final KendoFeedbackPanel feedback = new 
KendoFeedbackPanel("feedback", new Options("button", true));
+       private final Form<String> form = new Form<>("form");
+       private final PasswordTextField pass = new 
PasswordTextField("password");
+
+       public PasswordDialog(String id) {
+               super(id, "");
+       }
+
+       public UserForm getUserForm() {
+               return findParent(UserForm.class);
+       }
+
+       @Override
+       protected void onInitialize() {
+               setTitle(Model.of(getString("537")));
+               ok = new DialogButton("ok", getString("54"));
+               cancel = new DialogButton("cancel", getString("lbl.cancel"));
+               add(form.add(feedback, 
pass.setRequired(false).setLabel(Model.of(getString("110")))));
+               super.onInitialize();
+       }
+
+       @Override
+       protected List<DialogButton> getButtons() {
+               return Arrays.asList(ok, cancel);
+       }
+
+       @Override
+       public DialogButton getSubmitButton() {
+               return ok;
+       }
+
+       @Override
+       public Form<?> getForm() {
+               return form;
+       }
+
+       @Override
+       protected void onError(AjaxRequestTarget target) {
+               target.add(feedback);
+       }
+
+       @Override
+       public void onClick(AjaxRequestTarget target, DialogButton button) {
+               if (!form.hasError() || !button.equals(ok)) {
+                       super.onClick(target, button);
+               }
+       }
+
+       @Override
+       protected void onSubmit(AjaxRequestTarget target) {
+               final UserForm uf = getUserForm();
+               if (uf.isAdminPassRequired()) {
+                       final UserDao dao = getBean(UserDao.class);
+                       if (dao.verifyPassword(getUserId(), 
pass.getConvertedInput())) {
+                               uf.saveUser(target);
+                       } else {
+                               form.error(getString("error.bad.password"));
+                               target.add(feedback);
+                       }
+               }
+       }
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/c384a4a0/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.html
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.html
index 01c73a8..7ba2103 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.html
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.html
@@ -65,5 +65,6 @@
                        <form wicket:id="comunity"></form>
                </fieldset>
        </div>
+       <div wicket:id="adminPass"></div>
 </wicket:panel>
 </html>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/c384a4a0/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
index 9ae0c46..00a1733 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/users/UserForm.java
@@ -18,6 +18,7 @@
  */
 package org.apache.openmeetings.web.admin.users;
 
+import static org.apache.openmeetings.db.util.AuthLevelUtil.hasAdminLevel;
 import static org.apache.openmeetings.db.util.AuthLevelUtil.hasGroupAdminLevel;
 import static org.apache.openmeetings.db.util.UserHelper.getMinLoginLength;
 import static org.apache.openmeetings.db.util.UserHelper.getMinPasswdLength;
@@ -33,6 +34,7 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.UUID;
 
 import org.apache.openmeetings.core.util.StrongPasswordValidator;
@@ -45,6 +47,7 @@ import org.apache.openmeetings.db.entity.server.OAuthServer;
 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.Type;
+import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.service.mail.EmailManager;
 import org.apache.openmeetings.web.admin.AdminBaseForm;
 import org.apache.openmeetings.web.common.ComunityUserForm;
@@ -92,6 +95,7 @@ public class UserForm extends AdminBaseForm<User> {
        private final PasswordTextField password = new 
PasswordTextField("password", new Model<String>());
        private final MessageDialog warning;
        private final DropDownChoice<Long> domainId = new 
DropDownChoice<>("domainId");
+       private final PasswordDialog adminPass = new 
PasswordDialog("adminPass");
 
        public UserForm(String id, WebMarkupContainer listContainer, final User 
user, MessageDialog warning) {
                super(id, new CompoundPropertyModel<>(user));
@@ -165,6 +169,7 @@ public class UserForm extends AdminBaseForm<User> {
                // attach an ajax validation behavior to all form component's 
keydown
                // event and throttle it down to once per second
                add(new AjaxFormValidatingBehavior("keydown", 
Duration.ONE_SECOND));
+               add(adminPass);
        }
 
        @Override
@@ -177,25 +182,44 @@ public class UserForm extends AdminBaseForm<User> {
 
        @Override
        protected void onSaveSubmit(AjaxRequestTarget target, Form<?> form) {
+               if (isAdminPassRequired()) {
+                       adminPass.open(target);
+               } else {
+                       saveUser(target);
+               }
+       }
+
+       private static boolean checkLevel(Set<User.Right> rights) {
+               return hasAdminLevel(rights) || 
AuthLevelUtil.hasWebServiceLevel(rights);
+       }
+
+       boolean isAdminPassRequired() {
                User u = getModelObject();
+               UserDao dao = getBean(UserDao.class);
+               User ou = dao.get(u.getId());
+               return checkLevel(u.getRights()) || (ou != null && 
checkLevel(ou.getRights()));
+       }
+
+       void saveUser(AjaxRequestTarget target) {
+               User u = getModelObject();
+               final UserDao dao = getBean(UserDao.class);
+               final boolean isNew = u.getId() == null;
+               boolean sendEmailAtRegister = 
getBean(ConfigurationDao.class).getBool(CONFIG_EMAIL_AT_REGISTER, false);
+               if (isNew && sendEmailAtRegister) {
+                       u.setActivatehash(UUID.randomUUID().toString());
+               }
                try {
-                       boolean isNew = u.getId() == null;
-                       boolean sendEmailAtRegister = 
getBean(ConfigurationDao.class).getBool(CONFIG_EMAIL_AT_REGISTER, false);
-                       if (isNew && sendEmailAtRegister) {
-                               u.setActivatehash(UUID.randomUUID().toString());
-                       }
-                       u = getBean(UserDao.class).update(u, 
password.getConvertedInput(), getUserId());
-                       if (isNew && sendEmailAtRegister) {
-                               String email = u.getAddress().getEmail();
-                               
getBean(EmailManager.class).sendMail(login.getValue(), email, 
u.getActivatehash(), false, null);
-                       }
+                       u = dao.update(u, password.getConvertedInput(), 
getUserId());
                } catch (Exception e) {
                        log.error("[onSaveSubmit]: ", e);
                }
-               setModelObject(getBean(UserDao.class).get(u.getId()));
+               if (isNew && sendEmailAtRegister) {
+                       String email = u.getAddress().getEmail();
+                       getBean(EmailManager.class).sendMail(login.getValue(), 
email, u.getActivatehash(), false, null);
+               }
+               setModelObject(dao.get(u.getId()));
                hideNewRecord();
-               target.add(this);
-               target.add(listContainer);
+               target.add(this, listContainer);
                reinitJs(target);
                if (u.getGroupUsers().isEmpty()) {
                        warning.open(target);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/c384a4a0/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.java
index 7abda78..27118ef 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/FormSaveRefreshPanel.java
@@ -28,13 +28,17 @@ import 
com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
 
 public abstract class FormSaveRefreshPanel<T> extends Panel {
        private static final long serialVersionUID = 1L;
-       protected final KendoFeedbackPanel feedback;
+       private final Form<T> form;
+       protected final KendoFeedbackPanel feedback = new 
KendoFeedbackPanel("feedback", new Options("button", true));
 
        public FormSaveRefreshPanel(String id, Form<T> form) {
                super(id);
+               this.form = form;
                setOutputMarkupId(true);
+       }
 
-               feedback = new KendoFeedbackPanel("feedback", new 
Options("button", true));
+       @Override
+       protected void onInitialize() {
                add(feedback.setOutputMarkupId(true));
 
                // add a save button that can be used to submit the form via 
ajax
@@ -76,8 +80,9 @@ public abstract class FormSaveRefreshPanel<T> extends Panel {
                                onRefreshError(target, form);
                        }
                });
-
+               super.onInitialize();
        }
+
        /**
         * Hide the new record text
         */

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/c384a4a0/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html
index ef9e252..500bd0c 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html
@@ -21,7 +21,7 @@
 <html xmlns:wicket="http://wicket.apache.org";>
 <wicket:panel>
        <form wicket:id="form">
-               <label style="padding-left: 20px; padding-right: 20px;" 
wicket:id="label"></label><input type="text" wicket:id="title"/>
+               <label style="padding: 0 20px;" 
wicket:id="label"></label><input type="text" wicket:id="title"/>
                <div wicket:id="feedback"></div>
                <input type="submit" wicket:id="submit" 
class="invisible-form-component"/>
        </form>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/c384a4a0/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
index b5d66c8..14e6b03 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/activities/activities.js
@@ -1,6 +1,6 @@
 /* Licensed under the Apache License, Version 2.0 (the "License") 
http://www.apache.org/licenses/LICENSE-2.0 */
 var Activities = function() {
-       const closedHeight = 20, closedHeightPx = closedHeight + 'px', timeout 
= 10000;
+       const closedHeight = 20, timeout = 10000;
        let activities, aclean, area, openedHeight = 345, openedHeightPx = 
openedHeight + 'px', inited = false;
 
        function _load() {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/c384a4a0/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat-base.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat-base.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat-base.js
index adb6660..0d4a8cf 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat-base.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/chat/chat-base.js
@@ -211,7 +211,6 @@ var Chat = function() {
                if ($('#chat').length > 0 && m && m.type === "chat") {
                        if (isClosed()) {
                                ctrl.addClass('ui-state-highlight');
-                               const s = _load();
                                if (p.is(':visible') && !muted) {
                                        const playPromise = audio.play();
 

Reply via email to