/***********************************************************************
*
* $CVSHeader$
*
* This file is part of WebScarab, an Open Web Application Security
* Project utility. For details, please see http://www.owasp.org/
*
* Copyright (c) 2011 FedICT
*
* 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
*
*/
package org.owasp.webscarab.plugin.wsfed.swing;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.Action;
import javax.swing.JPanel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableModel;
import org.owasp.webscarab.model.ConversationID;
import org.owasp.webscarab.model.HttpUrl;
import org.owasp.webscarab.model.NamedValue;
import org.owasp.webscarab.plugin.saml.swing.AttributesTableModel;
import org.owasp.webscarab.plugin.wsfed.WSFederation;
import org.owasp.webscarab.plugin.wsfed.WSFederationModel;
import org.owasp.webscarab.ui.swing.ColumnWidthTracker;
import org.owasp.webscarab.ui.swing.ConversationTableModel;
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.TableSorter;
/**
*
* @author Frank Cornelis
*/
public class WSFederationPanel extends javax.swing.JPanel implements SwingPluginUI {
private final WSFederation wsfed;
private final WSFederationModel wsfedModel;
private final ParametersTableModel parametersTableModel;
private final ShowConversationAction showConversationAction;
private final AttributesTableModel samlAttributesTableModel;
/** Creates new form WSFederationPanel */
public WSFederationPanel(WSFederation wsfed) {
this.wsfed = wsfed;
this.wsfedModel = wsfed.getModel();
initComponents();
this.showConversationAction = new ShowConversationAction(this.wsfedModel.getConversationModel());
this.wsfedPopupMenu.add(this.showConversationAction);
ConversationTableModel wsfedTableModel = new ConversationTableModel(
this.wsfedModel.getConversationModel());
wsfedTableModel.addColumn(new ColumnDataModel<ConversationID>("WS-Federation", String.class) {
@Override
public Object getValue(ConversationID key) {
return WSFederationPanel.this.wsfedModel.getReadableMessageType(key);
}
});
ColumnWidthTracker.getTracker("WSFederationTable").addTable(this.conversationsTable);
TableSorter sorterWSFederationTableModel = new TableSorter(wsfedTableModel);
this.conversationsTable.setModel(sorterWSFederationTableModel);
addTableListeners();
this.parametersTableModel = new ParametersTableModel();
this.parametersTable.setModel(this.parametersTableModel);
this.samlAttributesTableModel = new AttributesTableModel();
this.samlAttributesTable.setModel(this.samlAttributesTableModel);
}
private void addTableListeners() {
this.conversationsTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
return;
}
int row = WSFederationPanel.this.conversationsTable.getSelectedRow();
TableModel tm = WSFederationPanel.this.conversationsTable.getModel();
ConversationID id;
if (row > -1) {
id = (ConversationID) tm.getValueAt(
row, 0); // UGLY hack! FIXME!!!!
WSFederationPanel.this.display(id);
} else {
id = null;
WSFederationPanel.this.resetDisplay();
}
WSFederationPanel.this.showConversationAction.putValue("CONVERSATION", id);
}
});
this.conversationsTable.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
private void maybeShowPopup(MouseEvent e) {
int row = WSFederationPanel.this.conversationsTable.rowAtPoint(e.getPoint());
WSFederationPanel.this.conversationsTable.getSelectionModel().setSelectionInterval(row, row);
if (e.isPopupTrigger()) {
WSFederationPanel.this.wsfedPopupMenu.show(e.getComponent(), e.getX(), e.getY());
}
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
ActionEvent actionEvent = new ActionEvent(WSFederationPanel.this.conversationsTable, 0, (String) WSFederationPanel.this.showConversationAction.getValue(Action.ACTION_COMMAND_KEY));
WSFederationPanel.this.showConversationAction.actionPerformed(actionEvent);
}
}
});
}
/** 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.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
wsfedPopupMenu = new javax.swing.JPopupMenu();
jSplitPane1 = new javax.swing.JSplitPane();
jTabbedPane1 = new javax.swing.JTabbedPane();
jPanel3 = new javax.swing.JPanel();
jScrollPane2 = new javax.swing.JScrollPane();
parametersTable = new javax.swing.JTable();
jPanel4 = new javax.swing.JPanel();
xmlPanel = new org.owasp.webscarab.ui.swing.editors.XMLPanel();
jPanel5 = new javax.swing.JPanel();
jTabbedPane3 = new javax.swing.JTabbedPane();
jPanel6 = new javax.swing.JPanel();
assertionPanel = new org.owasp.webscarab.ui.swing.editors.XMLPanel();
jPanel7 = new javax.swing.JPanel();
jPanel8 = new javax.swing.JPanel();
jScrollPane3 = new javax.swing.JScrollPane();
samlAttributesTable = new javax.swing.JTable();
jPanel1 = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jTabbedPane2 = new javax.swing.JTabbedPane();
jPanel2 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
conversationsTable = new javax.swing.JTable();
setLayout(new java.awt.BorderLayout());
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
jPanel3.setLayout(new java.awt.BorderLayout());
jScrollPane2.setViewportView(parametersTable);
jPanel3.add(jScrollPane2, java.awt.BorderLayout.CENTER);
jTabbedPane1.addTab("Parameters", jPanel3);
jPanel4.setLayout(new java.awt.BorderLayout());
jPanel4.add(xmlPanel, java.awt.BorderLayout.CENTER);
jTabbedPane1.addTab("XML", jPanel4);
jPanel5.setLayout(new java.awt.BorderLayout());
jPanel6.setLayout(new java.awt.BorderLayout());
jPanel6.add(assertionPanel, java.awt.BorderLayout.CENTER);
jTabbedPane3.addTab("XML", jPanel6);
jTabbedPane3.addTab("Signature", jPanel7);
jPanel8.setLayout(new java.awt.BorderLayout());
jScrollPane3.setViewportView(samlAttributesTable);
jPanel8.add(jScrollPane3, java.awt.BorderLayout.CENTER);
jTabbedPane3.addTab("Attributes", jPanel8);
jPanel5.add(jTabbedPane3, java.awt.BorderLayout.CENTER);
jTabbedPane1.addTab("SAML Assertion", jPanel5);
jPanel1.setLayout(new java.awt.GridBagLayout());
jLabel1.setText("WebScarab WS-Federation Plugin");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 20, 0);
jPanel1.add(jLabel1, gridBagConstraints);
jLabel2.setText("Copyright (C) 2011 Frank Cornelis <info@frankcornelis.be>");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
jPanel1.add(jLabel2, gridBagConstraints);
jLabel3.setText("Copyright (C) 2011 FedICT");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
jPanel1.add(jLabel3, gridBagConstraints);
jTabbedPane1.addTab("About", jPanel1);
jSplitPane1.setBottomComponent(jTabbedPane1);
jPanel2.setLayout(new java.awt.BorderLayout());
jScrollPane1.setViewportView(conversationsTable);
jPanel2.add(jScrollPane1, java.awt.BorderLayout.CENTER);
jTabbedPane2.addTab("Web Passive Requestor Messages", jPanel2);
jSplitPane1.setTopComponent(jTabbedPane2);
add(jSplitPane1, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private org.owasp.webscarab.ui.swing.editors.XMLPanel assertionPanel;
private javax.swing.JTable conversationsTable;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
private javax.swing.JPanel jPanel6;
private javax.swing.JPanel jPanel7;
private javax.swing.JPanel jPanel8;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane3;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JTabbedPane jTabbedPane1;
private javax.swing.JTabbedPane jTabbedPane2;
private javax.swing.JTabbedPane jTabbedPane3;
private javax.swing.JTable parametersTable;
private javax.swing.JTable samlAttributesTable;
private javax.swing.JPopupMenu wsfedPopupMenu;
private org.owasp.webscarab.ui.swing.editors.XMLPanel xmlPanel;
// End of variables declaration//GEN-END:variables
@Override
public JPanel getPanel() {
return this;
}
@Override
public Action[] getUrlActions() {
return null;
}
@Override
public ColumnDataModel<HttpUrl>[] getUrlColumns() {
return null;
}
@Override
public Action[] getConversationActions() {
return null;
}
@Override
public ColumnDataModel<ConversationID>[] getConversationColumns() {
return null;
}
@Override
public String getPluginName() {
return this.wsfed.getPluginName();
}
private void display(ConversationID id) {
resetDisplay();
List parameters = this.wsfedModel.getParameters(id);
this.parametersTableModel.setParameters(parameters);
Iterator parameterIter = parameters.iterator();
while (parameterIter.hasNext()) {
NamedValue parameter = (NamedValue) parameterIter.next();
if ("wreq".equals(parameter.getName())) {
this.xmlPanel.setBytes("text/xml", parameter.getValue().getBytes());
break;
}
if ("wresult".equals(parameter.getName())) {
this.xmlPanel.setBytes("text/xml", parameter.getValue().getBytes());
try {
byte[] assertion = this.wsfedModel.findSAMLAssertion(parameter.getValue().getBytes());
if (null != assertion) {
this.assertionPanel.setBytes("text/xml", assertion);
List samlAttributes = this.wsfedModel.getSAMLAttributes(assertion);
this.samlAttributesTableModel.setAttributes(samlAttributes);
}
} catch (Exception ex) {
Logger.getLogger(WSFederationPanel.class.getName()).log(Level.SEVERE, null, ex);
}
break;
}
}
}
private void resetDisplay() {
this.parametersTableModel.resetParameters();
this.xmlPanel.setBytes(null, null);
this.assertionPanel.setBytes(null, null);
this.samlAttributesTableModel.resetAttributes();
}
}