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.encryption.DefaultEncryptionParameters; import org.eparapher.core.encryption.GenericCypher; import org.eparapher.core.interfaces.IUserKeystore; public abstract class GenericDecryptionAction extends GenericAction { private static Logger log = Logger.getLogger(GenericDecryptionAction.class); public GenericDecryptionAction(String msignerName) { super(msignerName); } public GenericDecryptionAction(TreeViewer mviewer, boolean museWizard, String msignerName) { super(mviewer, museWizard, msignerName); } public GenericDecryptionAction(IWorkbenchWindow mwindow, String msignerName) { super(mwindow, msignerName); } abstract GenericCypher getCypher(); abstract void predecryption(IProgressMonitor monitor, GenericCypher cipher, DefaultEncryptionParameters signparams); abstract void decryptFile(IProgressMonitor monitor, File file, GenericCypher cipher, DefaultEncryptionParameters signparams); abstract void postdecryption(IProgressMonitor monitor, GenericCypher cipher, DefaultEncryptionParameters signparams); public void run() { DecryptionJob job = new DecryptionJob(); if (job != null && job.isPrivateKeyLoaded) { job.setUser(true); job.schedule(); } else { log.debug("Private key is not ready : cancelling decryption"); } } private class DecryptionJob extends Job { private String originalAlias; private boolean isPrivateKeyLoaded; protected GenericCypher cipher; private DefaultEncryptionParameters encparams; protected DecryptionJob() { super( actionName + " job"); // Use wizard if needed for parameters encparams = (DefaultEncryptionParameters) getParameters(); if (encparams==null) { log.info("Encryption parameters is empty"); return; } if (encparams.getFileSelection().length==0) { log.info("Nothing to decrypt"); return; } IUserKeystore userpkandcert = EPKeystoreManager.getInstance().getUserkeystore(); if (encparams != null ) { originalAlias = userpkandcert.getDefaultAlias(); if (encparams.getEncryptionAlias() != null && userpkandcert.containsAlias(encparams.getEncryptionAlias()) ) userpkandcert.setDefaultAlias(encparams.getEncryptionAlias()); //Ask PIN or Passphrase and load the private key isPrivateKeyLoaded = userpkandcert.loadPrivateKey(); if (isPrivateKeyLoaded) { cipher = getCypher(); //Verify if algorithm is supported if (cipher.isNotSupported(encparams,userpkandcert.getX509Certificate())) { encparams=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 ( encparams != null && isPrivateKeyLoaded) { predecryption( monitor, cipher, encparams); monitor.beginTask( actionName, encparams.getFileSelection().length ); File[] f2s = encparams.getFileSelection(); for (int i = 0; i < f2s.length; i++) { decryptFile(monitor, f2s[i], cipher, encparams); //refresh the document view refreshView(); } monitor.done(); postdecryption( monitor, cipher, encparams); } //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(); } } ); } } }