blob: 40eba45cc6b95276245c6392d0ac4ae6716b51fe [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2018 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* EclipseSource Corporation - ongoing enhancements
* Martin Karpisek <martin.karpisek@gmail.com> - Bug 387565
*******************************************************************************/
package org.eclipse.pde.internal.ui.wizards.exports;
import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;
import org.eclipse.equinox.security.storage.*;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.pde.internal.ui.*;
import org.eclipse.pde.internal.ui.util.SWTUtil;
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.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.PlatformUI;
public class JARSigningTab {
private static final String S_SIGN_JARS = "signJAR"; //$NON-NLS-1$
private static final String S_KEYSTORE = "keystore"; //$NON-NLS-1$
private static final String S_KEYPASS = "keypass"; //$NON-NLS-1$
private static final String S_ALIAS = "alias"; //$NON-NLS-1$
private static final String S_PASSWORD = "password"; //$NON-NLS-1$
private Button fButton;
private Label fKeystoreLabel;
private Text fKeystoreText;
private Label fKeypassLabel;
private Text fKeypassText;
private Label fAliasLabel;
private Text fAliasText;
private Label fPasswordLabel;
private Text fPasswordText;
private BaseExportWizardPage fPage;
private Button fBrowseButton;
public JARSigningTab(BaseExportWizardPage page) {
fPage = page;
}
public Control createControl(Composite parent) {
Composite comp = new Composite(parent, SWT.NONE);
comp.setLayout(new GridLayout(3, false));
comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fButton = new Button(comp, SWT.CHECK);
fButton.setText(PDEUIMessages.AdvancedPluginExportPage_signButton);
GridData gd = new GridData();
gd.horizontalSpan = 3;
fButton.setLayoutData(gd);
fButton.addSelectionListener(widgetSelectedAdapter(e -> {
updateGroup(fButton.getSelection());
fPage.pageChanged();
}));
fKeystoreLabel = createLabel(comp, PDEUIMessages.AdvancedPluginExportPage_keystore);
fKeystoreText = createText(comp, 1);
fBrowseButton = new Button(comp, SWT.PUSH);
fBrowseButton.setText(PDEUIMessages.ExportWizard_browse);
fBrowseButton.setLayoutData(new GridData());
SWTUtil.setButtonDimensionHint(fBrowseButton);
fBrowseButton.addSelectionListener(widgetSelectedAdapter(e -> {
FileDialog dialog = new FileDialog(fPage.getShell(), SWT.OPEN);
String path = fKeystoreText.getText();
if (path.trim().length() == 0)
path = PDEPlugin.getWorkspace().getRoot().getLocation().toString();
dialog.setFileName(path);
String res = dialog.open();
if (res != null) {
fKeystoreText.setText(res);
}
}));
fKeypassLabel = createLabel(comp, PDEUIMessages.JARSigningTab_keypass);
fKeypassText = createText(comp, 2);
fKeypassText.setEchoChar('*');
fAliasLabel = createLabel(comp, PDEUIMessages.AdvancedPluginExportPage_alias);
fAliasText = createText(comp, 2);
fPasswordLabel = createLabel(comp, PDEUIMessages.AdvancedPluginExportPage_password);
fPasswordText = createText(comp, 2);
fPasswordText.setEchoChar('*');
Dialog.applyDialogFont(comp);
PlatformUI.getWorkbench().getHelpSystem().setHelp(comp, IHelpContextIds.ADVANCED_PLUGIN_EXPORT);
return comp;
}
protected void initialize(IDialogSettings settings) {
boolean signJars = getBoolean(settings, S_SIGN_JARS);
// if jar signing is already enabled - load information from secured
// storage (also creates it)
if (signJars) {
initializeJarSigningInputFields(settings);
} else {
// if jar signing is not yet enabled, defer loading information to
// first time it is enabled
fButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
initializeJarSigningInputFields(settings);
// after first initialization and loading of information
// repeated initialization (on selection) would overwrite
// user entered changes -> remove listener
fButton.removeSelectionListener(this);
}
});
}
fButton.setSelection(signJars);
updateGroup(fButton.getSelection());
}
/**
* Initializes input fields in JarSigning tab with settings from secured
* storage. Has side effect of creating default secure storage (if not yet
* existing).
*/
protected void initializeJarSigningInputFields(IDialogSettings settings) {
String keystore = ""; //$NON-NLS-1$
String keypass = ""; //$NON-NLS-1$
String alias = ""; //$NON-NLS-1$
String password = ""; //$NON-NLS-1$
// only in case signing is requested, use and possible
// create an secure preferences store
ISecurePreferences preferences = getPreferences(settings.getName());
if (preferences == null) {
// only in case it is not possible to create secured
// storage in
// default location -> in that case default values
// are used
return;
}
if (preferences.keys().length <= 0) {
// nothing stored in secured preferences, check
// settings for values from before bug387565 fix
keystore = getString(settings, S_KEYSTORE);
keypass = getString(settings, S_KEYPASS);
alias = getString(settings, S_ALIAS);
password = getString(settings, S_PASSWORD);
} else {
// from secured preferences after bug387565 fix
keystore = getString(preferences, S_KEYSTORE);
keypass = getString(preferences, S_KEYPASS);
alias = getString(preferences, S_ALIAS);
password = getString(preferences, S_PASSWORD);
}
fKeystoreText.setText(keystore);
fKeypassText.setText(keypass);
fAliasText.setText(alias);
fPasswordText.setText(password);
}
private String getString(IDialogSettings settings, String key) {
String s = settings.get(key);
return s == null ? "" : s; //$NON-NLS-1$
}
private boolean getBoolean(IDialogSettings settings, String key) {
return settings.getBoolean(key);
}
private String getString(ISecurePreferences settings, String key) {
try {
return settings.get(key, ""); //$NON-NLS-1$
} catch (StorageException e) {
return ""; //$NON-NLS-1$
}
}
protected Label createLabel(Composite group, String text) {
Label label = new Label(group, SWT.NONE);
label.setText(text);
GridData gd = new GridData();
gd.horizontalIndent = 15;
label.setLayoutData(gd);
return label;
}
protected Text createText(Composite group, int span) {
Text text = new Text(group, SWT.SINGLE | SWT.BORDER);
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = span;
text.setLayoutData(gd);
text.addModifyListener(e -> fPage.pageChanged());
return text;
}
protected String validate() {
String error = null;
if (fButton.getSelection()) {
if (fKeystoreText.getText().trim().length() == 0) {
error = PDEUIMessages.AdvancedPluginExportPage_noKeystore;
} else if (fAliasText.getText().trim().length() == 0) {
error = PDEUIMessages.AdvancedPluginExportPage_noAlias;
} else if (fPasswordText.getText().trim().length() == 0) {
error = PDEUIMessages.AdvancedPluginExportPage_noPassword;
}
}
return error;
}
private void updateGroup(boolean enabled) {
fKeystoreLabel.setEnabled(enabled);
fKeystoreText.setEnabled(enabled);
fBrowseButton.setEnabled(enabled);
fAliasLabel.setEnabled(enabled);
fAliasText.setEnabled(enabled);
fPasswordLabel.setEnabled(enabled);
fPasswordText.setEnabled(enabled);
fKeypassLabel.setEnabled(enabled);
fKeypassText.setEnabled(enabled);
}
protected void saveSettings(IDialogSettings settings) {
boolean signJars = fButton.getSelection();
settings.put(S_SIGN_JARS, signJars);
if (signJars) {
// only in case signing is requested, use and possible create an
// secure preferences store
ISecurePreferences preferences = getPreferences(settings.getName());
if (preferences == null) {
// only in case it is not possible to create secured storage in
// default location -> in that case do not persist settings
return;
}
try {
preferences.put(S_KEYSTORE, fKeystoreText.getText().trim(), true);
preferences.put(S_ALIAS, fAliasText.getText().trim(), true);
preferences.put(S_PASSWORD, fPasswordText.getText().trim(), true);
preferences.put(S_KEYPASS, fKeypassText.getText().trim(), true);
// bug387565 - for keys which are starting with this bugfix to
// be stored in secured storage, replace value in settings with
// empty string to avoid keeping sensitive info in plain text
String[] obsoleted = new String[] { S_KEYSTORE, S_ALIAS, S_PASSWORD, S_KEYPASS };
for (String key : obsoleted) {
if (settings.get(key) != null) {
settings.put(key, ""); //$NON-NLS-1$
}
}
}
catch (StorageException e) {
PDEPlugin.log("Failed to store JarSigning settings in secured preferences store"); //$NON-NLS-1$
}
}
}
protected String[] getSigningInfo() {
if (fButton.getSelection()) {
return new String[] {fAliasText.getText().trim(), fKeystoreText.getText().trim(), fPasswordText.getText().trim(), fKeypassText.getText().trim()};
}
return null;
}
/**
* Answer secured preferences which can be used for storing sensitive
* information of this tab
*
* @return default instance of secure preferences for this tab,
* <code>null</code> if application was unable to create secure
* preferences using default location
*/
private ISecurePreferences getPreferences(String sectionName) {
ISecurePreferences preferences = SecurePreferencesFactory.getDefault();
if (preferences == null) {
return null;
}
return preferences.node(IPDEUIConstants.PLUGIN_ID).node(sectionName);
}
}