/***********************************************************************
*
* $CVSHeader$
*
* This file is part of WebScarab, an Open Web Application Security
* Project utility. For details, please see http://www.owasp.org/
*
* Copyright (c) 2002 - 2004 Rogan Dawes
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* 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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Getting Source
* ==============
*
* Source for this application is maintained at Sourceforge.net, a
* repository for free software projects.
*
* For details, please see http://www.sourceforge.net/projects/owasp
*
*/
/*
* RequestPanel.java
*
* Created on 02 June 2003, 03:09
*/
package org.owasp.webscarab.ui.swing;
import java.net.MalformedURLException;
import java.text.ParseException;
import javax.swing.JOptionPane;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import javax.swing.SwingUtilities;
import org.owasp.webscarab.model.Request;
import org.owasp.webscarab.model.HttpUrl;
import org.owasp.webscarab.ui.swing.editors.TextPanel;
import org.owasp.webscarab.util.RequestConverter;
/**
*
* @author rdawes
*/
public class RequestPanel extends javax.swing.JPanel {
/**
*
*/
private static final long serialVersionUID = -5571563143330632769L;
private boolean[] _upToDate;
private boolean _editable = false;
private boolean _modified = false;
private int _selected = 0;
private Request _request = null;
private MessagePanel _messagePanel;
private TextPanel _textPanel;
private static int _preferred = -1;
private boolean _reverting = false;
/** Creates new form RequestPanel */
public RequestPanel() {
initComponents();
displayTabbedPane.getModel().addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
try {
updateRequest(_selected);
_selected = displayTabbedPane.getSelectedIndex();
_preferred = _selected;
if (_selected >= 0) {
updatePanel(_selected);
}
} catch (MalformedURLException mue) {
if (!_reverting) {
JOptionPane.showMessageDialog(RequestPanel.this, new String[] {"The URL requested is malformed", mue.getMessage()}, "Malformed URL", JOptionPane.ERROR_MESSAGE);
_reverting = true;
displayTabbedPane.setSelectedIndex(_selected);
_reverting = false;
}
} catch (ParseException pe) {
if (!_reverting) {
JOptionPane.showMessageDialog(RequestPanel.this, new String[] {"Error parsing request", pe.getMessage()}, "Malformed Request", JOptionPane.ERROR_MESSAGE);
_reverting = true;
displayTabbedPane.setSelectedIndex(_selected);
_reverting = false;
}
}
}
});
_messagePanel = new MessagePanel();
parsedPanel.remove(messagePanelPlaceHolder);
java.awt.GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
parsedPanel.add(_messagePanel, gridBagConstraints);
_textPanel = new TextPanel();
displayTabbedPane.add("Raw", _textPanel);
_upToDate = new boolean[displayTabbedPane.getTabCount()];
invalidatePanels();
updateComponents(_editable);
if (_preferred > -1 && _preferred < displayTabbedPane.getTabCount()) displayTabbedPane.setSelectedIndex(_preferred);
}
private void invalidatePanels() {
for (int i=0; i<_upToDate.length; i++) {
_upToDate[i] = false;
}
}
private void updateRequest(int panel) throws MalformedURLException, ParseException {
if (! _editable || panel < 0) {
return;
}
if (displayTabbedPane.getTitleAt(panel).equals("Parsed")) {// parsed text
if (_messagePanel.isModified()) {
_request = (Request) _messagePanel.getMessage();
_modified = true;
}
if (_request == null) {
_request = new Request();
}
_request.setMethod(methodTextField.getText());
String url = urlTextField.getText();
if (!"".equals(url))
_request.setURL(new HttpUrl(url));
_request.setVersion(versionTextField.getText());
// this is a bit of a hack. What we should really do is add a listener
// to the text fields, so we know when a change has been made. Until then
// this will do
_modified = true;
} else if (displayTabbedPane.getTitleAt(panel).equals("Raw")) { // raw text
if (_textPanel.isModified()) {
Request r = new Request();
String text = _textPanel.getText();
if (!"".equals(text))
r.parse(_textPanel.getText());
_request = r;
_modified = true;
}
}
if (_modified)
invalidatePanels();
_upToDate[panel] = true;
}
public boolean isModified() {
return _modified;
}
private void updatePanel(int panel) {
if (!_upToDate[panel]) {
if (displayTabbedPane.getTitleAt(panel).equals("Parsed")) {// parsed text
_messagePanel.setMessage(_request);
if (_request != null) {
methodTextField.setText(_request.getMethod());
if (_request.getURL() != null) {
urlTextField.setText(_request.getURL().toString());
} else {
urlTextField.setText("");
}
versionTextField.setText(_request.getVersion());
} else {
methodTextField.setText("");
urlTextField.setText("");
versionTextField.setText("");
}
} else if (displayTabbedPane.getTitleAt(panel).equals("Raw")) { // raw text
if (_request != null && _request.getMethod() != null && _request.getURL() != null && _request.getVersion() != null) {
_textPanel.setText(null, _request.toString("\n"));
} else {
_textPanel.setText(null, "");
}
}
_upToDate[panel] = true;
}
}
private void updateComponents(boolean editable) {
java.awt.Color color;
if (editable) {
color = new java.awt.Color(255, 255, 255);
} else {
color = new java.awt.Color(204, 204, 204);
}
methodTextField.setEditable(editable);
urlTextField.setEditable(editable);
versionTextField.setEditable(editable);
methodTextField.setBackground(color);
urlTextField.setBackground(color);
versionTextField.setBackground(color);
editButton.setVisible(editable);
}
public void setEditable(boolean editable) {
_editable = editable;
_textPanel.setEditable(editable);
updateComponents(editable);
_messagePanel.setEditable(editable);
}
public void setRequest(Request request) {
_modified = false;
if (request != null) {
_request = new Request(request);
} else {
_request = null;
}
invalidatePanels();
if (SwingUtilities.isEventDispatchThread()) {
updatePanel(displayTabbedPane.getSelectedIndex());
} else {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
updatePanel(displayTabbedPane.getSelectedIndex());
}
});
}
}
public Request getRequest() throws MalformedURLException, ParseException {
if (_editable) {
int panel = displayTabbedPane.getSelectedIndex();
updateRequest(panel);
}
return _request;
}
public void selectPanel(String title) {
for (int i=0; i<displayTabbedPane.getTabCount(); i++) {
String tab = displayTabbedPane.getTitleAt(i);
int selected = displayTabbedPane.getSelectedIndex();
if (tab != null && tab.equalsIgnoreCase(title) && i != selected) {
displayTabbedPane.setSelectedIndex(i);
return;
}
}
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
editOptionsPopupMenu = new javax.swing.JPopupMenu();
convertGetMenuItem = new javax.swing.JMenuItem();
convertPostMenuItem = new javax.swing.JMenuItem();
convertMultipartMenuItem = new javax.swing.JMenuItem();
displayTabbedPane = new javax.swing.JTabbedPane();
parsedPanel = new javax.swing.JPanel();
jLabel3 = new javax.swing.JLabel();
methodTextField = new javax.swing.JTextField();
jLabel4 = new javax.swing.JLabel();
urlTextField = new javax.swing.JTextField();
messagePanelPlaceHolder = new javax.swing.JPanel();
jLabel5 = new javax.swing.JLabel();
versionTextField = new javax.swing.JTextField();
editButton = new javax.swing.JButton();
convertGetMenuItem.setText("Convert POST to GET");
convertGetMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
convertGetMenuItemActionPerformed(evt);
}
});
editOptionsPopupMenu.add(convertGetMenuItem);
convertPostMenuItem.setText("Convert GET to POST");
convertPostMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
convertPostMenuItemActionPerformed(evt);
}
});
editOptionsPopupMenu.add(convertPostMenuItem);
convertMultipartMenuItem.setText("Convert POST to Multipart");
convertMultipartMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
convertMultipartMenuItemActionPerformed(evt);
}
});
editOptionsPopupMenu.add(convertMultipartMenuItem);
setLayout(new java.awt.BorderLayout());
parsedPanel.setLayout(new java.awt.GridBagLayout());
jLabel3.setLabelFor(methodTextField);
jLabel3.setText("Method");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4);
parsedPanel.add(jLabel3, gridBagConstraints);
methodTextField.setEditable(false);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
parsedPanel.add(methodTextField, gridBagConstraints);
jLabel4.setLabelFor(urlTextField);
jLabel4.setText("URL");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4);
parsedPanel.add(jLabel4, gridBagConstraints);
urlTextField.setEditable(false);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
parsedPanel.add(urlTextField, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
parsedPanel.add(messagePanelPlaceHolder, gridBagConstraints);
jLabel5.setLabelFor(urlTextField);
jLabel5.setText("Version");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4);
parsedPanel.add(jLabel5, gridBagConstraints);
versionTextField.setBackground(new java.awt.Color(204, 204, 204));
versionTextField.setEditable(false);
versionTextField.setText("HTTP/1.0");
versionTextField.setMinimumSize(new java.awt.Dimension(65, 19));
versionTextField.setPreferredSize(new java.awt.Dimension(65, 19));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
parsedPanel.add(versionTextField, gridBagConstraints);
editButton.setText("Transform");
editButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
editButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 1;
parsedPanel.add(editButton, gridBagConstraints);
displayTabbedPane.addTab("Parsed", parsedPanel);
add(displayTabbedPane, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
private void convertGetMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_convertGetMenuItemActionPerformed
try {
Request req = getRequest();
if (req == null)
return;
Request get = RequestConverter.convertPostToGet(req);
setRequest(get);
_modified = true; // we have to do this as setRequest() resets this flag
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(this, e.getLocalizedMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
}//GEN-LAST:event_convertGetMenuItemActionPerformed
private void editButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editButtonActionPerformed
convertGetMenuItem.setEnabled(false);
convertPostMenuItem.setEnabled(false);
convertMultipartMenuItem.setEnabled(false);
try {
Request req = getRequest();
if ("GET".equals(req.getMethod())) {
convertPostMenuItem.setEnabled(true);
convertMultipartMenuItem.setEnabled(true);
} else if ("POST".equals(req.getMethod())) {
if ("application/x-www-form-urlencoded".equals(req.getHeader("Content-Type"))) {
convertGetMenuItem.setEnabled(true);
convertMultipartMenuItem.setEnabled(true);
}
}
} catch (Exception e) {
}
editOptionsPopupMenu.setVisible(true);
editOptionsPopupMenu.show(editButton, 0, editButton.getHeight());
}//GEN-LAST:event_editButtonActionPerformed
private void convertPostMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_convertPostMenuItemActionPerformed
try {
Request req = getRequest();
if (req == null)
return;
Request post = RequestConverter.convertGetToPost(req);
setRequest(post);
_modified = true; // we have to do this as setRequest() resets this flag
} catch (Exception e) {
JOptionPane.showMessageDialog(this, e.getLocalizedMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
}//GEN-LAST:event_convertPostMenuItemActionPerformed
private void convertMultipartMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_convertMultipartMenuItemActionPerformed
try {
Request req = getRequest();
if (req == null)
return;
Request post = RequestConverter.convertPostToMultipart(req);
setRequest(post);
_modified = true; // we have to do this as setRequest() resets this flag
} catch (Exception e) {
JOptionPane.showMessageDialog(this, e.getLocalizedMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
}//GEN-LAST:event_convertMultipartMenuItemActionPerformed
public static void main(String[] args) {
final RequestPanel panel = new RequestPanel();
javax.swing.JFrame top = new javax.swing.JFrame(panel.getName());
top.getContentPane().setLayout(new java.awt.BorderLayout());
top.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
System.exit(0);
}
});
javax.swing.JButton button = new javax.swing.JButton("GET");
top.getContentPane().add(panel);
top.getContentPane().add(button, java.awt.BorderLayout.SOUTH);
button.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
try {
System.out.println(panel.getRequest());
} catch (Exception e) {
e.printStackTrace();
}
}
});
// top.setBounds(100,100,600,400);
top.pack();
top.setVisible(true);
Request request = new Request();
try {
java.io.FileInputStream fis = new java.io.FileInputStream("l2/conversations/1-request");
request.read(fis);
} catch (Exception e) {
e.printStackTrace();
}
panel.setEditable(true);
panel.setRequest(request);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JMenuItem convertGetMenuItem;
private javax.swing.JMenuItem convertMultipartMenuItem;
private javax.swing.JMenuItem convertPostMenuItem;
private javax.swing.JTabbedPane displayTabbedPane;
private javax.swing.JButton editButton;
private javax.swing.JPopupMenu editOptionsPopupMenu;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JPanel messagePanelPlaceHolder;
private javax.swing.JTextField methodTextField;
private javax.swing.JPanel parsedPanel;
private javax.swing.JTextField urlTextField;
private javax.swing.JTextField versionTextField;
// End of variables declaration//GEN-END:variables
}