View Javadoc

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  			//Launch Wizard to get PDF Signature Parameters
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  			//recover params from wizard
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 			//Build File Array from Table Selection
112 			for (Iterator<Object> iterator = structselection.iterator(); iterator.hasNext();) {
113 				Object obj =  iterator.next();
114 				if (obj instanceof TreeParent)
115 					//TODO : sign all files in a directory (if confirm?)
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 			// Getting signature settings (with wizard if needed)
146 			pdfsignatureparams = getSignatureParameters();
147 
148 			IUserKeystore uk = EPKeystoreManager.getInstance().getUserkeystore();
149 
150 			try {
151 				
152 				//Load private key for the coming signing operation
153 				if (pdfsignatureparams!=null) {
154 					
155 					// Set the alias keystore to use
156 					originalAlias = uk.getDefaultAlias();
157 					if (pdfsignatureparams.getSignatureAlias()!=null
158 						&& uk.containsAlias(pdfsignatureparams.getSignatureAlias()) )
159 						uk.setDefaultAlias(pdfsignatureparams.getSignatureAlias());
160 
161 					//Verify if algorithm is supported (Elliptic curve not supported yet)
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 					//Load the private key (Ask PIN or Passphrase)
167 					isSigningPrivateKeyLoaded = uk.loadPrivateKey();
168 					
169 					if (isSigningPrivateKeyLoaded) {
170 						pdfsigner = new PDFSigner();
171 						//Start OpenOffice if needed
172 						pdfconverter = new PDFConverterWrapper();
173 						
174 						//End Job Listener
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 					//refresh the view
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 }