package com.intellij.lang.javascript.flex.actions.airpackage; import com.intellij.lang.javascript.flex.FlexBundle; import com.intellij.lang.javascript.flex.projectStructure.model.AirSigningOptions; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.ValidationInfo; import com.intellij.openapi.util.Trinity; import com.intellij.openapi.util.io.FileUtil; import com.intellij.util.PathUtil; import com.intellij.util.ui.JBUI; import javax.swing.*; import java.awt.*; import java.util.ArrayList; import java.util.Collection; public class KeystorePasswordDialog extends DialogWrapper { private JPanel myMainPanel; private JCheckBox myRememberPasswordsCheckBox; private final Project myProject; private final Collection<Trinity<AirSigningOptions, JPasswordField, JPasswordField>> myKeystoresAndPasswordFields; private JComponent myPreferredFocusedComponent; public KeystorePasswordDialog(final Project project, final Collection<AirSigningOptions> signingOptionsWithUnknownPasswords) { super(project); myProject = project; myKeystoresAndPasswordFields = createPasswordFields(signingOptionsWithUnknownPasswords); setTitle(FlexBundle.message("package.air.application.title")); init(); myRememberPasswordsCheckBox.setSelected(PasswordStore.getInstance(project).isRememberPasswords()); } private Collection<Trinity<AirSigningOptions, JPasswordField, JPasswordField>> createPasswordFields(final Collection<AirSigningOptions> signingOptionsWithUnknownPasswords) { final Collection<Trinity<AirSigningOptions, JPasswordField, JPasswordField>> result = new ArrayList<>(); final JPanel panel = new JPanel(new GridBagLayout()); myMainPanel.add(panel, BorderLayout.CENTER); int row = 0; for (AirSigningOptions signingOptions : signingOptionsWithUnknownPasswords) { if (row > 0) { panel.add(new JSeparator(SwingConstants.HORIZONTAL), new GridBagConstraints(0, row, 2, 1, 0., 0., GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, JBUI.insets(5, 0), 0, 0)); row++; } panel.add(new JLabel("Keystore file:"), new GridBagConstraints(0, row, 1, 1, 0., 0., GridBagConstraints.WEST, GridBagConstraints.NONE, JBUI.insets(2, 0), 0, 0)); panel.add(new JLabel(FileUtil.toSystemDependentName(signingOptions.getKeystorePath())), new GridBagConstraints(1, row, 1, 1, 0., 0., GridBagConstraints.WEST, GridBagConstraints.NONE, JBUI.insets(2, 0), 0, 0)); row++; panel.add(new JLabel("Keystore password:"), new GridBagConstraints(0, row, 1, 1, 0., 0., GridBagConstraints.WEST, GridBagConstraints.NONE, JBUI.insets(2, 0), 0, 0)); final JPasswordField keystorePasswordField = new JPasswordField(); panel.add(keystorePasswordField, new GridBagConstraints(1, row, 1, 1, 0., 0., GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, JBUI.insets(2, 0), 0, 0)); if (row == 1) { myPreferredFocusedComponent = keystorePasswordField; } row++; if (signingOptions.getKeyAlias().isEmpty()) { result.add(Trinity.create(signingOptions, keystorePasswordField, (JPasswordField)null)); } else { panel.add(new JLabel("Key alias:"), new GridBagConstraints(0, row, 1, 1, 0., 0., GridBagConstraints.WEST, GridBagConstraints.NONE, JBUI.insets(2, 0), 0, 0)); panel.add(new JLabel(signingOptions.getKeyAlias()), new GridBagConstraints(1, row, 1, 1, 0., 0., GridBagConstraints.WEST, GridBagConstraints.NONE, JBUI.insets(2, 0), 0, 0)); row++; panel.add(new JLabel("Key password:"), new GridBagConstraints(0, row, 1, 1, 0., 0., GridBagConstraints.WEST, GridBagConstraints.NONE, JBUI.insets(2, 0), 0, 0)); final JPasswordField keyPasswordField = new JPasswordField(); panel.add(keyPasswordField, new GridBagConstraints(1, row, 1, 1, 0., 0., GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, JBUI.insets(2, 0), 0, 0)); row++; result.add(Trinity.create(signingOptions, keystorePasswordField, keyPasswordField)); } } return result; } protected JComponent createCenterPanel() { return myMainPanel; } public JComponent getPreferredFocusedComponent() { return myPreferredFocusedComponent; } protected ValidationInfo doValidate() { for (Trinity<AirSigningOptions, JPasswordField, JPasswordField> entry : myKeystoresAndPasswordFields) { final AirSigningOptions signingOptions = entry.first; final JPasswordField keystorePasswordField = entry.second; final String keystorePassword = new String(keystorePasswordField.getPassword()); final JPasswordField keyPasswordField = entry.third; final String keyPassword = keyPasswordField == null ? "" : new String(keyPasswordField.getPassword()); try { PasswordStore.checkPassword(signingOptions, keystorePassword, keyPassword); } catch (PasswordStore.SigningOptionsException e) { final JPasswordField errorField = e.wrongKeyPassword ? keyPasswordField : e.wrongKeystorePassword ? keystorePasswordField : null; final String message = errorField == null ? PathUtil.getFileName(signingOptions.getKeystorePath()) + ": " + e.getMessage() : e.getMessage(); return new ValidationInfo(message, errorField); } } return null; } protected void doOKAction() { storePasswords(); super.doOKAction(); } private void storePasswords() { final boolean rememberPasswords = myRememberPasswordsCheckBox.isSelected(); final PasswordStore passwordStore = PasswordStore.getInstance(myProject); passwordStore.setRememberPasswords(rememberPasswords); if (rememberPasswords) { storePasswords(passwordStore); } else { passwordStore.clearPasswords(); } } private void storePasswords(final PasswordStore passwordStore) { for (Trinity<AirSigningOptions, JPasswordField, JPasswordField> entry : myKeystoresAndPasswordFields) { final AirSigningOptions signingOptions = entry.first; final String keystorePassword = new String(entry.second.getPassword()); final JPasswordField keyPasswordField = entry.third; passwordStore.storeKeystorePassword(signingOptions.getKeystorePath(), keystorePassword); if (keyPasswordField != null) { final String keyPassword = new String(keyPasswordField.getPassword()); passwordStore.storeKeyPassword(signingOptions.getKeystorePath(), signingOptions.getKeyAlias(), keyPassword); } } } public PasswordStore getPasswords() { assert isOK() : "ask for passwords only after OK in dialog"; final PasswordStore passwordStore = PasswordStore.getInstance(myProject); if (passwordStore.isRememberPasswords()) return passwordStore; final PasswordStore temporaryStore = new PasswordStore(); storePasswords(temporaryStore); return temporaryStore; } }