/*******************************************************************************
* Copyright (c) 2006-2011 Gluster, Inc. <http://www.gluster.com>
* This file is part of Gluster Management Console.
*
* Gluster Management Console is free software; you can redistribute
* it and/or modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* Gluster Management Console is distributed in the hope that it
* will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see
* <http://www.gnu.org/licenses/>.
*******************************************************************************/
package org.gluster.storage.management.console.dialogs;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.PojoProperties;
import org.eclipse.core.databinding.validation.ValidationStatus;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.gluster.storage.management.client.UsersClient;
import org.gluster.storage.management.console.utils.GUIHelper;
import org.gluster.storage.management.console.validators.StringRequiredValidator;
import org.gluster.storage.management.core.constants.CoreConstants;
import org.gluster.storage.management.core.model.ConnectionDetails;
public class ChangePasswordDialog extends Dialog {
public static final int RETURN_CODE_ERROR = 2;
private Text oldPassword;
private Text newPassword;
private Text confirmPassword;
private Button okButton;
private final GUIHelper guiHelper = GUIHelper.getInstance();
private Composite composite;
private final ConnectionDetails connectionDetails = new ConnectionDetails("gluster", "");
public ChangePasswordDialog(Shell shell) {
super(shell);
}
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText("Gluster Management Console");
addEscapeListener(newShell);
}
private void addEscapeListener(Shell shell) {
shell.addTraverseListener(new TraverseListener() {
@Override
public void keyTraversed(TraverseEvent e) {
if (e.keyCode == SWT.ESC) {
cancelPressed();
}
}
});
}
/**
* Overriding to make sure that the dialog is centered in screen
*/
@Override
protected void initializeBounds() {
super.initializeBounds();
guiHelper.centerShellInScreen(getShell());
}
private void configureDialogLayout(Composite composite) {
GridLayout layout = (GridLayout) composite.getLayout();
layout.numColumns = 2;
layout.marginLeft = 20;
layout.marginRight = 20;
layout.marginTop = 20;
layout.horizontalSpacing = 20;
layout.verticalSpacing = 20;
}
// ------------------------------------------
private void createLabel(Composite composite, String label) {
Label passwordLabel = new Label(composite, SWT.NONE);
passwordLabel.setText(label);
passwordLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false));
}
private Text createPasswordText(Composite composite) {
Text field = new Text(composite, SWT.BORDER | SWT.PASSWORD);
GridData layoutData = new GridData(SWT.FILL, GridData.FILL, true, false);
layoutData.widthHint = convertWidthInCharsToPixels(32);
field.setLayoutData(layoutData);
return field;
}
@Override
protected Control createDialogArea(Composite parent) {
// parent.setBackgroundImage(guiHelper.getImage(IImageKeys.DIALOG_SPLASH_IMAGE));
parent.setBackgroundMode(SWT.INHERIT_FORCE);
composite = (Composite) super.createDialogArea(parent);
configureDialogLayout(composite);
createLabel(composite, "Old Password:");
oldPassword = createPasswordText(composite);
createLabel(composite, "New Password:");
newPassword = createPasswordText(composite);
createLabel(composite, "Confirm Password:");
confirmPassword = createPasswordText(composite);
createListeners();
return composite;
}
/**
*
*/
private void createListeners() {
ModifyListener listener = new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
updateButtonStatus();
}
};
oldPassword.addModifyListener(listener);
newPassword.addModifyListener(listener);
confirmPassword.addModifyListener(listener);
}
private void updateButtonStatus() {
String oldPwd = oldPassword.getText();
String newPwd = newPassword.getText();
String confirmPwd = confirmPassword.getText();
if(oldPwd.isEmpty() || newPwd.isEmpty() || confirmPwd.isEmpty()) {
okButton.setEnabled(false);
return;
}
if(!newPwd.equals(confirmPwd)) {
okButton.setEnabled(false);
return;
}
if (confirmPwd.equals(CoreConstants.DEFAULT_PASSWORD) || isContainsWhiteSpace(confirmPwd)) {
okButton.setEnabled(false);
return;
}
if (newPwd.length() < 4 ) { // Minimum password length is 4
okButton.setEnabled(false);
return;
}
okButton.setEnabled(true);
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
okButton = createButton(parent, IDialogConstants.OK_ID, "&Change", true);
okButton.setEnabled(false);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
setupDataBinding();
}
public boolean isContainsWhiteSpace(String text) {
return text.matches(".*[\\s\\\\].*"); // White space or backslash
}
public class ConfirmPasswordValidator extends StringRequiredValidator {
public ConfirmPasswordValidator(String errorText, ControlDecoration controlDecoration, Control linkedControl) {
super(errorText, controlDecoration, linkedControl);
}
@Override
public IStatus validate(Object value) {
IStatus status = super.validate(value);
if (status.isOK()) {
String errMsg = null;
if (errMsg == null && isContainsWhiteSpace( newPassword.getText())) {
errMsg = "Password should not contain space or back slash characters";
}
if (!value.equals(newPassword.getText())) {
errMsg = "Passwords mismatched";
}
if (errMsg == null && value.equals(CoreConstants.DEFAULT_PASSWORD)) {
errMsg = "New password should not be a default password";
}
if(errMsg != null) {
controlDecoration.setDescriptionText(errMsg);
controlDecoration.show();
linkedControl.setEnabled(false);
return ValidationStatus.error(errMsg);
}
}
return status;
}
};
private void setupDataBinding() {
DataBindingContext dataBindingContext = new DataBindingContext(SWTObservables.getRealm(Display.getCurrent()));
UpdateValueStrategy passwordBindingStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE);
UpdateValueStrategy newPwdBindingStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE);
UpdateValueStrategy confirmPwdBindingStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE);
// The Validator shows error decoration and disables OK button on
// validation failure
passwordBindingStrategy.setBeforeSetValidator(new StringRequiredValidator("Please enter old password!",
guiHelper.createErrorDecoration(oldPassword), null));
dataBindingContext.bindValue(WidgetProperties.text(SWT.Modify).observe(oldPassword),
PojoProperties.value("password").observe(connectionDetails), passwordBindingStrategy,
passwordBindingStrategy);
newPwdBindingStrategy.setBeforeSetValidator(new StringRequiredValidator("Please enter new password!", guiHelper
.createErrorDecoration(newPassword), null));
dataBindingContext.bindValue(WidgetProperties.text(SWT.Modify).observe(newPassword),
PojoProperties.value("newPassword").observe(connectionDetails), newPwdBindingStrategy,
newPwdBindingStrategy);
confirmPwdBindingStrategy.setBeforeSetValidator(new ConfirmPasswordValidator("Please enter confirm password!",
guiHelper.createErrorDecoration(confirmPassword), null));
dataBindingContext.bindValue(WidgetProperties.text(SWT.Modify).observe(confirmPassword),
PojoProperties.value("confirmNewPassword").observe(connectionDetails), confirmPwdBindingStrategy,
confirmPwdBindingStrategy);
}
protected void okPressed() {
String user = connectionDetails.getUserId();
String oldPassword = connectionDetails.getPassword();
String newPassword = connectionDetails.getNewPassword();
UsersClient usersClient = new UsersClient();
try {
usersClient.changePassword(user, oldPassword, newPassword);
MessageDialog.openInformation(getShell(), "Change password", "Password changed successfully!");
this.close();
} catch (Exception e) {
MessageDialog.openError(getShell(), "Change password Failed", e.getMessage());
}
}
}