/* * 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.script; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.io.File; import java.util.List; import javax.swing.JCheckBox; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.SortOrder; import org.parosproxy.paros.Constant; import org.parosproxy.paros.model.OptionsParam; import org.parosproxy.paros.view.AbstractParamPanel; import org.parosproxy.paros.view.View; import org.zaproxy.zap.view.AbstractMultipleOptionsBaseTablePanel; public class OptionsScriptPanel extends AbstractParamPanel { private static final long serialVersionUID = 1L; private ExtensionScript extension; private AntiCsrfMultipleOptionsPanel tokensOptionsPanel; private OptionsScriptTableModel scriptDirModel = null; public OptionsScriptPanel(ExtensionScript extension) { super(); this.extension = extension; initialize(); } /** * This method initializes this */ private void initialize() { this.setName(Constant.messages.getString("options.script.title")); this.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.weightx = 1.0; gbc.anchor = GridBagConstraints.LINE_START; gbc.fill = GridBagConstraints.BOTH; this.add(new JLabel(Constant.messages.getString("options.script.label.dirs")), gbc); tokensOptionsPanel = new AntiCsrfMultipleOptionsPanel(this.extension, getScriptDirModel()); gbc.weighty = 1.0; this.add(tokensOptionsPanel, gbc); } @Override public void initParam(Object obj) { OptionsParam optionsParam = (OptionsParam) obj; ScriptParam param = optionsParam.getParamSet(ScriptParam.class); getScriptDirModel().setTokens(param.getScriptDirs()); tokensOptionsPanel.setRemoveWithoutConfirmation(!param.isConfirmRemoveDir()); } @Override public void saveParam(Object obj) throws Exception { OptionsParam optionsParam = (OptionsParam) obj; ScriptParam param = optionsParam.getParamSet(ScriptParam.class); // Work out whats changed.. List<File> dirs = getScriptDirModel().getElements(); // Look for removed ones for (File dir : param.getScriptDirs()) { if (!dirs.contains(dir)) { // Its been removed extension.removeScriptsFromDir(dir); } } // Look for added ones for (File dir : dirs) { if (!param.getScriptDirs().contains(dir)) { // Its been added extension.addScriptsFromDir(dir); } } param.setScriptDirs(dirs); param.setConfirmRemoveDir(!tokensOptionsPanel.isRemoveWithoutConfirmation()); } /** * This method initializes authModel * * @return org.parosproxy.paros.view.OptionsAuthenticationTableModel */ private OptionsScriptTableModel getScriptDirModel() { if (scriptDirModel == null) { scriptDirModel = new OptionsScriptTableModel(); } return scriptDirModel; } @Override public String getHelpIndex() { return "ui.dialogs.options.script"; } private static class AntiCsrfMultipleOptionsPanel extends AbstractMultipleOptionsBaseTablePanel<File> { private static final long serialVersionUID = -115340627058929308L; private static final String REMOVE_DIALOG_TITLE = Constant.messages.getString("options.script.dialog.dirs.remove.title"); private static final String REMOVE_DIALOG_TEXT = Constant.messages.getString("options.script.dialog.dirs.remove.text"); private static final String REMOVE_DIALOG_CONFIRM_BUTTON_LABEL = Constant.messages.getString("options.script.dialog.dirs.remove.button.confirm"); private static final String REMOVE_DIALOG_CANCEL_BUTTON_LABEL = Constant.messages.getString("options.script.dialog.dirs.remove.button.cancel"); private static final String REMOVE_DIALOG_CHECKBOX_LABEL = Constant.messages.getString("options.script.dialog.dirs.remove.checkbox.label"); private static ExtensionScript extension; public AntiCsrfMultipleOptionsPanel(ExtensionScript ext, OptionsScriptTableModel model) { super(model); extension = ext; getTable().setSortOrder(0, SortOrder.ASCENDING); } @Override public File showAddDialogue() { return showDirSelectDialog(null); } @Override public File showModifyDialogue(File dir) { return showDirSelectDialog(dir); } private File showDirSelectDialog(File dir) { JFileChooser fc = new JFileChooser(); fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); if (fc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); if (extension.getScriptCount(file) == 0) { // Cant find any valid scripts if (View.getSingleton().showConfirmDialog(this, Constant.messages.getString("options.script.dialog.dirs.noscripts.warning")) == JFileChooser.APPROVE_OPTION) { return file; } } else { return file; } } return null; } @Override public boolean showRemoveDialogue(File f) { JCheckBox removeWithoutConfirmationCheckBox = new JCheckBox(REMOVE_DIALOG_CHECKBOX_LABEL); Object[] messages = {REMOVE_DIALOG_TEXT, " ", removeWithoutConfirmationCheckBox}; int option = JOptionPane.showOptionDialog(View.getSingleton().getMainFrame(), messages, REMOVE_DIALOG_TITLE, JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, new String[] { REMOVE_DIALOG_CONFIRM_BUTTON_LABEL, REMOVE_DIALOG_CANCEL_BUTTON_LABEL }, null); if (option == JOptionPane.OK_OPTION) { setRemoveWithoutConfirmation(removeWithoutConfirmationCheckBox.isSelected()); return true; } return false; } } }