diff options
Diffstat (limited to 'src/net/java/sip/communicator')
-rw-r--r-- | src/net/java/sip/communicator/impl/protocol/jabber/OperationSetChangePasswordJabberImpl.java | 15 | ||||
-rw-r--r-- | src/net/java/sip/communicator/plugin/jabberaccregwizz/AccountPanel.java | 323 | ||||
-rw-r--r-- | src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberAccountRegistrationForm.java | 11 | ||||
-rw-r--r-- | src/net/java/sip/communicator/plugin/securityconfig/masterpassword/MasterPasswordChangeDialog.java | 361 | ||||
-rw-r--r-- | src/net/java/sip/communicator/service/protocol/OperationSetChangePassword.java | 6 | ||||
-rw-r--r-- | src/net/java/sip/communicator/util/PasswordQualityMeter.java (renamed from src/net/java/sip/communicator/plugin/securityconfig/masterpassword/PasswordQualityMeter.java) | 2 | ||||
-rw-r--r-- | src/net/java/sip/communicator/util/UtilActivator.java | 17 | ||||
-rw-r--r-- | src/net/java/sip/communicator/util/swing/PasswordChangeDialog.java | 385 | ||||
-rw-r--r-- | src/net/java/sip/communicator/util/util.manifest.mf | 1 |
9 files changed, 587 insertions, 534 deletions
diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetChangePasswordJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetChangePasswordJabberImpl.java index 82b89d5..b187c0e 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetChangePasswordJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/OperationSetChangePasswordJabberImpl.java @@ -70,4 +70,19 @@ public class OperationSetChangePasswordJabberImpl e); } } + + /** + * Returns true if the server supports password changes. This uses smack's + * <tt>AccountManager#supportsAccountCreation</tt> method, which checks for + * XEP-0077 (inband registrations) support. + * @return True if the server supports password changes, false otherwise. + */ + public boolean supportsPasswordChange() + { + org.jivesoftware.smack.AccountManager accountManager + = new org.jivesoftware.smack.AccountManager( + protocolProvider.getConnection()); + + return accountManager.supportsAccountCreation(); + } } diff --git a/src/net/java/sip/communicator/plugin/jabberaccregwizz/AccountPanel.java b/src/net/java/sip/communicator/plugin/jabberaccregwizz/AccountPanel.java index 0bcac3a..167b0d5 100644 --- a/src/net/java/sip/communicator/plugin/jabberaccregwizz/AccountPanel.java +++ b/src/net/java/sip/communicator/plugin/jabberaccregwizz/AccountPanel.java @@ -52,7 +52,8 @@ public class AccountPanel /** * Panel to hold the "change password" button */ - private final JPanel changePasswordPanel = new TransparentPanel(); + private final JPanel changePasswordPanel + = new TransparentPanel(new BorderLayout(10,10)); /** * "Change password" button @@ -61,6 +62,11 @@ public class AccountPanel = new JButton(Resources.getString( "plugin.jabberaccregwizz.CHANGE_PASSWORD")); + /** + * A pane to show a message in the "change password" panel + */ + private final JEditorPane changePasswordMessagePane = new JEditorPane(); + private final JabberAccountRegistrationForm parentForm; private final JRadioButton existingAccountButton; @@ -139,20 +145,33 @@ public class AccountPanel } userIDPassPanel.add(southPanel, BorderLayout.SOUTH); - - this.add(mainPanel, BorderLayout.NORTH); - changePasswordButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ChangePasswordDialog changePasswordDialog - = new ChangePasswordDialog(); + changePasswordPanel.setBorder(BorderFactory.createTitledBorder( + Resources.getString( + "plugin.jabberaccregwizz.CHANGE_PASSWORD"))); + + changePasswordButton.addActionListener(new ActionListener() + { + public void actionPerformed(ActionEvent e) + { + JabberPasswordChangeDialog passwordChangeDialog + = new JabberPasswordChangeDialog(); + passwordChangeDialog.setVisible(true); } }); - changePasswordPanel.add(changePasswordButton, BorderLayout.CENTER); - //show it only if needed (when modifying an account) + + changePasswordMessagePane.setOpaque(false); + changePasswordMessagePane.setBorder(BorderFactory. + createEmptyBorder(0, 5, 10, 0)); + changePasswordMessagePane.setEditable(false); + + changePasswordPanel.add(changePasswordMessagePane, BorderLayout.NORTH); + changePasswordPanel.add(changePasswordButton, BorderLayout.SOUTH); + + //we only show that when showChangePasswordPanel is called changePasswordPanel.setVisible(false); - this.add(changePasswordPanel); - + + this.add(mainPanel, BorderLayout.NORTH); } /** * Creates a register choice panel. @@ -422,6 +441,7 @@ public class AccountPanel else { mainPanel.add(userIDPassPanel, BorderLayout.NORTH); + mainPanel.add(changePasswordPanel, BorderLayout.SOUTH); } } @@ -498,185 +518,120 @@ public class AccountPanel return registerButton; } /** - * Shows or hides the "change password" button + * Shows or hides the "change password" panel */ - public void showChangePasswordButton() - { - changePasswordPanel.setVisible(true); + public void showChangePasswordPanel(boolean show) + { + if(!show) + { + changePasswordPanel.setVisible(false); + return; + } + else + { + ProtocolProviderService protocolProvider = + parentForm.getWizard().getProtocolProvider(); + + //the button will only be enabled if our preliminary checks (the + //account is logged in the server supports inband registers) succeed + changePasswordButton.setEnabled(false); + if (protocolProvider == null) + { + //we shouldn't get here, because this dialog only shows + //when editing an existing account + logger.warn("protocolProvider is null"); + changePasswordMessagePane.setText( + "Cannot change password for this account"); + } + else if (!protocolProvider.isRegistered()) + { + changePasswordMessagePane.setText(Resources.getString( + "plugin.jabberaccregwizz.HAS_TO_BE_LOGGED_IN")); + } + else if (!protocolProvider.getOperationSet( + OperationSetChangePassword.class).supportsPasswordChange()) + { + changePasswordMessagePane.setText(Resources.getString( + "plugin.jabberaccregwizz." + + "SERVER_NOT_SUPPORT_PASSWORD_CHANGE")); + } + else + { + changePasswordMessagePane.setVisible(false); + changePasswordButton.setEnabled(true); + } + + changePasswordPanel.setVisible(true); + } } - + /** * A "change password" dialog. */ - private class ChangePasswordDialog extends SIPCommDialog + private class JabberPasswordChangeDialog extends PasswordChangeDialog { - /** - * The main panel - */ - private final JPanel mainPanel = new JPanel(new BorderLayout()); - - /** - * A pane for showing messages (info or errors) - */ - private final JEditorPane messagePane = new JEditorPane(); - - /** - * Panel for the text fields - */ - TransparentPanel valuesPanel - = new TransparentPanel(new GridLayout(0, 1)); - - /** - * The password field - */ - private final JPasswordField passField1 = new JPasswordField(); - - /** - * The confirm password field - */ - private final JPasswordField passField2 = new JPasswordField(); - - /** - * Panel for the "ok" and "cancel" buttons - */ - private final TransparentPanel buttonsPanel - = new TransparentPanel(new FlowLayout(FlowLayout.RIGHT)); /** - * The "OK" button + * Default constructor. */ - private final JButton okButton - = new JButton(Resources.getString("service.gui.OK")); - - /** - * The "cancel" button - */ - private final JButton cancelButton - = new JButton(Resources.getString("service.gui.CANCEL")); - - /** - * Panel for the labels - */ - private final TransparentPanel labelsPanel - = new TransparentPanel(new GridLayout(0, 1)); - - /** - * The "new password" label - */ - private final JLabel passLabel1 = new JLabel(Resources. - getString("plugin.jabberaccregwizz.NEW_PASSWORD")); - - /** - * The "confirm password" label - */ - private final JLabel passLabel2 = new JLabel(Resources. - getString("plugin.jabberaccregwizz.NEW_PASSWORD_CONFIRM")); - - - /** - * Creates a full dialog (sets all the fields and buttons) - */ - public ChangePasswordDialog() + public JabberPasswordChangeDialog() { - //don't save size and location super(false); - + setTitle(Resources. - getString("plugin.jabberaccregwizz.CHANGE_PASSWORD")); - - messagePane.setOpaque(false); - messagePane.setForeground(Color.RED); - messagePane.setBorder(BorderFactory.createEmptyBorder(0, 0, 15, 0)); - messagePane.setEditable(false); - mainPanel.add(messagePane, BorderLayout.NORTH); - loadMessage(Resources.getString( - "plugin.jabberaccregwizz.ENTER_NEW_PASSWORD")); - - labelsPanel.add(passLabel1); - labelsPanel.add(passLabel2); - - passField1.setColumns(15); - passField2.setColumns(15); - valuesPanel.add(passField1); - valuesPanel.add(passField2); - - okButton.addActionListener(okButtonListener); - cancelButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e){ - dispose(); - } - }); - - buttonsPanel.add(okButton); - buttonsPanel.add(cancelButton); - getRootPane().setDefaultButton(okButton); - - mainPanel.add(labelsPanel, BorderLayout.WEST); - mainPanel.add(valuesPanel, BorderLayout.CENTER); - mainPanel.add(buttonsPanel, BorderLayout.SOUTH); - - mainPanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); - getContentPane().add(mainPanel, BorderLayout.NORTH); - setModal(true); - setVisible(true); - pack(); + getString("plugin.jabberaccregwizz.CHANGE_PASSWORD")); + setInfoText(Resources. + getString("plugin.jabberaccregwizz.ENTER_NEW_PASSWORD")); + + this.getOkButton().addActionListener(okButtonListener); } /** * This is the ActionListener for the "ok" button. */ - private final ActionListener okButtonListener = new ActionListener(){ + private final ActionListener okButtonListener = new ActionListener() + { /** - * Action for the "ok" button. This contains most of the logic for - * the dialog: - * It checks the fields, whether the account is logged in, tries to - * change the password and displays messages in the message pane + * Action for the "ok" button. Checks whether the account is logged + * in, tries to change the password and displays the appropriate + * messages. */ - public void actionPerformed(ActionEvent e) { - String newPass1 = new String(passField1.getPassword()); - String newPass2 = new String(passField2.getPassword()); + public void actionPerformed(ActionEvent e) + { + String newPass = getNewPassword(); ProtocolProviderService protocolProvider = parentForm.getWizard().getProtocolProvider(); - if (protocolProvider == null) { + if (protocolProvider == null) + { //we shouldn't get here, because this dialog only shows //when editing an existing account logger.warn("protocolProvider is null in change" + " password dialog"); - loadMessage("Could not change password"); - hideCancelAndFields(); - okButton.removeActionListener(okButtonListener); - okButton.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent e) - { - dispose(); - } - }); + displayPopupError("Could not change password"); + return; } - else if (!protocolProvider.isRegistered()) { + else if (!protocolProvider.isRegistered()) + { //editing an account, which is not logged in - loadMessage(Resources.getString( + displayPopupError(Resources.getString( "plugin.jabberaccregwizz.HAS_TO_BE_LOGGED_IN")); - } - else if (!newPass1.equals(newPass2)) { - loadMessage(Resources.getString( - "plugin.jabberaccregwizz.NOT_SAME_PASSWORD")); - } - else if (newPass1.length() <= 0) { - loadMessage(Resources.getString( - "plugin.jabberaccregwizz.PASSWORD_EMPTY")); + return; } else if (protocolProvider.getTransportProtocol() - != TransportProtocol.TLS) { - //XEP-077 advices agains changing password unless + != TransportProtocol.TLS) + { + //XEP-0077 advices agains changing password unless //the underlying stream is encrypted - loadMessage(Resources.getString( + displayPopupError(Resources.getString( "plugin.jabberaccregwizz.TLS_REQUIRED")); + return; } else //try to change { - if (logger.isInfoEnabled()) { + if (logger.isInfoEnabled()) + { logger.info("Trying to change password for jabber" + " account " + protocolProvider. @@ -686,10 +641,9 @@ public class AccountPanel OperationSetChangePassword opset = protocolProvider.getOperationSet( OperationSetChangePassword.class); - try { - opset.changePassword(newPass1); - loadMessage(Resources.getString( - "plugin.jabberaccregwizz.PASSWORD_CHANGED")); + try + { + opset.changePassword(newPass); /** * If the old password was stored, update it with the @@ -705,7 +659,7 @@ public class AccountPanel + " account " + protocolProvider. getAccountID().getAccountAddress()); - storeNewPassword(newPass1); + storeNewPassword(newPass); } catch (IllegalArgumentException ex) { @@ -716,33 +670,29 @@ public class AccountPanel + " account " + protocolProvider. getAccountID().getAccountAddress(), ex); - loadMessage(Resources.getString( + displayPopupError(Resources.getString( "plugin.jabberaccregwizz." + "PASSWORD_NOT_STORED")); } - - //now update the password field in AccountPanel, - //because it still has the old pass and if the user - //completes the wizard it will store it. - passField.setText(newPass1); } + //now update the password field in AccountPanel, + //because it still has the old pass and if the user + //completes the wizard it will store it. + passField.setText(newPass); + + displayPopupInfo(Resources.getString( + "plugin.jabberaccregwizz.PASSWORD_CHANGED")); + dispose(); - hideCancelAndFields(); - okButton.removeActionListener(this); - okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - dispose(); - } - }); } catch (IllegalStateException ex) { //we already checked for this, but if the connection //has since been lost smack will throw this - loadMessage(Resources.getString( + displayPopupError(Resources.getString( "plugin.jabberaccregwizz.HAS_TO_BE_LOGGED_IN")); } catch (OperationFailedException ex) { - loadMessage(Resources.getString( + displayPopupError(Resources.getString( "plugin.jabberaccregwizz." + "SERVER_NOT_SUPPORT_PASSWORD_CHANGE")); } @@ -750,33 +700,6 @@ public class AccountPanel } }; - - /** - * Loads the given message into the message pane. - * @param message The message to load - */ - private void loadMessage(String message) - { - messagePane.setText(message); - mainPanel.revalidate(); - mainPanel.repaint(); - pack(); - } - - /** - * Leaves only the message pane and the "ok" button visible - * XXX: a more appropriate name? - */ - public void hideCancelAndFields() - { - cancelButton.setVisible(false); - passField1.setVisible(false); - passField2.setVisible(false); - passLabel1.setVisible(false); - passLabel2.setVisible(false); - pack(); - } - /** * Stores the new password in the account configuration * @param newPass The new password diff --git a/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberAccountRegistrationForm.java b/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberAccountRegistrationForm.java index 6008dc8..2407dec 100644 --- a/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberAccountRegistrationForm.java +++ b/src/net/java/sip/communicator/plugin/jabberaccregwizz/JabberAccountRegistrationForm.java @@ -369,16 +369,7 @@ public class JabberAccountRegistrationForm String serverAddress = accountProperties.get(ProtocolProviderFactory.SERVER_ADDRESS); - //The idea here is to not show the "change password" button for - //GTalk and Facebook acounts, or accounts in gmail, since we know - //they don't support inband password changes. - //This is probably a bad way to achieve it... - if ( !serverAddress.equals("gmail.com") - && !serverAddress.equals("talk.google.com") - && !serverAddress.equals("chat.facebook.com")) - { - accountPanel.showChangePasswordButton(); - } + accountPanel.showChangePasswordPanel(true); connectionPanel.setServerAddress(serverAddress); diff --git a/src/net/java/sip/communicator/plugin/securityconfig/masterpassword/MasterPasswordChangeDialog.java b/src/net/java/sip/communicator/plugin/securityconfig/masterpassword/MasterPasswordChangeDialog.java index 24ce6f7..2ec5be7 100644 --- a/src/net/java/sip/communicator/plugin/securityconfig/masterpassword/MasterPasswordChangeDialog.java +++ b/src/net/java/sip/communicator/plugin/securityconfig/masterpassword/MasterPasswordChangeDialog.java @@ -6,35 +6,24 @@ */ package net.java.sip.communicator.plugin.securityconfig.masterpassword; -import java.awt.*; import java.awt.event.*; -import javax.swing.*; -import javax.swing.text.*; - import net.java.sip.communicator.plugin.securityconfig.*; import net.java.sip.communicator.service.credentialsstorage.*; -import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.util.swing.*; -import org.jitsi.service.resources.*; - /** * UI dialog to change the master password. * * @author Dmitri Melnikov + * @author Boris Grozev */ public class MasterPasswordChangeDialog - extends SIPCommDialog + extends PasswordChangeDialog implements ActionListener, KeyListener { /** - * Serial version UID. - */ - private static final long serialVersionUID = 0L; - - /** * Callback interface. Implementing classes know how to change the master * password from the old to the new one. */ @@ -49,240 +38,69 @@ public class MasterPasswordChangeDialog */ public boolean execute(String masterPassword, String newMasterPassword); } - - /** - * Dialog instance of this class. - */ - private static MasterPasswordChangeDialog dialog; - - /** - * Password quality meter. - */ - private static PasswordQualityMeter passwordMeter = - new PasswordQualityMeter(); - - /** + + /** * Callback to execute on password change. */ private MasterPasswordExecutable callback; - + /** - * UI components. - */ - private JTextComponent 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; - - /** - * The <tt>ResourceManagementService</tt> used by this instance to access - * the localized and internationalized resources of the application. + * Dialog instance of this class. */ - private final ResourceManagementService resources - = SecurityConfigActivator.getResources(); + private static MasterPasswordChangeDialog dialog; /** * Builds the dialog. */ private MasterPasswordChangeDialog() { - super(false); - initComponents(); - - this.setTitle( - resources.getI18NString( + super(SecurityConfigActivator.getCredentialsStorageService() + .isUsingMasterPassword()); + + setTitle(resources.getI18NString( "plugin.securityconfig.masterpassword.MP_TITLE")); - this.setMinimumSize(new Dimension(450, 320)); - this.setPreferredSize(new Dimension(450, 320)); - 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 (currentPasswdField instanceof JPasswordField) - { - currentPasswdField.requestFocusInWindow(); - } - else - { - newPasswordField.requestFocusInWindow(); - } - } - - /** - * Initialises 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( - "plugin.securityconfig.masterpassword.INFO_TEXT")); - - // label fields - labelsPanel = new TransparentPanel(new GridLayout(0, 1, 8, 8)); - - 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 (!SecurityConfigActivator - .getCredentialsStorageService() - .isUsingMasterPassword()) - { - currentPasswdField = new JTextField(resources.getI18NString( - "plugin.securityconfig.masterpassword.MP_NOT_SET")); - currentPasswdField.setEnabled(false); - } - else - { - currentPasswdField = new JPasswordField(15); - ((JPasswordField) currentPasswdField) - .addActionListener(clickOkButton); - } - newPasswordField = new JPasswordField(15); - newPasswordField.addKeyListener(this); - newAgainPasswordField = new JPasswordField(15); - newAgainPasswordField.addKeyListener(this); - newPasswordField.addActionListener(clickOkButton); - newAgainPasswordField.addActionListener(clickOkButton); - - textFieldsPanel = new TransparentPanel(new GridLayout(0, 1, 8, 8)); - 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.addActionListener(this); - okButton.setEnabled(false); - cancelButton - = new JButton(resources.getI18NString("service.gui.CANCEL")); - cancelButton.setMnemonic(resources.getI18nMnemonic( - "service.gui.CANCEL")); - cancelButton.addActionListener(this); - - 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); + setInfoText(resources.getI18NString( + "plugin.securityconfig.masterpassword.INFO_TEXT")); + + getOkButton().addActionListener(this); } /** - * OK and Cancel button event handler. + * OK button event handler. * * @param e action event */ public void actionPerformed(ActionEvent e) { - JButton sourceButton = (JButton) e.getSource(); boolean close = false; - if (sourceButton.equals(okButton)) // ok button - { - CredentialsStorageService credentialsStorageService - = SecurityConfigActivator.getCredentialsStorageService(); - String oldMasterPassword = null; + CredentialsStorageService credentialsStorageService + = SecurityConfigActivator.getCredentialsStorageService(); + String oldMasterPassword = null; - if (credentialsStorageService.isUsingMasterPassword()) + if (credentialsStorageService.isUsingMasterPassword()) + { + oldMasterPassword = getCurrentPassword(); + if (oldMasterPassword.length() == 0) { - oldMasterPassword = - new String(((JPasswordField) currentPasswdField) - .getPassword()); - if (oldMasterPassword.length() == 0) - { - displayPopupError( - resources.getI18NString( - "plugin.securityconfig.masterpassword.MP_CURRENT_EMPTY")); - return; - } - boolean verified = - credentialsStorageService - .verifyMasterPassword(oldMasterPassword); - if (!verified) - { - displayPopupError( - resources.getI18NString( - "plugin.securityconfig.masterpassword.MP_VERIFICATION_FAILURE_MSG")); - return; - } + displayPopupError(resources.getI18NString( + "plugin.securityconfig.masterpassword.MP_CURRENT_EMPTY")); + return; } - // if the callback executes OK, we close the dialog - if (callback != null) + boolean verified = credentialsStorageService + .verifyMasterPassword(oldMasterPassword); + if (!verified) { - String newPassword = new String(newPasswordField.getPassword()); - close = callback.execute(oldMasterPassword, newPassword); + displayPopupError(resources.getI18NString( + "plugin.securityconfig.masterpassword.MP_VERIFICATION_FAILURE_MSG")); + return; } } - else // cancel button + // if the callback executes OK, we close the dialog + if (callback != null) { - close = true; + close = callback.execute(oldMasterPassword, getNewPassword()); } - + if (close) { dialog = null; @@ -291,91 +109,6 @@ public class MasterPasswordChangeDialog } /** - * Displays an error pop-up. - * - * @param message the message to display - */ - protected void displayPopupError(String message) - { - SecurityConfigActivator - .getUIService() - .getPopupDialog() - .showMessagePopupDialog( - message, - resources.getI18NString( - "plugin.securityconfig.masterpassword.MP_CHANGE_FAILURE"), - PopupDialog.ERROR_MESSAGE); - } - - /** - * Displays an info pop-up. - * - * @param message the message to display. - */ - protected void displayPopupInfo(String message) - { - SecurityConfigActivator - .getUIService() - .getPopupDialog() - .showMessagePopupDialog( - message, - resources.getI18NString( - "plugin.securityconfig.masterpassword.MP_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) - { - } - - /** * @return dialog instance */ public static MasterPasswordChangeDialog getInstance() @@ -384,8 +117,8 @@ public class MasterPasswordChangeDialog dialog = new MasterPasswordChangeDialog(); return dialog; } - - /** + + /** * @param callbackInstance callback instance. */ public void setCallback(MasterPasswordExecutable callbackInstance) @@ -393,22 +126,4 @@ public class MasterPasswordChangeDialog this.callback = callbackInstance; } - /** - * 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(SecurityConfigActivator.getResources() - .getImage("service.gui.icons.AUTHORIZATION_ICON")); - - wrapIconPanel.add(iconLabel, BorderLayout.NORTH); - - return wrapIconPanel; - } } diff --git a/src/net/java/sip/communicator/service/protocol/OperationSetChangePassword.java b/src/net/java/sip/communicator/service/protocol/OperationSetChangePassword.java index 0efda6a..bcbf229 100644 --- a/src/net/java/sip/communicator/service/protocol/OperationSetChangePassword.java +++ b/src/net/java/sip/communicator/service/protocol/OperationSetChangePassword.java @@ -23,4 +23,10 @@ public interface OperationSetChangePassword */ public void changePassword(String newPass) throws IllegalStateException, OperationFailedException; + + /** + * Whether password changes are supported. + * @return True if the server supports password change, false otherwise. + */ + public boolean supportsPasswordChange(); } diff --git a/src/net/java/sip/communicator/plugin/securityconfig/masterpassword/PasswordQualityMeter.java b/src/net/java/sip/communicator/util/PasswordQualityMeter.java index 545e2d5..5a51723 100644 --- a/src/net/java/sip/communicator/plugin/securityconfig/masterpassword/PasswordQualityMeter.java +++ b/src/net/java/sip/communicator/util/PasswordQualityMeter.java @@ -4,7 +4,7 @@ * Distributable under LGPL license. * See terms of license at gnu.org. */ -package net.java.sip.communicator.plugin.securityconfig.masterpassword; +package net.java.sip.communicator.util; import java.util.regex.*; diff --git a/src/net/java/sip/communicator/util/UtilActivator.java b/src/net/java/sip/communicator/util/UtilActivator.java index 61f1827..ae769ca 100644 --- a/src/net/java/sip/communicator/util/UtilActivator.java +++ b/src/net/java/sip/communicator/util/UtilActivator.java @@ -12,6 +12,7 @@ import java.net.*; import javax.imageio.*; import net.java.sip.communicator.service.browserlauncher.*; +import net.java.sip.communicator.service.gui.*; import net.java.sip.communicator.service.keybindings.*; import net.java.sip.communicator.service.netaddr.*; import net.java.sip.communicator.service.resources.*; @@ -46,6 +47,8 @@ public class UtilActivator private static ResourceManagementService resourceService; private static BrowserLauncherService browserLauncherService; + + private static UIService uiService; private static BundleContext bundleContext; @@ -219,4 +222,18 @@ public class UtilActivator return image; } + + /** + * Gets the <tt>UIService</tt> instance registered in the + * <tt>BundleContext</tt> of the <tt>UtilActivator</tt>. + * + * @return the <tt>UIService</tt> instance registered in the + * <tt>BundleContext</tt> of the <tt>UtilActivator</tt> + */ + public static UIService getUIService() + { + if (uiService == null) + uiService = ServiceUtils.getService(bundleContext, UIService.class); + return uiService; + } } diff --git a/src/net/java/sip/communicator/util/swing/PasswordChangeDialog.java b/src/net/java/sip/communicator/util/swing/PasswordChangeDialog.java new file mode 100644 index 0000000..b80a953 --- /dev/null +++ b/src/net/java/sip/communicator/util/swing/PasswordChangeDialog.java @@ -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); + } + +} diff --git a/src/net/java/sip/communicator/util/util.manifest.mf b/src/net/java/sip/communicator/util/util.manifest.mf index b2804a5..0508286 100644 --- a/src/net/java/sip/communicator/util/util.manifest.mf +++ b/src/net/java/sip/communicator/util/util.manifest.mf @@ -28,6 +28,7 @@ Import-Package: com.sun.awt, javax.xml.transform.stream, net.java.sip.communicator.util, net.java.sip.communicator.util.dns, + net.java.sip.communicator.service.gui, net.java.sip.communicator.service.resources, net.java.sip.communicator.service.keybindings, net.java.sip.communicator.service.netaddr, |