/* * Copyright 2014-2016 CyberVision, Inc. * * Licensed 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.kaaproject.kaa.server.admin.client.mvp.view.dialog; import static org.kaaproject.kaa.server.admin.shared.util.Utils.isEmpty; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.event.dom.client.KeyDownHandler; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import org.kaaproject.avro.ui.gwt.client.input.InputEvent; import org.kaaproject.avro.ui.gwt.client.input.InputEventHandler; import org.kaaproject.avro.ui.gwt.client.widget.AlertPanel; import org.kaaproject.avro.ui.gwt.client.widget.dialog.AvroUiDialog; import org.kaaproject.kaa.common.dto.admin.ResultCode; import org.kaaproject.kaa.server.admin.client.mvp.view.widget.ExtendedPasswordTextBox; import org.kaaproject.kaa.server.admin.client.util.Utils; import org.kaaproject.kaa.server.admin.shared.services.KaaAuthServiceAsync; public class ChangePasswordDialog extends AvroUiDialog { private static final String REQUIRED = Utils.avroUiStyle.requiredField(); private KaaAuthServiceAsync authService = KaaAuthServiceAsync.Util.getInstance(); private AlertPanel errorPanel; private ExtendedPasswordTextBox oldPassword; private ExtendedPasswordTextBox newPassword; private ExtendedPasswordTextBox newPasswordAgain; private String username; private Button changePasswordButton; /** * Instantiates a new ChangePasswordDialog. */ public ChangePasswordDialog(final Listener listener, String username, String message) { super(false, true); this.username = username; setWidth("500px"); setTitle(Utils.constants.changePassword()); VerticalPanel dialogContents = new VerticalPanel(); dialogContents.setSpacing(4); setWidget(dialogContents); errorPanel = new AlertPanel(AlertPanel.Type.ERROR); errorPanel.setVisible(false); dialogContents.add(errorPanel); if (message != null) { AlertPanel warningPanel = new AlertPanel(AlertPanel.Type.WARNING); warningPanel.setMessage(message); dialogContents.add(warningPanel); } FlexTable table = new FlexTable(); table.setCellSpacing(6); int row = 0; Widget label = new Label(Utils.constants.oldPassword()); label.addStyleName(REQUIRED); oldPassword = new ExtendedPasswordTextBox(); table.setWidget(row, 0, label); table.setWidget(row, 1, oldPassword); InputChangeHandler handler = new InputChangeHandler(listener); oldPassword.addInputHandler(handler); oldPassword.addKeyDownHandler(handler); table.getCellFormatter().setHorizontalAlignment(row, 0, HasHorizontalAlignment.ALIGN_RIGHT); row++; label = new Label(Utils.constants.newPassword()); label.addStyleName(REQUIRED); newPassword = new ExtendedPasswordTextBox(); table.setWidget(row, 0, label); table.setWidget(row, 1, newPassword); newPassword.addInputHandler(handler); newPassword.addKeyDownHandler(handler); table.getCellFormatter().setHorizontalAlignment(row, 0, HasHorizontalAlignment.ALIGN_RIGHT); row++; label = new Label(Utils.constants.newPasswordAgain()); label.addStyleName(REQUIRED); newPasswordAgain = new ExtendedPasswordTextBox(); table.setWidget(row, 0, label); table.setWidget(row, 1, newPasswordAgain); newPasswordAgain.addInputHandler(handler); newPasswordAgain.addKeyDownHandler(handler); table.getCellFormatter().setHorizontalAlignment(row, 0, HasHorizontalAlignment.ALIGN_RIGHT); dialogContents.add(table); changePasswordButton = new Button(Utils.constants.changePassword(), handler); Button cancelButton = new Button(Utils.constants.cancel(), new ClickHandler() { @Override public void onClick(ClickEvent event) { hide(); listener.onCancel(); } }); addButton(changePasswordButton); addButton(cancelButton); changePasswordButton.setEnabled(false); } /** * Show change password dialog. */ public static ChangePasswordDialog showChangePasswordDialog(Listener listener, String username, String message) { ChangePasswordDialog dialog = new ChangePasswordDialog(listener, username, message); dialog.center(); dialog.show(); return dialog; } private boolean validate() { boolean result = !isEmpty(oldPassword.getValue()); result &= !isEmpty(newPassword.getValue()); result &= !isEmpty(newPasswordAgain.getValue()); return result; } private boolean validatePasswords() { String oldPasswordText = oldPassword.getValue(); String newPasswordText = newPassword.getValue(); String newPasswordAgainText = newPasswordAgain.getValue(); if (oldPasswordText.equals(newPasswordText)) { setError(Utils.messages.newPasswordShouldDifferent()); return false; } else if (!newPasswordText.equals(newPasswordAgainText)) { setError(Utils.messages.newPasswordsNotMatch()); return false; } return true; } private void performChangePassword(final AsyncCallback<ResultCode> callback) { if (validatePasswords()) { String oldPasswordText = oldPassword.getValue(); String newPasswordText = newPassword.getValue(); authService.changePassword( username, oldPasswordText, newPasswordText, new AsyncCallback<ResultCode>() { @Override public void onFailure(Throwable caught) { callback.onFailure(caught); } @Override public void onSuccess(ResultCode result) { if (ResultCode.OK != result) { setError(Utils.constants.getString(result.getResourceKey())); } callback.onSuccess(result); } }); } } private void setError(String error) { if (error != null) { errorPanel.setMessage(error); errorPanel.setVisible(true); } else { errorPanel.setMessage(""); errorPanel.setVisible(false); } } public interface Listener { public void onChangePassword(); public void onCancel(); } class InputChangeHandler implements ClickHandler, KeyDownHandler, InputEventHandler { final Listener listener; public InputChangeHandler(Listener listener) { this.listener = listener; } @Override public void onClick(ClickEvent event) { performChangePassword(new AsyncCallback<ResultCode>() { @Override public void onFailure(Throwable caught) { } @Override public void onSuccess(ResultCode result) { if (result == ResultCode.OK) { hide(); listener.onChangePassword(); } } }); } @Override public void onKeyDown(KeyDownEvent event) { if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER && validate()) { onClick(null); } } @Override public void onInputChanged(InputEvent event) { boolean valid = validate(); changePasswordButton.setEnabled(valid); } } }