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();
