/* * 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.history; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.HeadlessException; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import org.apache.log4j.Logger; import org.parosproxy.paros.Constant; import org.parosproxy.paros.control.Control; import org.parosproxy.paros.core.scanner.Alert; import org.parosproxy.paros.extension.AbstractDialog; import org.parosproxy.paros.extension.history.ExtensionHistory; import org.parosproxy.paros.model.HistoryReference; import org.parosproxy.paros.model.Model; import org.parosproxy.paros.network.HttpMessage; import org.zaproxy.zap.extension.alert.AlertViewPanel; import org.zaproxy.zap.extension.alert.ExtensionAlert; public class AlertAddDialog extends AbstractDialog { private static final Logger logger = Logger.getLogger(AlertAddDialog.class); private static final long serialVersionUID = 1L; private JPanel jPanel = null; private JButton btnOk = null; private JButton btnCancel = null; private ExtensionHistory extension = null; private HistoryReference historyRef; /** * The history type that will be used, along with the instance variable * {@code httpMessage}, to create a new {@code HistoryReference}. Used when * the user wants to add an alert to a temporary {@code HistoryReference} * (created when active scanning, fuzzing...), as the temporary * {@code HistoryReference}s are deleted when the session is closed a new * {@code HistoryReference} must be created. * * @see #httpMessage * @see #setHttpMessage(HttpMessage, int) * @see HistoryReference#HistoryReference(org.parosproxy.paros.model.Session, * int, HttpMessage) */ private int historyType; /** * The {@code HttpMessage} that will be used, along with {@code historyType} * , to create a new {@code HistoryReference} (created when active scanning, * fuzzing...). Used when the user wants to add an alert to a temporary * {@code HistoryReference}, as the temporary {@code HistoryReference}s are * deleted when the session is closed a new {@code HistoryReference} must be * created. If {@code null} indicates that no {@code HistoryReference} * should be created. * * @see #historyType * @see #setHttpMessage(HttpMessage, int) * @see HistoryReference#HistoryReference(org.parosproxy.paros.model.Session, * int, HttpMessage) */ private HttpMessage httpMessage; private JScrollPane jScrollPane = null; private AlertViewPanel alertViewPanel = null; /** * @throws HeadlessException */ public AlertAddDialog() throws HeadlessException { super(); initialize(); } /** * @param arg0 * @param arg1 * @throws HeadlessException */ public AlertAddDialog(Frame arg0, boolean arg1) throws HeadlessException { super(arg0, arg1); initialize(); } /** * This method initializes this */ private void initialize() { this.setTitle(Constant.messages.getString("alert.add.title")); this.setContentPane(getJPanel()); if (Model.getSingleton().getOptionsParam().getViewParam().getWmUiHandlingOption() == 0) { this.setSize(407, 657); } this.addWindowListener(new java.awt.event.WindowAdapter() { @Override public void windowOpened(java.awt.event.WindowEvent e) { } @Override public void windowClosing(java.awt.event.WindowEvent e) { btnCancel.doClick(); } }); pack(); } /** * This method initializes jPanel * * @return javax.swing.JPanel */ private JPanel getJPanel() { if (jPanel == null) { GridBagConstraints gridBagConstraints15 = new GridBagConstraints(); java.awt.GridBagConstraints gridBagConstraints13 = new GridBagConstraints(); javax.swing.JLabel jLabel2 = new JLabel(); java.awt.GridBagConstraints gridBagConstraints3 = new GridBagConstraints(); java.awt.GridBagConstraints gridBagConstraints2 = new GridBagConstraints(); jPanel = new JPanel(); jPanel.setLayout(new GridBagLayout()); jPanel.setPreferredSize(new java.awt.Dimension(450,650)); jPanel.setMinimumSize(new java.awt.Dimension(450,650)); gridBagConstraints2.gridx = 1; gridBagConstraints2.gridy = 5; gridBagConstraints2.insets = new java.awt.Insets(2,2,2,2); gridBagConstraints2.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints3.gridx = 2; gridBagConstraints3.gridy = 5; gridBagConstraints3.insets = new java.awt.Insets(2,2,2,10); gridBagConstraints3.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints13.gridx = 0; gridBagConstraints13.gridy = 5; gridBagConstraints13.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints13.weightx = 1.0D; gridBagConstraints13.insets = new java.awt.Insets(2,10,2,5); gridBagConstraints15.weightx = 1.0D; gridBagConstraints15.weighty = 1.0D; gridBagConstraints15.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints15.insets = new java.awt.Insets(2,2,2,2); gridBagConstraints15.gridwidth = 3; gridBagConstraints15.gridx = 0; gridBagConstraints15.gridy = 2; gridBagConstraints15.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints15.ipadx = 0; gridBagConstraints15.ipady = 10; jPanel.add(getJScrollPane(), gridBagConstraints15); jPanel.add(jLabel2, gridBagConstraints13); jPanel.add(getBtnCancel(), gridBagConstraints2); jPanel.add(getBtnOk(), gridBagConstraints3); } return jPanel; } /** * This method initializes btnStart * * @return javax.swing.JButton */ private JButton getBtnOk() { if (btnOk == null) { btnOk = new JButton(); btnOk.setText(Constant.messages.getString("alert.add.button.save")); btnOk.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent e) { Alert alert = alertViewPanel.getAlert(); try { ExtensionAlert extAlert = (ExtensionAlert) Control.getSingleton().getExtensionLoader().getExtension(ExtensionAlert.NAME); if (alert.getAlertId() >= 0) { // Its an existing alert so save it if (extAlert != null) { extAlert.updateAlert(alert); } else if (historyRef != null) { // Update history tree historyRef.updateAlert(alert); extension.notifyHistoryItemChanged(historyRef); } } else { if (httpMessage != null) { historyRef = new HistoryReference(Model.getSingleton().getSession(), historyType, httpMessage); } alert.setSource(Alert.Source.MANUAL); // Raise it if (extAlert != null) { extAlert.alertFound(alert, historyRef); } else { historyRef.addAlert(alert); extension.notifyHistoryItemChanged(historyRef); } } } catch (Exception ex) { logger.error(ex.getMessage(), ex); } clearAndCloseDialog(); } }); } return btnOk; } /** * This method initializes btnStop * * @return javax.swing.JButton */ private JButton getBtnCancel() { if (btnCancel == null) { btnCancel = new JButton(); btnCancel.setText(Constant.messages.getString("alert.add.button.cancel")); btnCancel.setEnabled(true); btnCancel.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent e) { clearAndCloseDialog(); } }); } return btnCancel; } private void clearAndCloseDialog() { getAlertViewPanel().clearAlert(); historyRef = null; httpMessage = null; dispose(); } public void setPlugin(ExtensionHistory plugin) { this.extension = plugin; } private AlertViewPanel getAlertViewPanel () { if (alertViewPanel == null) { alertViewPanel = new AlertViewPanel(true); } return this.alertViewPanel; } public void setAlert(Alert alert) { this.getAlertViewPanel().displayAlert(alert); if (alert.getHistoryRef() != null) { this.setHistoryRef(alert.getHistoryRef()); } else { this.setHistoryRef(alert.getMessage().getHistoryRef()); } // Change the title as we're editing an existing alert this.setTitle(Constant.messages.getString("alert.edit.title")); } /** * This method initializes jScrollPane * * @return javax.swing.JScrollPane */ private JScrollPane getJScrollPane() { if (jScrollPane == null) { jScrollPane = new JScrollPane(); jScrollPane.setHorizontalScrollBarPolicy(javax.swing.JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); jScrollPane.setVerticalScrollBarPolicy(javax.swing.JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); jScrollPane.setViewportView(getAlertViewPanel()); } return jScrollPane; } public HistoryReference getHistoryRef() { return historyRef; } public void setHistoryRef(HistoryReference historyRef) { this.historyRef = historyRef; this.httpMessage = null; alertViewPanel.setHistoryRef(historyRef); } /** * Sets the {@code HttpMessage} and the history type of the * {@code HistoryReference} that will be created if the user creates the * alert. The current session will be used to create the * {@code HistoryReference}. The alert created will be added to the newly * created {@code HistoryReference}. * <p> * Should be used when the alert is added to a temporary * {@code HistoryReference} as the temporary {@code HistoryReference}s are * deleted when the session is closed. * </p> * * @param httpMessage * the {@code HttpMessage} that will be used to create the * {@code HistoryReference}, must not be {@code null} * @param historyType * the type of the history reference that will be used to create * the {@code HistoryReference} * * @see Model#getSession() * @see HistoryReference#HistoryReference(org.parosproxy.paros.model.Session, * int, HttpMessage) */ public void setHttpMessage(HttpMessage httpMessage, int historyType) { this.historyRef = null; this.httpMessage = httpMessage; this.historyType = historyType; alertViewPanel.setHttpMessage(httpMessage); } }