package org.eparapher.rcp.wizards; import java.security.cert.X509Certificate; import org.apache.log4j.Logger; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eparapher.core.crypto.EPKeystoreManager; import org.eparapher.core.crypto.cert.CertificateInfo; import org.eparapher.core.crypto.keystore.KeystoreEntry; import org.eparapher.core.interfaces.IUserKeystore; import org.eparapher.core.tools.DefaulteParapherParameters; import org.eparapher.rcp.dialog.CertificateViewerDialog; import org.eparapher.rcp.tools.GUIIcons; import org.eparapher.rcp.tools.eParapherTools; public abstract class KeysAndCertificateSelectionPage extends WizardPage implements IWizardPage { private static Logger log = Logger.getLogger(KeysAndCertificateSelectionPage.class); private TableViewer viewer; @SuppressWarnings("unused") private DoubleClickAction dca; private KeystoreEntry[] certlist; private int defaultindex; private boolean hideCertificatesEntries; private boolean hideKeysEntries; private String defaultAlias; private Composite container; public KeysAndCertificateSelectionPage() { super("Keys And Certificate Selection"); setDescription("Please select your signing certificate."); setImageDescriptor( GUIIcons.WIZARD_SIGN_IMG2 ); defaultAlias = EPKeystoreManager.getInstance().getUserkeystore().getDefaultAlias(); hideCertificatesEntries = false; hideKeysEntries = false; } public KeysAndCertificateSelectionPage(DefaulteParapherParameters dsp) { this(); defaultAlias=dsp.getAlias(); hideCertificatesEntries = true; } public void createControl(Composite parent) { container = new Composite(parent, SWT.NULL); FillLayout layout = new FillLayout(); //layout.numColumns = 1; container.setLayout(layout); setControl(container); //http://www.eclipsezone.com/eclipse/forums/t73690.html final Table table = new Table(container, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION ); table.setHeaderVisible(true); table.setLinesVisible(false); //table.setBounds(new Rectangle(26, 21, 381, 370)); String[] column = new String[] {" ","Alias","Subject","Validity","Key"}; for (int i = 0; i < column.length; i++) { TableColumn c = new TableColumn(table, SWT.LEFT); c.setText(column[i]); switch (i) { case 0: c.setWidth(25); break; case 3: c.setWidth(180); break; default: c.setWidth(120); break; } } // table.addListener(SWT.Selection, new Listener() { // public void handleEvent(Event event) { // String string = event.detail == SWT.CHECK ? "Checked" : "Selected"; // //log.info(event.item + " " + string); // if (event.detail == SWT.CHECK) { // //log.info(event.item + " was checked: " + ((TableItem) event.item).getChecked()); // TableItem tableItem = (TableItem) event.item; // int ndx = table.indexOf(tableItem); // elipseButtons[ndx].setVisible(tableItem.getChecked()); // } // // } // }); viewer = new TableViewer(table); viewer.setContentProvider(new ViewContentProvider()); viewer.setLabelProvider(new ViewLabelProvider()); viewer.setComparator(new NameSorter()); viewer.setInput(getContainer()); //Set Default selection for (int i = 0; i < viewer.getTable().getItemCount(); i++) { Object data = viewer.getTable().getItem(i).getData(); if (data instanceof KeystoreEntry) { KeystoreEntry itemke = (KeystoreEntry) data; if (itemke.getKeystoreAlias().equals(defaultAlias)) defaultindex = i; } } viewer.getTable().setSelection(defaultindex); //TODO : Window not selectable - modal wizard problem? dca = new DoubleClickAction(); setPageComplete(true); } public String getSelectedCertificateAlias() { ISelection selection = viewer.getSelection(); KeystoreEntry obj = (KeystoreEntry) ((IStructuredSelection)selection).getFirstElement(); return obj.getKeystoreAlias(); } class ViewContentProvider implements IStructuredContentProvider { public void inputChanged(Viewer v, Object oldInput, Object newInput) { } public void dispose() { } public Object[] getElements(Object parent) { certlist = new KeystoreEntry[0]; IUserKeystore userKeystore = EPKeystoreManager.getInstance().getUserkeystore(); if ( userKeystore == null ) { eParapherTools.errorMessage("Failed to initialize your personal keystore.\r\nPlease change it in configuration."); } else if ( userKeystore.loadKeyStore() ) { if (hideCertificatesEntries && hideKeysEntries) log.warn("the certificate/PK selection wizard will be empty!"); if (hideCertificatesEntries) certlist = userKeystore.getKeysEntries(); else if (hideKeysEntries) certlist = userKeystore.getCertificatesEntries(); else certlist = userKeystore.getAllEntries(); } return certlist; } } public boolean isHideCertificatesEntries() { return hideCertificatesEntries; } public void setHideCertificatesEntries(boolean hideCertificatesEntries) { this.hideCertificatesEntries = hideCertificatesEntries; } public boolean isHideKeysEntries() { return hideKeysEntries; } public void setHideKeysEntries(boolean hideKeysEntries) { this.hideKeysEntries = hideKeysEntries; } class ViewLabelProvider extends LabelProvider implements ITableLabelProvider { public String getColumnText(Object obj, int index) { if (obj==null) return ""; KeystoreEntry certchain = (KeystoreEntry) obj; X509Certificate userCert = null; if (certchain.getCertificateChain() == null) { if (index==4) return "Secret Key"; if (index==7) return certchain.getKeystoreAlias(); return ""; } userCert = certchain.getCertificateChain()[0]; switch (index) { case 0: return ""; case 1: return certchain.getKeystoreAlias(); case 2: return CertificateInfo.getSubjectAsShortText(userCert); case 3: return CertificateInfo.getNotBeforeAsText( userCert ) + " to " + CertificateInfo.getNotAfterAsText( userCert ); case 4: return CertificateInfo.getPublicKeyInfo( userCert.getPublicKey() ); default: break; } return ""; } public Image getColumnImage(Object obj, int index) { if (index == 0) return getImage(obj); return null; } public Image getImage(Object obj) { KeystoreEntry certchain = (KeystoreEntry) obj; if (certchain.getKeystoreAlias().equals(defaultAlias)) { return GUIIcons.CERTIFICATE_SEL_ICON_IMAGE; } else if ( certchain.getCertificateChain()==null || certchain.getCertificateChain().length==0 ) return GUIIcons.PRIVATE_KEY_ICON_IMAGE; else return GUIIcons.CERTIFICATE_ICON_IMAGE; } } class NameSorter extends ViewerSorter { } class DoubleClickAction extends Action { public DoubleClickAction() { viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { run(); } }); } public void run() { ISelection selection = viewer.getSelection(); Object obj = ((IStructuredSelection)selection).getFirstElement(); if (obj!=null) if (obj instanceof KeystoreEntry) { KeystoreEntry ke = (KeystoreEntry) obj; CertificateViewerDialog cvg = new CertificateViewerDialog(ke.getCertificateChain()); cvg.open(); } } } }