/*
* ExtensionsPanel.java
*
* Created on 05 December 2005, 08:41
*/
package org.owasp.webscarab.plugin.xsscrlf.swing;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.logging.Logger;
import javax.swing.Action;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableModel;
import org.owasp.webscarab.model.HttpUrl;
import org.owasp.webscarab.model.Preferences;
import org.owasp.webscarab.plugin.xsscrlf.XSSCRLF;
import org.owasp.webscarab.plugin.xsscrlf.XSSCRLFModel;
import org.owasp.webscarab.ui.swing.ColumnWidthTracker;
import org.owasp.webscarab.ui.swing.ConversationTableModel;
import org.owasp.webscarab.ui.swing.DateRenderer;
import org.owasp.webscarab.ui.swing.EnabledBooleanTableCellRenderer;
import org.owasp.webscarab.ui.swing.ShowConversationAction;
import org.owasp.webscarab.ui.swing.SwingPluginUI;
import org.owasp.webscarab.util.swing.ColumnDataModel;
import org.owasp.webscarab.util.swing.SwingWorker;
import org.owasp.webscarab.util.swing.TableSorter;
import org.owasp.webscarab.model.ConversationID;
/**
*
* @author rdawes
*/
public class XSSCRLFPanel extends javax.swing.JPanel implements SwingPluginUI {
/**
*
*/
private static final long serialVersionUID = -5862303750441463107L;
private XSSCRLF _xsscrlf;
private XSSCRLFModel _model;
private Logger _logger = Logger.getLogger(getClass().getName());
private ColumnDataModel<ConversationID>[] _vulnerableConversationColumns;
private ColumnDataModel<HttpUrl>[] _vulnerableUrlColumns;
private ShowConversationAction _showAction;
/** Creates new form XSSCRLFPanel */
public XSSCRLFPanel(XSSCRLF xsscrlf) {
_xsscrlf = xsscrlf;
_model = xsscrlf.getModel();
initComponents();
conversationTable.setDefaultRenderer(Boolean.class,
new EnabledBooleanTableCellRenderer());
suspectedTable.setDefaultRenderer(Boolean.class,
new EnabledBooleanTableCellRenderer());
ConversationTableModel vtm = new ConversationTableModel(_model.getVulnerableConversationModel());
_vulnerableConversationColumns = new ColumnDataModel[] {
new ColumnDataModel<ConversationID>("Possible Injection", Boolean.class) {
public Object getValue(ConversationID key) {
return _model.isXSSSuspected(key) || _model.isCRLFSuspected(key)? Boolean.TRUE : Boolean.FALSE;
}
},
new ColumnDataModel<ConversationID>("XSS", Boolean.class) {
public Object getValue(ConversationID key) {
return _model.isXSSVulnerable(key) ? Boolean.TRUE : Boolean.FALSE;
}
},
new ColumnDataModel<ConversationID>("CRLF", Boolean.class) {
public Object getValue(ConversationID key) {
return _model.isCRLFVulnerable(key) ? Boolean.TRUE : Boolean.FALSE;
}
}
};
vtm.addColumn(_vulnerableConversationColumns[0]);
vtm.addColumn(_vulnerableConversationColumns[1]);
ConversationTableModel stm = new ConversationTableModel(_model.getSuspectedConversationModel());
stm.addColumn(new ColumnDataModel<ConversationID>("XSS", Boolean.class) {
public Object getValue(ConversationID key) {
return _model.isXSSSuspected(key) ? Boolean.TRUE : Boolean.FALSE;
}
});
stm.addColumn(new ColumnDataModel<ConversationID>("XSS parameters", Boolean.class) {
public Object getValue(ConversationID key) {
return _model.getXSSSuspected(key);
}
});
stm.addColumn(new ColumnDataModel<ConversationID>("CRLF", Boolean.class) {
public Object getValue(ConversationID key) {
return _model.isCRLFSuspected(key) ? Boolean.TRUE : Boolean.FALSE;
}
});
stm.addColumn(new ColumnDataModel<ConversationID>("CRLF parameters", Boolean.class) {
public Object getValue(ConversationID key) {
return _model.getCRLFSuspected(key);
}
});
TableSorter vts = new TableSorter(vtm, conversationTable.getTableHeader());
TableSorter sts = new TableSorter(stm, suspectedTable.getTableHeader());
conversationTable.setModel(vts);
suspectedTable.setModel(sts);
ColumnWidthTracker.getTracker("ConversationTable").addTable(conversationTable);
ColumnWidthTracker.getTracker("ConversationTable").addTable(suspectedTable);
conversationTable.setDefaultRenderer(Date.class, new DateRenderer());
suspectedTable.setDefaultRenderer(Date.class, new DateRenderer());
_vulnerableUrlColumns = new ColumnDataModel[] {
new ColumnDataModel<HttpUrl>("Possible Injection", Boolean.class) {
public Object getValue(HttpUrl key) {
return _model.isSuspected(key) ? Boolean.TRUE : Boolean.FALSE;
}
},
new ColumnDataModel<HttpUrl>("Injection", Boolean.class) {
public Object getValue(HttpUrl key) {
return _model.isXSSVulnerable(key) || _model.isCRLFVulnerable(key)? Boolean.TRUE : Boolean.FALSE;
}
}
};
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
editDialog.setBounds((screenSize.width-300)/2, (screenSize.height-150)/2, 300, 150);
addTableListeners();
}
private void addTableListeners() {
_showAction = new ShowConversationAction(_model.getVulnerableConversationModel());
conversationTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) return;
int row = conversationTable.getSelectedRow();
TableModel tm = conversationTable.getModel();
if (row >-1) {
ConversationID id = (ConversationID) tm.getValueAt(row, 0); // UGLY hack! FIXME!!!!
_showAction.putValue("CONVERSATION", id);
} else {
_showAction.putValue("CONVERSATION", null);
}
}
});
conversationTable.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
int row = conversationTable.rowAtPoint(e.getPoint());
conversationTable.getSelectionModel().setSelectionInterval(row,row);
if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
ActionEvent evt = new ActionEvent(conversationTable, 0, (String) _showAction.getValue(Action.ACTION_COMMAND_KEY));
if (_showAction.isEnabled())
_showAction.actionPerformed(evt);
}
}
});
}
/** 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;
editDialog = new javax.swing.JDialog();
tabbedPane = new javax.swing.JTabbedPane();
jScrollPane4 = new javax.swing.JScrollPane();
xssTextArea = new javax.swing.JTextArea();
jScrollPane3 = new javax.swing.JScrollPane();
crlfTextArea = new javax.swing.JTextArea();
jPanel3 = new javax.swing.JPanel();
loadButton = new javax.swing.JButton();
cancelButton = new javax.swing.JButton();
okButton = new javax.swing.JButton();
jSplitPane1 = new javax.swing.JSplitPane();
jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
suspectedTable = new javax.swing.JTable();
jPanel2 = new javax.swing.JPanel();
jLabel2 = new javax.swing.JLabel();
jScrollPane2 = new javax.swing.JScrollPane();
conversationTable = new javax.swing.JTable();
controlPanel = new javax.swing.JPanel();
editButton = new javax.swing.JButton();
checkButton = new javax.swing.JButton();
editDialog.setTitle("Extensions");
editDialog.setModal(true);
tabbedPane.setMinimumSize(new java.awt.Dimension(200, 200));
tabbedPane.setPreferredSize(new java.awt.Dimension(200, 200));
jScrollPane4.setViewportView(xssTextArea);
tabbedPane.addTab("XSS", jScrollPane4);
jScrollPane3.setViewportView(crlfTextArea);
tabbedPane.addTab("CRLF Injection", jScrollPane3);
editDialog.getContentPane().add(tabbedPane, java.awt.BorderLayout.CENTER);
loadButton.setText("Load");
loadButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
loadButtonActionPerformed(evt);
}
});
jPanel3.add(loadButton);
cancelButton.setText("Cancel");
cancelButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelButtonActionPerformed(evt);
}
});
jPanel3.add(cancelButton);
okButton.setText("Ok");
okButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
okButtonActionPerformed(evt);
}
});
jPanel3.add(okButton);
editDialog.getContentPane().add(jPanel3, java.awt.BorderLayout.SOUTH);
setLayout(new java.awt.BorderLayout());
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
jSplitPane1.setResizeWeight(0.5);
jPanel1.setLayout(new java.awt.BorderLayout());
jLabel1.setText("Suspected Vulnerabilities");
jPanel1.add(jLabel1, java.awt.BorderLayout.NORTH);
suspectedTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null}
},
new String [] {
"Title 1", "Title 2", "Title 3", "Title 4"
}
));
suspectedTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
jScrollPane1.setViewportView(suspectedTable);
jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);
jSplitPane1.setLeftComponent(jPanel1);
jPanel2.setLayout(new java.awt.BorderLayout());
jLabel2.setText("Confirmed Vulnerabilities");
jPanel2.add(jLabel2, java.awt.BorderLayout.NORTH);
conversationTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null}
},
new String [] {
"Title 1", "Title 2", "Title 3", "Title 4"
}
));
conversationTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
jScrollPane2.setViewportView(conversationTable);
jPanel2.add(jScrollPane2, java.awt.BorderLayout.CENTER);
jSplitPane1.setRightComponent(jPanel2);
add(jSplitPane1, java.awt.BorderLayout.CENTER);
controlPanel.setLayout(new java.awt.GridBagLayout());
editButton.setText("Edit Test Strings");
editButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
editButtonActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = 3;
controlPanel.add(editButton, gridBagConstraints);
checkButton.setText("Check");
checkButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
checkButtonActionPerformed(evt);
}
});
controlPanel.add(checkButton, new java.awt.GridBagConstraints());
add(controlPanel, java.awt.BorderLayout.SOUTH);
}// </editor-fold>//GEN-END:initComponents
private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
_model.setCRLFTestString(crlfTextArea.getText());
_model.setXSSTestString(xssTextArea.getText());
editDialog.setVisible(false);
}//GEN-LAST:event_okButtonActionPerformed
private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
editDialog.setVisible(false);
}//GEN-LAST:event_cancelButtonActionPerformed
private void loadButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_loadButtonActionPerformed
JFileChooser jfc = new JFileChooser(Preferences.getPreference("XSSCRLF.DefaultDirectory"));
jfc.setDialogTitle("Open test string file");
int returnVal = jfc.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File extFile = jfc.getSelectedFile();
try {
String testString=_xsscrlf.loadString(extFile);
if (tabbedPane.getTitleAt(tabbedPane.getSelectedIndex()).equals("XSS")) {
xssTextArea.setText(testString);
} else {
crlfTextArea.setText(testString);
}
} catch (IOException ioe) {
JOptionPane.showMessageDialog(null, new String[] {"Error loading test string: ", ioe.getMessage()}, "Error", JOptionPane.ERROR_MESSAGE);
}
}
Preferences.setPreference("XSSCRLF.DefaultDirectory", jfc.getCurrentDirectory().getAbsolutePath());
}//GEN-LAST:event_loadButtonActionPerformed
private void editButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editButtonActionPerformed
xssTextArea.setText(_model.getXSSTestString());
crlfTextArea.setText(_model.getCRLFTestString());
editDialog.setVisible(true);
}//GEN-LAST:event_editButtonActionPerformed
private void checkButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkButtonActionPerformed
String action = evt.getActionCommand();
if (action.equals("Stop")) {
_xsscrlf.stopChecks();
return;
}
final int[] selection = suspectedTable.getSelectedRows();
// XXX meder: selection in tables is buggy for now assume that all URLs were selected
// final int[] selection = new int[suspectedTable.getRowCount()];
// for(int k=0; k < selection.length; k++) selection[k]=k;
if (selection == null || selection.length == 0) return;
if (_xsscrlf.isBusy()) {
showBusyMessage();
return;
}
final ConversationID[] CIDs = new ConversationID[selection.length];
TableModel tm = suspectedTable.getModel();
for (int i=0; i<selection.length; i++) {
CIDs[i]= (ConversationID) tm.getValueAt(i,0); // UGLY hack! FIXME!!!!
}
checkButton.setText("Stop");
new SwingWorker() {
public Object construct() {
_xsscrlf.checkSelected(CIDs);
return null;
}
public void finished() {
Object result = getValue();
if (result != null && result instanceof Throwable) {
Throwable throwable = (Throwable) result;
_logger.warning("Caught a : " + throwable.toString());
}
checkButton.setText("Check");
}
}.start();
}//GEN-LAST:event_checkButtonActionPerformed
private void showBusyMessage() {
_logger.warning("Plugin is still busy, please wait");
// FIXME show a message dialog
}
public Action[] getConversationActions() {
return null;
}
public ColumnDataModel<ConversationID>[] getConversationColumns() {
return _vulnerableConversationColumns;
}
public javax.swing.JPanel getPanel() {
return this;
}
public String getPluginName() {
return _xsscrlf.getPluginName();
}
public Action[] getUrlActions() {
return null;
}
public ColumnDataModel<HttpUrl>[] getUrlColumns() {
return _vulnerableUrlColumns;
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton cancelButton;
private javax.swing.JButton checkButton;
private javax.swing.JPanel controlPanel;
private javax.swing.JTable conversationTable;
private javax.swing.JTextArea crlfTextArea;
private javax.swing.JButton editButton;
private javax.swing.JDialog editDialog;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JScrollPane jScrollPane4;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JButton loadButton;
private javax.swing.JButton okButton;
private javax.swing.JTable suspectedTable;
private javax.swing.JTabbedPane tabbedPane;
private javax.swing.JTextArea xssTextArea;
// End of variables declaration//GEN-END:variables
}