package org.jetbrains.android.util; import com.intellij.CommonBundle; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.android.compiler.artifact.ApkSigningSettingsForm; import org.jetbrains.android.compiler.artifact.ChooseKeyDialog; import org.jetbrains.android.compiler.artifact.NewKeyStoreDialog; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.util.List; /** * @author Eugene.Kudelevsky */ public class AndroidUiUtil { private static final Logger LOG = Logger.getInstance("org.jetbrains.android.util.AndroidUiUtil"); private AndroidUiUtil() { } @Nullable private static List<String> loadExistingKeys(@NotNull ApkSigningSettingsForm form) { final String errorPrefix = "Cannot load key store: "; InputStream is = null; try { //noinspection IOResourceOpenedButNotSafelyClosed is = new FileInputStream(new File(form.getKeyStorePathField().getText().trim())); final KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(is, form.getKeyStorePasswordField().getPassword()); return AndroidUtils.toList(keyStore.aliases()); } catch (KeyStoreException e) { Messages.showErrorDialog(form.getPanel(), errorPrefix + e.getMessage(), CommonBundle.getErrorTitle()); return null; } catch (FileNotFoundException e) { Messages.showErrorDialog(form.getPanel(), errorPrefix + e.getMessage(), CommonBundle.getErrorTitle()); return null; } catch (CertificateException e) { Messages.showErrorDialog(form.getPanel(), errorPrefix + e.getMessage(), CommonBundle.getErrorTitle()); return null; } catch (NoSuchAlgorithmException e) { Messages.showErrorDialog(form.getPanel(), errorPrefix + e.getMessage(), CommonBundle.getErrorTitle()); return null; } catch (IOException e) { Messages.showErrorDialog(form.getPanel(), errorPrefix + e.getMessage(), CommonBundle.getErrorTitle()); return null; } finally { if (is != null) { try { is.close(); } catch (IOException e) { LOG.info(e); } } } } public static void initSigningSettingsForm(@NotNull final Project project, @NotNull final ApkSigningSettingsForm form) { form.getLoadKeyStoreButton().addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final String defaultPath = form.getKeyStorePathField().getText().trim(); final VirtualFile defaultFile = LocalFileSystem.getInstance().findFileByPath(defaultPath); final FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileNoJarsDescriptor(); final VirtualFile file = FileChooser.chooseFile(descriptor, form.getPanel(), project, defaultFile); if (file != null) { form.getKeyStorePathField().setText(FileUtil.toSystemDependentName(file.getPath())); } } }); form.getCreateKeyStoreButton().addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final NewKeyStoreDialog dialog = new NewKeyStoreDialog(project, form.getKeyStorePathField().getText()); dialog.show(); if (dialog.getExitCode() == DialogWrapper.OK_EXIT_CODE) { form.getKeyStorePathField().setText(dialog.getKeyStorePath()); form.getKeyStorePasswordField().setText(String.valueOf(dialog.getKeyStorePassword())); form.getKeyAliasField().setText(dialog.getKeyAlias()); form.getKeyPasswordField().setText(String.valueOf(dialog.getKeyPassword())); } } }); form.getKeyAliasField().getButton().addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final List<String> keys = loadExistingKeys(form); if (keys == null) { return; } final ChooseKeyDialog dialog = new ChooseKeyDialog(project, form.getKeyStorePathField().getText().trim(), form.getKeyStorePasswordField().getPassword(), keys, form.getKeyAliasField().getText().trim()); dialog.show(); if (dialog.getExitCode() == DialogWrapper.OK_EXIT_CODE) { final String chosenKey = dialog.getChosenKey(); if (chosenKey != null) { form.getKeyAliasField().setText(chosenKey); } final char[] password = dialog.getChosenKeyPassword(); if (password != null) { form.getKeyPasswordField().setText(String.valueOf(password)); } } } }); } }