package org.eparapher.rcp.tools; import java.security.cert.X509Certificate; 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.swt.SWT; import org.eclipse.swt.graphics.Image; 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.rcp.dialog.CertificateViewerDialog; /** * Table that list certificates * @author arnault * */ public class CertificateView extends TableViewer { protected Action doubleClickAction; private KeystoreEntry[] ksentries; private String defaultAlias; private int defaultindex; /** * Create a certificate view that list UserKeystore */ public CertificateView(Composite parent) { this( parent, SWT.SINGLE, null ); } /** * Create a certificate view with specific style and specific * @param parent Composite that contain the tableView * @param style Choose SWT.SINGLE for single selection or SWT.MULTI for multiple selection */ public CertificateView(Composite parent, int style, KeystoreEntry[] content) { super( new Table( parent, SWT.BORDER | SWT.FULL_SELECTION | style ) ); //getTable().setLayoutData(new GridData( GridData.FILL, GridData.FILL, true, true )); ksentries = content; defaultindex = -1; //Build table //getTable().setLayoutData(new GridData(GridData.FILL_BOTH)); getTable().setHeaderVisible(true); getTable().setLinesVisible(false); //Build table columns String[] column = new String[] {" ","Alias","Subject","Validity","Key"}; for (int i = 0; i < column.length; i++) { TableColumn c = new TableColumn(getTable(), 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; } } this.setContentProvider(new ViewContentProvider()); this.setLabelProvider(new ViewLabelProvider()); this.setComparator(new NameSorter()); this.setInput(parent); // Dble click mgmt doubleClickAction = new DoubleClickAction(); addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { doubleClickAction.run(); } }); //Set Default selection if (defaultindex>0) this.getTable().setSelection(defaultindex); } public void setDefaultAlias(String defaultAlias) { this.defaultAlias = defaultAlias; } public void setContent(KeystoreEntry[] newContent) { this.ksentries = newContent; this.setInput(ksentries); this.refresh(); } public KeystoreEntry[] getKeystoreEntries() { return ksentries; } class ViewContentProvider implements IStructuredContentProvider { public void inputChanged(Viewer v, Object oldInput, Object newInput) { } public void dispose() { } public Object[] getElements(Object parent) { if (ksentries == null) { ksentries = 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() ) { ksentries = userKeystore.getAllEntries(); } } return ksentries; } } 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==1) 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)) { for (int i = 0; i < ksentries.length; i++) { if (ksentries[i].equals(certchain)) defaultindex = i; } 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 void run() { ISelection selection = 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(); } } } }