package org.owasp.webscarab.plugin.identity.swing; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import java.util.SortedSet; import java.util.TreeSet; import javax.swing.AbstractListModel; import javax.swing.ComboBoxModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.AbstractTableModel; import org.owasp.webscarab.model.ConversationID; import org.owasp.webscarab.model.NamedValue; import org.owasp.webscarab.plugin.identity.Identity; class SelectTokenDialog extends JDialog { private Identity identity; private JTable table; private JComboBox comboBox; private JButton btnOk; private TokenTableModel ttm; private IdentityComboModel icm; private ConversationID conversation; private boolean cancelled = true; public SelectTokenDialog(final Identity identity, Window window) { super(window); this.identity = identity; setAlwaysOnTop(true); setTitle("Select Token"); setModal(true); setMinimumSize(new Dimension(400, 300)); GridBagLayout gridBagLayout = new GridBagLayout(); gridBagLayout.columnWidths = new int[] { 0, 0, 0 }; gridBagLayout.rowHeights = new int[] { 0, 0, 0, 0 }; gridBagLayout.columnWeights = new double[] { 0.0, 1.0, Double.MIN_VALUE }; gridBagLayout.rowWeights = new double[] { 0.0, 0.0, 0.0, Double.MIN_VALUE }; getContentPane().setLayout(gridBagLayout); JScrollPane scrollPane = new JScrollPane(); GridBagConstraints gbc_scrollPane = new GridBagConstraints(); gbc_scrollPane.gridwidth = 2; gbc_scrollPane.weighty = 1.0; gbc_scrollPane.weightx = 1.0; gbc_scrollPane.insets = new Insets(0, 0, 5, 0); gbc_scrollPane.fill = GridBagConstraints.BOTH; gbc_scrollPane.gridx = 0; gbc_scrollPane.gridy = 0; getContentPane().add(scrollPane, gbc_scrollPane); ttm = new TokenTableModel(); table = new JTable(ttm); table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); scrollPane.setViewportView(table); table.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { int row = table.getSelectedRow(); comboBox.setEnabled(row >= 0); btnOk.setEnabled(row >= 0); if (row >= 0) { NamedValue token = ttm.getToken(row); String id = identity.getIdentity(getConversation(), token); comboBox.setSelectedItem(id); } else { comboBox.setSelectedItem(null); } } }); JLabel lblIdentity = new JLabel("Identity"); GridBagConstraints gbc_lblIdentity = new GridBagConstraints(); gbc_lblIdentity.insets = new Insets(0, 0, 5, 5); gbc_lblIdentity.anchor = GridBagConstraints.EAST; gbc_lblIdentity.gridx = 0; gbc_lblIdentity.gridy = 1; getContentPane().add(lblIdentity, gbc_lblIdentity); icm = new IdentityComboModel(); comboBox = new JComboBox(icm); comboBox.setToolTipText("Enter or select the identity"); comboBox.setEnabled(false); comboBox.setEditable(true); GridBagConstraints gbc_comboBox = new GridBagConstraints(); gbc_comboBox.insets = new Insets(0, 0, 5, 0); gbc_comboBox.fill = GridBagConstraints.HORIZONTAL; gbc_comboBox.gridx = 1; gbc_comboBox.gridy = 1; getContentPane().add(comboBox, gbc_comboBox); JPanel panel = new JPanel(); GridBagConstraints gbc_panel = new GridBagConstraints(); gbc_panel.weightx = 1.0; gbc_panel.anchor = GridBagConstraints.EAST; gbc_panel.fill = GridBagConstraints.BOTH; gbc_panel.gridx = 1; gbc_panel.gridy = 2; getContentPane().add(panel, gbc_panel); panel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5)); JButton btnCancel = new JButton("Cancel"); btnCancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setVisible(false); } }); panel.add(btnCancel); btnOk = new JButton("Ok"); btnOk.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { cancelled = false; setVisible(false); } }); btnOk.setEnabled(false); panel.add(btnOk); } @Override public void setVisible(boolean b) { super.setVisible(b); if (b) cancelled = true; } public boolean isCancelled() { return cancelled; } public void setConversation(ConversationID id) { this.conversation = id; } public ConversationID getConversation() { return conversation; } public void setIdentities(List<String> identities) { icm.setIdentities(identities); } public String getSelectedIdentity() { return (String) icm.getSelectedItem(); } public void setTokens(List<NamedValue> reqTokens, List<NamedValue> respTokens) { ttm.setTokens(reqTokens, respTokens); } public NamedValue getSelectedToken() { int row = table.getSelectedRow(); return row < 0 ? null : ttm.getToken(row); } private static class TokenTableModel extends AbstractTableModel { private String[] names = new String[] { "Source", "Name", "Value" }; private List<NamedValue> reqTokens, respTokens; private int reqCount = 0, respCount = 0; public void setTokens(List<NamedValue> reqTokens, List<NamedValue> respTokens) { this.reqTokens = reqTokens; reqCount = reqTokens == null ? 0 : reqTokens.size(); this.respTokens = respTokens; respCount = respTokens == null ? 0 : respTokens.size(); fireTableDataChanged(); } public NamedValue getToken(int row) { if (row < reqCount) return reqTokens.get(row); else if (row < getRowCount()) return respTokens.get(row - reqCount); return null; } @Override public String getColumnName(int column) { return names[column]; } @Override public Class<?> getColumnClass(int columnIndex) { return String.class; } @Override public int getRowCount() { return reqCount + respCount; } @Override public int getColumnCount() { return 3; } @Override public Object getValueAt(int rowIndex, int columnIndex) { if (columnIndex == 0) { if (rowIndex < reqCount) return "Request"; return "Response"; } NamedValue token = getToken(rowIndex); if (token == null) return null; if (columnIndex == 1) return token.getName(); return token.getValue(); } } private static class IdentityComboModel extends AbstractListModel implements ComboBoxModel { private List<String> identities = new ArrayList<String>(); private SortedSet<String> sorter = new TreeSet<String>(); private String selected = null; public void setIdentities(List<String> identities) { sorter.clear(); sorter.addAll(identities); this.identities.clear(); this.identities.addAll(sorter); fireContentsChanged(this, -1, -1); } @Override public int getSize() { return identities.size(); } @Override public Object getElementAt(int index) { return identities.get(index); } @Override public void setSelectedItem(Object anItem) { if (anItem instanceof String) { String item = (String) anItem; if (!identities.contains(item)) { sorter.add(item); identities.clear(); identities.addAll(sorter); } selected = item; } else { selected = null; } fireContentsChanged(this, -1, -1); } @Override public Object getSelectedItem() { return selected; } } }