/******************************************************************************* * Copyright (c) 2011 Subgraph. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Subgraph - initial API and implementation ******************************************************************************/ package com.subgraph.vega.ui.scanner; import java.net.URI; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Shell; import com.subgraph.vega.api.scanner.IScanProbeResult; import com.subgraph.vega.api.scanner.IScanner; import com.subgraph.vega.api.scanner.IScannerConfig; import com.subgraph.vega.api.scanner.IScanProbeResult.ProbeResultType; public class ScanProbeTask implements Runnable { private final Shell shell; private final URI targetURI; private final IScanner scanner; private final IScannerConfig scannerConfig; ScanProbeTask(Shell shell, URI targetURI, IScanner scanner, IScannerConfig scannerConfig) { this.shell = shell; this.targetURI = targetURI; this.scanner = scanner; this.scannerConfig = scannerConfig; } @Override public void run() { final IScanProbeResult probeResult = scanner.probeTargetURI(targetURI); shell.getDisplay().asyncExec(new Runnable() { @Override public void run() { if(processProbeResult(probeResult)) { scanner.setScannerConfig(scannerConfig); scanner.startScanner(scannerConfig); } else { scanner.unlock(); } } }); } private boolean processProbeResult(IScanProbeResult probeResult) { if(probeResult.getProbeResultType() == ProbeResultType.PROBE_CONNECT_FAILED) { MessageDialog.openError(shell, "Failed to connect to target", probeResult.getFailureMessage()); return false; } else if(probeResult.getProbeResultType() == ProbeResultType.PROBE_REDIRECT) { final URI redirectURI = probeResult.getRedirectTarget(); if(!isTrivialRedirect(targetURI, redirectURI)) { String message = "Target address "+ targetURI + " redirects to address "+ redirectURI + "\n\n"+ "Would you like to scan "+ redirectURI +" instead?"; boolean doit = MessageDialog.openQuestion(shell, "Follow Redirect?", message); if(!doit) { return false; } } scannerConfig.setBaseURI(probeResult.getRedirectTarget()); return true; } else if(probeResult.getProbeResultType() == ProbeResultType.PROBE_REDIRECT_FAILED) { MessageDialog.openError(shell, "Redirect failure", probeResult.getFailureMessage()); return false; } return true; } private boolean isTrivialRedirect(URI original, URI redirect) { final String originalStr = original.toString(); if(originalStr.endsWith("/")) { return false; } return (redirect.toString().equals(originalStr + "/")); } }