blob: 52fe9e797d105ed11674ba583bc8dfc2b9f47788 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 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
*******************************************************************************/
package org.eclipse.equinox.internal.p2.ui.dialogs;
import java.security.cert.X509Certificate;
import org.eclipse.equinox.internal.p2.ui.ProvUIMessages;
import org.eclipse.equinox.internal.p2.ui.viewers.CertificateLabelProvider;
import org.eclipse.equinox.internal.provisional.security.ui.X509CertificateViewDialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.dialogs.ListSelectionDialog;
/**
* A dialog that displays a certificate chain and asks the user if they
* trust the certificate providers.
*/
public class TrustCertificateDialog extends ListSelectionDialog {
private TreeViewer certificateChainViewer;
private Button detailsButton;
protected TreeNode parentElement;
protected Object selectedCertificate;
public TrustCertificateDialog(Shell parentShell, Object input, ILabelProvider labelProvider, ITreeContentProvider contentProvider) {
super(parentShell, input, contentProvider, labelProvider, ProvUIMessages.TrustCertificateDialog_Title);
setShellStyle(SWT.DIALOG_TRIM | SWT.MODELESS | SWT.RESIZE | getDefaultOrientation());
}
private void createButtons(Composite composite) {
// Details button to view certificate chain
detailsButton = new Button(composite, SWT.NONE);
detailsButton.setText(ProvUIMessages.TrustCertificateDialog_Details);
detailsButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
if (selectedCertificate != null) {
X509Certificate cert = (X509Certificate) ((TreeNode) selectedCertificate).getValue();
X509CertificateViewDialog certificateDialog = new X509CertificateViewDialog(getShell(), cert);
certificateDialog.open();
}
}
@Override
public void widgetSelected(SelectionEvent e) {
widgetDefaultSelected(e);
}
});
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
createButton(parent, IDialogConstants.OK_ID, ProvUIMessages.TrustCertificateDialog_AcceptSelectedButtonLabel, true);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
}
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
certificateChainViewer = new TreeViewer(composite, SWT.BORDER);
GridLayout layout = new GridLayout();
certificateChainViewer.getTree().setLayout(layout);
GridData data = new GridData(GridData.FILL_BOTH);
data.grabExcessHorizontalSpace = true;
certificateChainViewer.getTree().setLayoutData(data);
certificateChainViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
certificateChainViewer.setContentProvider(new TreeNodeContentProvider());
certificateChainViewer.setLabelProvider(new CertificateLabelProvider());
certificateChainViewer.addSelectionChangedListener(getChainSelectionListener());
Object input = getViewer().getInput();
if (input instanceof Object[]) {
ISelection selection = null;
Object[] nodes = (Object[]) input;
if (nodes.length > 0) {
selection = new StructuredSelection(nodes[0]);
certificateChainViewer.setInput(new TreeNode[] {(TreeNode) nodes[0]});
selectedCertificate = nodes[0];
}
getViewer().setSelection(selection);
}
getViewer().addDoubleClickListener(getDoubleClickListener());
getViewer().addSelectionChangedListener(getParentSelectionListener());
createButtons(composite);
return composite;
}
private ISelectionChangedListener getChainSelectionListener() {
return new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
if (selection instanceof StructuredSelection) {
selectedCertificate = ((StructuredSelection) selection).getFirstElement();
}
}
};
}
public TreeViewer getCertificateChainViewer() {
return certificateChainViewer;
}
private IDoubleClickListener getDoubleClickListener() {
return new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
StructuredSelection selection = (StructuredSelection) event.getSelection();
Object selectedElement = selection.getFirstElement();
if (selectedElement instanceof TreeNode) {
TreeNode treeNode = (TreeNode) selectedElement;
// create and open dialog for certificate chain
X509CertificateViewDialog certificateViewDialog = new X509CertificateViewDialog(getShell(), (X509Certificate) treeNode.getValue());
certificateViewDialog.open();
}
}
};
}
private ISelectionChangedListener getParentSelectionListener() {
return new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
if (selection instanceof StructuredSelection) {
getCertificateChainViewer().setInput(new TreeNode[] {(TreeNode) ((StructuredSelection) selection).getFirstElement()});
getCertificateChainViewer().refresh();
}
}
};
}
}