/*
* 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
* Copyright 2014 Jay Ball - Aspect Security
*
* 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.globalexcludeurl;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JCheckBox;
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.AbstractMultipleOptionsTablePanel;
public class OptionsGlobalExcludeURLPanel extends AbstractParamPanel {
private static final long serialVersionUID = 1L;
private GlobalExcludeURLMultipleOptionsPanel tokensOptionsPanel;
private OptionsGlobalExcludeURLTableModel globalExcludeURLModel = null;
public OptionsGlobalExcludeURLPanel() {
super();
initialize();
}
/**
* This method initializes this
*/
private void initialize() {
this.setName(Constant.messages.getString("options.globalexcludeurl.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.globalexcludeurl.label.tokens")), gbc);
tokensOptionsPanel = new GlobalExcludeURLMultipleOptionsPanel(getGlobalExcludeURLModel());
gbc.weighty = 1.0;
this.add(tokensOptionsPanel, gbc);
//gbc.weighty = 0.0;
}
@Override
public void initParam(Object obj) {
OptionsParam optionsParam = (OptionsParam) obj;
GlobalExcludeURLParam param = optionsParam.getGlobalExcludeURLParam();
getGlobalExcludeURLModel().setTokens(param.getTokens());
tokensOptionsPanel.setRemoveWithoutConfirmation(!param.isConfirmRemoveToken());
}
@Override
public void saveParam(Object obj) throws Exception {
OptionsParam optionsParam = (OptionsParam) obj;
GlobalExcludeURLParam globalExcludeURLParam = optionsParam.getGlobalExcludeURLParam();
globalExcludeURLParam.setTokens(getGlobalExcludeURLModel().getElements());
globalExcludeURLParam.setConfirmRemoveToken(!tokensOptionsPanel.isRemoveWithoutConfirmation());
}
/**
* This method initializes authModel
*
* @return org.parosproxy.paros.view.OptionsAuthenticationTableModel
*/
private OptionsGlobalExcludeURLTableModel getGlobalExcludeURLModel() {
if (globalExcludeURLModel == null) {
globalExcludeURLModel = new OptionsGlobalExcludeURLTableModel();
}
return globalExcludeURLModel;
}
@Override
public String getHelpIndex() {
return "ui.dialogs.options.globalexcludeurl";
}
private static class GlobalExcludeURLMultipleOptionsPanel extends AbstractMultipleOptionsTablePanel<GlobalExcludeURLParamToken> {
private static final long serialVersionUID = -115340627058929308L;
private static final String REMOVE_DIALOG_TITLE = Constant.messages.getString("options.globalexcludeurl.dialog.token.remove.title");
private static final String REMOVE_DIALOG_TEXT = Constant.messages.getString("options.globalexcludeurl.dialog.token.remove.text");
private static final String REMOVE_DIALOG_CONFIRM_BUTTON_LABEL = Constant.messages.getString("options.globalexcludeurl.dialog.token.remove.button.confirm");
private static final String REMOVE_DIALOG_CANCEL_BUTTON_LABEL = Constant.messages.getString("options.globalexcludeurl.dialog.token.remove.button.cancel");
private static final String REMOVE_DIALOG_CHECKBOX_LABEL = Constant.messages.getString("options.globalexcludeurl.dialog.token.remove.checkbox.label");
private DialogAddToken addDialog = null;
private DialogModifyToken modifyDialog = null;
private OptionsGlobalExcludeURLTableModel model;
public GlobalExcludeURLMultipleOptionsPanel(OptionsGlobalExcludeURLTableModel model) {
super(model);
this.model = model;
getTable().getColumnExt(0).setPreferredWidth(25); // checkbox column should be tiny
getTable().getColumnExt(1).setPreferredWidth(350); // wide Desc Col
getTable().getColumnExt(2).setPreferredWidth(300); // less wide Regex Column
getTable().setHorizontalScrollEnabled(true); // descriptions / regexs are very wide, so turn on horiz scroll
getTable().setAutoCreateRowSorter(true);
getTable().setSortOrder(1, SortOrder.ASCENDING); // sort by description by default
/* XXX For some reason, sorting isn't accurate in the table. The
getColumnClass correctly returns String for the Description, but
sort order might be: "Ext - MS Word, ExtParam - Bla bla, Ext - PDF."
It is like string.compare for the column sort ignores the space and
dash. Really unsure as to why. As a work-around, start some
descriptions with "Extension" instead of the shorter "Ext" */
}
@Override
public GlobalExcludeURLParamToken showAddDialogue() {
if (addDialog == null) {
addDialog = new DialogAddToken(View.getSingleton().getOptionsDialog(null));
addDialog.pack();
}
addDialog.setTokens(model.getElements());
addDialog.setVisible(true);
GlobalExcludeURLParamToken token = addDialog.getToken();
addDialog.clear();
return token;
}
@Override
public GlobalExcludeURLParamToken showModifyDialogue(GlobalExcludeURLParamToken e) {
if (modifyDialog == null) {
modifyDialog = new DialogModifyToken(View.getSingleton().getOptionsDialog(null));
modifyDialog.pack();
}
modifyDialog.setTokens(model.getElements());
modifyDialog.setToken(e);
modifyDialog.setVisible(true);
GlobalExcludeURLParamToken token = modifyDialog.getToken();
modifyDialog.clear();
if (!token.equals(e)) {
return token;
}
return null;
}
@Override
public boolean showRemoveDialogue(GlobalExcludeURLParamToken e) {
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;
}
}
}