/***********************************************************************
*
* $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
*
*/
/*
* ConversationEditorFrame.java
*
* Created on June 5, 2003, 8:43 PM
*/
package org.owasp.webscarab.plugin.proxy.swing;
import java.awt.Event;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.net.MalformedURLException;
import java.text.ParseException;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.KeyStroke;
import org.owasp.webscarab.model.Preferences;
import org.owasp.webscarab.model.Request;
import org.owasp.webscarab.model.Response;
import org.owasp.webscarab.ui.swing.RequestPanel;
import org.owasp.webscarab.ui.swing.ResponsePanel;
import javax.swing.ButtonModel;
import javax.swing.SwingUtilities;
/**
*
* @author rdawes
*/
public class ManualEditFrame extends javax.swing.JFrame {
/**
*
*/
private static final long serialVersionUID = -8237270407615405475L;
private static boolean _cancelAll = false;
private static Object _lock = new Object();
private boolean _done = false;
private Request _request = null;
private RequestPanel _requestPanel = null;
private Response _response = null;
private ResponsePanel _responsePanel = null;
/** Creates new form ManualEditFrame */
public ManualEditFrame() {
initComponents();
setPreferredSize();
_requestPanel = new RequestPanel();
contentSplitPane.setTopComponent(_requestPanel);
_responsePanel = new ResponsePanel();
contentSplitPane.setBottomComponent(_responsePanel);
getRootPane().setDefaultButton(acceptButton);
installShortcuts();
}
private void installShortcuts() {
Action toggleRequest = new AbstractAction() {
/**
*
*/
private static final long serialVersionUID = 4660900260023719510L;
public void actionPerformed(ActionEvent e) {
interceptRequestCheckBox.doClick();
}
};
KeyStroke toggleRequestKey = KeyStroke.getKeyStroke(KeyEvent.VK_Q, Event.CTRL_MASK | Event.ALT_MASK);
getRootPane().registerKeyboardAction(toggleRequest, "TOGGLEREQUEST", toggleRequestKey, JComponent.WHEN_IN_FOCUSED_WINDOW);
Action toggleResponse = new AbstractAction() {
/**
*
*/
private static final long serialVersionUID = 5909538388895326161L;
public void actionPerformed(ActionEvent e) {
interceptResponseCheckBox.doClick();
}
};
KeyStroke toggleResponseKey = KeyStroke.getKeyStroke(KeyEvent.VK_S, Event.CTRL_MASK | Event.ALT_MASK);
getRootPane().registerKeyboardAction(toggleResponse, "TOGGLERESPONSE", toggleResponseKey, JComponent.WHEN_IN_FOCUSED_WINDOW);
}
public void setInterceptModels(ButtonModel interceptRequest, ButtonModel interceptResponse) {
interceptRequestCheckBox.setModel(interceptRequest);
interceptRequestCheckBox.setEnabled(true);
interceptRequestCheckBox.setVisible(true);
interceptResponseCheckBox.setModel(interceptResponse);
interceptResponseCheckBox.setEnabled(true);
interceptResponseCheckBox.setVisible(true);
}
public Request editRequest(Request request) {
synchronized (_lock) {
_cancelAll = false;
_done = false;
_request = request;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
_requestPanel.setEditable(true);
_requestPanel.setRequest(_request);
_responsePanel.setEditable(false);
_responsePanel.setResponse(null);
setVisible(true);
toFront();
requestFocus();
contentSplitPane.setDividerLocation(1.0);
}
});
do {
try {
_lock.wait();
} catch (InterruptedException ie) {
System.out.println("Wait interrupted");
}
} while (! _cancelAll && ! _done);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setVisible(false);
dispose();
}
});
return _request;
}
}
public Response editResponse(final Request request, final Response response) {
synchronized (_lock) {
_cancelAll = false;
_done = false;
_response = response;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
_requestPanel.setEditable(false);
_requestPanel.setRequest(request);
_responsePanel.setEditable(true);
_responsePanel.setResponse(_response);
setVisible(true);
toFront();
requestFocus();
contentSplitPane.setDividerLocation(0.3);
}
});
do {
try {
_lock.wait();
} catch (InterruptedException ie) {
System.out.println("Wait interrupted");
}
} while (! _cancelAll && ! _done);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setVisible(false);
dispose();
}
});
return _response;
}
}
/** 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() {
jPanel1 = new javax.swing.JPanel();
acceptButton = new javax.swing.JButton();
cancelButton = new javax.swing.JButton();
abortButton = new javax.swing.JButton();
jSeparator1 = new javax.swing.JSeparator();
cancelAllButton = new javax.swing.JButton();
jPanel2 = new javax.swing.JPanel();
interceptRequestCheckBox = new javax.swing.JCheckBox();
interceptResponseCheckBox = new javax.swing.JCheckBox();
contentSplitPane = new javax.swing.JSplitPane();
setTitle("Intercept");
addComponentListener(new java.awt.event.ComponentAdapter() {
public void componentMoved(java.awt.event.ComponentEvent evt) {
formComponentMoved(evt);
}
public void componentResized(java.awt.event.ComponentEvent evt) {
formComponentResized(evt);
}
});
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
exitForm(evt);
}
});
jPanel1.setLayout(new java.awt.GridBagLayout());
acceptButton.setText("Accept changes");
acceptButton.setToolTipText("Accepts any changes made to this conversation");
acceptButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
acceptButtonActionPerformed(evt);
}
});
jPanel1.add(acceptButton, new java.awt.GridBagConstraints());
cancelButton.setText("Cancel changes");
cancelButton.setToolTipText("Cancels any changes made to this conversation");
cancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelButtonActionPerformed(evt);
}
});
jPanel1.add(cancelButton, new java.awt.GridBagConstraints());
abortButton.setText("Abort request");
abortButton.setToolTipText("Prevents this request from being sent to the server. Returns an error to the browser");
abortButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
abortButtonActionPerformed(evt);
}
});
jPanel1.add(abortButton, new java.awt.GridBagConstraints());
jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);
jSeparator1.setMinimumSize(new java.awt.Dimension(20, 0));
jSeparator1.setPreferredSize(new java.awt.Dimension(20, 0));
jPanel1.add(jSeparator1, new java.awt.GridBagConstraints());
cancelAllButton.setText("Cancel ALL intercepts");
cancelAllButton.setToolTipText("Cancels any pending changes, and allows intercepted conversations to proceed");
cancelAllButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelAllButtonActionPerformed(evt);
}
});
jPanel1.add(cancelAllButton, new java.awt.GridBagConstraints());
getContentPane().add(jPanel1, java.awt.BorderLayout.SOUTH);
interceptRequestCheckBox.setText("Intercept requests : ");
interceptRequestCheckBox.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING);
interceptRequestCheckBox.setEnabled(false);
jPanel2.add(interceptRequestCheckBox);
interceptResponseCheckBox.setText("Intercept responses : ");
interceptResponseCheckBox.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING);
interceptResponseCheckBox.setEnabled(false);
jPanel2.add(interceptResponseCheckBox);
getContentPane().add(jPanel2, java.awt.BorderLayout.NORTH);
contentSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
contentSplitPane.setResizeWeight(0.5);
contentSplitPane.setOneTouchExpandable(true);
getContentPane().add(contentSplitPane, java.awt.BorderLayout.CENTER);
pack();
}
// </editor-fold>//GEN-END:initComponents
private void cancelAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelAllButtonActionPerformed
_cancelAll = true;
_done = true;
synchronized(_lock) {
_lock.notifyAll();
}
}//GEN-LAST:event_cancelAllButtonActionPerformed
private void formComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentResized
if (!isShowing()) return;
Preferences.getPreferences().setProperty("ManualEditFrame.size.x",Integer.toString(getWidth()));
Preferences.getPreferences().setProperty("ManualEditFrame.size.y",Integer.toString(getHeight()));
}//GEN-LAST:event_formComponentResized
private void formComponentMoved(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentMoved
if (!isShowing()) return;
Preferences.getPreferences().setProperty("ManualEditFrame.position.x",Integer.toString(getX()));
Preferences.getPreferences().setProperty("ManualEditFrame.position.y",Integer.toString(getY()));
}//GEN-LAST:event_formComponentMoved
private void setPreferredSize() {
try {
int xpos = Integer.parseInt(Preferences.getPreference("ManualEditFrame.position.x").trim());
int ypos = Integer.parseInt(Preferences.getPreference("ManualEditFrame.position.y").trim());
int width = Integer.parseInt(Preferences.getPreference("ManualEditFrame.size.x").trim());
int height = Integer.parseInt(Preferences.getPreference("ManualEditFrame.size.y").trim());
setBounds(xpos,ypos,width,height);
} catch (NumberFormatException nfe) {
setSize(800,600);
} catch (NullPointerException npe) {
setSize(800,600);
}
}
private void abortButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_abortButtonActionPerformed
_done = true;
_request = null;
_response = null;
synchronized (_lock) {
_lock.notifyAll();
}
}//GEN-LAST:event_abortButtonActionPerformed
private void acceptButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_acceptButtonActionPerformed
try {
if (_response != null) {
_response = _responsePanel.getResponse();
} else if (_request != null) {
_request = _requestPanel.getRequest();
}
_done = true;
synchronized (_lock) {
_lock.notifyAll();
}
} catch (MalformedURLException mue) {
JOptionPane.showMessageDialog(this, new String[] {"The URL requested is malformed", mue.getMessage()}, "Malformed URL", JOptionPane.ERROR_MESSAGE);
} catch (ParseException pe) {
JOptionPane.showMessageDialog(this, new String[] {"The request is malformed", pe.getMessage()}, "Malformed Request", JOptionPane.ERROR_MESSAGE);
}
}//GEN-LAST:event_acceptButtonActionPerformed
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
_done = true;
synchronized (_lock) {
_lock.notifyAll();
}
}//GEN-LAST:event_cancelButtonActionPerformed
private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
_done = true;
synchronized (_lock) {
_lock.notifyAll();
}
}//GEN-LAST:event_exitForm
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton abortButton;
private javax.swing.JButton acceptButton;
private javax.swing.JButton cancelAllButton;
private javax.swing.JButton cancelButton;
private javax.swing.JSplitPane contentSplitPane;
private javax.swing.JCheckBox interceptRequestCheckBox;
private javax.swing.JCheckBox interceptResponseCheckBox;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JSeparator jSeparator1;
// End of variables declaration//GEN-END:variables
}