/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* Copyright 2010 psiinon@gmail.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.zaproxy.zap.view;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import org.apache.log4j.Logger;
import org.parosproxy.paros.Constant;
import org.parosproxy.paros.common.AbstractParam;
import org.parosproxy.paros.control.Control;
import org.parosproxy.paros.control.Control.Mode;
import org.parosproxy.paros.extension.AbstractPanel;
import org.parosproxy.paros.extension.ExtensionAdaptor;
import org.parosproxy.paros.model.Model;
import org.parosproxy.paros.model.Session;
import org.parosproxy.paros.model.SiteMap;
import org.parosproxy.paros.model.SiteNode;
import org.parosproxy.paros.view.View;
import org.zaproxy.zap.model.Context;
import org.zaproxy.zap.model.GenericScanner;
import org.zaproxy.zap.users.User;
import org.zaproxy.zap.utils.DisplayUtils;
import org.zaproxy.zap.utils.SortedComboBoxModel;
public abstract class ScanPanel extends AbstractPanel {
private static final long serialVersionUID = 1L;
protected enum Location {start, beforeSites, beforeButtons, beforeProgressBar, afterProgressBar};
public String prefix;
private ExtensionAdaptor extension = null;
private JPanel panelCommand = null;
private JToolBar panelToolbar = null;
private JLabel scannedCountNameLabel = null;
private JLabel foundCountNameLabel = null;
private List<String> activeScans = new ArrayList<>();
private String currentSite = null;
private JComboBox<String> siteSelect = null;
// The siteModel entries are all HTML, with the active ones in bold
private SortedComboBoxModel<String> siteModel = new SortedComboBoxModel<>();
private JButton startScanButton = null;
private JButton stopScanButton = null;
private ZapToggleButton pauseScanButton = null;
private JButton optionsButton = null;
private JProgressBar progressBar = null;
private Map <String, GenericScanner> scanMap = new HashMap<>();
private AbstractParam scanParam = null;
private ScanStatus scanStatus = null;
private Mode mode = Control.getSingleton().getMode();
private static Logger log = Logger.getLogger(ScanPanel.class);
/**
* Constructs a {@code ScanPanel} with the given message resources prefix, tab icon, extension and options.
*
* @param prefix the prefix of the message resources
* @param icon the icon for the tab
* @param extension the extension
* @param scanParam the options
*/
public ScanPanel(String prefix, ImageIcon icon, ExtensionAdaptor extension, AbstractParam scanParam) {
super();
this.prefix = prefix;
this.extension = extension;
this.scanParam = scanParam;
initialize(icon);
log.debug("Constructor " + prefix);
}
/**
* This method initializes this
*
*/
private void initialize(ImageIcon icon) {
this.setLayout(new CardLayout());
if (Model.getSingleton().getOptionsParam().getViewParam().getWmUiHandlingOption() == 0) {
this.setSize(474, 251);
}
this.setName(Constant.messages.getString(prefix + ".panel.title"));
this.setIcon(icon);
this.add(getPanelCommand(), prefix + ".panel");
scanStatus = new ScanStatus(icon, Constant.messages.getString(prefix + ".panel.title"));
if (View.isInitialised()) {
View.getSingleton().getMainFrame().getMainFooterPanel().addFooterToolbarRightLabel(scanStatus.getCountLabel());
}
}
/**
* This method initializes panelCommand
*
* @return javax.swing.JPanel
*/
private javax.swing.JPanel getPanelCommand() {
if (panelCommand == null) {
panelCommand = new javax.swing.JPanel();
panelCommand.setLayout(new java.awt.GridBagLayout());
panelCommand.setName(prefix + ".panel");
GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
gridBagConstraints1.gridx = 0;
gridBagConstraints1.gridy = 0;
gridBagConstraints1.insets = new java.awt.Insets(2,2,2,2);
gridBagConstraints1.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints1.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints1.weightx = 1.0D;
gridBagConstraints2.gridx = 0;
gridBagConstraints2.gridy = 1;
gridBagConstraints2.weightx = 1.0;
gridBagConstraints2.weighty = 1.0;
gridBagConstraints2.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints2.insets = new java.awt.Insets(0,0,0,0);
gridBagConstraints2.anchor = java.awt.GridBagConstraints.NORTHWEST;
panelCommand.add(this.getPanelToolbar(), gridBagConstraints1);
panelCommand.add(getWorkPanel(), gridBagConstraints2);
}
return panelCommand;
}
protected GridBagConstraints getGBC(int gridx, int gridy) {
return this.getGBC(gridx, gridy, 0.0, new Insets(0, 2, 0, 0));
}
protected GridBagConstraints getGBC(int gridx, int gridy, double weightx, Insets insets) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = gridx;
gbc.gridy = gridy;
gbc.weightx = weightx;
if (weightx > 0.0) {
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
}
gbc.insets = insets;
gbc.anchor = java.awt.GridBagConstraints.WEST;
return gbc;
}
private javax.swing.JToolBar getPanelToolbar() {
if (panelToolbar == null) {
panelToolbar = new javax.swing.JToolBar();
panelToolbar.setLayout(new GridBagLayout());
panelToolbar.setEnabled(true);
panelToolbar.setFloatable(false);
panelToolbar.setRollover(true);
panelToolbar.setPreferredSize(new java.awt.Dimension(800,30));
panelToolbar.setName(prefix + ".toolbar");
int x = 0;
x = this.addToolBarElements(panelToolbar, Location.start, x);
panelToolbar.add(new JLabel(Constant.messages.getString(prefix + ".toolbar.site.label")), getGBC(x++,0));
panelToolbar.add(getSiteSelect(), getGBC(x++,0));
x = this.addToolBarElements(panelToolbar, Location.beforeButtons, x);
panelToolbar.add(getStartScanButton(), getGBC(x++,0));
panelToolbar.add(getPauseScanButton(), getGBC(x++,0));
panelToolbar.add(getStopScanButton(), getGBC(x++,0));
x = this.addToolBarElements(panelToolbar, Location.beforeProgressBar, x);
panelToolbar.add(getProgressBar(), getGBC(x++,0, 1.0, new Insets(0,5,0,5)));
panelToolbar.add(getActiveScansNameLabel(), getGBC(x++,0));
panelToolbar.add(getActiveScansValueLabel(), getGBC(x++,0));
x = this.addToolBarElements(panelToolbar, Location.afterProgressBar, x);
panelToolbar.add(new JLabel(), getGBC(x++,0, 1.0, new Insets(0,0,0,0))); // Spacer
panelToolbar.add(getOptionsButton(), getGBC(x++,0));
}
return panelToolbar;
}
/**
* Adds elements to the tool bar. The method is called while initializing the ScanPanel, at the
* points specified by the {@link Location} enumeration. Should be overridden by all subclasses
* that want to add new elements to the ScanPanel's tool bar.
*
* <p>
* The tool bar uses a {@code GridBagLayout}, so elements have to be added with a
* {@code GridBagConstraints}. For this, the {@code getGBC} methods can be used. The {@code gridX} parameter
* specifies the cell (as used in {@code GridBagConstraints.gridx}) of the current row where the elements can
* be added.
* </p>
* <p>
* The method must return the new coordinates of the current cell, after the elements have been
* added.
* </p>
*
* @param toolBar the tool bar
* @param location the current location where elements will be added
* @param gridX the x coordinates of the current cell in the {@code GridBagLayout}
* @return the new coordinates of the current cell, after the elements have been added.
* @see #getGBC(int, int)
* @see #getGBC(int, int, double, Insets)
* @see GridBagConstraints
* @see GridBagLayout
*/
protected int addToolBarElements(JToolBar toolBar, Location location, int gridX) {
return gridX;
}
private JLabel getActiveScansNameLabel() {
if (scannedCountNameLabel == null) {
scannedCountNameLabel = new javax.swing.JLabel();
scannedCountNameLabel.setText(Constant.messages.getString(prefix + ".toolbar.ascans.label"));
}
return scannedCountNameLabel;
}
private JLabel getActiveScansValueLabel() {
if (foundCountNameLabel == null) {
foundCountNameLabel = new javax.swing.JLabel();
foundCountNameLabel.setText(String.valueOf(activeScans.size()));
}
return foundCountNameLabel;
}
private void setActiveScanLabels() {
if (EventQueue.isDispatchThread()) {
setActiveScanLabelsEventHandler();
} else {
try {
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
setActiveScanLabelsEventHandler();
}
});
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
private void setActiveScanLabelsEventHandler() {
getActiveScansValueLabel().setText(String.valueOf(activeScans.size()));
StringBuilder sb = new StringBuilder();
Iterator <String> iter = activeScans.iterator();
sb.append("<html>");
while (iter.hasNext()) {
sb.append(iter.next());
sb.append("<br>");
}
sb.append("</html>");
final String toolTip = sb.toString();
getActiveScansNameLabel().setToolTipText(toolTip);
getActiveScansValueLabel().setToolTipText(toolTip);
scanStatus.setScanCount(activeScans.size());
}
private JProgressBar getProgressBar() {
if (progressBar == null) {
progressBar = new JProgressBar(0, 100);
progressBar.setValue(0);
progressBar.setSize(new Dimension(80,20));
progressBar.setStringPainted(true);
progressBar.setEnabled(false);
}
return progressBar;
}
private JButton getStartScanButton() {
if (startScanButton == null) {
startScanButton = new JButton();
startScanButton.setToolTipText(Constant.messages.getString(prefix + ".toolbar.button.start"));
startScanButton.setIcon(DisplayUtils.getScaledIcon(new ImageIcon(ScanPanel.class.getResource("/resource/icon/16/131.png"))));
startScanButton.setEnabled(false);
startScanButton.addActionListener(new ActionListener () {
@Override
public void actionPerformed(ActionEvent e) {
startScan();
}
});
}
return startScanButton;
}
private JButton getStopScanButton() {
if (stopScanButton == null) {
stopScanButton = new JButton();
stopScanButton.setToolTipText(Constant.messages.getString(prefix + ".toolbar.button.stop"));
stopScanButton.setIcon(DisplayUtils.getScaledIcon(new ImageIcon(ScanPanel.class.getResource("/resource/icon/16/142.png"))));
stopScanButton.setEnabled(false);
stopScanButton.addActionListener(new ActionListener () {
@Override
public void actionPerformed(ActionEvent e) {
stopScan(currentSite);
}
});
}
return stopScanButton;
}
private JToggleButton getPauseScanButton() {
if (pauseScanButton == null) {
pauseScanButton = new ZapToggleButton();
pauseScanButton.setToolTipText(Constant.messages.getString(prefix + ".toolbar.button.pause"));
pauseScanButton.setSelectedToolTipText(Constant.messages.getString(prefix + ".toolbar.button.unpause"));
pauseScanButton.setIcon(DisplayUtils.getScaledIcon(new ImageIcon(ScanPanel.class.getResource("/resource/icon/16/141.png"))));
pauseScanButton.setRolloverIcon(DisplayUtils.getScaledIcon(new ImageIcon(ScanPanel.class.getResource("/resource/icon/16/141.png"))));
pauseScanButton.setSelectedIcon(DisplayUtils.getScaledIcon(new ImageIcon(ScanPanel.class.getResource("/resource/icon/16/131.png"))));
pauseScanButton.setRolloverSelectedIcon(DisplayUtils.getScaledIcon(new ImageIcon(ScanPanel.class.getResource("/resource/icon/16/131.png"))));
pauseScanButton.setEnabled(false);
pauseScanButton.addActionListener(new ActionListener () {
@Override
public void actionPerformed(ActionEvent e) {
pauseScan(currentSite);
}
});
}
return pauseScanButton;
}
private JButton getOptionsButton() {
if (optionsButton == null) {
optionsButton = new JButton();
optionsButton.setToolTipText(Constant.messages.getString(prefix + ".toolbar.button.options"));
optionsButton.setIcon(DisplayUtils.getScaledIcon(new ImageIcon(ScanPanel.class.getResource("/resource/icon/16/041.png"))));
optionsButton.addActionListener(new ActionListener () {
@Override
public void actionPerformed(ActionEvent e) {
Control.getSingleton().getMenuToolsControl().options(
Constant.messages.getString(prefix + ".options.title"));
}
});
}
return optionsButton;
}
protected JComboBox<String> getSiteSelect() {
if (siteSelect == null) {
siteSelect = new JComboBox<>(siteModel);
siteSelect.addItem(Constant.messages.getString(prefix + ".toolbar.site.select"));
siteSelect.setSelectedIndex(0);
siteSelect.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent e) {
String item = (String) siteSelect.getSelectedItem();
if (item != null && siteSelect.getSelectedIndex() > 0) {
siteSelected(item);
} else {
siteSelected(null);
}
}
});
}
return siteSelect;
}
public boolean isScanning(SiteNode node, boolean incPort) {
String site = getSiteFromLabel(cleanSiteName(node, incPort));
if (site != null) {
GenericScanner scanThread = scanMap.get(site);
if (scanThread != null) {
return scanThread.isRunning();
}
}
return false;
}
public void scanAllInScope() {
log.debug("scanSite (all in scope)");
this.setTabFocus();
if (this.getStartScanButton().isEnabled()) {
this.startScan(null, true, true, null, null);
}
}
public void scanAllInContext(Context context){
this.scanAllInContext(context, null);
}
public void scanAllInContext(Context context, User user){
log.debug("Scan all in context: "+context.getName());
this.setTabFocus();
if (this.getStartScanButton().isEnabled()) {
this.startScan(null, true, true, context, user);
}
}
public void scanSite(SiteNode node, boolean incPort) {
log.debug("scanSite " + prefix + " node=" + node.getNodeName());
this.setTabFocus();
nodeSelected(node, incPort);
if (currentSite != null && this.getStartScanButton().isEnabled()) {
startScan(node, false, true, null, null);
}
}
/**
* Scans a node (URL). Equivalent to calling {@link #scanNode(SiteNode, boolean, User)} with a
* null user.
*
* @param node the node
* @param incPort the inc port
*/
public void scanNode(SiteNode node, boolean incPort) {
this.scanNode(node, incPort, null);
}
/**
* Scans a node (URL). If a User is specified, the scan should be done from the point of view of
* the user.
*
* @param node the node
* @param incPort the inc port
* @param user the user
*/
public void scanNode(SiteNode node, boolean incPort, User user) {
log.debug("scanNode" + prefix + " node=" + node.getNodeName());
this.setTabFocus();
nodeSelected(node, incPort);
if (currentSite != null && this.getStartScanButton().isEnabled()) {
startScan(node, false, false, null, user);
}
}
private String activeSitelabel(String site) {
return "<html><b>" + site + "</b></html>";
}
private String passiveSitelabel(String site) {
return "<html>" + site + "</html>";
}
private String getSiteFromLabel(String siteLabel) {
if (siteLabel == null) {
return null;
}
if (siteLabel.startsWith("<html><b>")) {
return siteLabel.substring(9, siteLabel.indexOf("</b>"));
} else if (siteLabel.startsWith("<html>")) {
return siteLabel.substring(6, siteLabel.indexOf("</html>"));
} else {
return siteLabel;
}
}
public void addSite(String site, boolean incPort) {
site = cleanSiteName(site, incPort);
if (!isSiteAdded(site)) {
addSite(site);
}
}
private boolean isSiteAdded(String site) {
return (siteModel.getIndexOf(activeSitelabel(site)) != -1 || siteModel.getIndexOf(passiveSitelabel(site)) != -1);
}
private void addSite(String site) {
log.debug("addSite " + site);
siteModel.addElement(passiveSitelabel(site));
}
protected void siteSelected(String site) {
siteSelected(site, false);
}
protected void siteSelected(String site, boolean forceRefresh) {
if (site == null) {
currentSite = null;
// call with empty string instead of null because of backward compatibility reasons
switchView("");
resetScanState();
return;
}
if (Mode.safe.equals(this.mode)) {
// Safe mode so ignore this
return;
}
site = getSiteFromLabel(site);
if (forceRefresh || ! site.equals(currentSite)) {
if (!isSiteAdded(site)) {
return;
}
if (siteModel.getIndexOf(passiveSitelabel(site)) < 0) {
siteModel.setSelectedItem(activeSitelabel(site));
} else {
siteModel.setSelectedItem(passiveSitelabel(site));
}
GenericScanner scanThread = scanMap.get(site);
if (scanThread == null) {
scanThread = this.newScanThread(site, this.scanParam);
scanMap.put(site, scanThread);
}
if (scanThread.isRunning()) {
getStartScanButton().setEnabled(false);
getStopScanButton().setEnabled(true);
getPauseScanButton().setEnabled(true);
getPauseScanButton().setSelected(scanThread.isPaused());
getProgressBar().setEnabled(true);
} else {
resetScanButtonsAndProgressBarStates(true);
}
getProgressBar().setValue(scanThread.getProgress());
getProgressBar().setMaximum(scanThread.getMaximum());
currentSite = site;
switchView(currentSite);
}
if (Mode.protect.equals(this.mode)) {
// Check to see if in scope
if (! Model.getSingleton().getSession().isInScope(this.getSiteNode(currentSite))) {
resetScanButtonsAndProgressBarStates(false);
}
}
}
private void resetScanButtonsAndProgressBarStates(boolean allowStartScan) {
getStartScanButton().setEnabled(allowStartScan);
getStopScanButton().setEnabled(false);
getPauseScanButton().setEnabled(false);
getPauseScanButton().setSelected(false);
getProgressBar().setEnabled(false);
}
public static String cleanSiteName(String site, boolean incPort) {
boolean ssl = false;
if (site.toLowerCase().startsWith("https:")) {
ssl = true;
}
if (site.indexOf("//") >= 0) {
site = site.substring(site.indexOf("//") + 2);
}
if (site.indexOf(" (") >= 0) {
// Alert counts
site = site.substring(0, site.indexOf(" ("));
}
// does site already contain port number ?
if(site.indexOf(":")>=0) {
if (! incPort) { // We dont't want the port number, strip it off
site = site.substring(0, site.indexOf(":"));
} // otherwise keep it
} else { // The site does not contain the port number
if(incPort) { // But we want it! Add it
if (ssl) {
site += ":443";
} else {
site += ":80";
}
}
} // Site does not contain the port number and we don't want it
// Nothing to do
return site;
}
public static String cleanSiteName(SiteNode node, boolean incPort) {
if (node != null) {
while (node.getParent() != null && node.getParent().getParent() != null) {
node = node.getParent();
}
return cleanSiteName(node.getNodeName(), incPort);
}
return null;
}
protected SiteNode getSiteNode (String siteName) {
SiteMap siteTree = this.getExtension().getModel().getSession().getSiteTree();
SiteNode rootNode = (SiteNode) siteTree.getRoot();
@SuppressWarnings("unchecked")
Enumeration<SiteNode> en = rootNode.children();
while (en.hasMoreElements()) {
SiteNode sn = en.nextElement();
String nodeName = sn.getNodeName();
if (nodeName.toLowerCase().startsWith("https:") && !hasPort(nodeName)) {
nodeName += ":443";
}
if (nodeName.toLowerCase().startsWith("http:") && !hasPort(nodeName)) {
nodeName += ":80";
}
if (nodeName.indexOf("//") >= 0) {
nodeName = nodeName.substring(nodeName.indexOf("//") + 2);
}
if (siteName.equals(nodeName)) {
return sn;
}
}
return null;
}
private static boolean hasPort(String nodeName) {
return nodeName.lastIndexOf(":") != nodeName.indexOf(":");
}
public void nodeSelected(SiteNode node, boolean incPort) {
String site = cleanSiteName(node, incPort);
if (!isSiteAdded(site)) {
addSite(site);
}
siteSelected(site);
}
protected abstract GenericScanner newScanThread (String site, AbstractParam params);
protected void startScan() {
this.startScan(null, false, true, null, null);
}
protected void startSan(SiteNode startNode, boolean justScanInScope, boolean scanChildren, Context scanContext){
this.startScan(startNode, justScanInScope, scanChildren, scanContext, null);
}
protected void startScan(SiteNode startNode, boolean justScanInScope, boolean scanChildren, Context scanContext, User scanUser) {
this.startScan(startNode, justScanInScope, scanChildren, scanContext, scanUser, null);
}
/**
* Does nothing. Override to handle context specific objects
* @param scanThread the thread of the scan
* @param contextSpecificObjects context specific objects to configure the scan
*/
protected void handleContextSpecificObject(GenericScanner scanThread, Object[] contextSpecificObjects) {
}
protected void startScan(SiteNode startNode, boolean justScanInScope, boolean scanChildren,
Context scanContext, User scanUser, Object[] contextSpecificObjects) {
log.debug("startScan " + prefix + " " + startNode);
this.getStartScanButton().setEnabled(false);
this.getStopScanButton().setEnabled(true);
this.getPauseScanButton().setEnabled(true);
this.activeScans.add(currentSite);
GenericScanner scanThread = scanMap.get(currentSite);
if (scanThread.isStopped()) {
// Start a new thread
scanThread.reset();
scanThread = this.newScanThread(currentSite, scanParam);
scanMap.put(currentSite, scanThread);
}
if (justScanInScope) {
scanThread.setStartNode(null);
scanThread.setJustScanInScope(true);
scanThread.setScanContext(scanContext);
} else {
scanThread.setJustScanInScope(false);
scanThread.setScanContext(null);
if (scanThread.getStartNode() == null) {
// Quick fix - need to look at this again
scanThread.setStartNode(startNode);
}
}
scanThread.setScanAsUser(scanUser);
if (scanContext != null) {
scanThread.setTechSet(scanContext.getTechSet());
}
scanThread.setScanChildren(scanChildren);
if (contextSpecificObjects != null) {
this.handleContextSpecificObject(scanThread, contextSpecificObjects);
}
scanThread.start();
scanMap.put(currentSite, scanThread);
setActiveScanLabels();
getProgressBar().setEnabled(true);
getProgressBar().setMaximum(scanThread.getMaximum());
String selectedSite = currentSite; // currentSite can change when we remove elements
if (siteModel.getIndexOf(passiveSitelabel(selectedSite)) >= 0) {
// Change the site label to be bold
siteModel.removeElement(passiveSitelabel(selectedSite));
siteModel.addElement(activeSitelabel(selectedSite));
siteModel.setSelectedItem(activeSitelabel(selectedSite));
}
switchView(currentSite);
}
public void stopScan(String site) {
log.debug("stopScan " + prefix + " on " + site);
GenericScanner scan = scanMap.get(site);
if (scan != null) {
scan.stopScan();
}
}
public void pauseScan(String site) {
log.debug("pauseScan " + prefix + " on " + site);
GenericScanner scan = scanMap.get(site);
if (scan != null) {
if (scan.isPaused()) {
scan.resumeScan();
} else {
scan.pauseScan();
}
}
}
public void scanFinshed(final String host) {
if (EventQueue.isDispatchThread()) {
scanFinshedEventHandler(host);
} else {
try {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
scanFinshedEventHandler(host);
}
});
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
private void scanFinshedEventHandler(String host) {
log.debug("scanFinished " + prefix + " on " + currentSite);
if (host != null && host.equals(currentSite)) {
resetScanButtonsAndProgressBarStates(true);
}
this.activeScans.remove(host);
// Note the label is not now changed back from bold - so you can see which sites have been scanned
/*
// Change the label back from bold
siteModel.removeElement(activeSitelabel(host));
siteModel.addElement(passiveSitelabel(host));
if (host.equals(currentSite)) {
// Its changed under our feet :)
siteModel.setSelectedItem(passiveSitelabel(currentSite));
}
*/
setActiveScanLabels();
}
public void scanProgress(final String host, final int progress, final int maximum) {
if (EventQueue.isDispatchThread()) {
scanProgressEventHandler(host, progress, maximum);
} else {
try {
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
scanProgressEventHandler(host, progress, maximum);
}
});
} catch (InterruptedException e) {
log.info("Interrupt scan progress update on GUI.");
}
catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
private void scanProgressEventHandler(String host, int progress, int maximum) {
//log.debug("scanProgress " + prefix + " on " + currentSite + " " + progress);
if (host.equals(currentSite)) {
getProgressBar().setValue(progress);
getProgressBar().setMaximum(maximum);
}
}
public void reset() {
log.debug("reset " + prefix);
stopAllScans();
siteModel.removeAllElements();
siteSelect.addItem(Constant.messages.getString(prefix + ".toolbar.site.select"));
siteSelect.setSelectedIndex(0);
}
private void stopAllScans() {
for (GenericScanner scanner : scanMap.values()) {
scanner.stopScan();
scanner.reset();
}
// Allow 2 secs for the threads to stop - if we wait 'for ever' then we can get deadlocks
for (int i = 0; i < 20; i++) {
if (activeScans.size() == 0) {
break;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// Ignore
}
}
scanMap.clear();
activeScans.clear();
setActiveScanLabels();
resetScanState();
}
private void resetScanState() {
resetScanButtonsAndProgressBarStates(false);
getProgressBar().setValue(0);
}
public ExtensionAdaptor getExtension() {
return extension;
}
public AbstractParam getScanParam() {
return scanParam;
}
public GenericScanner getScanThread (String site) {
return scanMap.get(site);
}
public Map<String, GenericScanner> getScanThreads () {
return scanMap;
}
public boolean isCurrentSite(String site) {
return currentSite != null && currentSite.equals(site);
}
public void sessionScopeChanged(Session session) {
if (currentSite != null) {
this.siteSelected(currentSite, true);
}
}
public void sessionModeChanged(Mode mode) {
this.mode = mode;
switch (mode) {
case attack:
case standard:
case protect:
getSiteSelect().setEnabled(true);
if (currentSite != null) {
this.siteSelected(currentSite, true);
}
break;
case safe:
// Stop all scans
stopAllScans();
// And disable everything
getSiteSelect().setEnabled(false);
}
}
/**
* Gets the current site selected on this panel.
*
* @return the current site
*/
protected String getCurrentSite(){
return this.currentSite;
}
protected void unload() {
if (View.isInitialised()) {
View.getSingleton().getMainFrame().getMainFooterPanel().removeFooterToolbarRightLabel(scanStatus.getCountLabel());
}
}
protected abstract Component getWorkPanel();
protected abstract void switchView (String site);
}