/*
* Copyright 2000-2010 JetBrains s.r.o.
*
* 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 com.intellij.ide.passwordSafe.impl.providers.masterKey;
import com.intellij.ide.passwordSafe.HelpID;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.util.Processor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* This dialog is used to change master password
*/
public class ChangeMasterKeyDialog extends DialogWrapper {
/**
* The old password
*/
private JPasswordField myOldPasswordPasswordField;
/**
* The new password
*/
private JPasswordField myNewPasswordPasswordField;
/**
* The field used to confirm new password
*/
private JPasswordField myConfirmNewPasswordPasswordField;
/**
* The root panel
*/
private JPanel myPanel;
/**
* Encrypt master password with user credentials
*/
private JCheckBox myEncryptMasterPasswordWithCheckBox;
/**
* The constant for reset password action
*/
private static final int RESET_PASSWORD_CODE = NEXT_USER_EXIT_CODE;
/**
* Change master password
*
* @param project the project to use for this dialog
* @param safe the master safe to modify
* @param passwordEncrypted if the password was encrypted in the database
* @param error if not null, show as error
*/
protected ChangeMasterKeyDialog(@Nullable Project project, MasterKeyPasswordSafe safe, boolean passwordEncrypted, String error) {
super(project, true);
setTitle("Change Master Password");
setOKButtonText("Change Password");
if (!safe.isOsProtectedPasswordSupported()) {
myEncryptMasterPasswordWithCheckBox.setSelected(false);
myEncryptMasterPasswordWithCheckBox.setVisible(false);
}
else {
myEncryptMasterPasswordWithCheckBox.setSelected(passwordEncrypted);
}
MasterKeyUtils.matchPasswords(myConfirmNewPasswordPasswordField, myNewPasswordPasswordField, new Processor<String>() {
public boolean process(String s) {
setErrorText(s);
setOKActionEnabled(s == null);
return false;
}
});
setErrorText(error);
init();
}
/**
* {@inheritDoc}
*/
@Override
protected String getHelpId() {
return HelpID.CHANGE_PASSWORD;
}
/**
* {@inheritDoc}
*/
@NotNull
@Override
protected Action[] createActions() {
List<Action> baseActions = new ArrayList<Action>();
Collections.addAll(baseActions, super.createActions());
int okIndex = baseActions.indexOf(getOKAction());
baseActions.add(okIndex, new DialogWrapperExitAction("Reset Password", RESET_PASSWORD_CODE));
return baseActions.toArray(new Action[baseActions.size()]);
}
/**
* {@inheritDoc}
*/
@Override
protected String getDimensionServiceKey() {
return getClass().getName();
}
/**
* {@inheritDoc}
*/
@Override
protected JComponent createCenterPanel() {
return myPanel;
}
/**
* This method is called to show a dialog that allows changing a master password.
* The method should be called from the event dispatch thread.
*
* @param project the context project
* @param safe the password safe provider
* @return true, if the password was changed or reset
*/
public static boolean changePassword(@Nullable Project project, MasterKeyPasswordSafe safe) {
String error = null;
boolean encrypt = safe.isPasswordEncrypted();
while (true) {
ChangeMasterKeyDialog d = new ChangeMasterKeyDialog(project, safe, encrypt, error);
d.show();
encrypt = d.myEncryptMasterPasswordWithCheckBox.isSelected();
switch (d.getExitCode()) {
case OK_EXIT_CODE:
String o = new String(d.myOldPasswordPasswordField.getPassword());
String n = new String(d.myNewPasswordPasswordField.getPassword());
if (safe.changeMasterPassword(o, n, encrypt)) {
return true;
}
else {
error = "Invalid old password was specified, please retry";
}
break;
case CANCEL_EXIT_CODE:
return false;
case RESET_PASSWORD_CODE:
return ResetPasswordDialog.resetPassword(project, safe);
}
}
}
}