package com.intellij.ide.passwordSafe.config; import com.intellij.ide.passwordSafe.PasswordSafe; import com.intellij.ide.passwordSafe.impl.PasswordSafeImpl; import com.intellij.ide.passwordSafe.impl.providers.masterKey.ChangeMasterKeyDialog; import com.intellij.ide.passwordSafe.impl.providers.masterKey.ResetPasswordDialog; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * The option panel for password safe */ public class PasswordSafeOptionsPanel { /** * The password storage policy option */ private JRadioButton myDoNotRememberPasswordsRadioButton; /** * The password storage policy option */ private JRadioButton myRememberPasswordsUntilClosingRadioButton; /** * The password storage policy option */ private JRadioButton myRememberOnDiskProtectedRadioButton; /** * The change password button */ private JButton myChangeMasterPasswordButton; /** * The reset password button */ private JButton myResetMasterPasswordButton; /** * The root panel */ private JPanel myRoot; /** * The constructor * * @param passwordSafe the password safe service instance */ public PasswordSafeOptionsPanel(PasswordSafe passwordSafe) { final PasswordSafeImpl ps = (PasswordSafeImpl)passwordSafe; final ChangeListener listener = new ChangeListener() { public void stateChanged(ChangeEvent e) { boolean isDisk = myRememberOnDiskProtectedRadioButton.isSelected(); myChangeMasterPasswordButton.setEnabled(isDisk && !isMasterKeyEmpty(ps)); myResetMasterPasswordButton.setEnabled(isDisk); } }; myRememberOnDiskProtectedRadioButton.addChangeListener(listener); listener.stateChanged(null); myChangeMasterPasswordButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (!isMasterKeyEmpty(ps)) { ChangeMasterKeyDialog.changePassword(null, ps.getMasterKeyProvider()); listener.stateChanged(null); } } }); myResetMasterPasswordButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (isMasterKeyEmpty(ps)) { ResetPasswordDialog.newPassword(null, ps.getMasterKeyProvider()); } else { ResetPasswordDialog.resetPassword(null, ps.getMasterKeyProvider()); } listener.stateChanged(null); } }); } /** * Check if master key provider is empty * * @param ps the password safe component * @return true if the provider is empty */ private static boolean isMasterKeyEmpty(PasswordSafeImpl ps) { return ps.getMasterKeyProvider().isEmpty(); } /** * Load component state from settings * * @param settings the settings to use */ public void load(PasswordSafeSettings settings) { PasswordSafeSettings.ProviderType t = settings.getProviderType(); switch (t) { case DO_NOT_STORE: myDoNotRememberPasswordsRadioButton.setSelected(true); break; case MEMORY_ONLY: myRememberPasswordsUntilClosingRadioButton.setSelected(true); break; case MASTER_PASSWORD: myRememberOnDiskProtectedRadioButton.setSelected(true); break; default: throw new IllegalStateException("Unknown provider type: " + t); } } /** * @return the provider type */ private PasswordSafeSettings.ProviderType getProviderType() { if (myDoNotRememberPasswordsRadioButton.isSelected()) { return PasswordSafeSettings.ProviderType.DO_NOT_STORE; } if (myRememberPasswordsUntilClosingRadioButton.isSelected()) { return PasswordSafeSettings.ProviderType.MEMORY_ONLY; } return PasswordSafeSettings.ProviderType.MASTER_PASSWORD; } /** * Check if the option panel modified the settings * * @param settings the settings to compare with * @return true, if values were modified */ public boolean isModified(PasswordSafeSettings settings) { return getProviderType() != settings.getProviderType(); } /** * Save UI state to the settings * * @param settings the settings to use */ public void save(PasswordSafeSettings settings) { settings.setProviderType(getProviderType()); } /** * @return the root panel */ public JComponent getRoot() { return myRoot; } }