1 package org.eparapher.rcp.actions;
2
3 import java.io.File;
4 import java.security.KeyStoreException;
5 import java.util.ArrayList;
6 import java.util.Iterator;
7
8 import org.apache.log4j.Logger;
9 import org.eclipse.core.runtime.IProgressMonitor;
10 import org.eclipse.core.runtime.IStatus;
11 import org.eclipse.core.runtime.Status;
12 import org.eclipse.core.runtime.jobs.IJobChangeEvent;
13 import org.eclipse.core.runtime.jobs.Job;
14 import org.eclipse.core.runtime.jobs.JobChangeAdapter;
15 import org.eclipse.jface.action.Action;
16 import org.eclipse.jface.viewers.ISelection;
17 import org.eclipse.jface.viewers.IStructuredSelection;
18 import org.eclipse.jface.viewers.TreeViewer;
19 import org.eclipse.jface.window.Window;
20 import org.eclipse.jface.wizard.WizardDialog;
21 import org.eclipse.swt.SWT;
22 import org.eclipse.swt.widgets.Display;
23 import org.eclipse.ui.IWorkbenchWindow;
24 import org.eclipse.ui.PlatformUI;
25 import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
26 import org.eparapher.core.crypto.EPKeystoreManager;
27 import org.eparapher.core.crypto.cert.CertificateManager;
28 import org.eparapher.core.crypto.keystore.IUserKeystore;
29 import org.eparapher.core.signature.PDFSignatureParameters;
30 import org.eparapher.core.signature.PDFSigner;
31 import org.eparapher.core.tools.PDFConverterWrapper;
32 import org.eparapher.rcp.tools.GUIIcons;
33 import org.eparapher.rcp.tools.eParapherTools;
34 import org.eparapher.rcp.views.documents.SecuredDocumentsView.TreeObject;
35 import org.eparapher.rcp.views.documents.SecuredDocumentsView.TreeParent;
36 import org.eparapher.rcp.wizards.PDFSigningWizard;
37
38
39 public class ToPDFAndSignDocumentAction extends Action implements IWorkbenchAction {
40
41 private static Logger log = Logger.getLogger(ToPDFAndSignDocumentAction.class);
42
43 private TreeViewer viewer;
44 private boolean usewizard;
45 private IWorkbenchWindow window;
46
47 public ToPDFAndSignDocumentAction() {
48 this(null,true);
49 }
50
51 public ToPDFAndSignDocumentAction(TreeViewer mviewer, boolean museWizard) {
52 super();
53 viewer = mviewer;
54 usewizard = museWizard;
55 window = null;
56 this.setId("ToPDFAndSignDocumentAction");
57 this.setImageDescriptor(GUIIcons.PDF_ICON);
58 if (!usewizard) {
59 this.setText("Convert to PDF and Sign");
60 this.setToolTipText("Convert to PDF and Sign CMS with default parameters");
61 this.setAccelerator(SWT.CTRL | 'G');
62 } else {
63 this.setText("Convert to PDF and Sign (wizard)");
64 this.setToolTipText("Convert to PDF and Sign using a wizard");
65 this.setAccelerator(SWT.CTRL | 'H');
66 }
67 }
68
69 public ToPDFAndSignDocumentAction(IWorkbenchWindow mwindow) {
70 this();
71 window=mwindow;
72 }
73
74 public void run() {
75 PDFConvertAndSignJob job = new PDFConvertAndSignJob();
76 job.setUser(true);
77 job.schedule();
78 }
79
80 private PDFSignatureParameters getSignatureParameters() {
81
82 PDFSignatureParameters pdfsignparams = new PDFSignatureParameters();
83 pdfsignparams.setPdfsignatureParamsFromPreferences();
84 if (viewer !=null)
85 pdfsignparams.setFileSelectiontoSign(getFileSelectionFromView());
86
87 if (usewizard) {
88
89 PDFSigningWizard pdfWizard = new PDFSigningWizard(pdfsignparams);
90 if (window==null)
91 window=PlatformUI.getWorkbench().getActiveWorkbenchWindow();
92 WizardDialog dialog = new WizardDialog(window.getShell(), pdfWizard);
93 if ( dialog.open() != Window.OK ) {
94 log.info("PDF converter ans signature option wizard cancelled");
95 return null;
96 }
97
98 pdfsignparams = pdfWizard.getPdfsignatureparams();
99 }
100 return pdfsignparams;
101 }
102
103 private File[] getFileSelectionFromView() {
104
105 ArrayList<File> fileList = new ArrayList<File>();
106
107 if (viewer.getSelection()!=null && !viewer.getSelection().isEmpty()) {
108 ISelection selection = viewer.getSelection();
109 IStructuredSelection structselection = (IStructuredSelection) selection;
110
111
112 for (Iterator<Object> iterator = structselection.iterator(); iterator.hasNext();) {
113 Object obj = iterator.next();
114 if (obj instanceof TreeParent)
115
116 eParapherTools.debugMessage("Cannot sign a directory!");
117 else {
118 TreeObject to = (TreeObject) obj;
119 File f = new File(to.getFilePath());
120 if (!f.exists())
121 log.error("file " + to.getFilePath() + " has been deleted");
122 else
123 fileList.add(f);
124 }
125 }
126 }
127 return fileList.toArray(new File[] {});
128 }
129 public void dispose() {
130 }
131
132 class PDFConvertAndSignJob extends Job {
133
134 private PDFSignatureParameters pdfsignatureparams;
135 private PDFSigner pdfsigner;
136 private PDFConverterWrapper pdfconverter;
137
138 private String originalAlias;
139 protected boolean isSigningPrivateKeyLoaded;
140
141 protected PDFConvertAndSignJob() {
142
143 super("Converting to PDF and Sign");
144
145
146 pdfsignatureparams = getSignatureParameters();
147
148 IUserKeystore uk = EPKeystoreManager.getInstance().getUserkeystore();
149
150 try {
151
152
153 if (pdfsignatureparams!=null) {
154
155
156 originalAlias = uk.getDefaultAlias();
157 if (pdfsignatureparams.getSignatureAlias()!=null
158 && uk.containsAlias(pdfsignatureparams.getSignatureAlias()) )
159 uk.setDefaultAlias(pdfsignatureparams.getSignatureAlias());
160
161
162 if (CertificateManager.isECCertificate(uk.getX509Certificate())) {
163 pdfsignatureparams=null;
164 eParapherTools.errorMessage("Elliptic curve keys are not supported yet for PDF Signing.\r\n Please use a RSA or DSA Keypair & Certificate.");
165 }
166
167 isSigningPrivateKeyLoaded = uk.loadPrivateKey();
168
169 if (isSigningPrivateKeyLoaded) {
170 pdfsigner = new PDFSigner();
171
172 pdfconverter = new PDFConverterWrapper();
173
174
175 this.addJobChangeListener(new JobChangeAdapter() {
176 public void done(IJobChangeEvent event) {
177 if (event.getResult().isOK())
178 log.info("PDF convertion and signing job completed successfully");
179 else
180 log.error("PDF convertion and signing job did not complete successfully");
181 }
182 });
183 }
184 }
185 } catch (KeyStoreException e) {
186 log.error("Error in PDFConvertAndSignJob",e);
187 } catch (Throwable t) {
188 log.error("Error in PDFConvertAndSignJob",t);
189 }
190 }
191
192 @SuppressWarnings("unchecked")
193 @Override
194 protected IStatus run(IProgressMonitor monitor) {
195 if (pdfsignatureparams!=null && isSigningPrivateKeyLoaded) {
196
197 monitor.beginTask("Converting to PDF and Sign", pdfsignatureparams.getFileSelectiontoSign().length*2 );
198 File[] f2s = pdfsignatureparams.getFileSelectiontoSign();
199 for (int i = 0; i < f2s.length; i++) {
200
201 if (f2s[i].getName().toLowerCase().endsWith(".pdf")) {
202 monitor.subTask("Signing "+f2s[i].getName());
203 pdfsigner.sign(f2s[i].getAbsolutePath(), pdfsignatureparams, false);
204 monitor.worked(2);
205 } else {
206 monitor.subTask("Converting "+f2s[i].getName()+" to PDF");
207 String converted_unsigned_pdf = null;
208 try {
209 converted_unsigned_pdf = pdfconverter.convert(f2s[i].getAbsolutePath());
210 monitor.worked(1);
211 if (converted_unsigned_pdf!=null) {
212 monitor.subTask("Signing "+converted_unsigned_pdf);
213 pdfsigner.sign( converted_unsigned_pdf, pdfsignatureparams, true );
214 }
215 monitor.worked(1);
216 } catch (Exception e) {
217 final String eLabel = e.getLocalizedMessage();
218 Display.getDefault().asyncExec( new Runnable() {
219 public void run() { eParapherTools.errorMessage( eLabel ); }
220 });
221 }
222 }
223
224 refreshView();
225 }
226 monitor.done();
227
228 }
229 if (originalAlias!=null)
230 EPKeystoreManager.getInstance().getUserkeystore().setDefaultAlias(originalAlias);
231 return Status.OK_STATUS;
232 }
233
234 private void refreshView() {
235 Display.getDefault().asyncExec(
236 new Runnable() {
237 public void run() { viewer.refresh(); }
238 }
239 );
240 }
241 }
242 }