/* * 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.extension.params; import java.awt.CardLayout; import java.awt.Event; import java.awt.GridBagConstraints; import java.awt.Toolkit; import java.awt.event.KeyEvent; import javax.swing.ImageIcon; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JToolBar; import javax.swing.KeyStroke; import org.jdesktop.swingx.JXTable; import org.parosproxy.paros.Constant; import org.parosproxy.paros.extension.AbstractPanel; import org.parosproxy.paros.model.SiteNode; import org.parosproxy.paros.network.HtmlParameter; import org.parosproxy.paros.view.View; import org.zaproxy.zap.utils.SortedComboBoxModel; import org.zaproxy.zap.view.ScanPanel; public class ParamsPanel extends AbstractPanel{ private static final long serialVersionUID = 1L; public static final String PANEL_NAME = "params"; private ExtensionParams extension = null; private JPanel panelCommand = null; private JToolBar panelToolbar = null; private JScrollPane jScrollPane = null; private String currentSite = null; private JComboBox<String> siteSelect = null; private SortedComboBoxModel<String> siteModel = new SortedComboBoxModel<>(); //private JButton optionsButton = null; private JXTable paramsTable = null; private ParamsTableModel paramsModel = new ParamsTableModel(); //private static Log log = LogFactory.getLog(ParamsPanel.class); public ParamsPanel(ExtensionParams extension) { super(); this.extension = extension; initialize(); } /** * This method initializes this */ private void initialize() { this.setLayout(new CardLayout()); this.setSize(474, 251); this.setName(Constant.messages.getString("params.panel.title")); this.setIcon(new ImageIcon(ParamsPanel.class.getResource("/resource/icon/16/179.png"))); // 'form' icon this.setDefaultAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | Event.SHIFT_MASK, false)); this.setMnemonic(Constant.messages.getChar("params.panel.mnemonic")); this.add(getPanelCommand(), getPanelCommand().getName()); } /** * 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("Params"); 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(getJScrollPane(), gridBagConstraints2); } return panelCommand; } private javax.swing.JToolBar getPanelToolbar() { if (panelToolbar == null) { panelToolbar = new javax.swing.JToolBar(); panelToolbar.setLayout(new java.awt.GridBagLayout()); panelToolbar.setEnabled(true); panelToolbar.setFloatable(false); panelToolbar.setRollover(true); panelToolbar.setPreferredSize(new java.awt.Dimension(800,30)); panelToolbar.setName("ParamsToolbar"); GridBagConstraints gridBagConstraints0 = new GridBagConstraints(); GridBagConstraints gridBagConstraints1 = new GridBagConstraints(); GridBagConstraints gridBagConstraints2 = new GridBagConstraints(); GridBagConstraints gridBagConstraintsx = new GridBagConstraints(); gridBagConstraints0.gridx = 0; gridBagConstraints0.gridy = 0; gridBagConstraints0.insets = new java.awt.Insets(0,0,0,0); gridBagConstraints0.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints1.gridx = 1; gridBagConstraints1.gridy = 0; gridBagConstraints1.insets = new java.awt.Insets(0,0,0,0); gridBagConstraints1.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints2.gridx = 2; gridBagConstraints2.gridy = 0; gridBagConstraints2.insets = new java.awt.Insets(0,0,0,0); gridBagConstraints2.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraintsx.gridx = 3; gridBagConstraintsx.gridy = 0; gridBagConstraintsx.weightx = 1.0; gridBagConstraintsx.weighty = 1.0; gridBagConstraintsx.insets = new java.awt.Insets(0,0,0,0); gridBagConstraintsx.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraintsx.fill = java.awt.GridBagConstraints.HORIZONTAL; JLabel t1 = new JLabel(); //panelToolbar.add(getOptionsButton(), gridBagConstraints0); panelToolbar.add(new JLabel(Constant.messages.getString("params.toolbar.site.label")), gridBagConstraints1); panelToolbar.add(getSiteSelect(), gridBagConstraints2); panelToolbar.add(t1, gridBagConstraintsx); } return panelToolbar; } /* * Displaying the ANTI CSRF options might not actually make that much sense... private JButton getOptionsButton() { if (optionsButton == null) { optionsButton = new JButton(); optionsButton.setToolTipText(Constant.messages.getString("params.toolbar.button.options")); optionsButton.setIcon(new ImageIcon(ParamsPanel.class.getResource("/resource/icon/16/041.png"))); // 'Gears' icon optionsButton.setEnabled(false); optionsButton.addActionListener(new ActionListener () { @Override public void actionPerformed(ActionEvent e) { Control.getSingleton().getMenuToolsControl().options(Constant.messages.getString("options.acsrf.title")); } }); } return optionsButton; } */ private JScrollPane getJScrollPane() { if (jScrollPane == null) { jScrollPane = new JScrollPane(); jScrollPane.setViewportView(getParamsTable()); } return jScrollPane; } private void setParamsTableColumnSizes() { paramsTable.getColumnModel().getColumn(0).setMinWidth(50); paramsTable.getColumnModel().getColumn(0).setPreferredWidth(100); // type paramsTable.getColumnModel().getColumn(1).setMinWidth(100); paramsTable.getColumnModel().getColumn(1).setPreferredWidth(200); // name paramsTable.getColumnModel().getColumn(2).setMinWidth(50); paramsTable.getColumnModel().getColumn(2).setPreferredWidth(100); // used paramsTable.getColumnModel().getColumn(3).setMinWidth(50); paramsTable.getColumnModel().getColumn(3).setPreferredWidth(100); // numvals paramsTable.getColumnModel().getColumn(4).setMinWidth(50); paramsTable.getColumnModel().getColumn(4).setPreferredWidth(100); // % change paramsTable.getColumnModel().getColumn(5).setMinWidth(50); paramsTable.getColumnModel().getColumn(5).setPreferredWidth(200); // flags } protected JXTable getParamsTable() { if (paramsTable == null) { paramsTable = new JXTable(paramsModel); paramsTable.setColumnSelectionAllowed(false); paramsTable.setCellSelectionEnabled(false); paramsTable.setRowSelectionAllowed(true); paramsTable.setAutoCreateRowSorter(true); paramsTable.setColumnControlVisible(true); this.setParamsTableColumnSizes(); paramsTable.setName(PANEL_NAME); paramsTable.setDoubleBuffered(true); paramsTable.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mousePressed(java.awt.event.MouseEvent e) { showPopupMenuIfTriggered(e); } @Override public void mouseReleased(java.awt.event.MouseEvent e) { showPopupMenuIfTriggered(e); } private void showPopupMenuIfTriggered(java.awt.event.MouseEvent e) { if (e.isPopupTrigger()) { // Select table item int row = paramsTable.rowAtPoint( e.getPoint() ); if ( row < 0 || !paramsTable.getSelectionModel().isSelectedIndex( row ) ) { paramsTable.getSelectionModel().clearSelection(); if ( row >= 0 ) { paramsTable.getSelectionModel().setSelectionInterval( row, row ); } } View.getSingleton().getPopupMenu().show(e.getComponent(), e.getX(), e.getY()); } } }); } return paramsTable; } private JComboBox<String> getSiteSelect() { if (siteSelect == null) { siteSelect = new JComboBox<>(siteModel); siteSelect.addItem(Constant.messages.getString("params.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); } } }); } return siteSelect; } public void addSite(String site) { site = ScanPanel.cleanSiteName(site, true); if (siteModel.getIndexOf(site) < 0) { siteModel.addElement(site); if (siteModel.getSize() == 2 && currentSite == null) { // First site added, automatically select it this.getSiteSelect().setSelectedIndex(1); siteSelected(site); } } } private void siteSelected(String site) { site = ScanPanel.cleanSiteName(site, true); if (! site.equals(currentSite)) { siteModel.setSelectedItem(site); paramsModel=extension.getSiteParameters(site).getModel(); this.getParamsTable().setModel(paramsModel); this.setParamsTableColumnSizes(); currentSite = site; } } public void nodeSelected(SiteNode node) { if (node != null) { siteSelected(ScanPanel.cleanSiteName(node, true)); } } public void reset() { currentSite = null; siteModel.removeAllElements(); siteSelect.addItem(Constant.messages.getString("params.toolbar.site.select")); siteSelect.setSelectedIndex(0); paramsModel.removeAllElements(); paramsModel.fireTableDataChanged(); paramsTable.setModel(paramsModel); } /** * Gets the current selected site. * * @return the current site */ public String getCurrentSite(){ return currentSite; } protected HtmlParameterStats getSelectedParam() { int selectedRow = this.getParamsTable().getSelectedRow(); if (selectedRow == -1) { return null; } // TODO type is localized :( String type = (String) this.getParamsTable().getValueAt(selectedRow, 0); String name = (String) this.getParamsTable().getValueAt(selectedRow, 1); SiteParameters sps = extension.getSiteParameters(currentSite); if (sps != null) { return sps.getParam(HtmlParameter.Type.valueOf(type.toLowerCase()), name); // TODO HACK! } return null; } /** * Tells whether or not only one of the parameters is selected. * * @return {@code true} if only one parameter is selected, {@code false} otherwise. * @see #getSelectedParam() * @since 2.6.0 */ boolean isOnlyOneParamSelected() { return getParamsTable().getSelectedRowCount() == 1; } }