/*
*
* Paros and its related class files.
*
* Paros is an HTTP/HTTPS proxy for assessing web application security.
* Copyright (C) 2003-2004 Chinotec Technologies Company
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the Clarified Artistic License
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* Clarified Artistic License for more details.
*
* You should have received a copy of the Clarified Artistic License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.parosproxy.paros.extension.history;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.HeadlessException;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.parosproxy.paros.control.Control;
import org.parosproxy.paros.extension.AbstractDialog;
import org.parosproxy.paros.extension.Extension;
import org.parosproxy.paros.model.HistoryList;
import org.parosproxy.paros.model.HistoryReference;
import org.parosproxy.paros.model.Model;
import org.parosproxy.paros.network.HttpMalformedHeaderException;
import org.parosproxy.paros.network.HttpMessage;
import org.parosproxy.paros.network.HttpSender;
import org.parosproxy.paros.view.HttpPanel;
public class ManualRequestEditorDialog extends AbstractDialog {
private static final long serialVersionUID = -7918536141940081947L;
private HttpPanel requestPanel = null;
private JPanel panelCommand = null;
private JButton btnSend = null;
private JLabel jLabel = null;
private JTabbedPane panelTab = null;
private HttpPanel responsePanel = null;
private Extension extension = null;
private HttpSender httpSender = null;
private boolean isSendEnabled = true;
private HistoryList historyList = null;
private JPanel jPanel = null;
private JCheckBox chkFollowRedirect = null;
private JCheckBox chkUseTrackingSessionState = null;
// ZAP: Added logger
private static Log log = LogFactory.getLog(ManualRequestEditorDialog.class);
public ManualRequestEditorDialog() throws HeadlessException {
super();
initialize();
}
public ManualRequestEditorDialog(Frame parent, boolean modal, boolean isSendEnabled, Extension extension)
throws HeadlessException {
super(parent, modal);
this.isSendEnabled = isSendEnabled;
this.extension = extension;
this.historyList = ((ExtensionHistory)Control.getSingleton().getExtensionLoader().getExtension("ExtensionHistory")).getHistoryList();
initialize();
}
private void initialize() {
getRequestPanel().getPanelOption().add(getPanelCommand(), "");
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
getHttpSender().shutdown();
getResponsePanel().setMessage("", "", false);
}
});
this.setContentPane(getJPanel());
}
public HttpPanel getRequestPanel() {
if (requestPanel == null) {
requestPanel = new HttpPanel(true);
}
return requestPanel;
}
private JPanel getPanelCommand() {
if (panelCommand == null) {
jLabel = new JLabel();
jLabel.setText("");
panelCommand = new JPanel();
panelCommand.setLayout(new GridBagLayout());
GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
gridBagConstraints2.gridx = 0;
gridBagConstraints2.gridy = 0;
gridBagConstraints2.ipadx = 0;
gridBagConstraints2.ipady = 0;
gridBagConstraints2.anchor = GridBagConstraints.NORTHWEST;
gridBagConstraints2.fill = GridBagConstraints.HORIZONTAL;
gridBagConstraints2.weightx = 1.0D;
gridBagConstraints3.gridx = 3;
gridBagConstraints3.gridy = 0;
gridBagConstraints3.anchor = GridBagConstraints.NORTHEAST;
gridBagConstraints3.insets = new Insets(2, 2, 2, 2);
gridBagConstraints1.gridx = 2;
gridBagConstraints1.gridy = 0;
gridBagConstraints11.anchor = GridBagConstraints.EAST;
gridBagConstraints11.gridx = 1;
gridBagConstraints11.gridy = 0;
gridBagConstraints11.insets = new Insets(0, 0, 0, 0);
panelCommand.add(jLabel, gridBagConstraints2);
panelCommand.add(getChkUseTrackingSessionState(), gridBagConstraints11);
panelCommand.add(getChkFollowRedirect(), gridBagConstraints1);
panelCommand.add(getBtnSend(), gridBagConstraints3);
}
return panelCommand;
}
private JButton getBtnSend() {
if (btnSend == null) {
btnSend = new JButton();
btnSend.setText("Send");
btnSend.setEnabled(isSendEnabled);
btnSend.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
btnSend.setEnabled(false);
HttpMessage msg = new HttpMessage();
getRequestPanel().getMessage(msg, true);
msg.getRequestHeader().setContentLength(msg.getRequestBody().length());
send(msg);
}
});
}
return btnSend;
}
private JTabbedPane getPanelTab() {
if (panelTab == null) {
panelTab = new JTabbedPane();
panelTab.setDoubleBuffered(true);
panelTab.addTab("Request", null, getRequestPanel(), null);
panelTab.addTab("Response", null, getResponsePanel(), null);
}
return panelTab;
}
public HttpPanel getResponsePanel() {
if (responsePanel == null) {
responsePanel = new HttpPanel(false);
}
return responsePanel;
}
public void setExtension(Extension extension) {
this.extension = extension;
}
private Extension getExtention() {
return extension;
}
public void setVisible(boolean show) {
if (show) {
try {
if (httpSender != null) {
httpSender.shutdown();
httpSender = null;
}
} catch (Exception e) {
// ZAP: Log exceptions
log.warn(e.getMessage(), e);
}
getPanelTab().setSelectedIndex(0);
}
boolean isSessionTrackingEnabled = Model.getSingleton().getOptionsParam().getConnectionParam().isHttpStateEnabled();
getChkUseTrackingSessionState().setEnabled(isSessionTrackingEnabled);
super.setVisible(show);
}
private HttpSender getHttpSender() {
if (httpSender == null) {
httpSender = new HttpSender(Model.getSingleton().getOptionsParam().getConnectionParam(),
getChkUseTrackingSessionState().isSelected());
}
return httpSender;
}
public void setMessage(HttpMessage msg) {
getPanelTab().setSelectedIndex(0);
getRequestPanel().setMessage(msg, true);
getResponsePanel().setMessage("", "", false);
getBtnSend().setEnabled(true);
}
private JPanel getJPanel() {
if (jPanel == null) {
GridBagConstraints gridBagConstraints31 = new GridBagConstraints();
jPanel = new JPanel();
jPanel.setLayout(new GridBagLayout());
gridBagConstraints31.gridx = 0;
gridBagConstraints31.gridy = 0;
gridBagConstraints31.weightx = 1.0;
gridBagConstraints31.weighty = 1.0;
gridBagConstraints31.fill = GridBagConstraints.BOTH;
gridBagConstraints31.anchor = GridBagConstraints.NORTHWEST;
jPanel.add(getPanelTab(), gridBagConstraints31);
}
return jPanel;
}
private JCheckBox getChkFollowRedirect() {
if (chkFollowRedirect == null) {
chkFollowRedirect = new JCheckBox();
chkFollowRedirect.setText("Follow redirect");
chkFollowRedirect.setSelected(true);
}
return chkFollowRedirect;
}
private JCheckBox getChkUseTrackingSessionState() {
if (chkUseTrackingSessionState == null) {
chkUseTrackingSessionState = new JCheckBox();
chkUseTrackingSessionState.setText("Use current tracking session");
}
return chkUseTrackingSessionState;
}
private void send(final HttpMessage msg) {
Thread t = new Thread(new Runnable() {
public void run() {
try {
getHttpSender().sendAndReceive(msg, getChkFollowRedirect().isSelected());
EventQueue.invokeAndWait(new Runnable() {
public void run() {
if (!msg.getResponseHeader().isEmpty()) {
getResponsePanel().setMessage(msg, false);
final int finalType = HistoryReference.TYPE_MANUAL;
Thread t = new Thread(new Runnable() {
public void run() {
addHistory(msg, finalType);
}
});
t.start();
}
getPanelTab().setSelectedIndex(1);
}
});
} catch (NullPointerException npe) {
getExtention().getView().showWarningDialog("Malformed header error.");
} catch (HttpMalformedHeaderException mhe) {
getExtention().getView().showWarningDialog("Malformed header error.");
} catch (IOException ioe) {
getExtention().getView().showWarningDialog("IO error in sending request.");
} catch (Exception e) {
// ZAP: Log exceptions
log.warn(e.getMessage(), e);
} finally {
btnSend.setEnabled(true);
}
}
});
t.setPriority(Thread.NORM_PRIORITY);
t.start();
}
private void addHistory(HttpMessage msg, int type) {
HistoryReference historyRef = null;
try {
historyRef = new HistoryReference(Model.getSingleton().getSession(), type, msg);
synchronized (historyList) {
if (type == HistoryReference.TYPE_MANUAL) {
addHistoryInEventQueue(historyRef);
historyList.notifyItemChanged(historyRef);
}
}
} catch (Exception e) {
return;
}
}
private void addHistoryInEventQueue(final HistoryReference ref) {
if (EventQueue.isDispatchThread()) {
historyList.addElement(ref);
} else {
try {
EventQueue.invokeAndWait(new Runnable() {
public void run() {
historyList.addElement(ref);
}
});
} catch (Exception e) {
}
}
}
}