blob: 7fba23c823b1d0c9b3aaa6f73da76471dbbab758 [file] [log] [blame]
package org.eclipse.update.internal.ui.security;
/*
* (c) Copyright IBM Corp. 2000, 2002.
* All Rights Reserved.
*/
import java.io.File;
import java.io.IOException;
import java.util.jar.JarFile;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.update.core.*;
import org.eclipse.update.internal.core.UpdateManagerPlugin;
import org.eclipse.update.internal.security.CertificatePair;
import org.eclipse.update.internal.security.JarVerification;
import org.eclipse.update.internal.security.JarVerificationResult;
import org.eclipse.update.internal.security.JarVerifier;
import org.eclipse.update.internal.core.Policy;
/**
*
* Call example:
* JarVerificationService verifier = new JarVerificationService();
* JarVerificationResult result = verifier.verify(IFeature,ContentReferences[], InstallMonitor monitor);
* throws an exception if user canceled or error occured
*/
public class JarVerificationService implements IFeatureVerification {
/**
* The result object
*/
private JarVerificationResult result;
/**
* The JarVerifier is a instance variable
* bacause we want to reuse it upon multiple calls
*/
private JarVerifier jarVerifier;
/**
* the Shell
*/
private Shell shell;
/**
*
*/
private CertificatePair trustedCertificate = null;
/**
* If no shell, create a new shell
*/
public JarVerificationService() {
this(null);
}
/**
*
*/
public JarVerificationService(Shell aShell) {
jarVerifier = new JarVerifier();
shell = aShell;
// find the default display and get the active shell
if (shell == null) {
final Display disp = Display.getDefault();
if (disp == null) {
shell = new Shell(new Display());
} else {
disp.syncExec(new Runnable() {
public void run() {
shell = disp.getActiveShell();
}
});
}
}
}
/**
*/
public JarVerificationResult getResult() {
if (result == null) {
result = new JarVerificationResult();
}
return result;
}
/**
* returns an JarVerificationResult
* The monitor can be null.
*/
private JarVerificationResult okToInstall(
final File jarFile,
final String id,
final String featureName,
final String providerName,
InstallMonitor monitor) {
jarVerifier.setMonitor(monitor);
result = jarVerifier.verify(jarFile);
switch (getResult().getResultCode()) {
case JarVerification.UNKNOWN_ERROR :
{
getResult().setResultCode(JarVerification.ERROR_INSTALL);
break;
}
case JarVerification.VERIFICATION_CANCELLED :
{
getResult().setResultCode(JarVerification.CANCEL_INSTALL);
break;
}
default :
{
if (trustedCertificate != null) {
// check if this is not a user accepted certificate for this feature
CertificatePair[] pairs = getResult().getRootCertificates();
for (int i = 0; i < pairs.length; i++) {
if (trustedCertificate.equals(pairs[i])) {
getResult().setResultCode(JarVerification.OK_TO_INSTALL);
return getResult();
}
}
}
shell.getDisplay().syncExec(new Runnable() {
public void run() {
getResult().setResultCode(openWizard(jarFile, id, featureName, providerName));
}
});
}
}
return getResult();
}
/**
*
*/
private int openWizard(
File jarFile,
String id,
String componentName,
String providerName) {
int code;
JarVerificationDialog dialog =
new JarVerificationDialog(
shell,
id,
componentName,
providerName,
jarFile,
result);
dialog.open();
trustedCertificate = dialog.getCertificate();
if (dialog.okToInstall())
code = JarVerification.OK_TO_INSTALL;
else
code = JarVerification.CANCEL_INSTALL;
return code;
}
/*
* @see IFeatureVerification#verify(IFeature feature,ContentReference[], InstallMonitor)
*/
public void verify(
IFeature feature,
ContentReference[] references,
InstallMonitor monitor)
throws CoreException {
if (references == null || references.length == 0)
return;
try {
for (int i = 0; i < references.length; i++) {
if (references[i] instanceof JarContentReference) {
JarContentReference jarReference = (JarContentReference) references[i];
result =
okToInstall(
jarReference.asFile(),
feature.getVersionedIdentifier().toString(),
feature.getLabel(),
feature.getProvider(),
monitor);
if (result.getResultCode() == JarVerification.CANCEL_INSTALL) {
throw newCoreException(
Policy.bind("JarVerificationService.CancelInstall"), //$NON-NLS-1$
result.getResultException());
}
if (result.getResultCode() == JarVerification.ERROR_INSTALL) {
throw newCoreException(
Policy.bind("JarVerificationService.UnsucessfulVerification"), //$NON-NLS-1$
result.getResultException());
}
}
}
} catch (IOException e) {
throw newCoreException(Policy.bind("JarVerificationService.ErrorDuringVerification"),e); //$NON-NLS-1$
}
}
/**
*
*/
private CoreException newCoreException(String s, Throwable e)
throws CoreException {
String id =
UpdateManagerPlugin.getPlugin().getDescriptor().getUniqueIdentifier();
return new CoreException(new Status(IStatus.ERROR, id, 0, s, e));
}
}