/*********************************************************************** * * $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 * */ /* * $Id: ManualEditPanel.java,v 1.8 2005/05/19 15:20:56 rogan Exp $ * ProxyUI.java * * Created on February 17, 2003, 9:05 PM */ package org.owasp.webscarab.plugin.proxy.swing; import java.awt.Event; import java.awt.event.HierarchyEvent; import java.awt.event.HierarchyListener; import java.awt.event.KeyEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import org.owasp.webscarab.model.Request; import org.owasp.webscarab.model.Response; import org.owasp.webscarab.plugin.proxy.ManualEdit; import org.owasp.webscarab.plugin.proxy.ManualEditUI; import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionEvent; import javax.swing.ButtonModel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ListModel; import javax.swing.JPanel; /** * * @author rdawes */ public class ManualEditPanel extends javax.swing.JPanel implements ProxyPluginUI, ManualEditUI { /** * */ private static final long serialVersionUID = 4874553823942170256L; private ManualEdit _manualEdit; private ButtonModel _requestButtonModel, _responseButtonModel; /** Creates new form ManualEditPanel */ public ManualEditPanel(ManualEdit manualEdit) { _manualEdit = manualEdit; initComponents(); _requestButtonModel = interceptRequestCheckBox.getModel(); _requestButtonModel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { boolean enabled = interceptRequestCheckBox.isSelected(); interceptIncludeRegexTextField.setEnabled(isEnabled() && enabled); interceptExcludeRegexTextField.setEnabled(isEnabled() && enabled); interceptMethodList.setEnabled(isEnabled() && enabled); _manualEdit.setInterceptRequest(enabled); } }); _responseButtonModel = interceptResponseCheckBox.getModel(); _responseButtonModel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { boolean enabled = interceptResponseCheckBox.isSelected(); interceptResponseTextField.setEnabled(isEnabled() && enabled); _manualEdit.setInterceptResponse(enabled); } }); configure(); interceptMethodList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent evt) { interceptMethodListValueChanged(evt); } }); _manualEdit.setUI(this); addHierarchyListener(new HierarchyListener() { public void hierarchyChanged(HierarchyEvent e) { SwingUtilities.invokeLater(new Runnable() { public void run() { installShortcuts(); } }); // disconnect from the hierarchy after installing the shortcuts once removeHierarchyListener(this); } }); //installShortcuts(); } private void installShortcuts() { Action toggleRequest = new AbstractAction() { /** * */ private static final long serialVersionUID = -9087215230742742495L; public void actionPerformed(ActionEvent e) { System.out.println("Toggle request"); interceptRequestCheckBox.doClick(); } }; KeyStroke toggleRequestKey = KeyStroke.getKeyStroke(KeyEvent.VK_Q, Event.CTRL_MASK | Event.ALT_MASK); SwingUtilities.getRootPane(this).registerKeyboardAction(toggleRequest, "TOGGLEREQUEST", toggleRequestKey, WHEN_IN_FOCUSED_WINDOW); Action toggleResponse = new AbstractAction() { /** * */ private static final long serialVersionUID = 6167233061339024122L; public void actionPerformed(ActionEvent e) { System.out.println("Toggle response"); interceptResponseCheckBox.doClick(); } }; KeyStroke toggleResponseKey = KeyStroke.getKeyStroke(KeyEvent.VK_S, Event.CTRL_MASK | Event.ALT_MASK); SwingUtilities.getRootPane(this).registerKeyboardAction(toggleResponse, "TOGGLERESPONSE", toggleResponseKey, WHEN_IN_FOCUSED_WINDOW); } public String getPluginName() { return new String("Manual Edit"); } public void configure() { boolean enabled = _manualEdit.getInterceptRequest(); interceptRequestCheckBox.setSelected(enabled); sensitiveCheckBox.setSelected(_manualEdit.isCaseSensitive()); interceptIncludeRegexTextField.setEnabled(isEnabled() && enabled); interceptIncludeRegexTextField.setText(_manualEdit.getIncludeRegex()); interceptExcludeRegexTextField.setEnabled(isEnabled() && enabled); interceptExcludeRegexTextField.setText(_manualEdit.getExcludeRegex()); interceptMethodList.setEnabled(isEnabled() && enabled); String[] interceptMethods = _manualEdit.getInterceptMethods(); interceptMethodList.setSelectedIndices(getIndices(interceptMethods,interceptMethodList.getModel())); enabled = _manualEdit.getInterceptResponse(); interceptResponseTextField.setEnabled(isEnabled() && enabled); interceptResponseCheckBox.setSelected(_manualEdit.getInterceptResponse()); interceptResponseTextField.setText(_manualEdit.getInterceptResponseRegex()); } private int[] getIndices(String[] items, ListModel model) { int[] indices = new int[items.length]; for (int i=0; i< items.length; i++) { boolean found = false; for (int j=0; j<model.getSize(); j++) { if (items[i].equals(model.getElementAt(j))) { indices[i] = j; found = true; } } if (!found) { indices[i] = -1; System.err.println("Did not find item["+i+"] == '" + items[i] + "' in the list model"); } } return indices; } /** 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; interceptrequestPanel = new javax.swing.JPanel(); interceptRequestCheckBox = new javax.swing.JCheckBox(); sensitiveCheckBox = new javax.swing.JCheckBox(); interceptIncludeLabel = new javax.swing.JLabel(); interceptIncludeRegexTextField = new javax.swing.JTextField(); interceptExcludeLabel = new javax.swing.JLabel(); interceptExcludeRegexTextField = new javax.swing.JTextField(); jScrollPane3 = new javax.swing.JScrollPane(); interceptMethodList = new javax.swing.JList(); interceptResponsePanel = new javax.swing.JPanel(); interceptResponseCheckBox = new javax.swing.JCheckBox(); interceptResponseTextField = new javax.swing.JTextField(); jLabel1 = new javax.swing.JLabel(); setLayout(new java.awt.GridBagLayout()); interceptrequestPanel.setLayout(new java.awt.GridBagLayout()); interceptRequestCheckBox.setText("Intercept requests : "); interceptRequestCheckBox.setToolTipText("Use Ctrl-Alt Q to toggle"); interceptRequestCheckBox.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0); interceptrequestPanel.add(interceptRequestCheckBox, gridBagConstraints); sensitiveCheckBox.setText("Case Sensitive Regular Expressions ?"); sensitiveCheckBox.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING); sensitiveCheckBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { sensitiveCheckBoxActionPerformed(evt); } }); interceptrequestPanel.add(sensitiveCheckBox, new java.awt.GridBagConstraints()); interceptIncludeLabel.setText("Include Paths matching : "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0); interceptrequestPanel.add(interceptIncludeLabel, gridBagConstraints); interceptIncludeRegexTextField.setToolTipText("Use a regular expression to select which URLs to intercept. Leave blank to ignore."); interceptIncludeRegexTextField.setEnabled(false); interceptIncludeRegexTextField.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { interceptIncludeRegexTextFieldActionPerformed(evt); } }); interceptIncludeRegexTextField.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { interceptIncludeRegexTextFieldFocusLost(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 5); interceptrequestPanel.add(interceptIncludeRegexTextField, gridBagConstraints); interceptExcludeLabel.setText("Exclude paths matching : "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0); interceptrequestPanel.add(interceptExcludeLabel, gridBagConstraints); interceptExcludeRegexTextField.setToolTipText("Use a regular expression to select which URLs not to intercept. Leave blank to ignore."); interceptExcludeRegexTextField.setEnabled(false); interceptExcludeRegexTextField.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { interceptExcludeRegexTextFieldActionPerformed(evt); } }); interceptExcludeRegexTextField.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { interceptExcludeRegexTextFieldFocusLost(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 4; gridBagConstraints.gridwidth = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 5); interceptrequestPanel.add(interceptExcludeRegexTextField, gridBagConstraints); jScrollPane3.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); jScrollPane3.setViewportBorder(javax.swing.BorderFactory.createTitledBorder("Methods")); jScrollPane3.setMinimumSize(new java.awt.Dimension(100, 120)); jScrollPane3.setPreferredSize(new java.awt.Dimension(100, 120)); jScrollPane3.setAutoscrolls(true); interceptMethodList.setModel(new javax.swing.AbstractListModel() { /** * */ private static final long serialVersionUID = 2656664151003905524L; String[] strings = { "GET", "POST", "HEAD", "PUT", "DELETE", "TRACE", "PROPFIND", "OPTIONS", "PROPPATCH", "MKCOL", "COPY", "MOVE", "LOCK", "UNLOCK", "SEARCH", "SUBSCRIBE" }; public int getSize() { return strings.length; } public Object getElementAt(int i) { return strings[i]; } }); interceptMethodList.setToolTipText("Select which request methods to intercept"); interceptMethodList.setEnabled(false); interceptMethodList.setVisibleRowCount(0); jScrollPane3.setViewportView(interceptMethodList); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridheight = 5; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 0.1; gridBagConstraints.weighty = 1.0; interceptrequestPanel.add(jScrollPane3, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; add(interceptrequestPanel, gridBagConstraints); interceptResponsePanel.setLayout(new java.awt.GridBagLayout()); interceptResponseCheckBox.setText("Intercept responses : "); interceptResponseCheckBox.setToolTipText("Use Ctrl-Alt S to toggle"); interceptResponseCheckBox.setHorizontalTextPosition(javax.swing.SwingConstants.LEADING); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0); interceptResponsePanel.add(interceptResponseCheckBox, gridBagConstraints); interceptResponseTextField.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { interceptResponseTextFieldActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 5); interceptResponsePanel.add(interceptResponseTextField, gridBagConstraints); jLabel1.setText("Only MIME-Types matching :"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0); interceptResponsePanel.add(jLabel1, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; add(interceptResponsePanel, gridBagConstraints); }// </editor-fold>//GEN-END:initComponents private void sensitiveCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sensitiveCheckBoxActionPerformed _manualEdit.setCaseSensitive(sensitiveCheckBox.isSelected()); }//GEN-LAST:event_sensitiveCheckBoxActionPerformed private void interceptResponseTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_interceptResponseTextFieldActionPerformed _manualEdit.setInterceptResponseRegex(interceptResponseTextField.getText()); }//GEN-LAST:event_interceptResponseTextFieldActionPerformed private void interceptExcludeRegexTextFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_interceptExcludeRegexTextFieldFocusLost _manualEdit.setExcludeRegex(interceptExcludeRegexTextField.getText()); }//GEN-LAST:event_interceptExcludeRegexTextFieldFocusLost private void interceptExcludeRegexTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_interceptExcludeRegexTextFieldActionPerformed _manualEdit.setExcludeRegex(interceptExcludeRegexTextField.getText()); }//GEN-LAST:event_interceptExcludeRegexTextFieldActionPerformed private void interceptIncludeRegexTextFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_interceptIncludeRegexTextFieldFocusLost _manualEdit.setIncludeRegex(interceptIncludeRegexTextField.getText()); }//GEN-LAST:event_interceptIncludeRegexTextFieldFocusLost private void interceptIncludeRegexTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_interceptIncludeRegexTextFieldActionPerformed _manualEdit.setIncludeRegex(interceptIncludeRegexTextField.getText()); }//GEN-LAST:event_interceptIncludeRegexTextFieldActionPerformed private void interceptMethodListValueChanged(ListSelectionEvent evt) { int[] indices = interceptMethodList.getSelectedIndices(); String[] methods = new String[indices.length]; ListModel lm = interceptMethodList.getModel(); for (int i=0; i< indices.length; i++) { methods[i] = (String) lm.getElementAt(indices[i]); } _manualEdit.setInterceptMethods(methods); } public JPanel getPanel() { return this; } public Request editRequest(Request request) { ManualEditFrame mef = new ManualEditFrame(); mef.setTitle("Edit Request"); mef.setInterceptModels(interceptRequestCheckBox.getModel(), interceptResponseCheckBox.getModel()); return mef.editRequest(request); } public Response editResponse(Request request, Response response) { ManualEditFrame mef = new ManualEditFrame(); mef.setTitle("Edit Response"); mef.setInterceptModels(interceptRequestCheckBox.getModel(), interceptResponseCheckBox.getModel()); return mef.editResponse(request, response); } public void setEnabled(boolean enabled) { super.setEnabled(enabled); interceptRequestCheckBox.setEnabled(enabled); interceptResponseCheckBox.setEnabled(enabled); interceptMethodList.setEnabled(enabled && interceptRequestCheckBox.isSelected()); interceptIncludeRegexTextField.setEnabled(enabled && interceptRequestCheckBox.isSelected()); interceptExcludeRegexTextField.setEnabled(enabled && interceptRequestCheckBox.isSelected()); interceptResponseTextField.setEnabled(enabled && interceptResponseCheckBox.isSelected()); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JLabel interceptExcludeLabel; private javax.swing.JTextField interceptExcludeRegexTextField; private javax.swing.JLabel interceptIncludeLabel; private javax.swing.JTextField interceptIncludeRegexTextField; private javax.swing.JList interceptMethodList; private javax.swing.JCheckBox interceptRequestCheckBox; private javax.swing.JCheckBox interceptResponseCheckBox; private javax.swing.JPanel interceptResponsePanel; private javax.swing.JTextField interceptResponseTextField; private javax.swing.JPanel interceptrequestPanel; private javax.swing.JLabel jLabel1; private javax.swing.JScrollPane jScrollPane3; private javax.swing.JCheckBox sensitiveCheckBox; // End of variables declaration//GEN-END:variables }