com.subgraph.vega.ui.scanner.ScanProbeTask.java Source code

Java tutorial

Introduction

Here is the source code for com.subgraph.vega.ui.scanner.ScanProbeTask.java

Source

/*******************************************************************************
 * 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 + "/"));
    }

}