/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application 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.httppanel.view.paramtable;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import org.apache.commons.configuration.FileConfiguration;
import org.parosproxy.paros.Constant;
import org.parosproxy.paros.network.HtmlParameter;
import org.parosproxy.paros.network.HttpMessage;
import org.zaproxy.zap.extension.httppanel.Message;
import org.zaproxy.zap.extension.httppanel.view.HttpPanelView;
import org.zaproxy.zap.extension.httppanel.view.HttpPanelViewModel;
import org.zaproxy.zap.extension.httppanel.view.HttpPanelViewModelEvent;
import org.zaproxy.zap.extension.httppanel.view.HttpPanelViewModelListener;
import org.zaproxy.zap.extension.httppanel.view.paramtable.addins.ParamAddinInterface;
import org.zaproxy.zap.extension.httppanel.view.paramtable.addins.ParamAddinMagic;
import org.zaproxy.zap.extension.httppanel.view.paramtable.addins.ParamAddinUrlencode;
import org.zaproxy.zap.utils.DisplayUtils;
public abstract class HttpPanelParamTableView implements HttpPanelView, HttpPanelViewModelListener {
public static final String NAME = "HttpPanelParamTableView";
private static final String CAPTION_NAME = Constant.messages.getString("http.panel.view.tablev2.name");
private static final String ADD_INS = Constant.messages.getString("http.panel.view.tableparam.addins");
private JTable table;
private JPanel mainPanel;
private HttpPanelParamTableModel httpPanelTabularModel;
private boolean isEditable = false;
private List<ParamAddinInterface> addins;
private JComboBox<Object> comboBoxAddIns;
private HttpPanelViewModel model;
public HttpPanelParamTableView(HttpPanelViewModel model, HttpPanelParamTableModel tableModel) {
this.httpPanelTabularModel = tableModel;
this.model = model;
init();
initAddins();
this.model.addHttpPanelViewModelListener(this);
}
private void init() {
// Table
table = new JTable();
table.setName("");
table.setModel(httpPanelTabularModel);
table.setGridColor(java.awt.Color.gray);
table.setIntercellSpacing(new java.awt.Dimension(1, 1));
table.setRowHeight(DisplayUtils.getScaledSize(18));
// Issue 954: Force the JTable cell to auto-save when the focus changes.
// Example, edit cell, click OK for a panel dialog box, the data will get saved.
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
// Set standard row width's
TableColumn column = table.getColumnModel().getColumn(0);
column.setPreferredWidth(70);
column.setWidth(70);
column.setMaxWidth(70);
if (table.getColumnCount() == 4) {
column = table.getColumnModel().getColumn(3);
column.setPreferredWidth(150);
column.setWidth(150);
column.setMaxWidth(150);
}
// Main panel
mainPanel = new JPanel(new BorderLayout());
mainPanel.add(new JScrollPane(table), BorderLayout.CENTER);
}
private void initAddins() {
// Get all addins
addins = new LinkedList<>();
addins.add( new ParamAddinMagic());
addins.add( new ParamAddinUrlencode());
comboBoxAddIns = new JComboBox<>();
comboBoxAddIns.addItem(ADD_INS);
for(ParamAddinInterface addin: addins) {
comboBoxAddIns.addItem(addin);
}
comboBoxAddIns.addActionListener(new ComboBoxAddinsActionListener());
table.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(getComboBoxTypes()));
table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
if (table.getColumnCount() != 4) {
return;
}
table.getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(comboBoxAddIns));
table.getColumnModel().getColumn(3).setCellRenderer(new ComboBoxCellRenderer(comboBoxAddIns));
}
public abstract JComboBox<HtmlParameter.Type> getComboBoxTypes();
@Override
public void dataChanged(HttpPanelViewModelEvent e) {
// FIXME(This view should ask for a specific model based on HttpMessage)
httpPanelTabularModel.setHttpMessage((HttpMessage)model.getMessage());
}
@Override
public void save() {
httpPanelTabularModel.save();
}
@Override
public void setSelected(boolean selected) {
if (selected) {
table.requestFocusInWindow();
}
}
@Override
public String getName() {
return NAME;
}
@Override
public String getCaptionName() {
return CAPTION_NAME;
}
@Override
public int getPosition() {
return 10;
}
@Override
public boolean isEnabled(Message msg) {
return true;
}
@Override
public boolean hasChanged() {
return httpPanelTabularModel.hasChanged();
}
@Override
public JComponent getPane() {
return mainPanel;
}
@Override
public boolean isEditable() {
return isEditable;
}
@Override
public void setEditable(boolean editable) {
if (isEditable != editable) {
if (isEditable) {
table.getColumnModel().removeColumn(table.getColumnModel().getColumn(3));
} else {
TableColumn column = new TableColumn(3, 150, new ComboBoxCellRenderer(comboBoxAddIns), new DefaultCellEditor(comboBoxAddIns));
column.setPreferredWidth(150);
column.setMaxWidth(150);
table.addColumn(column);
}
isEditable = editable;
httpPanelTabularModel.setEditable(editable);
}
}
@Override
public HttpPanelViewModel getModel() {
return model;
}
@Override
public void setParentConfigurationKey(String configurationKey) {
}
@Override
public void loadConfiguration(FileConfiguration configuration) {
}
@Override
public void saveConfiguration(FileConfiguration configuration) {
}
private static final class ComboBoxAddinsActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
((JComboBox<?>)e.getSource()).setSelectedIndex(0);
}
}
private static final class ComboBoxCellRenderer extends JComboBox<Object> implements TableCellRenderer {
private static final long serialVersionUID = 7945388210094363435L;
public ComboBoxCellRenderer(JComboBox<Object> comboBox) {
this.addItem(comboBox.getModel().getElementAt(0));
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
return this;
}
}
}