summaryrefslogtreecommitdiff
path: root/src/plugins/certmanager/src/com/motorolamobility/studio/android/certmanager/ui/wizards/SignExternalPackagePage.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/certmanager/src/com/motorolamobility/studio/android/certmanager/ui/wizards/SignExternalPackagePage.java')
-rw-r--r--src/plugins/certmanager/src/com/motorolamobility/studio/android/certmanager/ui/wizards/SignExternalPackagePage.java559
1 files changed, 559 insertions, 0 deletions
diff --git a/src/plugins/certmanager/src/com/motorolamobility/studio/android/certmanager/ui/wizards/SignExternalPackagePage.java b/src/plugins/certmanager/src/com/motorolamobility/studio/android/certmanager/ui/wizards/SignExternalPackagePage.java
new file mode 100644
index 0000000..75898eb
--- /dev/null
+++ b/src/plugins/certmanager/src/com/motorolamobility/studio/android/certmanager/ui/wizards/SignExternalPackagePage.java
@@ -0,0 +1,559 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.motorolamobility.studio.android.certmanager.ui.wizards;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+
+import com.motorola.studio.android.common.log.StudioLogger;
+import com.motorolamobility.studio.android.certmanager.CertificateManagerActivator;
+import com.motorolamobility.studio.android.certmanager.core.KeyStoreManager;
+import com.motorolamobility.studio.android.certmanager.core.PasswordProvider;
+import com.motorolamobility.studio.android.certmanager.exception.InvalidPasswordException;
+import com.motorolamobility.studio.android.certmanager.exception.KeyStoreManagerException;
+import com.motorolamobility.studio.android.certmanager.i18n.CertificateManagerNLS;
+import com.motorolamobility.studio.android.certmanager.ui.model.EntryNode;
+import com.motorolamobility.studio.android.certmanager.ui.model.IKeyStore;
+import com.motorolamobility.studio.android.certmanager.ui.model.IKeyStoreEntry;
+import com.motorolamobility.studio.android.certmanager.ui.model.KeyStoreNode;
+
+/**
+ * This class implements the page of signature of external packages wizard It
+ * extends the page that removes the signature and implements the needed fields
+ */
+public class SignExternalPackagePage extends RemoveExternalPackageSignaturePage
+{
+
+ private Label keystoreLabel = null;
+
+ private Label keysLabel = null;
+
+ private Combo keystoreCombo = null;
+
+ private Text keystorePassword = null;
+
+ private Button loadKeystore = null;
+
+ private Button savePassword = null;
+
+ private Combo keysCombo = null;
+
+ private String keyEntryPassword;
+
+ private String keyStoreType;
+
+ PasswordProvider pP = null;
+
+ private IKeyStore initialSelectedKeyStore = null;
+
+ private IKeyStoreEntry initialSelectedEntry = null;
+
+ private IKeyStore selectedKeystore = null;
+
+ SelectionAdapter loadKeysSelectionAdapter = new SelectionAdapter()
+ {
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e)
+ {
+ widgetSelected(e);
+ };
+
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e)
+ {
+ setKeyEntries();
+ }
+ };
+
+ /**
+ * Create a new wizard page based on selection
+ *
+ * @param pageName
+ * the page name
+ * @param selection
+ * the selection
+ */
+ public SignExternalPackagePage(String pageName, IStructuredSelection selection,
+ IKeyStore selectedIKeyStore, IKeyStoreEntry selectedEntry)
+ {
+ super(pageName, selection);
+ this.initialSelectedKeyStore = selectedIKeyStore;
+ this.initialSelectedEntry = selectedEntry;
+ setDescription(CertificateManagerNLS.SIGN_EXTERNAL_PKG_WIZARD_DESCRIPTION);
+ setTitle(CertificateManagerNLS.SIGN_EXTERNAL_PKG_WIZARD_WINDOW_TITLE);
+ }
+
+ private HashMap<String, IKeyStore> getAvailableKeystores()
+ {
+ HashMap<String, IKeyStore> keystores = new HashMap<String, IKeyStore>();
+ Iterator<IKeyStore> iterator = null;
+ try
+ {
+ if ((KeyStoreManager.getInstance() != null)
+ && (KeyStoreManager.getInstance().getKeyStores() != null))
+ {
+ iterator = KeyStoreManager.getInstance().getKeyStores().iterator();
+ }
+ }
+ catch (KeyStoreManagerException e)
+ {
+ StudioLogger.error(this.getClass(), "Error retrieving keystore list", e); //$NON-NLS-1$
+ }
+
+ while ((iterator != null) && (iterator.hasNext()))
+ {
+ KeyStoreNode keystore = (KeyStoreNode) iterator.next();
+
+ keystores.put(keystore.toString(), keystore);
+ }
+ return keystores;
+
+ }
+
+ /**
+ * @param keystorePath
+ * @return key strings for the selected keystore
+ */
+ private final String[] getAvailableEntriesForKeystore(IKeyStore keystore)
+ {
+ ArrayList<String> entries = new ArrayList<String>();
+
+ if (keystore != null)
+ {
+
+ pP = new PasswordProvider(keystore.getFile());
+ String password = null;
+ try
+ {
+ // retrieve the saved password
+ password = pP.getKeyStorePassword(false);
+ }
+ catch (KeyStoreManagerException e1)
+ {
+ StudioLogger.error(this.getClass(), "Error retrieving keys from keystore", e1); //$NON-NLS-1$
+ }
+
+ if (password == null)
+ {
+ // password is not saved
+ if (!this.keystorePassword.getText().isEmpty())
+ {
+ // get the password from the wizard
+ password = this.keystorePassword.getText();
+ }
+ }
+ else
+ {
+ // the password was saved
+ try
+ {
+ keystore.isPasswordValid(password);
+ }
+ catch (InvalidPasswordException e)
+ {
+ if (!this.keystorePassword.getText().isEmpty())
+ {
+ // the saved password is invalid, get the password from the wizard
+ password = this.keystorePassword.getText();
+ }
+ }
+ catch (KeyStoreManagerException e)
+ {
+ //this exception should never happen here as it was handled at some point before
+ StudioLogger.error("This keystore was imported with wrong store type"); //$NON-NLS-1$
+ }
+ }
+ try
+ {
+ try
+ {
+ if (password != null)
+ {
+ // validate the password that was saved or from the wizard
+ keystore.isPasswordValid(password);
+ if (this.keystorePassword.getText().isEmpty())
+ {
+ // block the password fields if the password saved is valid
+ this.keystorePassword.setText(password);
+ this.keystorePassword.setEnabled(false);
+ this.savePassword.setSelection(true);
+ this.savePassword.setEnabled(false);
+ this.loadKeystore.setEnabled(false);
+ }
+ }
+ List<IKeyStoreEntry> keys = keystore.getEntries(password);
+
+ if ((keys.size() > 0) && (password != null))
+ {
+ this.keyStoreType = keystore.getType();
+ Iterator<IKeyStoreEntry> iterator2 = keys.iterator();
+ while ((iterator2 != null) && (iterator2.hasNext()))
+ {
+ EntryNode keyEntry = (EntryNode) iterator2.next();
+ entries.add(keyEntry.getId());
+ }
+
+ }
+
+ }
+ catch (KeyStoreManagerException e)
+ {
+ StudioLogger.error(this.getClass(), "Error retrieving keys from keystore", e); //$NON-NLS-1$
+ }
+
+ }
+ catch (InvalidPasswordException e)
+ {
+ setErrorMessage(CertificateManagerNLS.ConvertKeyStoreTypeDialog_Invalid_Keystore_Pass);
+ this.keystorePassword.setText(""); //$NON-NLS-1$
+ this.keystorePassword.setFocus(); //select the password text box so the user can retype the password
+ }
+ }
+
+ return entries.toArray(new String[0]);
+ }
+
+ /**
+ * Fill the key entries combo
+ *
+ */
+ private void setKeyEntries()
+ {
+ setErrorMessage(null);
+
+ String keystoreSelected = keystoreCombo.getItem(keystoreCombo.getSelectionIndex());
+
+ this.selectedKeystore = (IKeyStore) keystoreCombo.getData(keystoreSelected);
+ String[] availableKeys = getAvailableEntriesForKeystore(this.selectedKeystore);
+
+ if (availableKeys.length > 0)
+ {
+ keysCombo.setItems(availableKeys);
+ int selectedEntryIndex = 0;
+
+ if (initialSelectedEntry != null)
+ {
+ selectedEntryIndex = keysCombo.indexOf(initialSelectedEntry.getAlias());
+ initialSelectedEntry = null; //the selectedEntry only serves as first selection
+ }
+
+ keysCombo.select(selectedEntryIndex > 0 ? selectedEntryIndex : 0);
+
+ updatePageComplete();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.motorola.studio.android.packaging.ui.wizards.RemoveExternalPackageSignaturePage
+ * #createExtendedArea(org.eclipse.swt.widgets.Composite)
+ */
+ @Override
+ protected void createExtendedArea(Composite parent)
+ {
+ GridData layoutData = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
+
+ // Keystore label
+ this.keystoreLabel = new Label(parent, SWT.NONE);
+ this.keystoreLabel.setText(CertificateManagerNLS.SIGN_WIZARD_AREA_SIGN_KEYSTORE_LABEL);
+ this.keystoreLabel.setLayoutData(layoutData);
+
+ // Keystore combo
+ this.keystoreCombo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.SINGLE);
+ layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1);
+ this.keystoreCombo.setLayoutData(layoutData);
+ keystoreCombo.addSelectionListener(new SelectionAdapter()
+ {
+ /* (non-Javadoc)
+ * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+ */
+ @Override
+ public void widgetSelected(SelectionEvent e)
+ {
+ keystorePassword.setText(""); //$NON-NLS-1$
+ keystorePassword.setEnabled(true);
+ savePassword.setSelection(false);
+ savePassword.setEnabled(false);
+ loadKeystore.setEnabled(false);
+ keysCombo.removeAll();
+ setKeyEntries();
+ if (keystorePassword.getEnabled())
+ {
+ keystorePassword.setFocus();
+ }
+ //it only serves as
+ initialSelectedKeyStore = null;
+ }
+
+ });
+
+ // Keystore password label
+ Label keystorePasswordLabel = new Label(parent, SWT.NONE);
+ keystorePasswordLabel
+ .setText(CertificateManagerNLS.CreateKeystorePage_KeystorePasswordLabel);
+ layoutData = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
+ keystorePasswordLabel.setLayoutData(layoutData);
+
+ // Keystore password combo
+ this.keystorePassword = new Text(parent, SWT.BORDER | SWT.PASSWORD);
+ layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1);
+ this.keystorePassword.setLayoutData(layoutData);
+ this.keystorePassword.addListener(SWT.Modify, new Listener()
+ {
+ @Override
+ public void handleEvent(Event event)
+ {
+ if (keystorePassword.getText().isEmpty())
+ {
+ loadKeystore.setEnabled(false);
+ savePassword.setEnabled(false);
+ }
+ else
+ {
+ loadKeystore.setEnabled(true);
+ savePassword.setEnabled(true);
+ }
+ keysCombo.removeAll();
+ updatePageComplete();
+ }
+ });
+ this.keystorePassword.addSelectionListener(loadKeysSelectionAdapter);
+
+ // Load key entries Button
+ this.loadKeystore = new Button(parent, SWT.PUSH);
+ layoutData = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
+ this.loadKeystore.setLayoutData(layoutData);
+ this.loadKeystore.setText(CertificateManagerNLS.SIGN_EXTERNAL_PKG_WIZARD_LOAD);
+ this.loadKeystore.setEnabled(false);
+ this.loadKeystore.addSelectionListener(loadKeysSelectionAdapter);
+
+ // Save Keystore Password checkbox
+ this.savePassword = new Button(parent, SWT.CHECK);
+ layoutData = new GridData(SWT.FILL, SWT.CENTER, false, false, 4, 1);
+ this.savePassword.setLayoutData(layoutData);
+ this.savePassword.setText(CertificateManagerNLS.PasswordProvider_SaveThisPassword);
+ this.savePassword.setEnabled(false);
+ this.savePassword.setSelection(false);
+
+ // key entry label
+ this.keysLabel = new Label(parent, SWT.NONE);
+ this.keysLabel.setText(CertificateManagerNLS.SIGN_WIZARD_AREA_SIGN_KEYS_LABEL);
+ layoutData = new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1);
+ this.keysLabel.setLayoutData(layoutData);
+
+ // key entry combo
+ this.keysCombo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.SINGLE);
+ layoutData = new GridData(SWT.FILL, SWT.CENTER, true, false, 3, 1);
+ this.keysCombo.setLayoutData(layoutData);
+
+ PlatformUI
+ .getWorkbench()
+ .getHelpSystem()
+ .setHelp(parent,
+ CertificateManagerActivator.SIGN_EXTERNAL_PKG_WIZARD_CONTEXT_HELP_ID);
+
+ populateKeyStoreCombo();
+ }
+
+ @Override
+ protected void createPackageTreeLabel()
+ {
+ GridData layoutData;
+ Label packagesLabel = new Label(this.mainComposite, SWT.NONE);
+ packagesLabel.setText(CertificateManagerNLS.SignExternalPackagePage_Package_Tree_Label);
+ layoutData = new GridData(SWT.FILL, SWT.CENTER, false, false, 4, 1);
+ packagesLabel.setLayoutData(layoutData);
+ }
+
+ protected void populateKeyStoreCombo()
+ {
+ HashMap<String, IKeyStore> availableKeystores = getAvailableKeystores();
+ if (availableKeystores.size() > 0)
+ {
+
+ for (String keystoreKey : availableKeystores.keySet())
+ {
+ IKeyStore newKeystore = availableKeystores.get(keystoreKey);
+ this.keystoreCombo.setData(keystoreKey, availableKeystores.get(keystoreKey));
+ this.keystoreCombo.add(newKeystore.toString());
+
+ if (initialSelectedKeyStore != null)
+ {
+ if (initialSelectedKeyStore.equals(newKeystore))
+ {
+ //select combo with the item selected in Signing and keys view
+ keystoreCombo.select(keystoreCombo.indexOf(newKeystore.toString()));
+ setKeyEntries();
+ }
+ }
+ }
+
+ if (initialSelectedKeyStore == null)
+ {
+ this.keystoreCombo.select(0);
+ }
+ }
+ }
+
+ /**
+ *
+ * @return the key entry selected by user
+ */
+ public IKeyStoreEntry getSelectedKeyEntry()
+ {
+ IKeyStoreEntry result = null;
+ try
+ {
+ result =
+ this.selectedKeystore.getEntry(
+ this.keysCombo.getItem(this.keysCombo.getSelectionIndex()),
+ getKeystorePassword());
+ }
+ catch (KeyStoreManagerException e)
+ {
+ // should never happen
+ StudioLogger.error("Could not retrieve entry while signing package"); //$NON-NLS-1$
+ }
+ catch (InvalidPasswordException e)
+ {
+ // should never happen
+ StudioLogger.error("Invalid password while retrieving entry to sign package"); //$NON-NLS-1$
+ }
+
+ return result;
+ }
+
+ /**
+ *
+ * @return the keystore selected by user
+ */
+ public IKeyStore getSelectedKeyStore()
+ {
+ return this.selectedKeystore;
+ }
+
+ /**
+ *
+ * @return the keystore password entered by user
+ */
+ public String getKeystorePassword()
+ {
+ return this.keystorePassword.getText();
+ }
+
+ /**
+ *
+ * @return key entry password
+ */
+ public String getKeyEntryPassword()
+ {
+
+ try
+ {
+ this.keyEntryPassword =
+ pP.getPassword(this.keysCombo.getItem(this.keysCombo.getSelectionIndex()), true);
+ }
+ catch (KeyStoreManagerException e)
+ {
+ StudioLogger.error(this.getClass(), "Error retrieving keys entry password", e); //$NON-NLS-1$
+ }
+ return this.keyEntryPassword;
+ }
+
+ public PasswordProvider getPasswordProvider()
+ {
+ return pP;
+ }
+
+ /**
+ *
+ * @return the keystore type
+ */
+ public String getKeyStoreType()
+ {
+ return this.keyStoreType;
+ }
+
+ /**
+ * Update the page status, validating each field of this page The basic
+ * validation is made by superclass
+ */
+ @Override
+ public void updatePageComplete()
+ {
+ super.updatePageComplete();
+ int severity = getMessageType();
+ String messageAux = severity == IMessageProvider.NONE ? null : getMessage();
+
+ if (messageAux == null)
+ {
+ if (!(((this.keystoreCombo != null) && (this.keystoreCombo.getItemCount() > 0)
+ && (this.keystoreCombo.getItem(this.keystoreCombo.getSelectionIndex()) != null) && !this.keystoreCombo
+ .getItem(this.keystoreCombo.getSelectionIndex()).equalsIgnoreCase("")) && ((this.keysCombo != null) //$NON-NLS-1$
+ && (this.keysCombo.getItemCount() > 0)
+ && (this.keysCombo.getItem(this.keysCombo.getSelectionIndex()) != null) && !this.keysCombo
+ .getItem(this.keysCombo.getSelectionIndex()).equalsIgnoreCase("")))) //$NON-NLS-1$
+ {
+ messageAux =
+
+ CertificateManagerNLS.SIGN_EXTERNAL_PKG_WIZARD_NO_CERTIFICATE_ERROR;
+ severity = IMessageProvider.ERROR;
+ }
+
+ if (messageAux == null)
+ {
+ messageAux =
+
+ CertificateManagerNLS.SIGN_EXTERNAL_PKG_WIZARD_DESCRIPTION;
+ severity = IMessageProvider.NONE;
+ }
+
+ setMessage(messageAux, severity);
+ setPageComplete(severity == IMessageProvider.NONE);
+ }
+
+ }
+
+ /**
+ * @return checkbox save password
+ */
+ public boolean getSavePasswordSelection()
+ {
+ return this.savePassword.getSelection();
+ }
+}