/*********************************************************************** * * $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 * */ /* * ManualRequestPanel.java * * Created on September 15, 2003, 11:16 AM */ package org.owasp.webscarab.plugin.manualrequest.swing; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.net.MalformedURLException; import java.text.ParseException; import java.util.logging.Logger; import javax.swing.ComboBoxModel; import javax.swing.JOptionPane; import javax.swing.ListModel; import javax.swing.SwingUtilities; import javax.swing.border.TitledBorder; import org.owasp.webscarab.model.ConversationID; import org.owasp.webscarab.model.HttpUrl; import org.owasp.webscarab.model.Request; import org.owasp.webscarab.model.Response; import org.owasp.webscarab.plugin.manualrequest.ManualRequest; import org.owasp.webscarab.plugin.manualrequest.ManualRequestModel; import org.owasp.webscarab.plugin.manualrequest.ManualRequestUI; import org.owasp.webscarab.ui.swing.ConversationListModel; import org.owasp.webscarab.ui.swing.ConversationRenderer; import org.owasp.webscarab.ui.swing.RequestPanel; import org.owasp.webscarab.ui.swing.ResponsePanel; import org.owasp.webscarab.ui.swing.SwingPluginUI; import org.owasp.webscarab.util.swing.ColumnDataModel; import org.owasp.webscarab.util.swing.ListComboBoxModel; import org.owasp.webscarab.util.swing.SwingWorker; /** * * @author rdawes */ public class ManualRequestPanel extends javax.swing.JPanel implements SwingPluginUI, ManualRequestUI { /** * */ private static final long serialVersionUID = 277808739447506130L; private ManualRequestModel _model; private ManualRequest _manualRequest; private final RequestPanel _requestPanel; private final ResponsePanel _responsePanel; private final RequestUpdater _reqUpdater = new RequestUpdater(); private final ResponseUpdater _respUpdater = new ResponseUpdater(); private Logger _logger = Logger.getLogger(this.getClass().getName()); /** Creates new form ManualRequestPanel */ public ManualRequestPanel(ManualRequest manualRequest) { initComponents(); _manualRequest = manualRequest; _model = _manualRequest.getModel(); Request request = new Request(); request.setMethod("GET"); request.setVersion("HTTP/1.0"); _requestPanel = new RequestPanel(); _requestPanel.setEditable(true); _requestPanel.setRequest(request); _requestPanel.setBorder(new TitledBorder("Request")); conversationSplitPane.setLeftComponent(_requestPanel); _responsePanel = new ResponsePanel(); _responsePanel.setEditable(false); _responsePanel.setResponse(null); _responsePanel.setBorder(new TitledBorder("Response")); conversationSplitPane.setRightComponent(_responsePanel); ListModel conversationList = new ConversationListModel(_model.getConversationModel()); ComboBoxModel requestModel = new ListComboBoxModel(conversationList); requestComboBox.setModel(requestModel); requestComboBox.setRenderer(new ConversationRenderer(_model.getConversationModel())); requestComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { requestComboBoxActionPerformed(e); } }); _manualRequest.setUI(this); } /** 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. */ private void initComponents() {//GEN-BEGIN:initComponents jPanel1 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); requestComboBox = new javax.swing.JComboBox(); conversationSplitPane = new javax.swing.JSplitPane(); jPanel2 = new javax.swing.JPanel(); getCookieButton = new javax.swing.JButton(); fetchResponseButton = new javax.swing.JButton(); updateCookiesButton = new javax.swing.JButton(); setLayout(new java.awt.BorderLayout()); jPanel1.setLayout(new java.awt.BorderLayout()); jLabel1.setText("Previous Requests : "); jLabel1.setMinimumSize(new java.awt.Dimension(135, 15)); jPanel1.add(jLabel1, java.awt.BorderLayout.WEST); jPanel1.add(requestComboBox, java.awt.BorderLayout.CENTER); add(jPanel1, java.awt.BorderLayout.NORTH); conversationSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); conversationSplitPane.setResizeWeight(0.5); conversationSplitPane.setOneTouchExpandable(true); add(conversationSplitPane, java.awt.BorderLayout.CENTER); jPanel2.setLayout(new java.awt.GridLayout()); getCookieButton.setText("Get Cookies"); getCookieButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { getCookieButtonActionPerformed(evt); } }); jPanel2.add(getCookieButton); fetchResponseButton.setText("Fetch Response"); fetchResponseButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { fetchResponseButtonActionPerformed(evt); } }); jPanel2.add(fetchResponseButton); updateCookiesButton.setText("Update CookieJar"); updateCookiesButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { updateCookiesButtonActionPerformed(evt); } }); jPanel2.add(updateCookiesButton); add(jPanel2, java.awt.BorderLayout.SOUTH); }//GEN-END:initComponents private void requestComboBoxActionPerformed(java.awt.event.ActionEvent evt) { Object o = requestComboBox.getSelectedItem(); if (o instanceof ConversationID) { ConversationID id = (ConversationID) o; Request request = _model.getConversationModel().getRequest(id); _manualRequest.setRequest(request); } } private void updateCookiesButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_updateCookiesButtonActionPerformed _manualRequest.updateCookies(); }//GEN-LAST:event_updateCookiesButtonActionPerformed private void getCookieButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_getCookieButtonActionPerformed try { Request request = _requestPanel.getRequest(); if (request != null && request.getURL() != null) { _manualRequest.setRequest(request); _manualRequest.addRequestCookies(); } } 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_getCookieButtonActionPerformed private void fetchResponseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fetchResponseButtonActionPerformed try { Request request = _requestPanel.getRequest(); fetchResponse(request); } 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_fetchResponseButtonActionPerformed private void fetchResponse(final Request request) { if (request != null) { _requestPanel.setEnabled(false); fetchResponseButton.setEnabled(false); updateCookiesButton.setEnabled(false); getCookieButton.setEnabled(false); _manualRequest.setRequest(request); new SwingWorker() { public Object construct() { try { _manualRequest.fetchResponse(); return null; } catch (Exception e) { return e; } } //Runs on the event-dispatching thread. public void finished() { Object obj = getValue(); if (obj != null) { Exception e = (Exception) obj; JOptionPane.showMessageDialog(null, new String[] {"Error fetching response: ", e.toString()}, "Error", JOptionPane.ERROR_MESSAGE); _logger.severe("Exception fetching response: " + e); e.printStackTrace(); } fetchResponseButton.setEnabled(true); updateCookiesButton.setEnabled(true); getCookieButton.setEnabled(true); _requestPanel.setEnabled(true); } }.start(); } else { _logger.severe("Can't fetch a null request"); } } public javax.swing.JPanel getPanel() { return this; } public String getPluginName() { return new String("Manual Request"); } public javax.swing.Action[] getConversationActions() { // could return two actions here: "load request in editor", and "replay request" return null; } public javax.swing.Action[] getUrlActions() { // doesn't really make sense at an URL level return null; } public void requestChanged(Request request) { _reqUpdater.setRequest(request); } public void responseChanged(Response response) { _respUpdater.setResponse(response); } public void setEnabled(final boolean enabled) { if (SwingUtilities.isEventDispatchThread()) { fetchResponseButton.setEnabled(enabled); getCookieButton.setEnabled(enabled); updateCookiesButton.setEnabled(enabled); requestComboBox.setEnabled(enabled); } else { SwingUtilities.invokeLater(new Runnable() { public void run() { setEnabled(enabled); } }); } } public ColumnDataModel<ConversationID>[] getConversationColumns() { return null; } public ColumnDataModel<HttpUrl>[] getUrlColumns() { return null; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JSplitPane conversationSplitPane; private javax.swing.JButton fetchResponseButton; private javax.swing.JButton getCookieButton; private javax.swing.JLabel jLabel1; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JComboBox requestComboBox; private javax.swing.JButton updateCookiesButton; // End of variables declaration//GEN-END:variables private class RequestUpdater implements Runnable { private Request _req; public void setRequest(Request request) { _req = request; if (SwingUtilities.isEventDispatchThread()) { run(); } else { try { SwingUtilities.invokeAndWait(this); } catch (Exception e) { _logger.info("Exception " + e); } } } public void run() { _requestPanel.setEditable(true); _requestPanel.setRequest(_req); } } private class ResponseUpdater implements Runnable { private Response _resp; public void setResponse(Response response) { _resp = response; if (SwingUtilities.isEventDispatchThread()) { run(); } else { try { SwingUtilities.invokeAndWait(this); } catch (Exception e) { _logger.info("Exception " + e); } } } public void run() { _responsePanel.setEditable(false); _responsePanel.setResponse(_resp); } } }