All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.zaproxy.zap.view.panels.AbstractContextSelectToolbarStatusPanel Maven / Gradle / Ivy

Go to download

The Zed Attack Proxy (ZAP) is an easy to use integrated penetration testing tool for finding vulnerabilities in web applications. It is designed to be used by people with a wide range of security experience and as such is ideal for developers and functional testers who are new to penetration testing. ZAP provides automated scanners as well as a set of tools that allow you to find security vulnerabilities manually.

There is a newer version: 2.16.0
Show newest version
/*
 * Zed Attack Proxy (ZAP) and its related class files.
 *
 * ZAP is an HTTP/HTTPS proxy for assessing web application security.
 *
 * Copyright 2014 The ZAP Development Team
 *
 * 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.panels;

import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JToolBar;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.parosproxy.paros.Constant;
import org.parosproxy.paros.control.Control;
import org.parosproxy.paros.extension.AbstractPanel;
import org.parosproxy.paros.model.Model;
import org.parosproxy.paros.model.Session.OnContextsChangedListener;
import org.zaproxy.zap.model.Context;
import org.zaproxy.zap.view.LayoutHelper;
import org.zaproxy.zap.view.ScanPanel;
import org.zaproxy.zap.view.widgets.ContextSelectComboBox;

/**
 * A base implementation for a status panel with a control toolbar that shows information/actions
 * based on a selected {@link Context}.
 *
 * @see #unload()
 */
public abstract class AbstractContextSelectToolbarStatusPanel extends AbstractPanel
        implements OnContextsChangedListener {

    private static final long serialVersionUID = 7164298579345445108L;
    private static final Logger log =
            LogManager.getLogger(AbstractContextSelectToolbarStatusPanel.class);

    /**
     * Location provided to {@link #addToolBarElements(JToolBar, short, int)} to add items at the
     * beginning of the toolbar.
     */
    protected static final short TOOLBAR_LOCATION_START = 0;
    /**
     * Location provided to {@link #addToolBarElements(JToolBar, short, int)} to add items right
     * after the context selection box.
     */
    protected static final short TOOLBAR_LOCATION_AFTER_CONTEXTS_SELECT = 1;
    /**
     * Location provided to {@link #addToolBarElements(JToolBar, short, int)} to add items at the
     * end of the toolbar
     */
    protected static final short TOOLBAR_LOCATION_END = 99;

    protected String panelPrefix;

    private JToolBar panelToolbar = null;
    private JButton optionsButton = null;
    private ContextSelectComboBox contextSelectBox;

    public AbstractContextSelectToolbarStatusPanel(String prefix, ImageIcon icon) {
        super();
        this.panelPrefix = prefix;
        initialize(icon);
    }

    private void initialize(ImageIcon icon) {
        if (Model.getSingleton().getOptionsParam().getViewParam().getWmUiHandlingOption() == 0) {
            this.setSize(474, 251);
        }
        this.setName(Constant.messages.getString(panelPrefix + ".panel.title"));
        this.setIcon(icon);

        // Add the two components
        this.setLayout(new GridBagLayout());
        this.add(
                getPanelToolbar(),
                LayoutHelper.getGBC(0, 0, 1, 1.0d, 0.0d, GridBagConstraints.HORIZONTAL));
        this.add(getWorkPanel(), LayoutHelper.getGBC(0, 1, 1, 1.0d, 1.0d, GridBagConstraints.BOTH));

        // Register to be notified when the list of contexts changes
        Model.getSingleton().getSession().addOnContextsChangedListener(this);
    }

    private 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(panelPrefix + ".toolbar");

            setupToolbarElements(panelToolbar);
        }
        return panelToolbar;
    }

    /**
     * Method used to setup the toolbar elements. Should not usually be overridden. Instead, use the
     * {@link #addToolBarElements(JToolBar, short, int)} method to add elements at various points.
     *
     * @param toolbar the tool bar of the status panel
     */
    protected void setupToolbarElements(JToolBar toolbar) {
        int x = 0;
        Insets insets = new Insets(0, 4, 0, 2);

        x = this.addToolBarElements(toolbar, TOOLBAR_LOCATION_START, x);

        toolbar.add(
                new JLabel(Constant.messages.getString(panelPrefix + ".toolbar.context.label")),
                LayoutHelper.getGBC(x++, 0, 1, 0, insets));
        toolbar.add(getContextSelectComboBox(), LayoutHelper.getGBC(x++, 0, 1, 0, insets));

        x = this.addToolBarElements(toolbar, TOOLBAR_LOCATION_AFTER_CONTEXTS_SELECT, x);

        toolbar.add(new JLabel(), LayoutHelper.getGBC(x++, 0, 1, 1.0)); // Spacer
        if (hasOptions()) {
            toolbar.add(getOptionsButton(), LayoutHelper.getGBC(x++, 0, 1, 0, insets));
        }

        this.addToolBarElements(toolbar, TOOLBAR_LOCATION_END, x);
    }

    /**
     * Gets the options button.
     *
     * @return the options button
     */
    protected JButton getOptionsButton() {
        if (optionsButton == null) {
            optionsButton = new JButton();
            optionsButton.setToolTipText(
                    Constant.messages.getString(panelPrefix + ".toolbar.button.options"));
            optionsButton.setIcon(
                    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(
                                                    panelPrefix + ".options.title"));
                        }
                    });
        }
        return optionsButton;
    }

    /**
     * Gets the Context select combo box.
     *
     * @return the context select combo box
     */
    protected ContextSelectComboBox getContextSelectComboBox() {
        if (contextSelectBox == null) {
            contextSelectBox = new ContextSelectComboBox();
            contextSelectBox.addActionListener(
                    new ActionListener() {
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            contextSelected((Context) contextSelectBox.getSelectedItem());
                        }
                    });
        }
        return contextSelectBox;
    }

    /**
     * Adds elements to the tool bar. The method is called while initializing the StatusPanel, at
     * some specific points ({@code TOOLBAR_LOCATION_*} constants):
     *
     * 
    *
  • {@link #TOOLBAR_LOCATION_START} *
  • {@link #TOOLBAR_LOCATION_AFTER_CONTEXTS_SELECT} *
  • {@link #TOOLBAR_LOCATION_END} *
  • other {@code TOOLBAR_LOCATION_*} constants defined in extending classes (if case) *
* *

Should be overridden by all subclasses that want to add new elements to the ScanPanel's * tool bar. * *

The tool bar uses a {@link GridBagLayout}, so elements have to be added with a {@link * GridBagConstraints}. For this, the {@link LayoutHelper#getGBC(int, int, int, double)} methods * can be used. The {@code gridX} parameter specifies the cell (as used in {@link * GridBagConstraints#gridx}) of the current row where the elements can be added. * *

The method must return the new coordinates of the current cell, after the elements have * been added. * * @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 LayoutHelper * @see GridBagConstraints * @see GridBagLayout */ protected int addToolBarElements(JToolBar toolBar, short location, int gridX) { return gridX; } /** * Method called whenever a new context is selected. * * @param context the context that was selected */ protected void contextSelected(Context context) { log.debug("Selected new context: " + context); switchViewForContext(context); } /** * Gets the selected context. * * @return the selected context */ public Context getSelectedContext() { return contextSelectBox.getSelectedContext(); } @Override public void contextAdded(Context context) { log.debug("Context added..."); contextSelectBox.reloadContexts(true); } @Override public void contextDeleted(Context context) { log.debug("Context deleted..."); contextSelectBox.reloadContexts(false); contextSelectBox.setSelectedIndex(-1); } @Override public void contextsChanged() { log.debug("Contexts changed..."); contextSelectBox.reloadContexts(false); contextSelectBox.setSelectedIndex(-1); } /** * Unloads the status panel. * *

This method should be called once the panel is no longer needed, to detach it from core * (persistent) classes. * * @since 2.7.0 */ public void unload() { Model.getSingleton().getSession().removeOnContextsChangedListener(this); } /** * Called during initialization to check whether an Options button should be added to the * toolbar or not. Implementations can override this method to remove the default Options * button. * * @return {@code true} if the tool bar should show an Options button, {@code false} otherwise */ protected boolean hasOptions() { return true; } /** * Called in order to build the main panel displayed below the toolbar. * * @return the main panel */ protected abstract Component getWorkPanel(); /** * Called in order to switch the data displayed on the main panel below the toolbar for a new * context. * *

NOTE: Should not recreate a new work panel, but change the existing one * (obtained through the first call to {@link #getWorkPanel()}) to show the new data (e.g. * change the DataModel for a table). * * @param context the context for which to display the panel */ protected abstract void switchViewForContext(Context context); }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy