/** * */ package org.eparapher.rcp.actions; import java.io.File; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobChangeEvent; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbenchWindow; import org.eparapher.core.crypto.EPKeystoreManager; import org.eparapher.core.interfaces.IUserKeystore; import org.eparapher.core.signature.DefaultSignatureParameters; import org.eparapher.core.signature.GenericSigner; /** * @author Arnault MICHEL * */ public abstract class GenericSignatureAction extends GenericAction { private static Logger log = Logger.getLogger(GenericAction.class); /** * @param msignerName */ public GenericSignatureAction(String msignerName) { super(msignerName); } /** * @param mviewer * @param museWizard * @param msignerName */ public GenericSignatureAction(TreeViewer mviewer, boolean museWizard, String msignerName) { super(mviewer, museWizard, msignerName); } /** * @param mwindow * @param msignerName */ public GenericSignatureAction(IWorkbenchWindow mwindow, String msignerName) { super(mwindow, msignerName); } abstract GenericSigner getSigner(); abstract void presignature(IProgressMonitor monitor, GenericSigner signer, DefaultSignatureParameters signparams); abstract void signFile(IProgressMonitor monitor, File file, GenericSigner signer, DefaultSignatureParameters signparams); abstract void postsignature(IProgressMonitor monitor, GenericSigner signer, DefaultSignatureParameters signparams); public void run() { SecurityJob job = new SecurityJob(); if (job != null && job.isSigningPrivateKeyLoaded) { job.setUser(true); job.schedule(); } else { log.warn("Private key is not ready : cancelling signature"); } } private class SecurityJob extends Job { private String originalAlias; private boolean isSigningPrivateKeyLoaded; protected GenericSigner signer; private DefaultSignatureParameters signparams; protected SecurityJob() { super( actionName + " job"); // Use wizard if needed for signature parameters signparams = (DefaultSignatureParameters) getParameters(); if (signparams==null) return; if ( signparams.getFileSelection().length==0 ) { log.info("Nothing to sign"); return; } //Verify if algorithm is supported (Elliptic curve not supported yet) IUserKeystore userpkandcert = EPKeystoreManager.getInstance().getUserkeystore(); if (signparams != null ) { // Set the alias keystore to use originalAlias = userpkandcert.getDefaultAlias(); if (signparams.getSignatureAlias()!=null && userpkandcert.containsAlias(signparams.getSignatureAlias()) ) userpkandcert.setDefaultAlias(signparams.getSignatureAlias()); //Ask PIN or Passphrase and load the private key isSigningPrivateKeyLoaded = userpkandcert.loadPrivateKey(); if (isSigningPrivateKeyLoaded) { signer = getSigner(); //Verify if algorithm is supported (Elliptic curve not supported yet for PDF and XML encryption) if (signer.isNotSupported(signparams,userpkandcert.getX509Certificate())) { signparams=null; } //End Job Listener this.addJobChangeListener(new JobChangeAdapter() { public void done(IJobChangeEvent event) { if (event.getResult().isOK()) log.info( actionName + " job completed successfully"); else log.warn( actionName + " job did not complete successfully"); } }); } } } @SuppressWarnings("unchecked") @Override protected IStatus run(IProgressMonitor monitor) { if ( signparams != null && isSigningPrivateKeyLoaded) { presignature( monitor, signer, signparams); monitor.beginTask( actionName, signparams.getFileSelection().length ); File[] f2s = signparams.getFileSelection(); for (int i = 0; i < f2s.length; i++) { signFile(monitor, f2s[i], signer, signparams); //refresh the view refreshView(); } monitor.done(); postsignature( monitor, signer, signparams); } //Reset the original alias if (originalAlias!=null) EPKeystoreManager.getInstance().getUserkeystore().setDefaultAlias(originalAlias); return Status.OK_STATUS; } private void refreshView() { if (viewer != null) Display.getDefault().asyncExec( new Runnable() { public void run() { viewer.refresh(); } } ); } } }