| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php |
| * |
| * 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.android.ide.eclipse.adt.internal.wizards.export; |
| |
| import com.android.ide.eclipse.adt.internal.project.ProjectHelper; |
| import com.android.ide.eclipse.adt.internal.wizards.export.ExportWizard.ExportWizardPage; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.jface.wizard.IWizardPage; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.ModifyEvent; |
| import org.eclipse.swt.events.ModifyListener; |
| import org.eclipse.swt.events.SelectionAdapter; |
| import org.eclipse.swt.events.SelectionEvent; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Button; |
| import org.eclipse.swt.widgets.Combo; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Label; |
| import org.eclipse.swt.widgets.Text; |
| |
| import java.io.FileInputStream; |
| import java.io.FileNotFoundException; |
| import java.io.IOException; |
| import java.security.KeyStore; |
| import java.security.KeyStoreException; |
| import java.security.NoSuchAlgorithmException; |
| import java.security.cert.CertificateException; |
| import java.util.ArrayList; |
| import java.util.Enumeration; |
| |
| /** |
| * Key Selection Page. This is used when an existing keystore is used. |
| */ |
| final class KeySelectionPage extends ExportWizardPage { |
| |
| private final ExportWizard mWizard; |
| private Label mKeyAliasesLabel; |
| private Combo mKeyAliases; |
| private Label mKeyPasswordLabel; |
| private Text mKeyPassword; |
| private boolean mDisableOnChange = false; |
| private Button mUseExistingKey; |
| private Button mCreateKey; |
| |
| protected KeySelectionPage(ExportWizard wizard, String pageName) { |
| super(pageName); |
| mWizard = wizard; |
| |
| setTitle("Key alias selection"); |
| setDescription(""); // TODO |
| } |
| |
| @Override |
| public void createControl(Composite parent) { |
| Composite composite = new Composite(parent, SWT.NULL); |
| composite.setLayoutData(new GridData(GridData.FILL_BOTH)); |
| GridLayout gl = new GridLayout(3, false); |
| composite.setLayout(gl); |
| |
| GridData gd; |
| |
| mUseExistingKey = new Button(composite, SWT.RADIO); |
| mUseExistingKey.setText("Use existing key"); |
| mUseExistingKey.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL)); |
| gd.horizontalSpan = 3; |
| mUseExistingKey.setSelection(true); |
| |
| new Composite(composite, SWT.NONE).setLayoutData(gd = new GridData()); |
| gd.heightHint = 0; |
| gd.widthHint = 50; |
| mKeyAliasesLabel = new Label(composite, SWT.NONE); |
| mKeyAliasesLabel.setText("Alias:"); |
| mKeyAliases = new Combo(composite, SWT.READ_ONLY); |
| mKeyAliases.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| |
| new Composite(composite, SWT.NONE).setLayoutData(gd = new GridData()); |
| gd.heightHint = 0; |
| gd.widthHint = 50; |
| mKeyPasswordLabel = new Label(composite, SWT.NONE); |
| mKeyPasswordLabel.setText("Password:"); |
| mKeyPassword = new Text(composite, SWT.BORDER | SWT.PASSWORD); |
| mKeyPassword.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); |
| |
| mCreateKey = new Button(composite, SWT.RADIO); |
| mCreateKey.setText("Create new key"); |
| mCreateKey.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL)); |
| gd.horizontalSpan = 3; |
| |
| // Show description the first time |
| setErrorMessage(null); |
| setMessage(null); |
| setControl(composite); |
| |
| mUseExistingKey.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| mWizard.setKeyCreationMode(!mUseExistingKey.getSelection()); |
| enableWidgets(); |
| onChange(); |
| } |
| }); |
| |
| mKeyAliases.addSelectionListener(new SelectionAdapter() { |
| @Override |
| public void widgetSelected(SelectionEvent e) { |
| mWizard.setKeyAlias(mKeyAliases.getItem(mKeyAliases.getSelectionIndex())); |
| onChange(); |
| } |
| }); |
| |
| mKeyPassword.addModifyListener(new ModifyListener() { |
| @Override |
| public void modifyText(ModifyEvent e) { |
| mWizard.setKeyPassword(mKeyPassword.getText()); |
| onChange(); |
| } |
| }); |
| } |
| |
| @Override |
| void onShow() { |
| // fill the texts with information loaded from the project. |
| if ((mProjectDataChanged & (DATA_PROJECT | DATA_KEYSTORE)) != 0) { |
| // disable onChange for now. we'll call it once at the end. |
| mDisableOnChange = true; |
| |
| // reset the alias from the content of the project |
| try { |
| // reset to using a key |
| mWizard.setKeyCreationMode(false); |
| mUseExistingKey.setSelection(true); |
| mCreateKey.setSelection(false); |
| enableWidgets(); |
| |
| // remove the content of the alias combo always and first, in case the |
| // keystore password is wrong |
| mKeyAliases.removeAll(); |
| |
| // get the alias list (also used as a keystore password test) |
| KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); |
| FileInputStream fis = new FileInputStream(mWizard.getKeystore()); |
| keyStore.load(fis, mWizard.getKeystorePassword().toCharArray()); |
| fis.close(); |
| |
| Enumeration<String> aliases = keyStore.aliases(); |
| |
| // get the alias from the project previous export, and look for a match as |
| // we add the aliases to the combo. |
| IProject project = mWizard.getProject(); |
| |
| String keyAlias = ProjectHelper.loadStringProperty(project, |
| ExportWizard.PROPERTY_ALIAS); |
| |
| ArrayList<String> aliasList = new ArrayList<String>(); |
| |
| int selection = -1; |
| int count = 0; |
| while (aliases.hasMoreElements()) { |
| String alias = aliases.nextElement(); |
| mKeyAliases.add(alias); |
| aliasList.add(alias); |
| if (selection == -1 && alias.equalsIgnoreCase(keyAlias)) { |
| selection = count; |
| } |
| count++; |
| } |
| |
| mWizard.setExistingAliases(aliasList); |
| |
| if (selection != -1) { |
| mKeyAliases.select(selection); |
| |
| // since a match was found and is selected, we need to give it to |
| // the wizard as well |
| mWizard.setKeyAlias(keyAlias); |
| } else { |
| mKeyAliases.clearSelection(); |
| } |
| |
| // reset the password |
| mKeyPassword.setText(""); //$NON-NLS-1$ |
| |
| // enable onChange, and call it to display errors and enable/disable pageCompleted. |
| mDisableOnChange = false; |
| onChange(); |
| } catch (KeyStoreException e) { |
| onException(e); |
| } catch (FileNotFoundException e) { |
| onException(e); |
| } catch (NoSuchAlgorithmException e) { |
| onException(e); |
| } catch (CertificateException e) { |
| onException(e); |
| } catch (IOException e) { |
| onException(e); |
| } finally { |
| // in case we exit with an exception, we need to reset this |
| mDisableOnChange = false; |
| } |
| } |
| } |
| |
| @Override |
| public IWizardPage getPreviousPage() { |
| return mWizard.getKeystoreSelectionPage(); |
| } |
| |
| @Override |
| public IWizardPage getNextPage() { |
| if (mWizard.getKeyCreationMode()) { |
| return mWizard.getKeyCreationPage(); |
| } |
| |
| return mWizard.getKeyCheckPage(); |
| } |
| |
| /** |
| * Handles changes and update the error message and calls {@link #setPageComplete(boolean)}. |
| */ |
| private void onChange() { |
| if (mDisableOnChange) { |
| return; |
| } |
| |
| setErrorMessage(null); |
| setMessage(null); |
| |
| if (mWizard.getKeyCreationMode() == false) { |
| if (mKeyAliases.getSelectionIndex() == -1) { |
| setErrorMessage("Select a key alias."); |
| setPageComplete(false); |
| return; |
| } |
| |
| if (mKeyPassword.getText().trim().length() == 0) { |
| setErrorMessage("Enter key password."); |
| setPageComplete(false); |
| return; |
| } |
| } |
| |
| setPageComplete(true); |
| } |
| |
| private void enableWidgets() { |
| boolean useKey = !mWizard.getKeyCreationMode(); |
| mKeyAliasesLabel.setEnabled(useKey); |
| mKeyAliases.setEnabled(useKey); |
| mKeyPassword.setEnabled(useKey); |
| mKeyPasswordLabel.setEnabled(useKey); |
| } |
| } |