/*********************************************************************** * * $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 * */ /* * CookieJarViewer.java * * Created on September 30, 2003, 10:08 PM */ package org.owasp.webscarab.ui.swing; import org.owasp.webscarab.model.Cookie; import org.owasp.webscarab.model.FrameworkModel; import org.owasp.webscarab.model.FrameworkListener; import org.owasp.webscarab.model.FrameworkEvent; import org.owasp.webscarab.util.swing.TableSorter; import javax.swing.table.AbstractTableModel; import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionEvent; import java.awt.Color; import java.util.Date; import java.util.logging.Logger; /** * * @author rdawes */ public class CookieJarViewer extends javax.swing.JFrame { /** * */ private static final long serialVersionUID = -1330444912535205210L; private FrameworkModel _model; private CookieTableModel _cookieTableModel; private HistoricalCookieTableModel _detailTableModel; private Logger _logger = Logger.getLogger(getClass().getName()); private String _key = null; /** Creates new form CookieJarViewer */ public CookieJarViewer(FrameworkModel model) { _model = model; initComponents(); _cookieTableModel = new CookieTableModel(_model); cookieTable.setModel(new TableSorter(_cookieTableModel, cookieTable.getTableHeader())); _detailTableModel = new HistoricalCookieTableModel(_model); cookieDetailTable.setModel(new TableSorter(_detailTableModel, cookieDetailTable.getTableHeader())); cookieTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent evt) { if (evt.getValueIsAdjusting()) return; int row = cookieTable.getSelectedRow(); if (row>-1) { _key = _cookieTableModel.getKeyAt(row); } else { _key = null; } _detailTableModel.setKey(_key); } }); addDialog.pack(); } /** 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; addDialog = new javax.swing.JDialog(); jLabel6 = new javax.swing.JLabel(); domainTextField = new javax.swing.JTextField(); jLabel4 = new javax.swing.JLabel(); pathTextField = new javax.swing.JTextField(); jLabel5 = new javax.swing.JLabel(); nameTextField = new javax.swing.JTextField(); jLabel3 = new javax.swing.JLabel(); valueTextField = new javax.swing.JTextField(); jPanel2 = new javax.swing.JPanel(); okButton = new javax.swing.JButton(); cancelButton = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); cookieTable = new javax.swing.JTable(); jLabel2 = new javax.swing.JLabel(); jScrollPane2 = new javax.swing.JScrollPane(); cookieDetailTable = new javax.swing.JTable(); closeButton = new javax.swing.JButton(); jPanel1 = new javax.swing.JPanel(); addButton = new javax.swing.JButton(); deleteButton = new javax.swing.JButton(); addDialog.getContentPane().setLayout(new java.awt.GridBagLayout()); addDialog.setTitle("Add Cookie"); addDialog.setLocationRelativeTo(null); addDialog.setModal(true); addDialog.setName("Add Cookie"); addDialog.setResizable(false); jLabel6.setText("Domain : "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; addDialog.getContentPane().add(jLabel6, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; addDialog.getContentPane().add(domainTextField, gridBagConstraints); jLabel4.setText("Path : "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; addDialog.getContentPane().add(jLabel4, gridBagConstraints); pathTextField.setMinimumSize(new java.awt.Dimension(200, 19)); pathTextField.setPreferredSize(new java.awt.Dimension(400, 19)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; addDialog.getContentPane().add(pathTextField, gridBagConstraints); jLabel5.setText("Name : "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; addDialog.getContentPane().add(jLabel5, gridBagConstraints); nameTextField.setMinimumSize(new java.awt.Dimension(200, 19)); nameTextField.setPreferredSize(new java.awt.Dimension(400, 19)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; addDialog.getContentPane().add(nameTextField, gridBagConstraints); jLabel3.setText("Value : "); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; addDialog.getContentPane().add(jLabel3, gridBagConstraints); valueTextField.setMinimumSize(new java.awt.Dimension(200, 19)); valueTextField.setPreferredSize(new java.awt.Dimension(400, 19)); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; addDialog.getContentPane().add(valueTextField, gridBagConstraints); okButton.setText("OK"); okButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { okButtonActionPerformed(evt); } }); jPanel2.add(okButton); cancelButton.setText("Cancel"); jPanel2.add(cancelButton); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.gridwidth = 2; addDialog.getContentPane().add(jPanel2, gridBagConstraints); getContentPane().setLayout(new java.awt.GridBagLayout()); setTitle("WebScarab Cookies"); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { exitForm(evt); } }); jLabel1.setText("Cookies"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; getContentPane().add(jLabel1, gridBagConstraints); jScrollPane1.setPreferredSize(new java.awt.Dimension(600, 200)); cookieTable.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { }, new String [] { } )); jScrollPane1.setViewportView(cookieTable); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(jScrollPane1, gridBagConstraints); jLabel2.setText("Previous values"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; getContentPane().add(jLabel2, gridBagConstraints); jScrollPane2.setPreferredSize(new java.awt.Dimension(300, 200)); cookieDetailTable.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { }, new String [] { } )); jScrollPane2.setViewportView(cookieDetailTable); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(jScrollPane2, gridBagConstraints); closeButton.setText("Close"); closeButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { closeButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.gridwidth = 2; gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4); getContentPane().add(closeButton, gridBagConstraints); jPanel1.setLayout(new java.awt.GridBagLayout()); addButton.setText("Add"); addButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTH; gridBagConstraints.weightx = 1.0; jPanel1.add(addButton, gridBagConstraints); deleteButton.setText("Delete"); deleteButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { deleteButtonActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH; gridBagConstraints.weightx = 1.0; jPanel1.add(deleteButton, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL; gridBagConstraints.weighty = 1.0; getContentPane().add(jPanel1, gridBagConstraints); java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize(); setBounds((screenSize.width-600)/2, (screenSize.height-400)/2, 600, 400); } // </editor-fold>//GEN-END:initComponents private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed String domain = domainTextField.getText(); domainTextField.setBackground("".equals(domain)?Color.RED:Color.WHITE); String path = pathTextField.getText(); if ("".equals(path)) path = "/"; String name = nameTextField.getText(); nameTextField.setBackground("".equals(name)?Color.RED:Color.WHITE); String value = valueTextField.getText(); if ("".equals(domain) || "".equals(name)) return; Cookie cookie = new Cookie(new Date(), name + "=" + value + "; domain=" + domain + "; path="+path); _logger.info("Cookie is " + cookie); _model.addCookie(cookie); addDialog.setVisible(false); }//GEN-LAST:event_okButtonActionPerformed private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteButtonActionPerformed int row = cookieDetailTable.getSelectedRow(); if (row < cookieDetailTable.getRowCount() && row > -1) { Cookie cookie = _model.getCookieAt(_key, row); _model.removeCookie(cookie); } }//GEN-LAST:event_deleteButtonActionPerformed private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addButtonActionPerformed addDialog.setVisible(true); }//GEN-LAST:event_addButtonActionPerformed private void closeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeButtonActionPerformed setVisible(false); }//GEN-LAST:event_closeButtonActionPerformed /** Exit the Application */ private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm setVisible(false); }//GEN-LAST:event_exitForm // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addButton; private javax.swing.JDialog addDialog; private javax.swing.JButton cancelButton; private javax.swing.JButton closeButton; private javax.swing.JTable cookieDetailTable; private javax.swing.JTable cookieTable; private javax.swing.JButton deleteButton; private javax.swing.JTextField domainTextField; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JTextField nameTextField; private javax.swing.JButton okButton; private javax.swing.JTextField pathTextField; private javax.swing.JTextField valueTextField; // End of variables declaration//GEN-END:variables private class CookieTableModel extends AbstractTableModel { /** * */ private static final long serialVersionUID = 5256611073293100905L; private FrameworkModel _model; private FrameworkListener _listener = new FrameworkListener() { public void cookieAdded(FrameworkEvent evt) { Cookie cookie = evt.getCookie(); int row = _model.getIndexOfCookie(cookie); int count = _model.getCookieCount(cookie.getKey()); if (count == 1) { fireTableRowsInserted(row, row); } else { fireTableRowsUpdated(row, row); } } public void cookieRemoved(FrameworkEvent evt) { Cookie cookie = evt.getCookie(); int count = _model.getCookieCount(cookie.getKey()); if (count == 0) { fireTableDataChanged(); } else { int row = _model.getIndexOfCookie(cookie); fireTableRowsUpdated(row, row); } } public void cookiesChanged() { fireTableDataChanged(); } public void conversationPropertyChanged(FrameworkEvent evt) {} public void urlPropertyChanged(FrameworkEvent evt) {} }; private String[] _columnNames = new String[] { "Domain", "Path", "Name", "Date", "Value", "Secure", "Max age", "Comment" }; private Class<?>[] _columnClass = new Class[] { String.class, String.class, String.class, Date.class, String.class, Boolean.class, String.class, String.class }; public CookieTableModel(FrameworkModel model) { this._model = model; this._model.addModelListener(_listener); } public int getColumnCount() { return _columnNames.length; } public int getRowCount() { if (this._model == null) return 0; return this._model.getCookieCount(); } public Object getValueAt(int rowIndex, int columnIndex) { String key = this._model.getCookieAt(rowIndex); Cookie cookie = this._model.getCurrentCookie(key); switch (columnIndex) { case 0: return cookie.getDomain(); case 1: return cookie.getPath(); case 2: return cookie.getName(); case 3: return cookie.getDate(); case 4: return cookie.getValue(); case 5: return Boolean.valueOf(cookie.getSecure()); case 6: return cookie.getMaxAge(); case 7: return cookie.getComment(); } return null; } public String getColumnName(int columnIndex) { return _columnNames[columnIndex]; } public Class<?> getColumnClass(int columnIndex) { return _columnClass[columnIndex]; } public String getKeyAt(int row) { return this._model.getCookieAt(row); } } private class HistoricalCookieTableModel extends AbstractTableModel { /** * */ private static final long serialVersionUID = 5621223454741175006L; private FrameworkModel _model = null; private String _key = null; private FrameworkListener _listener = new FrameworkListener() { public void cookieAdded(FrameworkEvent evt) { Cookie cookie = evt.getCookie(); if (_key == null || ! _key.equals(cookie.getKey())) return; int row = _model.getIndexOfCookie(_key, cookie); fireTableRowsInserted(row, row); } public void cookieRemoved(FrameworkEvent evt) { Cookie cookie = evt.getCookie(); if (_key == null || ! _key.equals(cookie.getKey())) return; fireTableDataChanged(); } public void cookiesChanged() { fireTableDataChanged(); } public void conversationPropertyChanged(FrameworkEvent evt) {} public void urlPropertyChanged(FrameworkEvent evt) {} }; private String[] _columnNames = new String[] { "Date", "Value", "Secure", "Max age", "Comment" }; private Class<?>[] _columnClass = new Class[] { Date.class, String.class, Boolean.class, String.class, String.class }; public HistoricalCookieTableModel(FrameworkModel model) { this._model = model; this._model.addModelListener(_listener); } public void setKey(String key) { _key = key; fireTableDataChanged(); } public int getRowCount() { if (this._model == null) return 0; if (_key == null) return 0; return this._model.getCookieCount(_key); } public Object getValueAt(int row, int column) { Cookie cookie = this._model.getCookieAt(_key, row); switch (column) { case 0: return cookie.getDate(); case 1: return cookie.getValue(); case 2: return Boolean.valueOf(cookie.getSecure()); case 3: return cookie.getMaxAge(); case 4: return cookie.getComment(); } return null; } public int getColumnCount() { return _columnNames.length; } public String getColumnName(int columnIndex) { return _columnNames[columnIndex]; } public Class<?> getColumnClass(int columnIndex) { return _columnClass[columnIndex]; } } }