1 package org.eparapher.rcp.views;
2
3 import java.security.KeyStoreException;
4 import java.security.cert.X509Certificate;
5 import java.util.Iterator;
6
7 import org.apache.log4j.Logger;
8 import org.eclipse.jface.action.Action;
9 import org.eclipse.jface.action.IMenuListener;
10 import org.eclipse.jface.action.IMenuManager;
11 import org.eclipse.jface.action.IToolBarManager;
12 import org.eclipse.jface.action.MenuManager;
13 import org.eclipse.jface.action.Separator;
14 import org.eclipse.jface.viewers.ColumnWeightData;
15 import org.eclipse.jface.viewers.DoubleClickEvent;
16 import org.eclipse.jface.viewers.IDoubleClickListener;
17 import org.eclipse.jface.viewers.ISelection;
18 import org.eclipse.jface.viewers.IStructuredContentProvider;
19 import org.eclipse.jface.viewers.IStructuredSelection;
20 import org.eclipse.jface.viewers.ITableLabelProvider;
21 import org.eclipse.jface.viewers.LabelProvider;
22 import org.eclipse.jface.viewers.TableLayout;
23 import org.eclipse.jface.viewers.TableViewer;
24 import org.eclipse.jface.viewers.Viewer;
25 import org.eclipse.jface.viewers.ViewerComparator;
26 import org.eclipse.swt.SWT;
27 import org.eclipse.swt.graphics.Image;
28 import org.eclipse.swt.widgets.Composite;
29 import org.eclipse.swt.widgets.Menu;
30 import org.eclipse.swt.widgets.Table;
31 import org.eclipse.swt.widgets.TableColumn;
32 import org.eclipse.ui.IActionBars;
33 import org.eclipse.ui.IViewPart;
34 import org.eclipse.ui.IWorkbenchActionConstants;
35 import org.eclipse.ui.part.ViewPart;
36 import org.eparapher.core.EParapherManager;
37 import org.eparapher.core.crypto.EPKeystoreManager;
38 import org.eparapher.core.crypto.KeystoreEntry;
39 import org.eparapher.core.crypto.cert.CertificateInfo;
40 import org.eparapher.rcp.dialog.CertificateViewerDialog;
41 import org.eparapher.rcp.tools.GUIIcons;
42 import org.eparapher.rcp.tools.RCPGUI;
43
44
45 public abstract class AbstractCertificateView extends ViewPart {
46
47 private static Logger log = Logger.getLogger(AbstractCertificateView.class);
48
49 protected TableViewer viewer;
50 protected Action importAction;
51 protected Action exportAction;
52 protected Action delecteAction;
53 protected Action refreshAction;
54 protected Action doubleClickAction;
55
56
57
58
59
60
61
62
63
64
65
66
67 class ViewContentProvider implements IStructuredContentProvider {
68
69 public void inputChanged(Viewer v, Object oldInput, Object newInput) {
70 }
71 public void dispose() {
72 }
73 public Object[] getElements(Object parent) {
74 return getKeystoreEntries();
75 }
76 }
77 class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
78 public String getColumnText(Object obj, int index) {
79
80 if (obj==null)
81 return "";
82
83 KeystoreEntry certchain = (KeystoreEntry) obj;
84
85 X509Certificate userCert = null;
86 if (certchain.getCertificateChain() == null) {
87 if (index==4)
88 return "Secret Key";
89 if (index==7)
90 return certchain.getKeystoreAlias();
91 return "--";
92 }
93 userCert = certchain.getCertificateChain()[0];
94
95 switch (index) {
96 case 0: return CertificateInfo.getSubjectAsShortText(userCert);
97 case 1: return CertificateInfo.getIssuerAsShortText(userCert);
98 case 2: return CertificateInfo.getNotBeforeAsText( userCert );
99 case 3: return CertificateInfo.getNotAfterAsText( userCert );
100 case 4: return CertificateInfo.getPublicKeyInfo( userCert.getPublicKey() );
101 case 5: return CertificateInfo.getKeyUsageAsText(userCert);
102 case 6: return CertificateInfo.getExtendedKeyUsageAsText(userCert);
103 case 7: return certchain.getKeystoreAlias();
104 default: break;
105 }
106 return "";
107 }
108 public Image getColumnImage(Object obj, int index) {
109 if (index == 0)
110 return getImage(obj);
111 return null;
112 }
113
114 public Image getImage(Object obj) {
115 return getCertificateImage(obj);
116 }
117 }
118
119 class NameComparator extends ViewerComparator {
120 public int compare(Viewer viewer, Object e1, Object e2) {
121 KeystoreEntry k1 = (KeystoreEntry) e1;
122 KeystoreEntry k2 = (KeystoreEntry) e2;
123 if (k1.getCertificateChain()==null || k2.getCertificateChain()==null ||
124 k1.getCertificateChain().length ==0 || k2.getCertificateChain().length ==0)
125 return 1;
126 String s1 = CertificateInfo.getSubjectAsShortText(k1.getCertificateChain()[0]);
127 String s2 = CertificateInfo.getSubjectAsShortText(k2.getCertificateChain()[0]);
128 int compare = getComparator().compare(s1, s2);
129 return compare;
130 }
131 public boolean isSorterProperty(Object element, String property) {
132 return false;
133 }
134 }
135
136
137
138
139
140 public void createPartControl(Composite parent) {
141
142 viewer = new TableViewer(createTable(parent));
143 viewer.setContentProvider(new ViewContentProvider());
144 viewer.setLabelProvider(new ViewLabelProvider());
145 viewer.setComparator(new NameComparator());
146 viewer.setInput(getViewSite());
147
148 makeActions();
149 hookContextMenu();
150 hookDoubleClickAction();
151 contributeToActionBars();
152 }
153
154 private Table createTable(Composite parent) {
155
156 Table table = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
157 table.setLinesVisible(true);
158 table.setHeaderVisible(true);
159
160 TableLayout layout = new TableLayout();
161 layout.addColumnData(new ColumnWeightData(1, 100, true));
162 layout.addColumnData(new ColumnWeightData(1, 100, true));
163 layout.addColumnData(new ColumnWeightData(1, 100, true));
164 layout.addColumnData(new ColumnWeightData(1, 100, true));
165 layout.addColumnData(new ColumnWeightData(1, 100, true));
166 layout.addColumnData(new ColumnWeightData(1, 100, true));
167 layout.addColumnData(new ColumnWeightData(1, 100, true));
168 table.setLayout(layout);
169
170 TableColumn nameColumn = new TableColumn(table, SWT.NONE);
171 nameColumn.setText("Delivered to");
172 nameColumn.setWidth(70);
173 nameColumn.setMoveable(true);
174
175 TableColumn issuerCNColumn = new TableColumn(table, SWT.NONE);
176 issuerCNColumn.setText("Delivered by");
177 issuerCNColumn.setWidth(70);
178 issuerCNColumn.setMoveable(true);
179
180 TableColumn deliveryDateColumn = new TableColumn(table, SWT.NONE);
181 deliveryDateColumn.setText("Valid from");
182 deliveryDateColumn.setWidth(70);
183 deliveryDateColumn.setMoveable(true);
184
185 TableColumn expiryDateColumn = new TableColumn(table, SWT.NONE);
186 expiryDateColumn.setText("Expires on");
187 expiryDateColumn.setWidth(70);
188 expiryDateColumn.setMoveable(true);
189
190 TableColumn keyColumn = new TableColumn(table, SWT.NONE);
191 keyColumn.setText("Key");
192 keyColumn.setWidth(120);
193 keyColumn.setMoveable(true);
194
195 TableColumn keyusageColumn = new TableColumn(table, SWT.NONE);
196 keyusageColumn.setText("Key Usage");
197 keyusageColumn.setWidth(120);
198 keyusageColumn.setMoveable(true);
199
200 TableColumn issuerDNColumn = new TableColumn(table, SWT.NONE);
201 issuerDNColumn.setText("Extended KeyUsage");
202 issuerDNColumn.setWidth(120);
203 issuerDNColumn.setMoveable(true);
204
205 TableColumn aliasColumn = new TableColumn(table, SWT.NONE);
206 aliasColumn.setText("Alias");
207 aliasColumn.setWidth(60);
208 aliasColumn.setMoveable(true);
209
210 return table;
211 }
212 private void hookContextMenu() {
213 MenuManager menuMgr = new MenuManager("#PopupMenu");
214 menuMgr.setRemoveAllWhenShown(true);
215 menuMgr.addMenuListener(new IMenuListener() {
216 public void menuAboutToShow(IMenuManager manager) {
217 fillContextMenu(manager);
218 }
219 });
220 Menu menu = menuMgr.createContextMenu(viewer.getControl());
221 viewer.getControl().setMenu(menu);
222 getSite().registerContextMenu(menuMgr, viewer);
223 }
224
225 private void contributeToActionBars() {
226 IActionBars bars = getViewSite().getActionBars();
227
228 fillLocalToolBar(bars.getToolBarManager());
229 }
230
231 protected void fillLocalPullDown(IMenuManager manager) {
232 manager.add(importAction);
233 manager.add(exportAction);
234 }
235
236 protected void fillContextMenu(IMenuManager manager) {
237 manager.add(delecteAction);
238 manager.add(new Separator());
239 manager.add(importAction);
240 manager.add(exportAction);
241 manager.add(new Separator());
242 manager.add(refreshAction);
243
244 manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
245 }
246
247 protected void fillLocalToolBar(IToolBarManager manager) {
248 manager.add(refreshAction);
249 manager.add(new Separator());
250 manager.add(importAction);
251 manager.add(exportAction);
252 }
253
254 protected void makeActions() {
255
256 delecteAction = new DeleteAction(this);
257
258
259 refreshAction = new RefreshAction();
260
261 doubleClickAction = new DoubleClickAction();
262 }
263
264 private void hookDoubleClickAction() {
265 viewer.addDoubleClickListener(new IDoubleClickListener() {
266 public void doubleClick(DoubleClickEvent event) {
267 doubleClickAction.run();
268 }
269 });
270 }
271
272
273
274
275 public void setFocus() {
276 viewer.getControl().setFocus();
277 }
278
279
280
281 public void refreshView() {
282
283 if (viewer!=null)
284 viewer.refresh();
285 }
286
287
288
289 protected abstract Object[] getKeystoreEntries();
290
291 protected abstract Image getCertificateImage(Object obj);
292
293 protected String[] getSelectedAlias() {
294 ISelection selection = viewer.getSelection();
295 int size = ((IStructuredSelection)selection).size();
296 String[] selected_aliases = new String[size];
297 int i=0;
298 IStructuredSelection struct_sel = (IStructuredSelection)selection;
299 for (Iterator<KeystoreEntry> iterator = struct_sel.iterator(); iterator.hasNext();) {
300 KeystoreEntry type = iterator.next();
301 selected_aliases[i++] = type.getKeystoreAlias();
302 }
303 return selected_aliases;
304 }
305
306 class RefreshAction extends Action {
307 protected RefreshAction() {
308 setText("Re&fresh");
309 setToolTipText("Refresh the Tree for added/removed files");
310 setImageDescriptor(GUIIcons.REFRESH_ICON);
311 setAccelerator(SWT.F5);
312 }
313 public void run() {
314 viewer.refresh();
315 }
316 }
317
318 class DoubleClickAction extends Action {
319 public void run() {
320 ISelection selection = viewer.getSelection();
321 Object obj = ((IStructuredSelection)selection).getFirstElement();
322 if (obj instanceof KeystoreEntry) {
323 KeystoreEntry ke = (KeystoreEntry) obj;
324 if (ke.getCertificateChain()!=null) {
325 CertificateViewerDialog cvg = new CertificateViewerDialog(ke.getCertificateChain());
326 cvg.open();
327 } else {
328
329 }
330 }
331 }
332 }
333
334 class DeleteAction extends Action {
335 IViewPart vp;
336 public DeleteAction(IViewPart mvp) {
337 setText("Delete");
338 setToolTipText("Delete selected keys/certificates");
339 setImageDescriptor(GUIIcons.TRASH_ICON);
340 vp = mvp;
341 }
342 public void run() {
343 ISelection selection = viewer.getSelection();
344 if (selection.isEmpty())
345 RCPGUI.infoMessage("Delete private key(s) and/or certificate(s)","Please select first an entry in the list.");
346 else {
347 String[] aliases_to_del = getSelectedAlias();
348 String aliases = "alias ";
349 if (aliases_to_del.length>1)
350 aliases = "aliases ";
351 for (int i = 0; i < aliases_to_del.length; i++) {
352 aliases += aliases_to_del[i] + ( i != (aliases_to_del.length-1) ? ", " : "" );
353 }
354 if ( EParapherManager.getInstance().getUI().askUserYesNo("Please confirm the deletion of keys and/or certificates for " + aliases) ) {
355 for (int i = 0; i < aliases_to_del.length; i++) {
356 try {
357 if (vp instanceof UserCertificateStoreView)
358 EPKeystoreManager.getInstance().getUserkeystore().getKeystore().deleteEntry(aliases_to_del[i]);
359 if (vp instanceof TrustedCertificateStoreView) {
360 EPKeystoreManager.getInstance().getTrustStore().getKeystore().deleteEntry(aliases_to_del[i]);
361 log.info("Alias " + aliases_to_del[i] + " deleted in truststore");
362 }
363 } catch (KeyStoreException e) {
364 log.error("Cannot delete alias " + aliases_to_del[i] + " in user keystore", e );
365 }
366 viewer.refresh();
367 }
368 if (vp instanceof UserCertificateStoreView)
369 EPKeystoreManager.getInstance().getUserkeystore().saveKeyStore();
370 if (vp instanceof TrustedCertificateStoreView)
371 EPKeystoreManager.getInstance().getTrustStore().saveTrustStore();
372 }
373 }
374 }
375 }
376 }