mirror of https://github.com/sipwise/jitsi.git
Applies a patch from Boris Grozev that Adds a password strength meter to XMPP password changes and improves the feature in other ways.
parent
8ecc482d92
commit
e2c6718d5b
@ -0,0 +1,385 @@
|
||||
/*
|
||||
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
|
||||
*
|
||||
* Distributable under LGPL license.
|
||||
* See terms of license at gnu.org.
|
||||
*/
|
||||
package net.java.sip.communicator.util.swing;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.*;
|
||||
|
||||
import javax.swing.*;
|
||||
|
||||
import net.java.sip.communicator.service.gui.*;
|
||||
import net.java.sip.communicator.util.*;
|
||||
|
||||
import org.jitsi.service.resources.*;
|
||||
|
||||
/**
|
||||
* UI dialog to change the master password.
|
||||
*
|
||||
* @author Dmitri Melnikov
|
||||
* @author Boris Grozev
|
||||
*/
|
||||
public class PasswordChangeDialog
|
||||
extends SIPCommDialog
|
||||
implements KeyListener
|
||||
{
|
||||
/**
|
||||
* Serial version UID.
|
||||
*/
|
||||
private static final long serialVersionUID = 0L;
|
||||
|
||||
/**
|
||||
* The <tt>ResourceManagementService</tt> used by this instance to access
|
||||
* the localized and internationalized resources of the application.
|
||||
*/
|
||||
protected final ResourceManagementService resources
|
||||
= UtilActivator.getResources();
|
||||
|
||||
/**
|
||||
* Password quality meter.
|
||||
*/
|
||||
private PasswordQualityMeter passwordMeter =
|
||||
new PasswordQualityMeter();
|
||||
|
||||
/**
|
||||
* Whether to show a current password field or not
|
||||
*/
|
||||
private boolean showCurrentPassword = false;
|
||||
|
||||
/**
|
||||
* UI components.
|
||||
*/
|
||||
private JPasswordField currentPasswdField;
|
||||
private JPasswordField newPasswordField;
|
||||
private JPasswordField newAgainPasswordField;
|
||||
private JButton okButton;
|
||||
private JButton cancelButton;
|
||||
private JTextArea infoTextArea;
|
||||
private JProgressBar passwordQualityBar;
|
||||
private JPanel textFieldsPanel;
|
||||
private JPanel labelsPanel;
|
||||
private JPanel buttonsPanel;
|
||||
private JPanel qualityPanel;
|
||||
private JPanel dataPanel;
|
||||
|
||||
/**
|
||||
* Builds the dialog, no current password
|
||||
*/
|
||||
public PasswordChangeDialog()
|
||||
{
|
||||
this(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the dialog.
|
||||
*
|
||||
* @param showCurrentPassword Whether to show a "current password" field
|
||||
*/
|
||||
public PasswordChangeDialog(boolean showCurrentPassword)
|
||||
{
|
||||
super(false);
|
||||
|
||||
this.showCurrentPassword = showCurrentPassword;
|
||||
|
||||
initComponents();
|
||||
|
||||
this.setTitle(resources
|
||||
.getI18NString("service.gui.CHANGE_PASSWORD"));
|
||||
this.setResizable(false);
|
||||
|
||||
JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
|
||||
mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
|
||||
|
||||
mainPanel.add(createIconComponent(), BorderLayout.WEST);
|
||||
mainPanel.add(dataPanel);
|
||||
|
||||
this.getContentPane().add(mainPanel);
|
||||
|
||||
this.pack();
|
||||
Toolkit toolkit = Toolkit.getDefaultToolkit();
|
||||
Dimension screenSize = toolkit.getScreenSize();
|
||||
|
||||
int x = (screenSize.width - this.getWidth()) / 2;
|
||||
int y = (screenSize.height - this.getHeight()) / 2;
|
||||
|
||||
this.setLocation(x, y);
|
||||
|
||||
if (showCurrentPassword)
|
||||
{
|
||||
currentPasswdField.requestFocusInWindow();
|
||||
}
|
||||
else
|
||||
{
|
||||
newPasswordField.requestFocusInWindow();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the UI components.
|
||||
*/
|
||||
private void initComponents()
|
||||
{
|
||||
dataPanel = new TransparentPanel(new BorderLayout(10, 10));
|
||||
dataPanel.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 8));
|
||||
|
||||
// info text
|
||||
infoTextArea = new JTextArea();
|
||||
infoTextArea.setEditable(false);
|
||||
infoTextArea.setOpaque(false);
|
||||
infoTextArea.setLineWrap(true);
|
||||
infoTextArea.setWrapStyleWord(true);
|
||||
infoTextArea.setFont(infoTextArea.getFont().deriveFont(Font.BOLD));
|
||||
infoTextArea.setText(resources
|
||||
.getI18NString("service.gui.CHANGE_PASSWORD"));
|
||||
|
||||
// label fields
|
||||
labelsPanel = new TransparentPanel(new GridLayout(0, 1, 8, 8));
|
||||
|
||||
if(showCurrentPassword)
|
||||
{
|
||||
labelsPanel.add(new JLabel(resources.getI18NString(
|
||||
"plugin.securityconfig.masterpassword.CURRENT_PASSWORD")));
|
||||
}
|
||||
labelsPanel.add(new JLabel(resources.getI18NString(
|
||||
"plugin.securityconfig.masterpassword.ENTER_PASSWORD")));
|
||||
labelsPanel.add(new JLabel(resources.getI18NString(
|
||||
"plugin.securityconfig.masterpassword.REENTER_PASSWORD")));
|
||||
|
||||
// password fields
|
||||
ActionListener clickOkButton = new ActionListener()
|
||||
{
|
||||
public void actionPerformed(ActionEvent e)
|
||||
{
|
||||
if (okButton.isEnabled())
|
||||
okButton.doClick();
|
||||
}
|
||||
};
|
||||
|
||||
if(showCurrentPassword)
|
||||
{
|
||||
currentPasswdField = new JPasswordField(15);
|
||||
currentPasswdField.addActionListener(clickOkButton);
|
||||
}
|
||||
newPasswordField = new JPasswordField(15);
|
||||
newPasswordField.addKeyListener(this);
|
||||
newPasswordField.addActionListener(clickOkButton);
|
||||
newAgainPasswordField = new JPasswordField(15);
|
||||
newAgainPasswordField.addKeyListener(this);
|
||||
newAgainPasswordField.addActionListener(clickOkButton);
|
||||
|
||||
textFieldsPanel = new TransparentPanel(new GridLayout(0, 1, 8, 8));
|
||||
if(showCurrentPassword)
|
||||
{
|
||||
textFieldsPanel.add(currentPasswdField);
|
||||
}
|
||||
textFieldsPanel.add(newPasswordField);
|
||||
textFieldsPanel.add(newAgainPasswordField);
|
||||
|
||||
// OK and cancel buttons
|
||||
okButton = new JButton(resources.getI18NString("service.gui.OK"));
|
||||
okButton.setMnemonic(resources.getI18nMnemonic("service.gui.OK"));
|
||||
okButton.setEnabled(false);
|
||||
cancelButton
|
||||
= new JButton(resources.getI18NString("service.gui.CANCEL"));
|
||||
cancelButton.setMnemonic(resources.getI18nMnemonic(
|
||||
"service.gui.CANCEL"));
|
||||
cancelButton.addActionListener(new ActionListener()
|
||||
{
|
||||
public void actionPerformed(ActionEvent e)
|
||||
{
|
||||
dispose();
|
||||
}
|
||||
});
|
||||
|
||||
passwordQualityBar =
|
||||
new JProgressBar(0, PasswordQualityMeter.TOTAL_POINTS);
|
||||
passwordQualityBar.setValue(0);
|
||||
|
||||
qualityPanel = new TransparentPanel();
|
||||
qualityPanel.setLayout(new BoxLayout(qualityPanel, BoxLayout.Y_AXIS));
|
||||
|
||||
JLabel qualityMeterLabel = new JLabel(resources.getI18NString(
|
||||
"plugin.securityconfig.masterpassword.PASSWORD_QUALITY_METER"));
|
||||
qualityMeterLabel.setAlignmentX(CENTER_ALIGNMENT);
|
||||
|
||||
qualityPanel.add(qualityMeterLabel);
|
||||
qualityPanel.add(passwordQualityBar);
|
||||
qualityPanel.add(Box.createVerticalStrut(15));
|
||||
|
||||
buttonsPanel = new TransparentPanel(
|
||||
new FlowLayout(FlowLayout.RIGHT, 0, 5));
|
||||
buttonsPanel.add(okButton);
|
||||
buttonsPanel.add(cancelButton);
|
||||
qualityPanel.add(buttonsPanel);
|
||||
|
||||
dataPanel.add(infoTextArea, BorderLayout.NORTH);
|
||||
dataPanel.add(labelsPanel, BorderLayout.WEST);
|
||||
dataPanel.add(textFieldsPanel, BorderLayout.CENTER);
|
||||
dataPanel.add(qualityPanel, BorderLayout.SOUTH);
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays an error pop-up.
|
||||
*
|
||||
* @param message the message to display
|
||||
*/
|
||||
protected void displayPopupError(String message)
|
||||
{
|
||||
UtilActivator
|
||||
.getUIService()
|
||||
.getPopupDialog()
|
||||
.showMessagePopupDialog(
|
||||
message,
|
||||
resources.getI18NString(
|
||||
"service.gui.PASSWORD_CHANGE_FAILURE"),
|
||||
PopupDialog.ERROR_MESSAGE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays an info pop-up.
|
||||
*
|
||||
* @param message the message to display.
|
||||
*/
|
||||
protected void displayPopupInfo(String message)
|
||||
{
|
||||
UtilActivator
|
||||
.getUIService()
|
||||
.getPopupDialog()
|
||||
.showMessagePopupDialog(
|
||||
message,
|
||||
resources.getI18NString(
|
||||
"service.gui.PASSWORD_CHANGE_SUCCESS"),
|
||||
PopupDialog.INFORMATION_MESSAGE);
|
||||
}
|
||||
|
||||
protected void close(boolean isEscaped)
|
||||
{
|
||||
cancelButton.doClick();
|
||||
}
|
||||
|
||||
/**
|
||||
* When a key is pressed we do 2 things. The first is to compare the two
|
||||
* password input fields and enable OK button if they are equal. The second
|
||||
* is to measure the password quality of the password from the first input
|
||||
* field.
|
||||
*
|
||||
* @param event key event
|
||||
*/
|
||||
public void keyReleased(KeyEvent event)
|
||||
{
|
||||
JPasswordField source = (JPasswordField) event.getSource();
|
||||
if (newPasswordField.equals(source)
|
||||
|| newAgainPasswordField.equals(source))
|
||||
{
|
||||
String password1 = new String(newPasswordField.getPassword());
|
||||
String password2 = new String(newAgainPasswordField.getPassword());
|
||||
// measure password quality
|
||||
passwordQualityBar
|
||||
.setValue(passwordMeter.assessPassword(password1));
|
||||
// enable OK button if passwords are equal
|
||||
boolean eq = (password1.length() != 0)
|
||||
&& password1.equals(password2);
|
||||
okButton.setEnabled(eq);
|
||||
password1 = null;
|
||||
password2 = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Not overriding.
|
||||
*
|
||||
* @param arg0 key event
|
||||
*/
|
||||
public void keyPressed(KeyEvent arg0)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Not overriding.
|
||||
*
|
||||
* @param arg0 key event
|
||||
*/
|
||||
public void keyTyped(KeyEvent arg0)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the icon component to show on the left of this dialog.
|
||||
*
|
||||
* @return the created component
|
||||
*/
|
||||
private static Component createIconComponent()
|
||||
{
|
||||
JPanel wrapIconPanel = new JPanel(new BorderLayout());
|
||||
|
||||
JLabel iconLabel = new JLabel();
|
||||
|
||||
iconLabel.setIcon(UtilActivator.getResources()
|
||||
.getImage("service.gui.icons.AUTHORIZATION_ICON"));
|
||||
|
||||
wrapIconPanel.add(iconLabel, BorderLayout.NORTH);
|
||||
|
||||
return wrapIconPanel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a reference to the "ok" button.
|
||||
*
|
||||
* @return a reference to the "ok" button.
|
||||
*/
|
||||
protected JButton getOkButton()
|
||||
{
|
||||
return okButton;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a reference to the "cancel" button.
|
||||
*
|
||||
* @return a reference to the "cancel" button.
|
||||
*/
|
||||
protected JButton getCancelButton()
|
||||
{
|
||||
return cancelButton;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the string entered in the password field.
|
||||
*
|
||||
* @return the string entered in the password field.
|
||||
*/
|
||||
protected String getNewPassword()
|
||||
{
|
||||
return new String(newPasswordField.getPassword());
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the string entered in the "current password" field, or null if
|
||||
* that field is not shown.
|
||||
*
|
||||
* @return the string entered in the "current password" field.
|
||||
*/
|
||||
protected String getCurrentPassword()
|
||||
{
|
||||
if(currentPasswdField == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
return new String(currentPasswdField.getPassword());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the descriptional text that is displayed
|
||||
* @param infoText the new text to display.
|
||||
*/
|
||||
protected void setInfoText(String infoText)
|
||||
{
|
||||
infoTextArea.setText(infoText);
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in new issue