/** * JRadiusSimulator * Copyright (C) 2004-2005 PicoPoint, B.V. * Copyright (C) 2006-2007 David Bird <david@coova.com> * * 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 * */ package net.jradius.client.gui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Event; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; import java.net.ConnectException; import java.net.InetAddress; import java.net.URL; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.Map; import java.util.Properties; import javax.net.ssl.KeyManager; import javax.net.ssl.TrustManager; import javax.swing.AbstractButton; import javax.swing.AbstractCellEditor; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFormattedTextField; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.JToggleButton; import javax.swing.JTree; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.table.TableCellEditor; import javax.swing.table.TableColumn; import javax.swing.text.NumberFormatter; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import net.jradius.client.RadiusClient; import net.jradius.client.RadiusClientTransport; import net.jradius.client.TransportStatusListener; import net.jradius.client.UDPClientTransport; import net.jradius.client.auth.RadiusAuthenticator; import net.jradius.client.auth.TunnelAuthenticator; import net.jradius.dictionary.Attr_AcctSessionId; import net.jradius.dictionary.Attr_AcctStatusType; import net.jradius.dictionary.Attr_Class; import net.jradius.dictionary.Attr_ReplyMessage; import net.jradius.dictionary.Attr_UserPassword; import net.jradius.exception.StandardViolatedException; import net.jradius.exception.TimeoutException; import net.jradius.exception.UnknownAttributeException; import net.jradius.packet.AccessReject; import net.jradius.packet.AccessRequest; import net.jradius.packet.AccountingRequest; import net.jradius.packet.CoARequest; import net.jradius.packet.DisconnectRequest; import net.jradius.packet.PacketFactory; import net.jradius.packet.RadiusPacket; import net.jradius.packet.RadiusRequest; import net.jradius.packet.attribute.AttributeFactory; import net.jradius.packet.attribute.AttributeFactory.VendorValue; import net.jradius.packet.attribute.AttributeList; import net.jradius.packet.attribute.RadiusAttribute; import net.jradius.packet.attribute.VSADictionary; import net.jradius.packet.attribute.VSAttribute; import net.jradius.packet.attribute.value.IntegerValue; import net.jradius.packet.attribute.value.NamedValue; import net.jradius.packet.attribute.value.NamedValue.NamedValueMap; import net.jradius.radsec.RadSecClientTransport; import net.jradius.standard.IRAPStandard; import net.jradius.standard.RadiusStandard; import net.jradius.standard.WISPrStandard; import net.jradius.util.Base64; import net.jradius.util.KeyStoreUtil; import net.jradius.util.RadiusRandom; /** * Java Swing Graphical User Interface for the JRadius RADIUS Client. * @author David Bird */ public class JRadiusSimulator extends JFrame { private static final long serialVersionUID = (long)0; public static final String logSepLine = "----------------------------------------------------------"; private static String configFileUrl = "file:///" + System.getProperty("user.home") + "/.jRadiusSimulator"; private String[] authTypeNames = { "PAP", "CHAP", "MSCHAPv1", "MSCHAPv2", "EAP-MD5", "EAP-MSCHAPv2", "EAP-TLS", "PEAP", "EAP-TTLS/PAP" }; private String[] keystoreTypes = { "PEM", "PKCS12", "JKS" }; private String[] transportTypes = { "UDP", "RadSec" }; private Properties properties; private Thread[] simulationThreads = null; private SimulationRunner[] simulationRunners = null; private Thread simulationMonitor = null; boolean interactiveSession = false; private final HashMap namedValueComponentCache = new HashMap(); private NumberFormatter numberFormatter; private PrintStream logSent; private PrintStream logRecv; private PrintStream logErr; private AttributesTableModel attributesTableModel = new AttributesTableModel(); private JMenuBar jJMenuBar = null; private JMenu fileMenu = null; private JMenu helpMenu = null; private JMenuItem exitMenuItem = null; private JMenuItem aboutMenuItem = null; private JMenuItem saveMenuItem = null; private JMenuItem saveAsMenuItem = null; private JMenuItem openMenuItem = null; private JMenuItem openUrlMenuItem = null; private JTabbedPane mainTabPane = null; private JPanel radiusPanel = null; private JPanel diameterPanel = null; private JPanel dhcpPanel = null; private JPanel logPanel = null; private JPanel runStatusPanel = null; private LogConsole logConsole = null; private JPanel logButtonPanel = null; private JPanel mainContentPane = null; private JButton clearLogButton = null; private JButton saveLogButton = null; private JPanel runStatsPanel = null; private JLabel runStatsSent = null; private JLabel runStatsRecv = null; private JLabel runStatsTime = null; private JLabel runStatsRPS = null; private JLabel runStatsPktAccept = null; private JLabel runStatsPktReject = null; private JLabel runStatsPktChallenge = null; private JLabel runStatsPktAcctResp = null; private JLabel runStatsTime1 = null; private JLabel runStatsTime2 = null; private JLabel runStatsTime3 = null; private JLabel runStatsTime4 = null; private JLabel runStatsTime5 = null; private JLabel runStatsThreads = null; private JToggleButton runButton = null; private JScrollPane attributesTableScrollPane = null; private JTable attributesTable = null; private JPanel sendOptionsPanel = null; private JButton addAttributeButton = null; private JDialog addAttributeDialog = null; private JPanel addAttributeContentPane = null; private JTree attributeTree = null; private JPanel addAttributePanel = null; private JComboBox authTypeComboBox = null; private JComboBox checkStandardComboBox = null; private JPanel attributesPanel = null; private JPanel keysPanel = null; private JPanel keysOptionsPanel = null; private JTextField radiusServerTextField = null; private JTextField tlsKeyFileTextField = null; private JTextField tlsKeyPasswordTextField = null; private JTextField tlsCAFileTextField = null; private JTextField tlsCAPasswordTextField = null; private JFormattedTextField requestersTextField = null; private JFormattedTextField requestsTextField = null; private JComboBox tlsKeyFileTypeComboBox = null; private JComboBox tlsCAFileTypeComboBox = null; private JCheckBox tlsTrustAll = null; private JCheckBox tlsUseJavaRootCA = null; private JLabel radiusServerLabel = null; private JTextField sharedSecretTextField = null; private JButton doneButton = null; private JScrollPane attributeTreeScrollPane = null; private JPanel attributeTreeScrollPanel = null; private JButton addButton = null; private JComboBox simulationTypeComboBox = null; private JPanel attributesButtonPanel = null; private JButton removeAttributeButton = null; private JButton moveUpButton = null; private JButton moveDownButton = null; private JFormattedTextField radiusAuthPortTextField = null; private JFormattedTextField radiusAcctPortTextField = null; private JFormattedTextField radiusRetriesTextField = null; private JFormattedTextField radiusTimeoutTextField = null; private JFormattedTextField radiusInterimIntervalTextField = null; private JFormattedTextField sessionTimeTextField = null; private JCheckBox generateAcctSessionIdCheckBox = null; private JCheckBox doLogCheckBox = null; private JCheckBox floodCheckBox = null; private JCheckBox notStopOnRejectCheckBox = null; private JCheckBox notSendClassAttribute = null; private JDialog openUrlDialog = null; private JPanel openUrlContentPane = null; private JTextField openUrlTextField = null; private JButton openUrlButton = null; private JLabel openUrlStatusLabel = null; private JButton cancelUrlButton = null; private JLabel statusLabel = null; private JComboBox transportTypeComboBox = null; private boolean isJava14 = false; /** * This is the default constructor */ public JRadiusSimulator() { super(); // Security.addProvider(new BouncyCastleProvider()); String version = System.getProperty("java.version"); if (version.startsWith("1.4")) { isJava14 = true; for (int i = 0; i < authTypeNames.length; i++) { if (authTypeNames[i].startsWith("EAP-T")) { authTypeNames[i] += " (requires Java 1.5)"; } } } initialize(); } private boolean windows; /** * This method initializes this * * @return void */ private void initialize() { this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setJMenuBar(getJJMenuBar()); this.setSize(650, 600); this.setContentPane(getMainContentPane()); this.setTitle("JRadiusSimulator"); this.setVisible(true); String osName = System.getProperty("os.name"); if (osName.indexOf("Windows") != -1) windows = true; else windows = false; logSent = new PrintStream(logConsole.createFilteredStream(LogConsole.CATEGORY_PACKETS_SENT)); logRecv = new PrintStream(logConsole.createFilteredStream(LogConsole.CATEGORY_PACKETS_RECV)); logErr = new PrintStream(logConsole.createFilteredStream(LogConsole.CATEGORY_ERROR)); AttributeFactory.loadAttributeDictionary("net.jradius.dictionary.AttributeDictionaryImpl"); try { loadConfigFile(configFileUrl); } catch (Exception e) { e.printStackTrace(); } statusLabel.setText("Ready"); fileMenu.setEnabled(true); mainTabPane.setEnabled(true); runButton.setEnabled(true); } private void loadConfigFile(String url) throws IOException { this.properties = new Properties(); loadConfigFile(new URL(url).openStream()); } private void loadConfigFile(InputStream inputStream) throws IOException { this.properties.load(inputStream); String s = this.properties.getProperty("AttributesTableEntries"); if (s != null) { attributesTableModel.setEntries((ArrayList)Base64.decodeToObject(s)); attributesTableModel.fireTableDataChanged(); } s = this.properties.getProperty("RadiusServer"); if (s != null) radiusServerTextField.setText(s); s = this.properties.getProperty("SharedSecret"); if (s != null) sharedSecretTextField.setText(s); s = this.properties.getProperty("AuthPort"); if (s != null) radiusAuthPortTextField.setValue(new Integer(s)); s = this.properties.getProperty("AcctPort"); if (s != null) radiusAcctPortTextField.setValue(new Integer(s)); s = this.properties.getProperty("Retries"); if (s != null) radiusRetriesTextField.setValue(new Integer(s)); s = this.properties.getProperty("Timeout"); if (s != null) radiusTimeoutTextField.setValue(new Integer(s)); s = this.properties.getProperty("Requesters"); if (s != null) requestersTextField.setValue(new Integer(s)); s = this.properties.getProperty("Requests"); if (s != null) requestsTextField.setValue(new Integer(s)); s = this.properties.getProperty("SimulationType"); if (s != null) try { simulationTypeComboBox.setSelectedIndex(Integer.parseInt(s)); } catch (Exception e) { } s = this.properties.getProperty("AuthType"); if (s != null) try { authTypeComboBox.setSelectedIndex(Integer.parseInt(s)); } catch (Exception e) { } s = this.properties.getProperty("CheckStandard"); if (s != null) try { checkStandardComboBox.setSelectedIndex(Integer.parseInt(s)); } catch (Exception e) { } s = this.properties.getProperty("GenerateAcctSessionId"); if (s != null) try { generateAcctSessionIdCheckBox.setSelected(new Boolean(s).booleanValue()); } catch (Exception e) { } s = this.properties.getProperty("DoLog"); if (s != null) try { doLogCheckBox.setSelected(new Boolean(s).booleanValue()); } catch (Exception e) { } s = this.properties.getProperty("StopOnReject"); if (s != null) try { notStopOnRejectCheckBox.setSelected(new Boolean(s).booleanValue()); } catch (Exception e) { } s = this.properties.getProperty("SendClassAttr"); if (s != null) try { notSendClassAttribute.setSelected(new Boolean(s).booleanValue()); } catch (Exception e) { } s = this.properties.getProperty("TLSKeyFile"); if (s != null) tlsKeyFileTextField.setText(s); s = this.properties.getProperty("TLSKeyPassword"); if (s != null) tlsKeyPasswordTextField.setText(s); s = this.properties.getProperty("TLSCAFile"); if (s != null) tlsCAFileTextField.setText(s); s = this.properties.getProperty("TLSCAPassword"); if (s != null) tlsCAPasswordTextField.setText(s); s = this.properties.getProperty("TLSKeyFileType"); if (s != null) try { tlsKeyFileTypeComboBox.setSelectedIndex(Integer.parseInt(s)); } catch (Exception e) { } s = this.properties.getProperty("TLSCAFileType"); if (s != null) try { tlsCAFileTypeComboBox.setSelectedIndex(Integer.parseInt(s)); } catch (Exception e) { } s = this.properties.getProperty("TLSTrustAll"); if (s != null) try { tlsTrustAll.setSelected(new Boolean(s).booleanValue()); } catch (Exception e) { } //s = this.properties.getProperty("TLSUseJavaCA"); //if (s != null) try { tlsUseJavaRootCA.setSelected(new Boolean(s).booleanValue()); } catch (Exception e) { } } private void saveConfigFile(String fileName) { try { String encodedAttributes = Base64.encodeObject(attributesTableModel.getEntries(), Base64.GZIP | Base64.DONT_BREAK_LINES); this.properties.setProperty("AttributesTableEntries", encodedAttributes); this.properties.setProperty("RadiusServer", radiusServerTextField.getText()); this.properties.setProperty("SharedSecret", sharedSecretTextField.getText()); this.properties.setProperty("SimulationType", "" + simulationTypeComboBox.getSelectedIndex()); this.properties.setProperty("AuthType", "" + authTypeComboBox.getSelectedIndex()); this.properties.setProperty("CheckStandard", "" + checkStandardComboBox.getSelectedIndex()); this.properties.setProperty("AuthPort", ((Integer)radiusAuthPortTextField.getValue()).toString()); this.properties.setProperty("AcctPort", ((Integer)radiusAcctPortTextField.getValue()).toString()); this.properties.setProperty("Retries", ((Integer)radiusRetriesTextField.getValue()).toString()); this.properties.setProperty("Timeout", ((Integer)radiusTimeoutTextField.getValue()).toString()); this.properties.setProperty("Requesters", ((Integer)requestersTextField.getValue()).toString()); this.properties.setProperty("Requests", ((Integer)requestsTextField.getValue()).toString()); this.properties.setProperty("GenerateAcctSessionId", Boolean.toString(generateAcctSessionIdCheckBox.isSelected())); this.properties.setProperty("DoLog", Boolean.toString(doLogCheckBox.isSelected())); this.properties.setProperty("StopOnReject", Boolean.toString(notStopOnRejectCheckBox.isSelected())); this.properties.setProperty("SendClassAttr", Boolean.toString(notSendClassAttribute.isSelected())); this.properties.setProperty("TLSKeyFile", tlsKeyFileTextField.getText()); this.properties.setProperty("TLSKeyPassword", tlsKeyPasswordTextField.getText()); this.properties.setProperty("TLSCAFile", tlsCAFileTextField.getText()); this.properties.setProperty("TLSCAPassword", tlsCAPasswordTextField.getText()); this.properties.setProperty("TLSKeyFileType", "" + tlsKeyFileTypeComboBox.getSelectedIndex()); this.properties.setProperty("TLSCAFileType", "" + tlsCAFileTypeComboBox.getSelectedIndex()); this.properties.setProperty("TLSTrustAll", Boolean.toString(tlsTrustAll.isSelected())); //this.properties.setProperty("TLSUseJavaCA", Boolean.toString(tlsUseJavaRootCA.isSelected())); FileOutputStream fileOutputStream = new FileOutputStream(fileName); this.properties.store(fileOutputStream, "JRadiusSimulator"); } catch(Exception e) { e.printStackTrace(); } } public static void setConfigFileUrl(String fileName) { configFileUrl = fileName; } /** * This method initializes jJMenuBar * * @return javax.swing.JMenuBar */ private JMenuBar getJJMenuBar() { if (jJMenuBar == null) { jJMenuBar = new JMenuBar(); jJMenuBar.add(getFileMenu()); jJMenuBar.add(getHelpMenu()); } return jJMenuBar; } /** * This method initializes jMenu * * @return javax.swing.JMenu */ private JMenu getFileMenu() { if (fileMenu == null) { fileMenu = new JMenu(); fileMenu.setText("File"); fileMenu.add(getSaveMenuItem()); fileMenu.add(getSaveAsMenuItem()); fileMenu.add(getOpenMenuItem()); fileMenu.add(getOpenUrlMenuItem()); fileMenu.add(getExitMenuItem()); fileMenu.setEnabled(false); } return fileMenu; } /** * This method initializes jMenu * * @return javax.swing.JMenu */ private JMenu getHelpMenu() { if (helpMenu == null) { helpMenu = new JMenu(); helpMenu.setText("Help"); helpMenu.add(getAboutMenuItem()); } return helpMenu; } /** * This method initializes jMenuItem * * @return javax.swing.JMenuItem */ private JMenuItem getExitMenuItem() { if (exitMenuItem == null) { exitMenuItem = new JMenuItem(); exitMenuItem.setText("Exit"); exitMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); } return exitMenuItem; } /** * This method initializes jMenuItem * * @return javax.swing.JMenuItem */ private JMenuItem getAboutMenuItem() { if (aboutMenuItem == null) { aboutMenuItem = new JMenuItem(); aboutMenuItem.setText("About"); aboutMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(JRadiusSimulator.this, "Version 1.3.0\n\n" + "For help, go to http://www.coova.org/JRadius\n" + "Licensed under the GNU General Public License (GPL).\n" + "Copyright (c) 2007-2011 Coova Technologies, LLC\n", "Copyright (c) 2006 PicoPoint B.V.\n" + "About JRadiusSimulator", JOptionPane.INFORMATION_MESSAGE, null); } }); } return aboutMenuItem; } /** * This method initializes jMenuItem * * @return javax.swing.JMenuItem */ private JMenuItem getSaveMenuItem() { if (saveMenuItem == null) { saveMenuItem = new JMenuItem(); saveMenuItem.setText("Save"); saveMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, Event.CTRL_MASK, true)); saveMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (configFileUrl.startsWith("file:///")) saveConfigFile(configFileUrl.substring(7)); else doSaveAs(); } }); } return saveMenuItem; } /** * This method initializes jMenuItem * * @return javax.swing.JMenuItem */ private JMenuItem getSaveAsMenuItem() { if (saveAsMenuItem == null) { saveAsMenuItem = new JMenuItem(); saveAsMenuItem.setText("Save As"); saveAsMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doSaveAs(); } }); } return saveAsMenuItem; } private void doSaveAs() { JFileChooser chooser = new JFileChooser(); int returnVal = chooser.showSaveDialog(JRadiusSimulator.this); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = chooser.getSelectedFile(); saveConfigFile(file.getAbsolutePath()); } } /** * This method initializes jMenuItem * * @return javax.swing.JMenuItem */ private JMenuItem getOpenMenuItem() { if (openMenuItem == null) { openMenuItem = new JMenuItem(); openMenuItem.setText("Open"); openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Event.CTRL_MASK, true)); openMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser(); int returnVal = chooser.showOpenDialog(JRadiusSimulator.this); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = chooser.getSelectedFile(); try { loadConfigFile("file:///" + file.getAbsolutePath()); } catch(Exception ex) { JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE); ex.printStackTrace(); } } } }); } return openMenuItem; } /** * This method initializes jMenuItem * * @return javax.swing.JMenuItem */ private JMenuItem getOpenUrlMenuItem() { if (openUrlMenuItem == null) { openUrlMenuItem = new JMenuItem(); openUrlMenuItem.setText("Open Url"); openUrlMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { getOpenUrlDialog().setVisible(true); } }); } return openUrlMenuItem; } /** * This method initializes mainTabPane * * @return javax.swing.JTabbedPane */ private JTabbedPane getMainTabPane() { if (mainTabPane == null) { mainTabPane = new JTabbedPane(); mainTabPane.addTab("RADIUS", null, getRADIUSPanel(), null); //mainTabPane.addTab("Diameter", null, getDiameterPanel(), null); //mainTabPane.addTab("DHCP", null, getDHCPPanel(), null); mainTabPane.addTab("Attributes", null, getAttributesPanel(), null); mainTabPane.addTab("Keys", null, getKeysPanel(), null); mainTabPane.addTab("Log", null, getLogPanel(), null); mainTabPane.setEnabled(false); } return mainTabPane; } /** * This method initializes radiusPanel * * @return javax.swing.JPanel */ private JPanel getRADIUSPanel() { if (radiusPanel == null) { radiusPanel = new JPanel(); radiusPanel.setLayout(new BorderLayout()); radiusPanel.add(getRunStatusPanel(), java.awt.BorderLayout.SOUTH); radiusPanel.add(getSendOptionsPanel(), java.awt.BorderLayout.NORTH); } return radiusPanel; } /** * This method initializes diameterPanel * * @return javax.swing.JPanel */ private JPanel getDHCPPanel() { if (dhcpPanel == null) { dhcpPanel = new JPanel(); dhcpPanel.setLayout(new BorderLayout()); } return dhcpPanel; } /** * This method initializes diameterPanel * * @return javax.swing.JPanel */ private JPanel getDiameterPanel() { if (diameterPanel == null) { diameterPanel = new JPanel(); diameterPanel.setLayout(new BorderLayout()); } return diameterPanel; } /** * This method initializes logPanel * * @return javax.swing.JPanel */ private JPanel getLogPanel() { if (logPanel == null) { logPanel = new JPanel(); logPanel.setLayout(new BorderLayout()); logPanel.add(getLogConsole(), BorderLayout.CENTER); logPanel.add(getLogButtonPanel(), java.awt.BorderLayout.SOUTH); } return logPanel; } /** * This method initializes progressBarPanel * * @return javax.swing.JPanel */ private JPanel getRunStatusPanel() { if (runStatusPanel == null) { statusLabel = new JLabel(); statusLabel.setText("Initializing..."); runStatusPanel = new JPanel(); runStatusPanel.setLayout(new BorderLayout()); runStatusPanel.add(getRunStatsPanel(), java.awt.BorderLayout.NORTH); runStatusPanel.add(getRunButton(), java.awt.BorderLayout.EAST); runStatusPanel.add(statusLabel, java.awt.BorderLayout.CENTER); } return runStatusPanel; } /** * This method initializes logConsole * * @return javax.swing.JTextPane */ private LogConsole getLogConsole() { if (logConsole == null) { logConsole = new LogConsole(); } return logConsole; } /** * This method initializes logButtonPanel * * @return javax.swing.JPanel */ private JPanel getLogButtonPanel() { if (logButtonPanel == null) { logButtonPanel = new JPanel(); logButtonPanel.add(getClearLogButton(), null); logButtonPanel.add(getSaveLogButton(), null); } return logButtonPanel; } /** * This method initializes mainContentPane * * @return javax.swing.JPanel */ private JPanel getMainContentPane() { if (mainContentPane == null) { mainContentPane = new JPanel(); mainContentPane.setLayout(new BorderLayout()); mainContentPane.add(getMainTabPane(), java.awt.BorderLayout.CENTER); } return mainContentPane; } /** * This method initializes clearLogButton * * @return javax.swing.JButton */ private JButton getClearLogButton() { if (clearLogButton == null) { clearLogButton = new JButton(); clearLogButton.setText("Clear"); clearLogButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { logConsole.setText(""); } }); } return clearLogButton; } /** * This method initializes saveLogButton * * @return javax.swing.JButton */ private JButton getSaveLogButton() { if (saveLogButton == null) { saveLogButton = new JButton(); saveLogButton.setText("Save"); saveLogButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { JFileChooser chooser = new JFileChooser(); int returnVal = chooser.showSaveDialog(JRadiusSimulator.this); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = chooser.getSelectedFile(); try { FileOutputStream out = new FileOutputStream(file); out.write(logConsole.getText().getBytes()); out.close(); } catch(Exception ex) { System.err.println(ex.getMessage()); } } } }); } return saveLogButton; } private void shutdown() { if (simulationRunners != null) { simulationRunners = null; } if (simulationThreads != null) { for (int i=0; i < simulationThreads.length; i++) { simulationThreads[i].interrupt(); simulationThreads[i] = null; } simulationThreads = null; } if (simulationMonitor != null) { simulationMonitor.interrupt(); simulationMonitor = null; } } /** * This method initializes sendButton * * @return javax.swing.JButton */ private JToggleButton getRunButton() { if (runButton == null) { runButton = new JToggleButton(); runButton.setText("Start"); runButton.addActionListener(new java.awt.event.ActionListener() { public synchronized void actionPerformed(java.awt.event.ActionEvent e) { AbstractButton ab = (AbstractButton)e.getSource(); if (ab.isSelected()) { shutdown(); simulationMonitor = new Thread(new SimulationMonitor()); simulationThreads = new Thread[(Integer) requestersTextField.getValue()]; simulationRunners = new SimulationRunner[(Integer) requestersTextField.getValue()]; for (int i=0; i < simulationThreads.length; i++) { simulationThreads[i] = new Thread(simulationRunners[i] = new SimulationRunner()); simulationThreads[i].start(); } simulationMonitor.start(); runButton.setText("Stop"); } else { shutdown(); setStatus("Ready"); runButton.setText("Start"); } } }); runButton.setEnabled(false); } return runButton; } /** * This method initializes attributesTableScrollPane * * @return javax.swing.JScrollPane */ private JScrollPane getAttributesTableScrollPane() { if (attributesTableScrollPane == null) { attributesTableScrollPane = new JScrollPane(); attributesTableScrollPane.setViewportView(getAttributesTable()); } return attributesTableScrollPane; } private class ValueTableCellEditor extends AbstractCellEditor implements TableCellEditor { private static final long serialVersionUID = (long)0; private JComponent component; public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int rowIndex, int colIndex) { if (isSelected) { } AttributesTableEntry entry = (AttributesTableEntry)attributesTableModel.getEntries().get(rowIndex); if (entry.getValueClass().equals(NamedValue.class)) { component = createNamedValueCellEditor(entry.getAttributeName()); ((JComboBox)component).setSelectedItem(value); } else if (entry.getValueClass().equals(IntegerValue.class)) { JFormattedTextField ftf = new JFormattedTextField(getNumberFormatter()); Integer iValue = null; try { iValue = new Integer((String)value); } catch (Exception e) { iValue = new Integer(0); } ftf.setValue(iValue); component = ftf; } else { component = new JTextField(); ((JTextField)component).setText((String)value); } component.setBorder(null); return component; } public Object getCellEditorValue() { if (component instanceof JComboBox) return ((JComboBox)component).getSelectedItem(); if (component instanceof JFormattedTextField) return ((Integer)((JFormattedTextField)component).getValue()).toString(); return ((JTextField)component).getText(); } public boolean stopCellEditing() { if (component instanceof JFormattedTextField) { JFormattedTextField ftf = (JFormattedTextField)component; if (ftf.isEditValid()) { try { ftf.commitEdit(); } catch (java.text.ParseException exc) { } } else { return false; } } return super.stopCellEditing(); } } /** * This method initializes attributesTable * * @return javax.swing.JTable */ private JTable getAttributesTable() { if (attributesTable == null) { attributesTable = new JTable(attributesTableModel); TableColumn col = attributesTable.getColumnModel().getColumn(7); col.setCellEditor(new ValueTableCellEditor()); for (int i = 0; i < attributesTableModel.getColumnCount(); i++) { col = attributesTable.getColumnModel().getColumn(i); if (i == 0 || i == 7) { col.setPreferredWidth(120); } else { col.setPreferredWidth(40); } } } return attributesTable; } private JComboBox createNamedValueCellEditor(String attributeName) { JComboBox comboBox = (JComboBox)namedValueComponentCache.get(attributeName); if (comboBox != null) return comboBox; try { RadiusAttribute attribute = AttributeFactory.newAttribute(attributeName); NamedValue namedValue = (NamedValue)attribute.getValue(); NamedValueMap valueMap = namedValue.getMap(); Long[] possibleValues = valueMap.getKnownValues(); comboBox = new JComboBox(); for (int i=0; i<possibleValues.length;i++) { comboBox.addItem(valueMap.getNamedValue(possibleValues[i])); } namedValueComponentCache.put(attributeName, comboBox); } catch (Exception e) { e.printStackTrace(); } return comboBox; } private JPanel getRunStatsPanel() { if (runStatsPanel == null) { runStatsPanel = new JPanel(); runStatsPanel.setLayout(new FlowLayout()); GridBagConstraints gridBagConstraints = new GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 5); GridBagConstraints gridBagConstraints1 = new GridBagConstraints(); gridBagConstraints1.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints1.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints1.insets = new java.awt.Insets(0, 0, 0, 10); gridBagConstraints1.weightx = 1.0; JPanel runStatsPanel1 = new JPanel(); runStatsPanel1.setLayout(new GridBagLayout()); runStatsPanel1.add(new JLabel("Threads:"), gridBagConstraints); runStatsPanel1.add(runStatsThreads = new JLabel(), gridBagConstraints1); runStatsPanel1.add(new JLabel("Sent:"), gridBagConstraints); runStatsPanel1.add(runStatsSent = new JLabel(), gridBagConstraints1); runStatsPanel1.add(new JLabel("Received:"), gridBagConstraints); runStatsPanel1.add(runStatsRecv = new JLabel(), gridBagConstraints1); runStatsPanel1.add(new JLabel("Time:"), gridBagConstraints); runStatsPanel1.add(runStatsTime = new JLabel(), gridBagConstraints1); runStatsPanel1.add(new JLabel("Throughput:"), gridBagConstraints); runStatsPanel1.add(runStatsRPS = new JLabel(), gridBagConstraints1); JPanel runStatsPanel3 = new JPanel(); runStatsPanel3.setLayout(new GridBagLayout()); runStatsPanel3.add(new JLabel("Pkts Received"), gridBagConstraints1); runStatsPanel3.add(new JLabel("Accept:"), gridBagConstraints); runStatsPanel3.add(runStatsPktAccept = new JLabel(), gridBagConstraints1); runStatsPanel3.add(new JLabel("Reject:"), gridBagConstraints); runStatsPanel3.add(runStatsPktReject = new JLabel(), gridBagConstraints1); runStatsPanel3.add(new JLabel("Challenge:"), gridBagConstraints); runStatsPanel3.add(runStatsPktChallenge = new JLabel(), gridBagConstraints1); runStatsPanel3.add(new JLabel("Acct Resp:"), gridBagConstraints); runStatsPanel3.add(runStatsPktAcctResp = new JLabel(), gridBagConstraints1); JPanel runStatsPanel2 = new JPanel(); runStatsPanel2.setLayout(new GridBagLayout()); runStatsPanel2.add(new JLabel("1 ms or less:"), gridBagConstraints); runStatsPanel2.add(runStatsTime1 = new JLabel(), gridBagConstraints1); runStatsPanel2.add(new JLabel("10 ms or less:"), gridBagConstraints); runStatsPanel2.add(runStatsTime2 = new JLabel(), gridBagConstraints1); runStatsPanel2.add(new JLabel("100 ms or less:"), gridBagConstraints); runStatsPanel2.add(runStatsTime3 = new JLabel(), gridBagConstraints1); runStatsPanel2.add(new JLabel("1000 ms or less:"), gridBagConstraints); runStatsPanel2.add(runStatsTime4 = new JLabel(), gridBagConstraints1); runStatsPanel2.add(new JLabel("10000 ms or less:"), gridBagConstraints); runStatsPanel2.add(runStatsTime5 = new JLabel(), gridBagConstraints1); clearStats(); runStatsPanel.add(runStatsPanel1); runStatsPanel.add(runStatsPanel3); runStatsPanel.add(runStatsPanel2); } return runStatsPanel; } /** * This method initializes sendOptionsPanel * * @return javax.swing.JPanel */ private JPanel getSendOptionsPanel() { if (sendOptionsPanel == null) { GridBagConstraints gridBagConstraints = new GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 5); GridBagConstraints gridBagConstraints1 = new GridBagConstraints(); gridBagConstraints1.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints1.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints1.insets = new java.awt.Insets(0, 0, 0, 10); gridBagConstraints1.weightx = 1.0; GridBagConstraints gridBagConstraints2 = new GridBagConstraints(); gridBagConstraints2.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints2.insets = new java.awt.Insets(0, 10, 0, 5); GridBagConstraints gridBagConstraints3 = new GridBagConstraints(); gridBagConstraints3.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints3.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints3.insets = new java.awt.Insets(0, 0, 0, 10); gridBagConstraints3.weightx = 1.0; GridBagConstraints gridBagConstraints4 = new GridBagConstraints(); gridBagConstraints4.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints4.insets = new java.awt.Insets(0, 10, 0, 5); GridBagConstraints gridBagConstraints5 = new GridBagConstraints(); gridBagConstraints5.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints5.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints5.insets = new java.awt.Insets(0, 0, 0, 10); gridBagConstraints5.weightx = 1.0; GridBagConstraints gridBagConstraints6 = new GridBagConstraints(); gridBagConstraints6.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints6.insets = new java.awt.Insets(0, 10, 0, 5); GridBagConstraints gridBagConstraints7 = new GridBagConstraints(); gridBagConstraints7.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints7.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints7.insets = new java.awt.Insets(0, 0, 0, 10); gridBagConstraints7.weightx = 1.0; GridBagConstraints gridBagConstraints8 = new GridBagConstraints(); gridBagConstraints8.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints8.insets = new java.awt.Insets(0, 10, 0, 5); GridBagConstraints gridBagConstraints9 = new GridBagConstraints(); gridBagConstraints9.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints9.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints9.insets = new java.awt.Insets(0, 0, 0, 10); gridBagConstraints9.weightx = 1.0; GridBagConstraints gridBagConstraints10 = new GridBagConstraints(); gridBagConstraints10.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints10.insets = new java.awt.Insets(0, 10, 0, 5); GridBagConstraints gridBagConstraints11 = new GridBagConstraints(); gridBagConstraints11.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints11.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints11.insets = new java.awt.Insets(0, 0, 0, 10); gridBagConstraints11.weightx = 1.0; GridBagConstraints gridBagConstraints12 = new GridBagConstraints(); gridBagConstraints12.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints12.insets = new java.awt.Insets(0, 10, 0, 5); GridBagConstraints gridBagConstraints13 = new GridBagConstraints(); gridBagConstraints13.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints13.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints13.insets = new java.awt.Insets(0, 0, 0, 10); gridBagConstraints13.weightx = 1.0; GridBagConstraints gridBagConstraints14 = new GridBagConstraints(); gridBagConstraints14.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints14.insets = new java.awt.Insets(0, 10, 0, 5); GridBagConstraints gridBagConstraints15 = new GridBagConstraints(); gridBagConstraints15.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints15.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints15.insets = new java.awt.Insets(0, 0, 0, 10); gridBagConstraints15.weightx = 1.0; GridBagConstraints gridBagConstraints16 = new GridBagConstraints(); gridBagConstraints16.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints16.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints16.insets = new java.awt.Insets(0, 0, 0, 10); gridBagConstraints16.weightx = 1.0; gridBagConstraints16.gridx = 1; JLabel authenticationProtocolLabel = new JLabel(); authenticationProtocolLabel.setText("Authentication Protocol:"); JLabel sharedSecretLabel = new JLabel(); sharedSecretLabel.setText("Shared Secret:"); radiusServerLabel = new JLabel(); radiusServerLabel.setText("RADIUS Server:"); JLabel simulationTypeLabel = new JLabel(); simulationTypeLabel.setText("Simulation Type:"); JLabel checkStandardLabel = new JLabel(); checkStandardLabel.setText("Verify Standard:"); JLabel radiusAuthPortLabel = new JLabel(); radiusAuthPortLabel.setText("Auth Port:"); JLabel radiusAcctPortLabel = new JLabel(); radiusAcctPortLabel.setText("Acct Port:"); JLabel radiusRetriesLabel = new JLabel(); radiusRetriesLabel.setText("Send Retries:"); JLabel radiusTimeoutLabel = new JLabel(); radiusTimeoutLabel.setText("Send Timeout (sec):"); JLabel radiusInterimIntervalLabel = new JLabel(); radiusInterimIntervalLabel.setText("Interim Interval (sec):"); JLabel sessionTimeLabel = new JLabel(); sessionTimeLabel.setText("Session Duration (sec):"); JLabel requestersLabel = new JLabel(); requestersLabel.setText("Requester Threads:"); JLabel requestsLabel = new JLabel(); requestsLabel.setText("Requests per Thread:"); GridBagLayout gridBagLayout = new GridBagLayout(); sendOptionsPanel = new JPanel(); sendOptionsPanel.setLayout(gridBagLayout); sendOptionsPanel.add(new JLabel("Transport"), gridBagConstraints); sendOptionsPanel.add(getTransportTypeComboBox(), gridBagConstraints1); sendOptionsPanel.add(radiusServerLabel, gridBagConstraints); sendOptionsPanel.add(getRadiusServerTextField(), gridBagConstraints1); sendOptionsPanel.add(sharedSecretLabel, gridBagConstraints2); sendOptionsPanel.add(getSharedSecretTextField(), gridBagConstraints3); sendOptionsPanel.add(radiusAuthPortLabel, gridBagConstraints8); sendOptionsPanel.add(getRadiusAuthPortTextField(), gridBagConstraints9); sendOptionsPanel.add(radiusAcctPortLabel, gridBagConstraints10); sendOptionsPanel.add(getRadiusAcctPortTextField(), gridBagConstraints11); sendOptionsPanel.add(radiusTimeoutLabel, gridBagConstraints12); sendOptionsPanel.add(getRadiusTimeoutTextField(), gridBagConstraints13); sendOptionsPanel.add(radiusRetriesLabel, gridBagConstraints12); sendOptionsPanel.add(getRadiusRetriesTextField(), gridBagConstraints13); sendOptionsPanel.add(requestersLabel, gridBagConstraints12); sendOptionsPanel.add(getRequestersTextField(), gridBagConstraints13); sendOptionsPanel.add(requestsLabel, gridBagConstraints12); sendOptionsPanel.add(getRequestsTextField(), gridBagConstraints13); sendOptionsPanel.add(simulationTypeLabel, gridBagConstraints4); sendOptionsPanel.add(getSimulationTypeComboBox(), gridBagConstraints5); sendOptionsPanel.add(authenticationProtocolLabel, gridBagConstraints6); sendOptionsPanel.add(getAuthTypeComboBox(), gridBagConstraints7); sendOptionsPanel.add(checkStandardLabel, gridBagConstraints6); sendOptionsPanel.add(getCheckStandardComboBox(), gridBagConstraints7); //sendOptionsPanel.add(sessionTimeLabel, gridBagConstraints12); //sendOptionsPanel.add(getSessionTimeTextField(), gridBagConstraints13); //sendOptionsPanel.add(radiusInterimIntervalLabel, gridBagConstraints12); //sendOptionsPanel.add(getRadiusInterimIntervalTextField(), gridBagConstraints13); sendOptionsPanel.add(getOptionsLabel(), gridBagConstraints14); sendOptionsPanel.add(getGenerateAcctSessionIdCheckBox(), gridBagConstraints15); sendOptionsPanel.add(getNotStopOnRejectCheckBox(), gridBagConstraints16); sendOptionsPanel.add(getSendClassAttributeCheckBox(), gridBagConstraints16); sendOptionsPanel.add(getDoLogCheckBox(), gridBagConstraints16); sendOptionsPanel.add(getFloodCheckBox(), gridBagConstraints16); } return sendOptionsPanel; } /** * This method initializes optionsLabel * * @return javax.swing.JLabel */ private JLabel getOptionsLabel() { JLabel optionsLabel = new JLabel(); optionsLabel.setText("Options:"); return optionsLabel; } /** * This method initializes addAttributeButton * * @return javax.swing.JButton */ private JButton getAddAttributeButton() { if (addAttributeButton == null) { addAttributeButton = new JButton(); addAttributeButton.setText("Add Attribute"); addAttributeButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { JDialog dialog = getAddAttributeDialog(); dialog.setModal(true); dialog.setVisible(true); } }); } return addAttributeButton; } /** * This method initializes addAttributeDialog * * @return javax.swing.JDialog */ private JDialog getAddAttributeDialog() { if (addAttributeDialog == null) { addAttributeDialog = new JDialog(); addAttributeDialog.setSize(350, 300); addAttributeDialog.setTitle("Add Attributes"); addAttributeDialog.setContentPane(getAddAttributeContentPane()); } return addAttributeDialog; } /** * This method initializes addAttributeContentPane * * @return javax.swing.JPanel */ private JPanel getAddAttributeContentPane() { if (addAttributeContentPane == null) { addAttributeContentPane = new JPanel(); addAttributeContentPane.setLayout(new BorderLayout()); addAttributeContentPane.add(getAddAttributePanel(), java.awt.BorderLayout.SOUTH); addAttributeContentPane.add(getAttributeTreeScrollPane(), java.awt.BorderLayout.CENTER); } return addAttributeContentPane; } /** * This method initializes attributeTree * * @return javax.swing.JTree */ private JTree getAttributeTree() { if (attributeTree == null) { DefaultMutableTreeNode top = new DefaultMutableTreeNode("Attribute Dictionary"); createAttributeTreeNodes(top); attributeTree = new JTree(top); } return attributeTree; } private void createAttributeTreeNodes(DefaultMutableTreeNode top) { DefaultMutableTreeNode standardTree = new DefaultMutableTreeNode("Standard Attributes"); DefaultMutableTreeNode vsaTree = new DefaultMutableTreeNode("Vendor Specific Attributes"); addAttributesToTable(standardTree, AttributeFactory.getAttributeNameMap(), true); top.add(standardTree); Map<Long, VendorValue> vendors = AttributeFactory.getVendorValueMap(); LinkedHashMap<String, Map<String, Class<?>>> dictList = new LinkedHashMap<String, Map<String, Class<?>>>(); for (Iterator<VendorValue> i = vendors.values().iterator(); i.hasNext();) { VendorValue vendor = i.next(); try { VSADictionary dict = (VSADictionary)vendor.getDictClass().newInstance(); String vendorName = dict.getVendorName(); Map<String, Class<?>> map = vendor.getAttributeNameMap(); System.out.println("Loading vendor " + vendorName + " with " + map.size() + " attributes."); dictList.put(vendorName, map); } catch(Exception e) { e.printStackTrace(); } } LinkedList<String> list = new LinkedList<String>(dictList.keySet()); Collections.sort(list); for (Iterator<String> i = list.iterator(); i.hasNext();) { String vendorName = i.next(); DefaultMutableTreeNode vsaNode = new DefaultMutableTreeNode(vendorName); addAttributesToTable(vsaNode, dictList.get(vendorName), false); vsaTree.add(vsaNode); } top.add(vsaTree); } private void addAttributesToTable(DefaultMutableTreeNode node, Map<String, Class<?>> map, boolean skipVSA) { LinkedHashMap<String, String> attributeList = new LinkedHashMap<String, String>(); for (Iterator<Map.Entry<String, Class<?>>> i = map.entrySet().iterator(); i.hasNext();) { Map.Entry<String, Class<?>> entry = i.next(); String type = entry.getKey(); Class<?> clazz = entry.getValue(); try { RadiusAttribute attribute = (RadiusAttribute)clazz.newInstance(); if (!skipVSA || (!(attribute instanceof VSAttribute) && attribute.getType() <= 255)) { String attributeName = attribute.getAttributeName(); if (attributeName.equals("Vendor-Specific")) continue; if (attributeName.startsWith("X-Ascend-")) continue; attributeList.put(type, attributeName); } } catch(Exception e) { e.printStackTrace(); } } LinkedList<String> list = new LinkedList<String>(attributeList.keySet()); Collections.sort(list); for (Iterator<String> i = list.iterator(); i.hasNext();) { node.add(new DefaultMutableTreeNode(attributeList.get(i.next()))); } } /** * This method initializes addAttributePanel * * @return javax.swing.JPanel */ private JPanel getAddAttributePanel() { if (addAttributePanel == null) { addAttributePanel = new JPanel(); addAttributePanel.add(getAddButton(), null); addAttributePanel.add(getDoneButton(), null); } return addAttributePanel; } /** * This method initializes authTypeComboBox * * @return javax.swing.JComboBox */ private JComboBox getAuthTypeComboBox() { if (authTypeComboBox == null) { authTypeComboBox = new JComboBox(authTypeNames); } return authTypeComboBox; } private RadiusAuthenticator getAuthenticator() throws Exception { String authName = authTypeNames[authTypeComboBox.getSelectedIndex()]; if (authName.startsWith("EAP-T") || authName.startsWith("PEAP")) { if (isJava14) { throw new Exception(authName + " not available with this Java version"); } String s[] = authName.split("/"); StringBuffer sb = new StringBuffer(s[0]); String v = tlsKeyFileTextField.getText(); if (v != null && !"".equals(v)) { sb.append(":keyFile=").append(v); } v = (String)tlsKeyFileTypeComboBox.getSelectedItem(); if (v != null && !"".equals(v)) { sb.append(":keyFileType=").append(v); } v = tlsKeyPasswordTextField.getText(); if (v != null && !"".equals(v)) { sb.append(":keyPassword=").append(v); } v = tlsCAFileTextField.getText(); if (v != null && !"".equals(v)) { sb.append(":caFile=").append(v); } v = (String)tlsCAFileTypeComboBox.getSelectedItem(); if (v != null && !"".equals(v)) { sb.append(":caFileType=").append(v); } v = tlsCAPasswordTextField.getText(); if (v != null && !"".equals(v)) { sb.append(":caPassword=").append(v); } if (tlsTrustAll.isSelected()) { sb.append(":trustAll=true"); } if (s.length == 2) { sb.append(":innerProtocol=").append(s[1]); } authName = sb.toString(); System.out.println("Using Authenticator String: " + authName); } return RadiusClient.getAuthProtocol(authName); } /** * This method initializes checkStandardComboBox * * @return javax.swing.JComboBox */ private JComboBox getCheckStandardComboBox() { if (checkStandardComboBox == null) { checkStandardComboBox = new JComboBox(new String[] { "None", "IRAP", "WISPr" }); } return checkStandardComboBox; } /** * This method initializes tlsCAFileTypeComboBox * * @return javax.swing.JComboBox */ private JComboBox getTLSCAFileTypeComboBox() { if (tlsCAFileTypeComboBox == null) { tlsCAFileTypeComboBox = new JComboBox(keystoreTypes); } return tlsCAFileTypeComboBox; } /** * This method initializes tlsKeyFileTypeComboBox * * @return javax.swing.JComboBox */ private JComboBox getTLSKeyFileTypeComboBox() { if (tlsKeyFileTypeComboBox == null) { tlsKeyFileTypeComboBox = new JComboBox(keystoreTypes); } return tlsKeyFileTypeComboBox; } private JComboBox getTransportTypeComboBox() { if (transportTypeComboBox == null) { transportTypeComboBox = new JComboBox(transportTypes); } return transportTypeComboBox; } /** * This method initializes attributesPanel * * @return javax.swing.JPanel */ private JPanel getAttributesPanel() { if (attributesPanel == null) { attributesPanel = new JPanel(); attributesPanel.setLayout(new BorderLayout()); attributesPanel.add(getAttributesTableScrollPane(), java.awt.BorderLayout.CENTER); attributesPanel.add(getAttributesButtonPanel(), java.awt.BorderLayout.SOUTH); } return attributesPanel; } /** * This method initializes tlsPanel * * @return javax.swing.JPanel */ private JPanel getKeysPanel() { if (keysPanel == null) { keysPanel = new JPanel(); keysPanel.setLayout(new BorderLayout()); keysPanel.add(getKeysOptionsPanel(), java.awt.BorderLayout.NORTH); } return keysPanel; } /** * This method initializes tlsOptionsPanel * * @return javax.swing.JPanel */ private JPanel getKeysOptionsPanel() { if (keysOptionsPanel == null) { GridBagConstraints gridBagConstraints = new GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 5); GridBagConstraints gridBagConstraintsH = new GridBagConstraints(); gridBagConstraintsH.insets = new java.awt.Insets(10, 10, 5, 10); gridBagConstraintsH.gridwidth = java.awt.GridBagConstraints.REMAINDER; GridBagConstraints gridBagConstraints0 = new GridBagConstraints(); gridBagConstraints0.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints0.insets = new java.awt.Insets(0, 0, 0, 5); gridBagConstraints0.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints0.weightx = 1.0; GridBagConstraints gridBagConstraints1 = new GridBagConstraints(); gridBagConstraints1.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints1.insets = new java.awt.Insets(0, 0, 0, 5); gridBagConstraints1.weightx = 1.0; GridBagConstraints gridBagConstraints2 = new GridBagConstraints(); gridBagConstraints2.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints2.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints2.insets = new java.awt.Insets(0, 0, 0, 10); GridBagConstraints gridBagConstraints3 = new GridBagConstraints(); gridBagConstraints3.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints3.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints3.insets = new java.awt.Insets(0, 0, 0, 10); gridBagConstraints3.gridx = 1; GridBagConstraints gridBagConstraints4 = new GridBagConstraints(); gridBagConstraints4.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints4.insets = new java.awt.Insets(0, 0, 0, 5); GridBagLayout gridBagLayout = new GridBagLayout(); keysOptionsPanel = new JPanel(); keysOptionsPanel.setLayout(gridBagLayout); keysOptionsPanel.add(new JLabel("Client Certificate Java Keystore"), gridBagConstraintsH); keysOptionsPanel.add(new JLabel("File:"), gridBagConstraints); keysOptionsPanel.add(getTLSKeyFileTextField(), gridBagConstraints0); keysOptionsPanel.add(new JLabel("Password:"), gridBagConstraints); keysOptionsPanel.add(getTLSKeyPasswordTextField(), gridBagConstraints1); keysOptionsPanel.add(new JLabel("Type:"), gridBagConstraints4); keysOptionsPanel.add(getTLSKeyFileTypeComboBox(), gridBagConstraints2); keysOptionsPanel.add(new JLabel("Root CA Chain Java Keystore"), gridBagConstraintsH); keysOptionsPanel.add(new JLabel("File:"), gridBagConstraints); keysOptionsPanel.add(getTLSCAFileTextField(), gridBagConstraints0); keysOptionsPanel.add(new JLabel("Password:"), gridBagConstraints); keysOptionsPanel.add(getTLSCAPasswordTextField(), gridBagConstraints1); keysOptionsPanel.add(new JLabel("Type:"), gridBagConstraints4); keysOptionsPanel.add(getTLSCAFileTypeComboBox(), gridBagConstraints2); keysOptionsPanel.add(getOptionsLabel(), gridBagConstraints); //tlsOptionsPanel.add(getUseJavaRootCAChainCheckBox(), gridBagConstraints2); keysOptionsPanel.add(getTLSTrustAllCheckBox(), gridBagConstraints2); } return keysOptionsPanel; } /** * This method initializes tlsKeyFileTextField * * @return javax.swing.JTextField */ private JTextField getTLSKeyFileTextField() { if (tlsKeyFileTextField == null) { tlsKeyFileTextField = new JTextField(100); } return tlsKeyFileTextField; } /** * This method initializes tlsKeyPasswordTextField * * @return javax.swing.JTextField */ private JTextField getTLSKeyPasswordTextField() { if (tlsKeyPasswordTextField == null) { tlsKeyPasswordTextField = new JTextField(100); } return tlsKeyPasswordTextField; } /** * This method initializes tlsCAFileTextField * * @return javax.swing.JTextField */ private JTextField getTLSCAFileTextField() { if (tlsCAFileTextField == null) { tlsCAFileTextField = new JTextField(100); } return tlsCAFileTextField; } /** * This method initializes tlsCAPasswordTextField * * @return javax.swing.JTextField */ private JTextField getTLSCAPasswordTextField() { if (tlsCAPasswordTextField == null) { tlsCAPasswordTextField = new JTextField(100); } return tlsCAPasswordTextField; } /** * This method initializes radiusServerTextField * * @return javax.swing.JTextField */ private JTextField getRadiusServerTextField() { if (radiusServerTextField == null) { radiusServerTextField = new JTextField(100); } return radiusServerTextField; } /** * This method initializes sharedSecretTextField * * @return javax.swing.JTextField */ private JTextField getSharedSecretTextField() { if (sharedSecretTextField == null) { sharedSecretTextField = new JTextField(40); } return sharedSecretTextField; } /** * This method initializes doneButton * * @return javax.swing.JButton */ private JButton getDoneButton() { if (doneButton == null) { doneButton = new JButton(); doneButton.setText("Done"); doneButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { addAttributeDialog.dispose(); } }); } return doneButton; } /** * This method initializes attributeTreeScrollPane * * @return javax.swing.JScrollPane */ private JScrollPane getAttributeTreeScrollPane() { if (attributeTreeScrollPane == null) { attributeTreeScrollPane = new JScrollPane(); attributeTreeScrollPane.setViewportView(getAttributeTreeScrollPanel()); } return attributeTreeScrollPane; } /** * This method initializes attributeTreeScrollPanel * * @return javax.swing.JPanel */ private JPanel getAttributeTreeScrollPanel() { if (attributeTreeScrollPanel == null) { attributeTreeScrollPanel = new JPanel(); attributeTreeScrollPanel.add(getAttributeTree(), null); } return attributeTreeScrollPanel; } /** * This method initializes addButton * * @return javax.swing.JButton */ private JButton getAddButton() { if (addButton == null) { addButton = new JButton(); addButton.setText("Add"); addButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { int rows[] = attributeTree.getSelectionRows(); if (rows != null) { for (int i = 0; i < rows.length; i++) { TreePath path = attributeTree.getPathForRow(rows[i]); DefaultMutableTreeNode node = (DefaultMutableTreeNode)path.getPathComponent(path.getPathCount() - 1); String attr = (String)node.getUserObject(); try { attributesTableModel.addAttribute(AttributeFactory.newAttribute(attr)); } catch (Exception ex) { ex.printStackTrace(); } } attributesTableModel.fireTableDataChanged(); } } }); } return addButton; } /** * This method initializes simulationTypeComboBox * * @return javax.swing.JComboBox */ private JComboBox getSimulationTypeComboBox() { if (simulationTypeComboBox == null) { simulationTypeComboBox = new JComboBox(new String[] { "Auth Only", "Auth & Acct (Start, Interim, Stop)", "Auth & Acct (Start, Stop)", "Auth & Acct (Start Only)", "Acct Only (Start, Interim, Stop)", "Acct Only (Start Only)", "Acct Only (Interim Only)", "Acct Only (Stop Only)", "Acct On/Off", "Disconnect Request", "CoA Request"}); // "Auth & Acct (Start until you Stop)" }); } return simulationTypeComboBox; } /** * This method initializes attributesButtonPanel * * @return javax.swing.JPanel */ private JPanel getAttributesButtonPanel() { if (attributesButtonPanel == null) { attributesButtonPanel = new JPanel(); attributesButtonPanel.add(getAddAttributeButton(), null); attributesButtonPanel.add(getMoveUpButton(), null); attributesButtonPanel.add(getMoveDownButton(), null); attributesButtonPanel.add(getRemoveAttributeButton(), null); } return attributesButtonPanel; } /** * This method initializes removeAttributeButton * * @return javax.swing.JButton */ private JButton getRemoveAttributeButton() { if (removeAttributeButton == null) { removeAttributeButton = new JButton(); removeAttributeButton.setText("Remove Attribute"); removeAttributeButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { int selectedIndex[] = attributesTable.getSelectedRows(); if (selectedIndex == null) return; for (int i = 0; i < selectedIndex.length; i++) attributesTableModel.getEntries().remove(selectedIndex[i]); attributesTableModel.fireTableDataChanged(); } }); } return removeAttributeButton; } /** * This method initializes moveUpButton * * @return javax.swing.JButton */ private JButton getMoveUpButton() { if (moveUpButton == null) { moveUpButton = new JButton(); moveUpButton.setText("Move Up"); moveUpButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { int selectedIndex = attributesTable.getSelectedRow(); if (selectedIndex <= 0) return; ArrayList list = attributesTableModel.getEntries(); ArrayList newList = new ArrayList(); Object[] oList = list.toArray(); Object selectedObject = null; for (int i = 0; i < oList.length; i++) { if (i == selectedIndex) { newList.add(oList[i]); newList.add(selectedObject); } else if (i == (selectedIndex - 1)) { selectedObject = oList[i]; } else { newList.add(oList[i]); } } attributesTableModel.setEntries(newList); attributesTableModel.fireTableDataChanged(); attributesTable.setRowSelectionInterval(--selectedIndex, selectedIndex); } }); } return moveUpButton; } /** * This method initializes moveDownButton * * @return javax.swing.JButton */ private JButton getMoveDownButton() { if (moveDownButton == null) { moveDownButton = new JButton(); moveDownButton.setText("Move Down"); moveDownButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { int selectedIndex = attributesTable.getSelectedRow(); if (selectedIndex == -1) return; ArrayList list = attributesTableModel.getEntries(); if (selectedIndex >= (list.size() - 1)) return; ArrayList newList = new ArrayList(); Object[] oList = list.toArray(); Object selectedObject = null; for (int i = 0; i < oList.length; i++) { if (i == selectedIndex) { selectedObject = oList[i]; } else if (i == (selectedIndex + 1)) { newList.add(oList[i]); newList.add(selectedObject); } else { newList.add(oList[i]); } } attributesTableModel.setEntries(newList); attributesTableModel.fireTableDataChanged(); attributesTable.setRowSelectionInterval(++selectedIndex, selectedIndex); } }); } return moveDownButton; } /** * This method initializes generateAcctSessionIdCheckBox * * @return javax.swing.JCheckBox */ private JCheckBox getGenerateAcctSessionIdCheckBox() { if (generateAcctSessionIdCheckBox == null) { generateAcctSessionIdCheckBox = new JCheckBox(); generateAcctSessionIdCheckBox.setText("Generate Unique Acct-Session-Id"); } return generateAcctSessionIdCheckBox; } private JCheckBox getDoLogCheckBox() { if (doLogCheckBox == null) { doLogCheckBox = new JCheckBox(); doLogCheckBox.setText("Log RADIUS to Log tab"); } return doLogCheckBox; } private JCheckBox getFloodCheckBox() { if (floodCheckBox == null) { floodCheckBox = new JCheckBox(); floodCheckBox.setText("Flood (don't wait for reply)"); } return floodCheckBox; } /** * This method initializes tlsUseJavaRootCA * * @return javax.swing.JCheckBox */ private JCheckBox getUseJavaRootCAChainCheckBox() { if (tlsUseJavaRootCA == null) { tlsUseJavaRootCA = new JCheckBox(); tlsUseJavaRootCA.setText("Use Java's Root CA Chain"); } return tlsUseJavaRootCA; } /** * This method initializes tlsTrustAll * * @return javax.swing.JCheckBox */ private JCheckBox getTLSTrustAllCheckBox() { if (tlsTrustAll == null) { tlsTrustAll = new JCheckBox(); tlsTrustAll.setText("Trust All Server Certificates"); } return tlsTrustAll; } /** * This method initializes notStopOnRejectCheckBox * * @return javax.swing.JCheckBox */ private JCheckBox getNotStopOnRejectCheckBox() { if (notStopOnRejectCheckBox == null) { notStopOnRejectCheckBox = new JCheckBox(); notStopOnRejectCheckBox.setText("Don't Stop Simulation On AccessReject"); } return notStopOnRejectCheckBox; } /** * This method initializes notSendClassAttribute * * @return javax.swing.JCheckBox */ private JCheckBox getSendClassAttributeCheckBox() { if (notSendClassAttribute == null) { notSendClassAttribute = new JCheckBox(); notSendClassAttribute.setText("Don't Send The Received Class Attribute"); } return notSendClassAttribute; } /** * @return Returns the numberFormatter. */ public NumberFormatter getNumberFormatter() { if (numberFormatter == null) { numberFormatter = new NumberFormatter(NumberFormat.getIntegerInstance()); numberFormatter.setValueClass(Integer.class); } return numberFormatter; } /** * This method initializes radiusAuthPortTextField * * @return javax.swing.JTextField */ private JFormattedTextField getRadiusAuthPortTextField() { if (radiusAuthPortTextField == null) { radiusAuthPortTextField = new JFormattedTextField(getNumberFormatter()); radiusAuthPortTextField.setValue(new Integer(1812)); } return radiusAuthPortTextField; } /** * This method initializes radiusAcctPortTextField * * @return javax.swing.JTextField */ private JFormattedTextField getRadiusAcctPortTextField() { if (radiusAcctPortTextField == null) { radiusAcctPortTextField = new JFormattedTextField(getNumberFormatter()); radiusAcctPortTextField.setValue(new Integer(1813)); } return radiusAcctPortTextField; } /** * This method initializes radiusRetriesTextField * * @return javax.swing.JTextField */ private JFormattedTextField getRadiusRetriesTextField() { if (radiusRetriesTextField == null) { radiusRetriesTextField = new JFormattedTextField(getNumberFormatter()); radiusRetriesTextField.setValue(new Integer(0)); } return radiusRetriesTextField; } /** * This method initializes requestersTextField * * @return javax.swing.JTextField */ private JFormattedTextField getRequestersTextField() { if (requestersTextField == null) { requestersTextField = new JFormattedTextField(getNumberFormatter()); requestersTextField.setValue(new Integer(1)); } return requestersTextField; } /** * This method initializes radiusRetriesTextField * * @return javax.swing.JTextField */ private JFormattedTextField getRequestsTextField() { if (requestsTextField == null) { requestsTextField = new JFormattedTextField(getNumberFormatter()); requestsTextField.setValue(new Integer(1)); } return requestsTextField; } /** * This method initializes radiusRetriesTextField * * @return javax.swing.JTextField */ private JFormattedTextField getRadiusTimeoutTextField() { if (radiusTimeoutTextField == null) { radiusTimeoutTextField = new JFormattedTextField(getNumberFormatter()); radiusTimeoutTextField.setValue(new Integer(10)); } return radiusTimeoutTextField; } /** * This method initializes radiusInterimIntervalTextField * * @return javax.swing.JTextField */ private JFormattedTextField getRadiusInterimIntervalTextField() { if (radiusInterimIntervalTextField == null) { radiusInterimIntervalTextField = new JFormattedTextField(getNumberFormatter()); radiusInterimIntervalTextField.setValue(new Integer(60)); } return radiusInterimIntervalTextField; } /** * This method initializes sessionTimeTextField * * @return javax.swing.JTextField */ private JFormattedTextField getSessionTimeTextField() { if (sessionTimeTextField == null) { sessionTimeTextField = new JFormattedTextField(getNumberFormatter()); sessionTimeTextField.setValue(new Integer(60)); } return sessionTimeTextField; } private void checkStandard(RadiusStandard radiusStandard, RadiusPacket p) { if (radiusStandard != null) { try { radiusStandard.checkPacket(p); } catch (StandardViolatedException e) { setStatus(radiusStandard.getName() + " standard violated"); logErr.println(radiusStandard.getName() + " Standard Violated: " + p.getClass().getName()); logErr.println(logSepLine); logErr.println("Missing attributes:"); logErr.println(e.listAttributes("\n") + "\n"); logErr.flush(); } } } private RadiusStandard getRadiusStandard() { switch (checkStandardComboBox.getSelectedIndex()) { case 1: return new IRAPStandard(); case 2: return new WISPrStandard(); } return null; } /** * This method initializes openUrlDialog * * @return javax.swing.JDialog */ private JDialog getOpenUrlDialog() { if (openUrlDialog == null) { openUrlDialog = new JDialog(); openUrlDialog.setContentPane(getOpenUrlContentPane()); openUrlDialog.setSize(425,125); } openUrlStatusLabel.setText("Enter the URL of the configuration file:"); openUrlTextField.setText("http://"); return openUrlDialog; } /** * This method initializes openUrlContentPane * * @return javax.swing.JPanel */ private JPanel getOpenUrlContentPane() { if (openUrlContentPane == null) { GridBagConstraints gridBagConstraints = new GridBagConstraints(); gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.insets = new java.awt.Insets(25, 25, 10, 25); GridBagConstraints gridBagConstraints1 = new GridBagConstraints(); gridBagConstraints1.insets = new java.awt.Insets(0, 25, 0, 5); gridBagConstraints1.anchor = java.awt.GridBagConstraints.EAST; GridBagConstraints gridBagConstraints2 = new GridBagConstraints(); gridBagConstraints2.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints2.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints2.insets = new java.awt.Insets(0, 0, 0, 25); gridBagConstraints2.weightx = 1.0; GridBagConstraints gridBagConstraints3 = new GridBagConstraints(); gridBagConstraints3.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints3.gridwidth = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints3.insets = new java.awt.Insets(0, 25, 25, 25); JLabel openUrlLabel = new JLabel(); openUrlLabel.setText("URL:"); openUrlStatusLabel = new JLabel(); GridBagLayout gridBagLayout = new GridBagLayout(); openUrlContentPane = new JPanel(); openUrlContentPane.setLayout(gridBagLayout); JPanel buttonPanel = new JPanel(); buttonPanel.add(getOpenUrlButton(), null); buttonPanel.add(getCancelUrlButton(), null); openUrlContentPane.add(openUrlStatusLabel, gridBagConstraints); openUrlContentPane.add(openUrlLabel, gridBagConstraints1); openUrlContentPane.add(getOpenUrlTextField(), gridBagConstraints2); openUrlContentPane.add(buttonPanel, gridBagConstraints3); } return openUrlContentPane; } /** * This method initializes openUrlTextField * * @return javax.swing.JTextField */ private JTextField getOpenUrlTextField() { if (openUrlTextField == null) { openUrlTextField = new JTextField(); } return openUrlTextField; } /** * This method initializes openUrlButton * * @return javax.swing.JButton */ private JButton getOpenUrlButton() { if (openUrlButton == null) { openUrlButton = new JButton(); openUrlButton.setText("Open"); openUrlButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { try { loadConfigFile(openUrlTextField.getText()); } catch(FileNotFoundException ex) { openUrlStatusLabel.setText("Not found: " + ex.getMessage()); return; } catch(ConnectException ex) { openUrlStatusLabel.setText("Open Failed: " + ex.getMessage()); return; } catch(Exception ex) { openUrlStatusLabel.setText(ex.getMessage()); ex.printStackTrace(); return; } openUrlDialog.dispose(); } }); } return openUrlButton; } /** * This method initializes cancelUrlButton * * @return javax.swing.JButton */ private JButton getCancelUrlButton() { if (cancelUrlButton == null) { cancelUrlButton = new JButton(); cancelUrlButton.setText("Cancel"); cancelUrlButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { openUrlDialog.dispose(); } }); } return cancelUrlButton; } /** * Launches this application */ public static void main(String[] args) { System.setProperty("org.apache.commons.logging.LogFactory", "net.jradius.client.gui.LogFactory"); if (args.length > 0) { String url = args[0]; File file = new File(url); if (file.exists()) url = "file:///" + file.getAbsolutePath(); JRadiusSimulator.setConfigFileUrl(url); } JRadiusSimulator application = new JRadiusSimulator(); application.setVisible(true); } public boolean isWindows() { return windows; } public byte[] toBinArray(String hexStr) { hexStr = hexStr.replace("0x", ""); byte bArray[] = new byte[hexStr.length()/2]; for (int i=0; i<(hexStr.length()/2); i++) { byte firstNibble = Byte.parseByte(hexStr.substring(2*i,2*i+1),16); byte secondNibble = Byte.parseByte(hexStr.substring(2*i+1,2*i+2),16); int finalByte = (secondNibble) | (firstNibble << 4 ); bArray[i] = (byte) finalByte; } return bArray; } public void setStatus(String s) { SwingUtilities.invokeLater(new SetStatus(statusLabel, s)); } private static class SetStatus implements Runnable { JLabel label = null; String line = null; public SetStatus(JLabel label, String line) { this.label = label; this.line = line; } public void run() { try { label.setText(line); } catch (Throwable t) { } } } public void clearStats() { runStatsThreads.setText("-"); runStatsSent.setText("-"); runStatsRecv.setText("-"); runStatsTime.setText("-"); runStatsRPS.setText("-"); runStatsTime1.setText("-"); runStatsTime2.setText("-"); runStatsTime3.setText("-"); runStatsTime4.setText("-"); runStatsTime5.setText("-"); } class SimulationMonitor implements Runnable { long startTime = System.currentTimeMillis(); public void run() { clearStats(); setStatus("Simulation Running..."); if (simulationThreads != null) { for (Thread t : simulationThreads) { try { t.join(); } catch (InterruptedException e) { setStatus(statusLabel.getText()+ " Stopped."); runButton.setSelected(false); runButton.setText("Start"); return; } } } if (simulationRunners == null) return; setStatus(statusLabel.getText()+ " Done."); long overallTime = System.currentTimeMillis() - startTime; int threads = simulationRunners.length; long cntAccept = 0; long cntReject = 0; long cntChallenge = 0; long cntAcctResp = 0; int sent = 0; int recd = 0; long pktTimes[] = new long[10]; for (SimulationRunner r : simulationRunners) { sent += r.sent; recd += r.recd; for (int i = 0; i < pktTimes.length; i++) { pktTimes[i] += r.pkts[i]; } cntAccept += r.cntAccept; cntReject += r.cntReject; cntChallenge += r.cntChallenge; cntAcctResp += r.cntAcctResp; System.out.println(r.logLine); } double time = (double)overallTime / 1000; double rps = (double)recd; rps /= time; NumberFormat dfmt = new DecimalFormat("#.##"); NumberFormat ifmt = NumberFormat.getInstance(); runStatsThreads.setText(ifmt.format(threads)); runStatsSent.setText(ifmt.format(sent)); runStatsRecv.setText(ifmt.format(recd)); runStatsTime.setText(dfmt.format(time)+" sec"); runStatsRPS.setText(dfmt.format(rps)+" req/sec"); runStatsTime1.setText(ifmt.format(pktTimes[0])); runStatsTime2.setText(ifmt.format(pktTimes[1])); runStatsTime3.setText(ifmt.format(pktTimes[2])); runStatsTime4.setText(ifmt.format(pktTimes[3])); runStatsTime5.setText(ifmt.format(pktTimes[4])); runStatsPktAccept.setText(ifmt.format(cntAccept)); runStatsPktReject.setText(ifmt.format(cntReject)); runStatsPktChallenge.setText(ifmt.format(cntChallenge)); runStatsPktAcctResp.setText(ifmt.format(cntAcctResp)); runButton.setSelected(false); runButton.setText("Start"); System.gc(); } } class SimulationRunner implements Runnable { protected StringBuilder logLine = new StringBuilder(this.toString()); protected int sent = 0; protected int recd = 0; protected int accepts = 0; protected double requestPerSecond = 0; protected long pkts[] = new long[10]; // not using all - notably : 2 (accept), 3 (reject), 11 (challenge) long cntAccept = 0; long cntReject = 0; long cntChallenge = 0; long cntAcctResp = 0; public void run() { final boolean doLog = doLogCheckBox.isSelected(); RadiusClientTransport transport = null; try { int id = 0; String radiusServer = radiusServerTextField.getText(); String sharedSecret = sharedSecretTextField.getText(); Integer authPort = (Integer) radiusAuthPortTextField.getValue(); Integer acctPort = (Integer) radiusAcctPortTextField.getValue(); Integer timeout = (Integer) radiusTimeoutTextField.getValue(); Integer retries = (Integer) radiusRetriesTextField.getValue(); Integer requests = (Integer) requestsTextField.getValue(); if (radiusServer == null || sharedSecret == null || "".equals(radiusServer) || "".equals(sharedSecret)) { logLine.append("The RADIUS Server and Shared Secret are required"); return; } if (authPort == null || acctPort == null) { logLine.append("The Auth Port and Acct Port must be set"); return; } AttributeList[] authAttributes = { new AttributeList(), new AttributeList() }; AttributeList[] acctAttributes = { new AttributeList(), new AttributeList(), new AttributeList(), new AttributeList() }; Object[] entries = attributesTableModel.getEntries().toArray(); for (int i = 0; i < entries.length; i++) { AttributesTableEntry entry = (AttributesTableEntry)entries[i]; try { RadiusAttribute attribute = AttributeFactory.newAttribute(entry.getAttributeName(), entry.getAttributeValue(), "="); Boolean bool; if ((bool = entry.getAccessRequest()) != null && bool.booleanValue()) authAttributes[0].add(AttributeFactory.copyAttribute(attribute), false); if ((bool = entry.getTunnelRequest()) != null && bool.booleanValue()) authAttributes[1].add(AttributeFactory.copyAttribute(attribute), false); if ((bool = entry.getAccountingStart()) != null && bool.booleanValue()) acctAttributes[0].add(AttributeFactory.copyAttribute(attribute), false); if ((bool = entry.getAccountingUpdate()) != null && bool.booleanValue()) acctAttributes[1].add(AttributeFactory.copyAttribute(attribute), false); if ((bool = entry.getAccountingStop()) != null && bool.booleanValue()) acctAttributes[2].add(AttributeFactory.copyAttribute(attribute), false); if ((bool = entry.getCoARequest()) != null && bool.booleanValue()) acctAttributes[3].add(AttributeFactory.copyAttribute(attribute), false); } catch (UnknownAttributeException e) { e.printStackTrace(); } } boolean sendPackets[] = { true, false, false, false }; boolean sendDisconnectRequest = false; boolean sendCoARequest = false; boolean sendOnOff = false; boolean simulationSuccess = true; interactiveSession = false; switch (simulationTypeComboBox.getSelectedIndex()) { case 1: sendPackets[1] = sendPackets[2] = sendPackets[3] = true; break; case 2: sendPackets[1] = sendPackets[3] = true; break; case 3: sendPackets[1] = true; break; case 4: sendPackets = new boolean[]{ false, true, true, true }; break; case 5: sendPackets = new boolean[]{ false, true, false, false }; break; case 6: sendPackets = new boolean[]{ false, false, true, false }; break; case 7: sendPackets = new boolean[]{ false, false, false, true }; break; case 8: sendPackets = new boolean[]{ false, true, false, true }; sendOnOff = true; break; case 9: sendDisconnectRequest = true; break; case 10: sendCoARequest = true; break; //case 3: sendPackets[1] = true; interactiveSession = true; break; } if ("RadSec".equals(transportTypeComboBox.getSelectedItem())) { KeyManager keyManagers[] = KeyStoreUtil.loadKeyManager( tlsKeyFileTypeComboBox.getSelectedItem().toString(), new FileInputStream(tlsKeyFileTextField.getText()), tlsKeyPasswordTextField.getText()); TrustManager trustManagers[]; if (tlsTrustAll.isSelected()) { trustManagers = KeyStoreUtil.trustAllManager(); } else { trustManagers = KeyStoreUtil.loadTrustManager( tlsCAFileTypeComboBox.getSelectedItem().toString(), new FileInputStream(tlsCAFileTextField.getText()), tlsCAPasswordTextField.getText()); } transport = new RadSecClientTransport(keyManagers, trustManagers); } else { transport = new UDPClientTransport(); } transport.setRemoteInetAddress(InetAddress.getByName(radiusServer)); transport.setSharedSecret(sharedSecret); transport.setAuthPort(authPort); transport.setAcctPort(acctPort); transport.setSocketTimeout(timeout); transport.setStatusListener(new TransportStatusListener() { long t = 0; public void onAfterReceive(RadiusClientTransport transport, RadiusPacket packet) { long d = System.currentTimeMillis() - t; if (d <= 1) pkts[0]++; else if (d <= 10) pkts[1]++; else if (d <= 100) pkts[2]++; else if (d <= 1000) pkts[3]++; else if (d <= 10000) pkts[4]++; else if (d <= 100000) pkts[5]++; else if (d <= 1000000) pkts[6]++; if (doLog) { // statusLabel.setText("Received RADIUS Packet " + packet.getClass().getName()); logRecv.println("Received RADIUS Packet:"); logRecv.println(logSepLine); logRecv.println(packet.toString()); logRecv.flush(); checkStandard(getRadiusStandard(), packet); } switch(packet.getCode()) { case 2: cntAccept++; break; case 3: cntReject++; break; case 5: cntAcctResp++; break; case 11: cntChallenge++; break; } recd++; } public void onAfterSend(RadiusClientTransport transport) { } public void onBeforeReceive(RadiusClientTransport transport) { //if (doLog) //statusLabel.setText("Waiting for response..."); } public void onBeforeSend(RadiusClientTransport transport, RadiusPacket packet) { if (doLog) { logSent.println("Sending RADIUS Packet:"); logSent.println(logSepLine); logSent.println(packet.toString()); logSent.flush(); checkStandard(getRadiusStandard(), packet); // statusLabel.setText("Sending RADIUS Packet " + packet.getClass().getName()); } t = System.currentTimeMillis(); sent++; } }); long startTime = System.currentTimeMillis(); for (int r=0; r < requests; r++) { RadiusClient radiusClient = null; try { // Run the Simulation radiusClient = new RadiusClient(transport); String sessionId = "JRadius-" + RadiusRandom.getRandomString(16); byte[] bClass = null; for (int i = 0; i < sendPackets.length; i++) { if (!sendPackets[i]) continue; RadiusRequest request; if (i == 0) { if (sendDisconnectRequest) { request = PacketFactory.newPacket(DisconnectRequest.CODE, radiusClient, acctAttributes[3]); } else if (sendCoARequest) { request = PacketFactory.newPacket(CoARequest.CODE, radiusClient, acctAttributes[3]); } else { request = PacketFactory.newPacket(AccessRequest.CODE, radiusClient, authAttributes[0]); } } else { request = PacketFactory.newPacket(AccountingRequest.CODE, radiusClient, acctAttributes[sendOnOff ? 3 : (i - 1)]); if (request.findAttribute(Attr_AcctStatusType.TYPE) == null) { switch(i) { case 1: request.addAttribute(AttributeFactory.newAttribute(Attr_AcctStatusType.TYPE, sendOnOff ? Attr_AcctStatusType.AccountingOn : Attr_AcctStatusType.Start, false)); break; case 2: request.addAttribute(AttributeFactory.newAttribute(Attr_AcctStatusType.TYPE, Attr_AcctStatusType.InterimUpdate, false)); break; case 3: request.addAttribute(AttributeFactory.newAttribute(Attr_AcctStatusType.TYPE, sendOnOff ? Attr_AcctStatusType.AccountingOff : Attr_AcctStatusType.Stop, false)); break; } } } request.setIdentifier(request.getIdentifier() + id++); if (bClass != null) { request.addAttribute(AttributeFactory.newAttribute(Attr_Class.TYPE, bClass, false)); } if (generateAcctSessionIdCheckBox.isSelected()) { Attr_AcctSessionId generatedAcctSessionId = (Attr_AcctSessionId) AttributeFactory.newAttribute(Attr_AcctSessionId.TYPE, sessionId, false); if (generatedAcctSessionId != null && request.findAttribute(Attr_AcctSessionId.TYPE) != null) { request.overwriteAttribute(generatedAcctSessionId); } } RadiusPacket reply = null; if (floodCheckBox.isSelected()) { radiusClient.send(request); } else if (i == 0) { if (request instanceof AccessRequest) { RadiusAuthenticator auth = getAuthenticator(); if (auth instanceof TunnelAuthenticator) { ((TunnelAuthenticator)auth).setTunneledAttributes(authAttributes[1]); } reply = radiusClient.authenticate((AccessRequest)request, auth, retries.intValue()); if (reply == null) { PacketFactory.recycle(request); throw new TimeoutException("timeout waiting for reply"); } if (!notStopOnRejectCheckBox.isSelected()) { if (reply instanceof AccessReject) { String replyMessage = (String)reply.getAttributeValue(Attr_ReplyMessage.TYPE); if (replyMessage == null) replyMessage = "reason unknown"; // statusLabel.setText("Access Rejected: " + replyMessage); simulationSuccess = false; break; } } if (!notSendClassAttribute.isSelected()) { bClass = (byte[]) reply.getAttributeValue(Attr_Class.TYPE); } } else if (sendDisconnectRequest) { reply = radiusClient.disconnect((DisconnectRequest)request, retries.intValue()); } else if (sendCoARequest) { reply = radiusClient.changeOfAuth((CoARequest)request, retries.intValue()); } } else { reply = radiusClient.accounting((AccountingRequest)request, retries.intValue()); } logLine.append(" ").append(request.getClass().getSimpleName()).append("/"); if (reply != null) { logLine.append(reply.getClass().getSimpleName()); PacketFactory.recycle(reply); } PacketFactory.recycle(request); } if (simulationSuccess) { logLine.append(". Done."); } } catch (Exception e) { // statusLabel.setText("Problem: " + e.getMessage()); e.printStackTrace(); } finally { } } authAttributes[0].clear(); authAttributes[1].clear(); acctAttributes[0].clear(); acctAttributes[1].clear(); acctAttributes[2].clear(); acctAttributes[3].clear(); System.out.println("Sent: "+sent+" Recd: "+recd+" in "+((System.currentTimeMillis() - startTime))+"ms"); } catch (Exception e) { e.printStackTrace(); } finally { if (transport != null) { transport.close(); } } } } }