package eu.geclipse.ui.internal.wizards; import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.wizard.Wizard; import org.eclipse.jface.wizard.WizardPage; import eu.geclipse.core.reporting.ProblemException; import eu.geclipse.core.security.ICertificateLoader; import eu.geclipse.core.security.Security; import eu.geclipse.core.security.ICertificateLoader.CertificateID; import eu.geclipse.core.security.ICertificateManager.CertTrust; import eu.geclipse.ui.dialogs.ProblemDialog; import eu.geclipse.ui.internal.Activator; public class CertificateImportWizard extends Wizard { private CertificateLoaderSelectionPage loaderPage; private CertificateChooserPage chooserPage; public CertificateImportWizard() { setNeedsProgressMonitor( true ); URL imgUrl = Activator.getDefault().getBundle().getEntry( "icons/wizban/cacert_wiz.gif" ); //$NON-NLS-1$ setDefaultPageImageDescriptor( ImageDescriptor.createFromURL( imgUrl ) ); } @Override public void addPages() { this.loaderPage = new CertificateLoaderSelectionPage(); addPage( this.loaderPage ); this.chooserPage = new CertificateChooserPage( this.loaderPage ); addPage( this.chooserPage ); } @Override public boolean canFinish() { return ( getContainer().getCurrentPage() == this.chooserPage ) && this.chooserPage.isPageComplete(); } @Override public String getWindowTitle() { return "Certificate import"; } @Override public boolean performFinish() { boolean result = true; WizardPage currentPage = ( WizardPage ) getContainer().getCurrentPage(); currentPage.setErrorMessage( null ); final ICertificateLoader loader = this.loaderPage.getSelectedLoader(); final CertificateID[] certificates = this.chooserPage.getSelectedCertificates(); try { getContainer().run( true, true, new IRunnableWithProgress() { public void run( final IProgressMonitor monitor ) throws InvocationTargetException, InterruptedException { monitor.beginTask( "Importing certificates", certificates.length ); List< X509Certificate > certList = new ArrayList< X509Certificate >(); try { for ( CertificateID certID : certificates ) { if ( monitor.isCanceled() ) { throw new OperationCanceledException(); } SubProgressMonitor subMonitor = new SubProgressMonitor( monitor, 1 ); X509Certificate certificate = loader.fetchCertificate( certID, subMonitor ); if ( certificate != null ) { certList.add( certificate ); } } } catch ( ProblemException pExc ) { throw new InvocationTargetException( pExc ); } finally { monitor.done(); } if ( !certList.isEmpty() ) { X509Certificate[] certArray = certList.toArray( new X509Certificate[ certList.size() ] ); try { Security.getCertificateManager().addCertificates( certArray, CertTrust.AlwaysTrusted ); } catch( ProblemException pExc ) { throw new InvocationTargetException( pExc ); } } } } ); } catch ( InvocationTargetException itExc ) { Throwable cause = itExc.getCause() == null ? itExc : itExc.getCause(); ProblemDialog.openProblem( getShell(), "Certifcate import failed", "A problem occured while the certificates were imported. At least parts of the certificates may not have been imported properly.", cause ); currentPage.setErrorMessage( cause.getLocalizedMessage() ); result = false; } catch ( InterruptedException intExc ) { currentPage.setErrorMessage( intExc.getLocalizedMessage() ); result = false; } return result; } }