/* * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * * Copyright 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.extension.ascan; import java.awt.Dimension; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.JTable; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.filechooser.FileFilter; import org.apache.commons.configuration.ConfigurationException; import org.apache.log4j.Logger; import org.parosproxy.paros.Constant; import org.parosproxy.paros.view.View; import org.zaproxy.zap.view.SingleColumnTableModel; import org.zaproxy.zap.view.StandardFieldsDialog; public class PolicyManagerDialog extends StandardFieldsDialog { private static final long serialVersionUID = 1L; private JButton addButton = null; private JButton modifyButton = null; private JButton removeButton = null; private JButton importButton = null; private JButton exportButton = null; private JTable paramsTable = null; private SingleColumnTableModel paramsModel = null; private ExtensionActiveScan extension; private static final Logger logger = Logger.getLogger(PolicyManagerDialog.class); public PolicyManagerDialog(Frame owner) { super(owner, "ascan.policymgr.title", new Dimension(512, 400)); } public void init(ExtensionActiveScan extension) { this.extension = extension; this.removeAllFields(); this.getParamsModel().setLines(extension.getPolicyManager().getAllPolicyNames()); List<JButton> buttons = new ArrayList<>(); buttons.add(getAddButton()); buttons.add(getModifyButton()); buttons.add(getRemoveButton()); buttons.add(getImportButton()); buttons.add(getExportButton()); this.addTableField(this.getParamsTable(), buttons); } /** * Only need one close button */ @Override public boolean hasCancelSaveButtons() { return false; } @Override public String getHelpIndex() { return "ui.dialogs.scanpolicymgr"; } private JButton getAddButton() { if (this.addButton == null) { this.addButton = new JButton(Constant.messages.getString("ascan.policymgr.button.add")); this.addButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { extension.showPolicyDialog(PolicyManagerDialog.this); } catch (ConfigurationException e1) { logger.error(e1.getMessage(), e1); } } }); } return this.addButton; } private JButton getModifyButton() { if (this.modifyButton == null) { this.modifyButton = new JButton(Constant.messages.getString("ascan.policymgr.button.modify")); this.modifyButton.setEnabled(false); this.modifyButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String name = (String) getParamsModel().getValueAt(getParamsTable().getSelectedRow(), 0); if (name != null) { try { extension.showPolicyDialog(PolicyManagerDialog.this, name); } catch (ConfigurationException e1) { logger.error(e1.getMessage(), e1); } } } }); } return this.modifyButton; } private JButton getRemoveButton() { if (this.removeButton == null) { this.removeButton = new JButton(Constant.messages.getString("ascan.policymgr.button.remove")); this.removeButton.setEnabled(false); this.removeButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String name = (String) getParamsModel().getValueAt(getParamsTable().getSelectedRow(), 0); if (name != null) { if (View.getSingleton().showConfirmDialog(PolicyManagerDialog.this, Constant.messages.getString("ascan.policymgr.warn.delete")) == JOptionPane.OK_OPTION) { extension.getPolicyManager().deletePolicy(name); policyNamesChanged(); } } } }); } return this.removeButton; } private JButton getImportButton() { if (this.importButton == null) { this.importButton = new JButton(Constant.messages.getString("ascan.policymgr.button.import")); this.importButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // Default to ZAP home dir - we dont want to import/export to the policy dir JFileChooser chooser = new JFileChooser(Constant.getZapHome()); chooser.setFileFilter(new FileFilter() { @Override public boolean accept(File file) { if (file.isDirectory()) { return true; } else if (file.isFile() && file.getName().endsWith(".policy")) { return true; } return false; } @Override public String getDescription() { return Constant.messages.getString("file.format.zap.policy"); } }); File file = null; int rc = chooser.showOpenDialog(View.getSingleton().getMainFrame()); if (rc == JFileChooser.APPROVE_OPTION) { file = chooser.getSelectedFile(); if (file == null) { return; } try { extension.getPolicyManager().importPolicy(file); policyNamesChanged(); } catch (ConfigurationException | IOException e1) { logger.error(e1.getMessage(), e1); View.getSingleton().showWarningDialog(Constant.messages.getString("ascan.policy.load.error")); } } } }); } return this.importButton; } private JButton getExportButton() { if (this.exportButton == null) { this.exportButton = new JButton(Constant.messages.getString("ascan.policymgr.button.export")); this.exportButton.setEnabled(false); this.exportButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String name = (String) getParamsModel().getValueAt(getParamsTable().getSelectedRow(), 0); if (name != null) { JFileChooser chooser = new JFileChooser(Constant.getPoliciesDir()); File file = new File(Constant.getZapHome(), name + PolicyManager.POLICY_EXTENSION); chooser.setSelectedFile(file); chooser.setFileFilter(new FileFilter() { @Override public boolean accept(File file) { if (file.isDirectory()) { return true; } else if (file.isFile() && file.getName().endsWith(".policy")) { return true; } return false; } @Override public String getDescription() { return Constant.messages.getString("file.format.zap.policy"); } }); int rc = chooser.showSaveDialog(View.getSingleton().getMainFrame()); if (rc == JFileChooser.APPROVE_OPTION) { file = chooser.getSelectedFile(); if (file == null) { return; } try { ScanPolicy policy = extension.getPolicyManager().getPolicy(name); if (policy != null) { extension.getPolicyManager().exportPolicy(policy, file); } } catch (ConfigurationException e1) { logger.error(e1.getMessage(), e1); View.getSingleton().showWarningDialog(Constant.messages.getString("ascan.policy.load.error")); } } } } }); } return this.exportButton; } @Override public void save() { } @Override public String validateFields() { return null; } private SingleColumnTableModel getParamsModel() { if (paramsModel == null) { paramsModel = new SingleColumnTableModel(Constant.messages.getString("ascan.policymgr.table.policy")); paramsModel.setEditable(false); } return paramsModel; } private JTable getParamsTable() { if (paramsTable == null) { paramsTable = new JTable(); paramsTable.setModel(getParamsModel()); paramsTable.addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { if (e.getClickCount() >= 2) { int row = paramsTable.rowAtPoint(e.getPoint()); if (row >= 0) { String name = (String) getParamsModel().getValueAt(row, 0); if (name != null) { try { extension.showPolicyDialog(PolicyManagerDialog.this, name); } catch (ConfigurationException e1) { logger.error(e1.getMessage(), e1); } } } } } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } }); paramsTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { if (getParamsTable().getSelectedRowCount() == 0) { getModifyButton().setEnabled(false); getRemoveButton().setEnabled(false); getExportButton().setEnabled(false); } else if (getParamsTable().getSelectedRowCount() == 1) { getModifyButton().setEnabled(true); // Dont let the last policy be removed getRemoveButton().setEnabled(getParamsModel().getRowCount() > 1); getExportButton().setEnabled(true); } else { getModifyButton().setEnabled(false); getRemoveButton().setEnabled(false); getExportButton().setEnabled(false); } } }); } return paramsTable; } protected void policyNamesChanged() { this.getParamsModel().setLines(extension.getPolicyManager().getAllPolicyNames()); } }