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 GenericEncryptionAction extends GenericAction { private static Logger log = Logger.getLogger(GenericEncryptionAction.class); /** * @param msignerName */ public GenericEncryptionAction(String msignerName) { super(msignerName); } /** * @param mviewer * @param museWizard * @param msignerName */ public GenericEncryptionAction(TreeViewer mviewer, boolean museWizard, String msignerName) { super(mviewer, museWizard, msignerName); } /** * @param mwindow * @param msignerName */ public GenericEncryptionAction(IWorkbenchWindow mwindow, String msignerName) { super(mwindow, msignerName); } abstract GenericCypher getCypher(); abstract void preencryption(IProgressMonitor monitor, GenericCypher cipher, DefaultEncryptionParameters signparams); abstract void encryptFile(IProgressMonitor monitor, File file, GenericCypher cipher, DefaultEncryptionParameters signparams); abstract void postencryption(IProgressMonitor monitor, GenericCypher cipher, DefaultEncryptionParameters signparams); public void run() { EncryptionJob job = new EncryptionJob(); if (job != null && job.isPublicKeyLoaded) { job.setUser(true); job.schedule(); } else { log.warn("Public key is not ready : cancelling encryption"); } } private class EncryptionJob extends Job { private String originalAlias; private boolean isPublicKeyLoaded; protected GenericCypher cipher; private DefaultEncryptionParameters encparams; protected EncryptionJob() { super( actionName + " job"); // Use wizard if needed for parameters encparams = (DefaultEncryptionParameters) getParameters(); if (encparams==null) return; if (encparams.getFileSelection().length==0) { log.info("Nothing to encrypt"); 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 isPublicKeyLoaded = userpkandcert.loadPublicInformation(); if (isPublicKeyLoaded) { 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 && isPublicKeyLoaded) { preencryption( monitor, cipher, encparams); monitor.beginTask( actionName + " for "+encparams.getFileSelection().length+" files", encparams.getFileSelection().length ); File[] f2s = encparams.getFileSelection(); for (int i = 0; i < f2s.length; i++) { encryptFile(monitor, f2s[i], cipher, encparams); //refresh the view refreshView(); } monitor.done(); postencryption( 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(); } } ); } } }