/* * Zed Attack Proxy (ZAP) and its related class files. * * ZAP is an HTTP/HTTPS proxy for assessing web application security. * * Copyright 2011 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.ext; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextArea; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.apache.log4j.Logger; import org.parosproxy.paros.Constant; import org.parosproxy.paros.extension.Extension; import org.parosproxy.paros.model.OptionsParam; import org.parosproxy.paros.view.AbstractParamPanel; import org.zaproxy.zap.utils.DesktopUtils; import org.zaproxy.zap.utils.DisplayUtils; import org.zaproxy.zap.view.LayoutHelper; public class OptionsExtensionPanel extends AbstractParamPanel { private static final long serialVersionUID = 1L; private JTable tableExt = null; private JScrollPane jScrollPane = null; private JPanel detailsPane = null; private JLabel extName = new JLabel(); private JLabel extAuthor = new JLabel(); private JLabel extURL = new JLabel(); private JTextArea extDescription = new JTextArea(); private OptionsExtensionTableModel extensionModel = null; private JScrollPane extDescScrollPane = null; private JButton urlLaunchButton = null; private static Logger log = Logger.getLogger(OptionsExtensionPanel.class); public OptionsExtensionPanel(ExtensionExtension ext) { super(); initialize(); } /** * This method initializes this */ private void initialize() { GridBagConstraints gridBagConstraints1 = new GridBagConstraints(); GridBagConstraints gridBagConstraints2 = new GridBagConstraints(); GridBagConstraints gridBagConstraints3 = new GridBagConstraints(); javax.swing.JLabel jLabel = new JLabel(); this.setLayout(new GridBagLayout()); this.setSize(409, 268); this.setName(Constant.messages.getString("options.ext.title")); jLabel.setText(Constant.messages.getString("options.ext.label.enable")); gridBagConstraints1.gridx = 0; gridBagConstraints1.gridy = 0; gridBagConstraints1.gridheight = 1; gridBagConstraints1.weightx = 0.0; gridBagConstraints1.weighty = 0.0; gridBagConstraints1.insets = new Insets(0,0,5,0); gridBagConstraints1.anchor = GridBagConstraints.NORTHWEST; gridBagConstraints1.fill = GridBagConstraints.HORIZONTAL; gridBagConstraints2.gridx = 0; gridBagConstraints2.gridy = 1; gridBagConstraints2.weightx = 1.0; gridBagConstraints2.weighty = 0.75; gridBagConstraints2.fill = GridBagConstraints.BOTH; gridBagConstraints2.ipadx = 0; gridBagConstraints2.insets = new Insets(0,0,0,0); gridBagConstraints2.anchor = GridBagConstraints.NORTHWEST; gridBagConstraints3.gridx = 0; gridBagConstraints3.gridy = 2; gridBagConstraints3.weightx = 1.0; gridBagConstraints3.weighty = 0.25; gridBagConstraints3.fill = GridBagConstraints.BOTH; gridBagConstraints3.ipadx = 0; gridBagConstraints3.insets = new Insets(0,0,0,0); gridBagConstraints3.anchor = GridBagConstraints.NORTHWEST; this.add(jLabel, gridBagConstraints1); this.add(getJScrollPane(), gridBagConstraints2); this.add(getDetailsPane(), gridBagConstraints3); } @Override public void initParam(Object obj) { OptionsParam optionsParam = (OptionsParam) obj; ExtensionParam extParam = optionsParam.getExtensionParam(); List<Extension> exts = extensionModel.getExtensions(); for (Extension ext : exts) { ext.setEnabled(extParam.isExtensionEnabled(ext.getName())); } extensionModel.fireTableRowsUpdated(0, extensionModel.getRowCount()); } @Override public void saveParam(Object obj) throws Exception { OptionsParam optionsParam = (OptionsParam) obj; Map<String, Boolean> extensionsState = new HashMap<>(); List<Extension> exts = extensionModel.getExtensions(); for (Extension ext : exts) { extensionsState.put(ext.getName(), ext.isEnabled()); } optionsParam.getExtensionParam().setExtensionsState(extensionsState); } /** * This method initializes tableAuth * * @return javax.swing.JTable */ private JTable getTableExtension() { if (tableExt == null) { tableExt = new JTable(); tableExt.setModel(getExtensionModel()); tableExt.setRowHeight(DisplayUtils.getScaledSize(18)); tableExt.getColumnModel().getColumn(0).setPreferredWidth(DisplayUtils.getScaledSize(70)); tableExt.getColumnModel().getColumn(1).setPreferredWidth(DisplayUtils.getScaledSize(70)); tableExt.getColumnModel().getColumn(2).setPreferredWidth(DisplayUtils.getScaledSize(120)); tableExt.getColumnModel().getColumn(3).setPreferredWidth(DisplayUtils.getScaledSize(220)); ListSelectionListener sl = new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent arg0) { if (tableExt.getSelectedRow() > -1) { Extension ext = ((OptionsExtensionTableModel)tableExt.getModel()).getExtension( tableExt.getSelectedRow()); if (ext != null) { try { extName.setText(ext.getUIName()); extDescription.setText(ext.getDescription()); if (ext.getAuthor() != null) { extAuthor.setText(ext.getAuthor()); } else { extAuthor.setText(""); } if (ext.getURL() != null) { extURL.setText(ext.getURL().toString()); getUrlLaunchButton().setEnabled(true); } else { extURL.setText(""); getUrlLaunchButton().setEnabled(false); } } catch (Exception e) { // Just to be safe log.error(e.getMessage(), e); } } } }}; tableExt.getSelectionModel().addListSelectionListener(sl); tableExt.getColumnModel().getSelectionModel().addListSelectionListener(sl); } return tableExt; } /** * This method initializes jScrollPane * * @return javax.swing.JScrollPane */ private JScrollPane getJScrollPane() { if (jScrollPane == null) { jScrollPane = new JScrollPane(); jScrollPane.setViewportView(getTableExtension()); jScrollPane.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED)); } return jScrollPane; } private JPanel getDetailsPane() { if (detailsPane == null) { detailsPane = new JPanel(); detailsPane.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED)); detailsPane.setLayout(new GridBagLayout()); detailsPane.add(new JLabel(Constant.messages.getString("options.ext.label.name")), LayoutHelper.getGBC(0, 1, 1, 0.25D)); detailsPane.add(extName, LayoutHelper.getGBC(1, 1, 1, 0.75D)); detailsPane.add(new JLabel(Constant.messages.getString("options.ext.label.author")), LayoutHelper.getGBC(0, 2, 1, 0.25D)); detailsPane.add(extAuthor, LayoutHelper.getGBC(1, 2, 1, 0.75D)); detailsPane.add(new JLabel(Constant.messages.getString("options.ext.label.url")), LayoutHelper.getGBC(0, 3, 1, 0.25D)); if (DesktopUtils.canOpenUrlInBrowser()) { detailsPane.add(getUrlLaunchButton(), LayoutHelper.getGBC(1, 3, 1, 0.0D, 0.0D, GridBagConstraints.NONE)); } else { detailsPane.add(extURL, LayoutHelper.getGBC(1, 3, 1, 0.5D)); } detailsPane.add(getExtDescJScrollPane(), LayoutHelper.getGBC(0, 4, 2, 1.0D, 1.0D)); } return detailsPane; } private JButton getUrlLaunchButton() { if (urlLaunchButton == null) { urlLaunchButton = new JButton(Constant.messages.getString("options.ext.button.openurl")); urlLaunchButton.setEnabled(false); urlLaunchButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { if (extURL.getText() != null) { DesktopUtils.openUrlInBrowser(extURL.getText()); } }}); } return urlLaunchButton; } private JScrollPane getExtDescJScrollPane() { if (extDescScrollPane == null) { extDescScrollPane = new JScrollPane(); extDescScrollPane.setViewportView(extDescription); extDescription.setEditable(false); extDescription.setLineWrap(true); } return extDescScrollPane; } /** * This method initializes authModel * * @return org.parosproxy.paros.view.OptionsAuthenticationTableModel */ private OptionsExtensionTableModel getExtensionModel() { if (extensionModel == null) { extensionModel = new OptionsExtensionTableModel(); } return extensionModel; } protected boolean enableExtension(String name, boolean enable) { Extension ext = this.getExtensionModel().getExtension(name); if (ext != null) { ext.setEnabled(enable); return true; } return false; } @Override public String getHelpIndex() { return "ui.dialogs.options.ext"; } }