From 22c2829714a89c46db2928f7ef5beb703ca97acf Mon Sep 17 00:00:00 2001 From: mathiasdm Date: Wed, 17 Jun 2009 21:54:29 +0000 Subject: [PATCH 01/24] * desktopgui: - Added client and server tunnel view (saving does not work yet) --- apps/desktopgui/build.xml | 2 + apps/desktopgui/nbproject/project.properties | 4 +- .../i2p/desktopgui/desktopgui/GUIVersion.java | 2 +- .../desktopgui/gui/ClientTunnelWindow.form | 396 ++++++++++++++++ .../desktopgui/gui/ClientTunnelWindow.java | 434 ++++++++++++++++++ .../desktopgui/gui/GeneralConfiguration.form | 106 ++++- .../desktopgui/gui/GeneralConfiguration.java | 183 +++++++- .../desktopgui/gui/ServerTunnelWindow.form | 40 ++ .../desktopgui/gui/ServerTunnelWindow.java | 60 +++ .../resources/ClientTunnelWindow.properties | 26 ++ .../resources/GeneralConfiguration.properties | 12 +- .../resources/ServerTunnelWindow.properties | 1 + history.txt | 5 + 13 files changed, 1242 insertions(+), 29 deletions(-) create mode 100644 apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.form create mode 100644 apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.java create mode 100644 apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.form create mode 100644 apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.java create mode 100644 apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ClientTunnelWindow.properties create mode 100644 apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ServerTunnelWindow.properties diff --git a/apps/desktopgui/build.xml b/apps/desktopgui/build.xml index 795edf046..8138f14c5 100644 --- a/apps/desktopgui/build.xml +++ b/apps/desktopgui/build.xml @@ -77,11 +77,13 @@ + + diff --git a/apps/desktopgui/nbproject/project.properties b/apps/desktopgui/nbproject/project.properties index fb880932f..a02ea8207 100644 --- a/apps/desktopgui/nbproject/project.properties +++ b/apps/desktopgui/nbproject/project.properties @@ -22,6 +22,7 @@ dist.javadoc.dir=${dist.dir}/javadoc excludes= file.reference.appframework.jar=lib/appframework.jar file.reference.i2p.jar=../../core/java/build/i2p.jar +file.reference.i2ptunnel.jar=../i2ptunnel/java/build/i2ptunnel.jar file.reference.router.jar=../../router/java/build/router.jar file.reference.routerconsole.jar=../routerconsole/java/build/routerconsole.jar file.reference.swing-worker.jar=lib/swing-worker.jar @@ -32,7 +33,8 @@ javac.classpath=\ ${file.reference.appframework.jar}:\ ${file.reference.swing-worker.jar}:\ ${file.reference.i2p.jar}:\ - ${file.reference.routerconsole.jar} + ${file.reference.routerconsole.jar}:\ + ${file.reference.i2ptunnel.jar} # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false diff --git a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/GUIVersion.java b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/GUIVersion.java index 10a6e5293..21f0e04cf 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/GUIVersion.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/desktopgui/GUIVersion.java @@ -10,5 +10,5 @@ package net.i2p.desktopgui.desktopgui; * @author mathias */ public class GUIVersion { - public static final String VERSION = "0.0.1.3"; + public static final String VERSION = "0.0.2"; } diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.form new file mode 100644 index 000000000..0f07284d5 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.form @@ -0,0 +1,396 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.java new file mode 100644 index 000000000..b7102b3ce --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/ClientTunnelWindow.java @@ -0,0 +1,434 @@ +/* + * ClientTunnelWindow.java + * + * Created on 10-jun-2009, 16:49:12 + */ + +package net.i2p.desktopgui.gui; + +import net.i2p.i2ptunnel.web.EditBean; +import java.awt.event.ActionListener; + +/** + * + * @author mathias + */ +public class ClientTunnelWindow extends javax.swing.JFrame { + + /** Creates new form ClientTunnelWindow */ + public ClientTunnelWindow(int tunnelNumber, ActionListener al) { + initComponents(); + this.tunnelNumber = tunnelNumber; + this.al = al; + extraInitComponents(); + this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + this.setSize(600, 600); + this.setLocationRelativeTo(null); + this.requestFocus(); + this.changeTunnelState.setVisible(false); //TODO: implement tunnel state change + this.setVisible(true); + } + + public void extraInitComponents() { + EditBean bean = new EditBean(); + if(!bean.isClient(tunnelNumber)) { + this.dispose(); + } + else { + this.tunnelName.setText(bean.getTunnelName(tunnelNumber)); + this.tunnelType.setText(bean.getTunnelType(tunnelNumber)); + this.tunnelPort.setText(bean.getClientPort(tunnelNumber)); + this.tunnelDestination.setText(bean.getClientDestination(tunnelNumber)); + + if(bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) { + tunnelProfile.setVisible(false); + tunnelProfileLabel.setVisible(false); + this.delayConnect.setVisible(false); + this.sharedClient.setVisible(false); + this.autoStart.setVisible(false); + } + else { + if(bean.isInteractive(tunnelNumber)) { + tunnelProfile.setSelectedIndex(TUNNEL_INTERACTIVE); + } + else { + tunnelProfile.setSelectedIndex(TUNNEL_BULK); + } + + this.delayConnect.setSelected(bean.shouldDelay(tunnelNumber)); + this.sharedClient.setSelected(bean.isSharedClient(tunnelNumber)); + this.autoStart.setSelected(bean.startAutomatically(tunnelNumber)); + } + + this.tunnelDepth.setSelectedIndex(bean.getTunnelDepth(tunnelNumber, 2)); + + int variance = bean.getTunnelVariance(tunnelNumber, 0); + if(variance == 0) { + this.depthVariance.setSelectedIndex(0); + } + else if(variance == 1) { + this.depthVariance.setSelectedIndex(1); + } + else if(variance == 2) { + this.depthVariance.setSelectedIndex(2); + } + else if(variance == -1) { + this.depthVariance.setSelectedIndex(3); + } + else if(variance == -2) { + this.depthVariance.setSelectedIndex(4); + } + + int tunnelQuantity = bean.getTunnelQuantity(tunnelNumber, 2) - 1; + if(tunnelQuantity >= 0 && tunnelQuantity <= 2) { + this.tunnelCount.setSelectedIndex(tunnelQuantity); + } + + int backupTunnelQuantity = bean.getTunnelBackupQuantity(tunnelNumber, 0); + if(backupTunnelQuantity >= 0 && backupTunnelQuantity <= 3) { + this.backupTunnelCount.setSelectedIndex(backupTunnelQuantity); + } + + + if(bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) { + this.reduceIdle.setVisible(false); + this.closeIdle.setVisible(false); + this.delayIdle.setVisible(false); + } + else { + this.reduceIdle.setSelected(bean.getReduce(tunnelNumber)); + this.closeIdle.setSelected(bean.getClose(tunnelNumber)); + this.delayIdle.setSelected(bean.getDelayOpen(tunnelNumber)); + } + } + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + tunnelNameLabel = new javax.swing.JLabel(); + tunnelTypeLabel = new javax.swing.JLabel(); + tunnelPortLabel = new javax.swing.JLabel(); + tunnelDestinationLabel = new javax.swing.JLabel(); + tunnelProfileLabel = new javax.swing.JLabel(); + delayConnect = new javax.swing.JCheckBox(); + sharedClient = new javax.swing.JCheckBox(); + autoStart = new javax.swing.JCheckBox(); + jSeparator1 = new javax.swing.JSeparator(); + tunnelDepthLabel = new javax.swing.JLabel(); + depthVarianceLabel = new javax.swing.JLabel(); + tunnelCountLabel = new javax.swing.JLabel(); + backupTunnelCountLabel = new javax.swing.JLabel(); + jSeparator2 = new javax.swing.JSeparator(); + reduceIdle = new javax.swing.JCheckBox(); + closeIdle = new javax.swing.JCheckBox(); + delayIdle = new javax.swing.JCheckBox(); + jSeparator3 = new javax.swing.JSeparator(); + save = new javax.swing.JButton(); + cancel = new javax.swing.JButton(); + tunnelName = new javax.swing.JTextField(); + tunnelType = new javax.swing.JLabel(); + tunnelPort = new javax.swing.JTextField(); + tunnelDestination = new javax.swing.JTextField(); + tunnelProfile = new javax.swing.JComboBox(); + tunnelDepth = new javax.swing.JComboBox(); + depthVariance = new javax.swing.JComboBox(); + tunnelCount = new javax.swing.JComboBox(); + backupTunnelCount = new javax.swing.JComboBox(); + changeTunnelState = new javax.swing.JButton(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(ClientTunnelWindow.class); + setTitle(resourceMap.getString("Form.title")); // NOI18N + setName("Form"); // NOI18N + getContentPane().setLayout(null); + + tunnelNameLabel.setText(resourceMap.getString("tunnelNameLabel.text")); // NOI18N + tunnelNameLabel.setName("tunnelNameLabel"); // NOI18N + getContentPane().add(tunnelNameLabel); + tunnelNameLabel.setBounds(20, 20, 120, 17); + + tunnelTypeLabel.setText(resourceMap.getString("tunnelTypeLabel.text")); // NOI18N + tunnelTypeLabel.setName("tunnelTypeLabel"); // NOI18N + getContentPane().add(tunnelTypeLabel); + tunnelTypeLabel.setBounds(20, 50, 120, 17); + + tunnelPortLabel.setText(resourceMap.getString("tunnelPortLabel.text")); // NOI18N + tunnelPortLabel.setName("tunnelPortLabel"); // NOI18N + getContentPane().add(tunnelPortLabel); + tunnelPortLabel.setBounds(20, 80, 110, 17); + + tunnelDestinationLabel.setText(resourceMap.getString("tunnelDestinationLabel.text")); // NOI18N + tunnelDestinationLabel.setName("tunnelDestinationLabel"); // NOI18N + getContentPane().add(tunnelDestinationLabel); + tunnelDestinationLabel.setBounds(20, 110, 110, 17); + + tunnelProfileLabel.setText(resourceMap.getString("tunnelProfileLabel.text")); // NOI18N + tunnelProfileLabel.setName("tunnelProfileLabel"); // NOI18N + getContentPane().add(tunnelProfileLabel); + tunnelProfileLabel.setBounds(20, 140, 110, 17); + + delayConnect.setText(resourceMap.getString("delayConnect.text")); // NOI18N + delayConnect.setName("delayConnect"); // NOI18N + getContentPane().add(delayConnect); + delayConnect.setBounds(20, 170, 160, 22); + + sharedClient.setText(resourceMap.getString("sharedClient.text")); // NOI18N + sharedClient.setName("sharedClient"); // NOI18N + getContentPane().add(sharedClient); + sharedClient.setBounds(20, 200, 160, 22); + + autoStart.setText(resourceMap.getString("autoStart.text")); // NOI18N + autoStart.setName("autoStart"); // NOI18N + getContentPane().add(autoStart); + autoStart.setBounds(20, 230, 160, 22); + + jSeparator1.setName("jSeparator1"); // NOI18N + getContentPane().add(jSeparator1); + jSeparator1.setBounds(0, 510, 750, 10); + + tunnelDepthLabel.setText(resourceMap.getString("tunnelDepthLabel.text")); // NOI18N + tunnelDepthLabel.setName("tunnelDepthLabel"); // NOI18N + getContentPane().add(tunnelDepthLabel); + tunnelDepthLabel.setBounds(20, 280, 160, 17); + + depthVarianceLabel.setText(resourceMap.getString("depthVarianceLabel.text")); // NOI18N + depthVarianceLabel.setName("depthVarianceLabel"); // NOI18N + getContentPane().add(depthVarianceLabel); + depthVarianceLabel.setBounds(20, 310, 160, 17); + + tunnelCountLabel.setText(resourceMap.getString("tunnelCountLabel.text")); // NOI18N + tunnelCountLabel.setName("tunnelCountLabel"); // NOI18N + getContentPane().add(tunnelCountLabel); + tunnelCountLabel.setBounds(20, 340, 160, 17); + + backupTunnelCountLabel.setText(resourceMap.getString("backupTunnelCountLabel.text")); // NOI18N + backupTunnelCountLabel.setName("backupTunnelCountLabel"); // NOI18N + getContentPane().add(backupTunnelCountLabel); + backupTunnelCountLabel.setBounds(20, 370, 170, 17); + + jSeparator2.setName("jSeparator2"); // NOI18N + getContentPane().add(jSeparator2); + jSeparator2.setBounds(0, 260, 750, 10); + + reduceIdle.setText(resourceMap.getString("reduceIdle.text")); // NOI18N + reduceIdle.setName("reduceIdle"); // NOI18N + getContentPane().add(reduceIdle); + reduceIdle.setBounds(20, 420, 300, 22); + + closeIdle.setText(resourceMap.getString("closeIdle.text")); // NOI18N + closeIdle.setName("closeIdle"); // NOI18N + getContentPane().add(closeIdle); + closeIdle.setBounds(20, 450, 370, 22); + + delayIdle.setText(resourceMap.getString("delayIdle.text")); // NOI18N + delayIdle.setName("delayIdle"); // NOI18N + getContentPane().add(delayIdle); + delayIdle.setBounds(20, 480, 400, 22); + + jSeparator3.setName("jSeparator3"); // NOI18N + getContentPane().add(jSeparator3); + jSeparator3.setBounds(0, 400, 760, 10); + + save.setText(resourceMap.getString("save.text")); // NOI18N + save.setName("save"); // NOI18N + save.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + saveActionPerformed(evt); + } + }); + getContentPane().add(save); + save.setBounds(10, 520, 44, 29); + + cancel.setText(resourceMap.getString("cancel.text")); // NOI18N + cancel.setName("cancel"); // NOI18N + cancel.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + cancelActionPerformed(evt); + } + }); + getContentPane().add(cancel); + cancel.setBounds(60, 520, 55, 29); + + tunnelName.setText(resourceMap.getString("tunnelName.text")); // NOI18N + tunnelName.setName("tunnelName"); // NOI18N + getContentPane().add(tunnelName); + tunnelName.setBounds(200, 20, 340, 27); + + tunnelType.setText(resourceMap.getString("tunnelType.text")); // NOI18N + tunnelType.setName("tunnelType"); // NOI18N + getContentPane().add(tunnelType); + tunnelType.setBounds(200, 50, 340, 20); + + tunnelPort.setText(resourceMap.getString("tunnelPort.text")); // NOI18N + tunnelPort.setName("tunnelPort"); // NOI18N + getContentPane().add(tunnelPort); + tunnelPort.setBounds(200, 70, 340, 27); + + tunnelDestination.setText(resourceMap.getString("tunnelDestination.text")); // NOI18N + tunnelDestination.setName("tunnelDestination"); // NOI18N + getContentPane().add(tunnelDestination); + tunnelDestination.setBounds(200, 100, 340, 27); + + tunnelProfile.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Interactive connection (Instant messaging)", "Bulk connection (Downloads, websites...)" })); + tunnelProfile.setName("tunnelProfile"); // NOI18N + getContentPane().add(tunnelProfile); + tunnelProfile.setBounds(200, 130, 340, 27); + + tunnelDepth.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 hop tunnel (no anonymity, low latency)", "1 hop tunnel (low anonymity, low latency)", "2 hop tunnel (medium anonymity, medium latency)", "3 hop tunnel (high anonymity, high latency)" })); + tunnelDepth.setName("tunnelDepth"); // NOI18N + getContentPane().add(tunnelDepth); + tunnelDepth.setBounds(200, 280, 350, 27); + + depthVariance.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 hop variance (no random, good performance)", "+ 0-1 hop variance (slightly random, lower performance)", "+ 0-2 hop variance (very random, lower performance)", "+/- 0-1 hop variance (slightly random, standard performance)", "+/- 0-2 hop variance (not recommended)" })); + depthVariance.setName("depthVariance"); // NOI18N + getContentPane().add(depthVariance); + depthVariance.setBounds(200, 310, 350, 27); + + tunnelCount.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "1 tunnel (low bandwidth usage, low reliability)", "2 tunnels (standard bandwidth usage, standard reliability)", "3 tunnels (high bandwidth usage, high reliability)" })); + tunnelCount.setName("tunnelCount"); // NOI18N + getContentPane().add(tunnelCount); + tunnelCount.setBounds(200, 340, 350, 27); + + backupTunnelCount.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 backup tunnels (no redundancy, no resource usage)", "1 backup tunnel (low redundancy, low resource usage)", "2 backup tunnels (medium redundancy, medium resource usage)", "3 backup tunnels (high redundancy, high resource usage)" })); + backupTunnelCount.setName("backupTunnelCount"); // NOI18N + getContentPane().add(backupTunnelCount); + backupTunnelCount.setBounds(200, 370, 350, 27); + + changeTunnelState.setText(resourceMap.getString("changeTunnelState.text")); // NOI18N + changeTunnelState.setName("changeTunnelState"); // NOI18N + getContentPane().add(changeTunnelState); + changeTunnelState.setBounds(160, 520, 150, 29); + + pack(); + }// //GEN-END:initComponents + + private void saveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveActionPerformed + EditBean bean = new EditBean(); + if(!bean.isClient(tunnelNumber)) { + al.actionPerformed(evt); + this.dispose(); + } + else { + bean.setTunnel("" + tunnelNumber); + bean.setName(tunnelName.getText()); + bean.setPort(tunnelPort.getText()); + bean.setTargetDestination(tunnelDestination.getText()); + if(!bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) { + if(tunnelProfile.getSelectedIndex() == TUNNEL_INTERACTIVE) { + bean.setProfile("interactive"); + } + else { + bean.setProfile("bulk"); + } + + if(delayConnect.isSelected()) { + bean.setConnectDelay("true"); + } + else { + bean.setConnectDelay("false"); + } + + if(sharedClient.isSelected()) { + bean.setShared(true); + } + else { + bean.setShared(false); + } + + if(autoStart.isSelected()) { + bean.setStartOnLoad("true"); + } + else { + } + } + bean.setTunnelDepth("" + tunnelDepth.getSelectedIndex()); + + int variance = depthVariance.getSelectedIndex(); + if(variance >= 0 && variance <= 2) { + bean.setTunnelVariance("" + variance); + } + else if(variance == 3) { + bean.setTunnelVariance("-1"); + } + else if(variance == 4) { + bean.setTunnelVariance("-2"); + } + + bean.setTunnelQuantity("" + tunnelCount.getSelectedIndex() + 1); + + bean.setTunnelBackupQuantity("" + backupTunnelCount.getSelectedIndex()); + + if(!bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) { + if(reduceIdle.isSelected()) { + bean.setReduce("true"); + } + else { + } + + if(closeIdle.isSelected()) { + bean.setClose("true"); + } + else { + } + + if(delayIdle.isSelected()) { + bean.setDelayOpen("true"); + } + } + + } + + al.actionPerformed(evt); + this.dispose(); +}//GEN-LAST:event_saveActionPerformed + + private void cancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelActionPerformed + al.actionPerformed(evt); + this.dispose(); + }//GEN-LAST:event_cancelActionPerformed + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JCheckBox autoStart; + private javax.swing.JComboBox backupTunnelCount; + private javax.swing.JLabel backupTunnelCountLabel; + private javax.swing.JButton cancel; + private javax.swing.JButton changeTunnelState; + private javax.swing.JCheckBox closeIdle; + private javax.swing.JCheckBox delayConnect; + private javax.swing.JCheckBox delayIdle; + private javax.swing.JComboBox depthVariance; + private javax.swing.JLabel depthVarianceLabel; + private javax.swing.JSeparator jSeparator1; + private javax.swing.JSeparator jSeparator2; + private javax.swing.JSeparator jSeparator3; + private javax.swing.JCheckBox reduceIdle; + private javax.swing.JButton save; + private javax.swing.JCheckBox sharedClient; + private javax.swing.JComboBox tunnelCount; + private javax.swing.JLabel tunnelCountLabel; + private javax.swing.JComboBox tunnelDepth; + private javax.swing.JLabel tunnelDepthLabel; + private javax.swing.JTextField tunnelDestination; + private javax.swing.JLabel tunnelDestinationLabel; + private javax.swing.JTextField tunnelName; + private javax.swing.JLabel tunnelNameLabel; + private javax.swing.JTextField tunnelPort; + private javax.swing.JLabel tunnelPortLabel; + private javax.swing.JComboBox tunnelProfile; + private javax.swing.JLabel tunnelProfileLabel; + private javax.swing.JLabel tunnelType; + private javax.swing.JLabel tunnelTypeLabel; + // End of variables declaration//GEN-END:variables + private int tunnelNumber; + private ActionListener al; + private static final int TUNNEL_INTERACTIVE = 0; + private static final int TUNNEL_BULK = 1; + private static final String TYPE_STREAMR_CLIENT = "Streamr client"; +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.form index 4c7cb5afc..589f5cee2 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.form +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.form @@ -322,14 +322,14 @@ - - - - + + + + - + @@ -439,11 +439,11 @@ - + - - + + @@ -463,9 +463,9 @@ - - - + + + @@ -477,6 +477,51 @@ + + + + + + + + + +
+
+ + + + + <Editor/> + <Renderer/> + </Column> + <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> + <Title resourceKey="clientTable.columnModel.title1"/> + <Editor/> + <Renderer/> + </Column> + <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> + <Title resourceKey="clientTable.columnModel.title2"/> + <Editor/> + <Renderer/> + </Column> + <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> + <Title resourceKey="clientTable.columnModel.title3"/> + <Editor/> + <Renderer/> + </Column> + </TableColumnModel> + </Property> + <Property name="name" type="java.lang.String" value="clientTable" noResource="true"/> + <Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor"> + <TableHeader reorderingAllowed="true" resizingAllowed="true"/> + </Property> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="clientTableMouseClicked"/> + </Events> + </Component> + </SubComponents> </Container> <Container class="javax.swing.JScrollPane" name="serverFrame"> <Properties> @@ -484,6 +529,45 @@ </Properties> <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> + <SubComponents> + <Component class="javax.swing.JTable" name="serverTable"> + <Properties> + <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor"> + <Table columnCount="3" rowCount="4"> + <Column editable="true" title="Name" type="java.lang.Object"/> + <Column editable="true" title="Address" type="java.lang.Object"/> + <Column editable="true" title="Status" type="java.lang.Object"/> + </Table> + </Property> + <Property name="columnModel" type="javax.swing.table.TableColumnModel" editor="org.netbeans.modules.form.editors2.TableColumnModelEditor"> + <TableColumnModel selectionModel="0"> + <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> + <Title resourceKey="serverTable.columnModel.title0"/> + <Editor/> + <Renderer/> + </Column> + <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> + <Title resourceKey="serverTable.columnModel.title1"/> + <Editor/> + <Renderer/> + </Column> + <Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true"> + <Title resourceKey="serverTable.columnModel.title2"/> + <Editor/> + <Renderer/> + </Column> + </TableColumnModel> + </Property> + <Property name="name" type="java.lang.String" value="serverTable" noResource="true"/> + <Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor"> + <TableHeader reorderingAllowed="true" resizingAllowed="true"/> + </Property> + </Properties> + <Events> + <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="serverTableMouseClicked"/> + </Events> + </Component> + </SubComponents> </Container> <Component class="javax.swing.JLabel" name="tunnelsExplanation"> <Properties> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.java index 474e39473..3e4a17fd2 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.java @@ -7,6 +7,7 @@ package net.i2p.desktopgui.gui; import java.awt.Desktop; +import java.awt.event.ActionEvent; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; @@ -23,6 +24,9 @@ import net.i2p.router.web.NewsFetcher; import net.i2p.desktopgui.router.configuration.UpdateHandler; import java.util.Date; import javax.swing.SwingWorker; +import net.i2p.i2ptunnel.web.IndexBean; +import javax.swing.table.DefaultTableModel; +import java.awt.event.ActionListener; /** * @@ -43,6 +47,7 @@ public class GeneralConfiguration extends javax.swing.JFrame { private void extraInitComponents() { initSpeedTab(); initUpdateTab(); + initTunnelTab(); } private void initSpeedTab() { @@ -87,6 +92,48 @@ public class GeneralConfiguration extends javax.swing.JFrame { } } + private void initTunnelTab() { + while(((DefaultTableModel) clientTable.getModel()).getRowCount() > 0) { + ((DefaultTableModel) clientTable.getModel()).removeRow(0); + } + while(((DefaultTableModel) serverTable.getModel()).getRowCount() > 0) { + ((DefaultTableModel) serverTable.getModel()).removeRow(0); + } + IndexBean bean = new IndexBean(); + for(int i=0; i<bean.getTunnelCount(); i++) { + if(bean.isClient(i)) { + Object[] row = {bean.getTunnelName(i), bean.getTunnelType(i), + bean.getClientInterface(i) + ":" + bean.getClientPort(i), + getTunnelStatus(bean.getTunnelStatus(i))}; + ((DefaultTableModel) clientTable.getModel()).addRow(row); + } + else { + Object[] row = {bean.getTunnelName(i), + bean.getServerTarget(i), + getTunnelStatus(bean.getTunnelStatus(i))}; + ((DefaultTableModel) serverTable.getModel()).addRow(row); + } + } + } + + public String getTunnelStatus(int status) { + if(status == IndexBean.NOT_RUNNING) { + return "Not running"; + } + else if(status == IndexBean.RUNNING) { + return "Running"; + } + else if(status == IndexBean.STANDBY) { + return "Standby"; + } + else if(status == IndexBean.STARTING) { + return "Starting"; + } + else { + return "Error: status not found"; + } + } + /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is @@ -125,7 +172,9 @@ public class GeneralConfiguration extends javax.swing.JFrame { advancedUpdateConfig = new javax.swing.JToggleButton(); tunnelPanel = new javax.swing.JPanel(); clientFrame = new javax.swing.JScrollPane(); + clientTable = new javax.swing.JTable(); serverFrame = new javax.swing.JScrollPane(); + serverTable = new javax.swing.JTable(); tunnelsExplanation = new javax.swing.JLabel(); clientTunnelLabel = new javax.swing.JLabel(); serverTunnelLabel = new javax.swing.JLabel(); @@ -334,11 +383,11 @@ public class GeneralConfiguration extends javax.swing.JFrame { .addComponent(updateNow)))) .addGroup(updatesPanelLayout.createSequentialGroup() .addGap(40, 40, 40) - .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(updateDownload) - .addComponent(updateInform) - .addComponent(updateDownloadRestart)))) - .addGap(9, 9, 9)) + .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(updateInform, javax.swing.GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE) + .addComponent(updateDownload, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(updateDownloadRestart, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) + .addContainerGap()) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, updatesPanelLayout.createSequentialGroup() .addContainerGap(339, Short.MAX_VALUE) .addComponent(advancedUpdateConfig) @@ -370,8 +419,50 @@ public class GeneralConfiguration extends javax.swing.JFrame { clientFrame.setName("clientFrame"); // NOI18N + clientTable.setModel(new javax.swing.table.DefaultTableModel( + new Object [][] { + + }, + new String [] { + "Name", "Type", "Address", "Status" + } + )); + clientTable.setName("clientTable"); // NOI18N + clientTable.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + clientTableMouseClicked(evt); + } + }); + clientFrame.setViewportView(clientTable); + clientTable.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("clientTable.columnModel.title0")); // NOI18N + clientTable.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("clientTable.columnModel.title1")); // NOI18N + clientTable.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("clientTable.columnModel.title2")); // NOI18N + clientTable.getColumnModel().getColumn(3).setHeaderValue(resourceMap.getString("clientTable.columnModel.title3")); // NOI18N + serverFrame.setName("serverFrame"); // NOI18N + serverTable.setModel(new javax.swing.table.DefaultTableModel( + new Object [][] { + {null, null, null}, + {null, null, null}, + {null, null, null}, + {null, null, null} + }, + new String [] { + "Name", "Address", "Status" + } + )); + serverTable.setName("serverTable"); // NOI18N + serverTable.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + serverTableMouseClicked(evt); + } + }); + serverFrame.setViewportView(serverTable); + serverTable.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("serverTable.columnModel.title0")); // NOI18N + serverTable.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("serverTable.columnModel.title1")); // NOI18N + serverTable.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("serverTable.columnModel.title2")); // NOI18N + tunnelsExplanation.setText(resourceMap.getString("tunnelsExplanation.text")); // NOI18N tunnelsExplanation.setName("tunnelsExplanation"); // NOI18N @@ -385,14 +476,14 @@ public class GeneralConfiguration extends javax.swing.JFrame { tunnelPanel.setLayout(tunnelPanelLayout); tunnelPanelLayout.setHorizontalGroup( tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(tunnelPanelLayout.createSequentialGroup() + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, tunnelPanelLayout.createSequentialGroup() .addContainerGap() - .addGroup(tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(serverFrame, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE) - .addComponent(tunnelsExplanation, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE) - .addComponent(clientTunnelLabel) - .addComponent(clientFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE) - .addComponent(serverTunnelLabel)) + .addGroup(tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(tunnelsExplanation, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE) + .addComponent(serverFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE) + .addComponent(clientTunnelLabel, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(clientFrame, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE) + .addComponent(serverTunnelLabel, javax.swing.GroupLayout.Alignment.LEADING)) .addContainerGap()) ); tunnelPanelLayout.setVerticalGroup( @@ -407,8 +498,8 @@ public class GeneralConfiguration extends javax.swing.JFrame { .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(serverFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 122, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(tunnelsExplanation, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap()) + .addComponent(tunnelsExplanation, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(32, 32, 32)) ); settingsPanel.addTab(resourceMap.getString("tunnelPanel.TabConstraints.tabTitle"), tunnelPanel); // NOI18N @@ -584,6 +675,68 @@ private void advancedUpdateConfigActionPerformed(java.awt.event.ActionEvent evt) } }//GEN-LAST:event_advancedUpdateConfigActionPerformed +private void clientTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_clientTableMouseClicked + int row = clientTable.getSelectedRow(); + if(row == -1) { //No selected row + return; + } + else { + IndexBean bean = new IndexBean(); + /* + * TODO: This is not entirely good: if one adds/removes a tunnel without desktopgui, this number will be wrong + */ + int clientNumber = 0; + int i = 0; + for(clientNumber=0; clientNumber<bean.getTunnelCount(); clientNumber++) { + if(bean.isClient(clientNumber)) { + if(i == row) { + break; + } + i++; + } + } + new ClientTunnelWindow(clientNumber, new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + initTunnelTab(); + } + + }); + } +}//GEN-LAST:event_clientTableMouseClicked + +private void serverTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_serverTableMouseClicked + int row = serverTable.getSelectedRow(); + if(row == -1) { //No selected row + return; + } + else { + IndexBean bean = new IndexBean(); + /* + * TODO: This is not entirely good: if one adds/removes a tunnel without desktopgui, this number will be wrong + */ + int serverNumber = 0; + int i = 0; + for(serverNumber=0; serverNumber<bean.getTunnelCount(); serverNumber++) { + if(!bean.isClient(serverNumber)) { + if(i == row) { + break; + } + i++; + } + } + new ServerTunnelWindow(serverNumber, new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + initTunnelTab(); + } + + }); + } +}//GEN-LAST:event_serverTableMouseClicked + protected void initUsage(String upload, String download) { uploadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(upload))); downloadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(download))); @@ -646,6 +799,7 @@ private void advancedUpdateConfigActionPerformed(java.awt.event.ActionEvent evt) private javax.swing.JToggleButton cancel; private javax.swing.JToggleButton checkUpdates; private javax.swing.JScrollPane clientFrame; + private javax.swing.JTable clientTable; private javax.swing.JLabel clientTunnelLabel; private javax.swing.JLabel downloadSpeedLabel; private javax.swing.JLabel downloadUsageLabel; @@ -657,6 +811,7 @@ private void advancedUpdateConfigActionPerformed(java.awt.event.ActionEvent evt) private javax.swing.JPanel networkPanel; private javax.swing.JToggleButton ok; private javax.swing.JScrollPane serverFrame; + private javax.swing.JTable serverTable; private javax.swing.JLabel serverTunnelLabel; private javax.swing.JTabbedPane settingsPanel; private javax.swing.JPanel speedPanel; diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.form b/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.form new file mode 100644 index 000000000..303f49a7f --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.form @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> + <Properties> + <Property name="defaultCloseOperation" type="int" value="3"/> + <Property name="name" type="java.lang.String" value="Form" noResource="true"/> + </Properties> + <SyntheticProperties> + <SyntheticProperty name="formSizePolicy" type="int" value="1"/> + </SyntheticProperties> + <AuxValues> + <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> + <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> + <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> + <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> + <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> + <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> + <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/> + </AuxValues> + + <Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout"> + <Property name="useNullLayout" type="boolean" value="true"/> + </Layout> + <SubComponents> + <Component class="javax.swing.JLabel" name="jLabel1"> + <Properties> + <Property name="text" type="java.lang.String" resourceKey="jLabel1.text"/> + <Property name="name" type="java.lang.String" value="jLabel1" noResource="true"/> + </Properties> + <Constraints> + <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> + <AbsoluteConstraints x="10" y="10" width="-1" height="-1"/> + </Constraint> + </Constraints> + </Component> + </SubComponents> +</Form> diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.java b/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.java new file mode 100644 index 000000000..765210148 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/ServerTunnelWindow.java @@ -0,0 +1,60 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * ServerTunnelWindow.java + * + * Created on 11-jun-2009, 14:55:53 + */ + +package net.i2p.desktopgui.gui; + +import java.awt.event.ActionListener; + +/** + * + * @author mathias + */ +public class ServerTunnelWindow extends javax.swing.JFrame { + + /** Creates new form ServerTunnelWindow */ + public ServerTunnelWindow(int tunnelNumber, ActionListener al) { + initComponents(); + this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + this.setSize(600, 600); + this.setLocationRelativeTo(null); + this.requestFocus(); + this.setVisible(true); + } + + /** This method is called from within the constructor to + * initialize the form. + * WARNING: Do NOT modify this code. The content of this method is + * always regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents + private void initComponents() { + + jLabel1 = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); + setName("Form"); // NOI18N + getContentPane().setLayout(null); + + org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(ServerTunnelWindow.class); + jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N + jLabel1.setName("jLabel1"); // NOI18N + getContentPane().add(jLabel1); + jLabel1.setBounds(10, 10, 43, 17); + + pack(); + }// </editor-fold>//GEN-END:initComponents + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel jLabel1; + // End of variables declaration//GEN-END:variables + +} diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ClientTunnelWindow.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ClientTunnelWindow.properties new file mode 100644 index 000000000..ca036e197 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ClientTunnelWindow.properties @@ -0,0 +1,26 @@ +# To change this template, choose Tools | Templates +# and open the template in the editor. + +Form.title=Client Tunnel Configuration +tunnelNameLabel.text=Name: +tunnelTypeLabel.text=Type: +tunnelType.text=jLabel10 +tunnelName.text=jTextField1 +tunnelPortLabel.text=Port: +tunnelPort.text=jTextField2 +tunnelDestination.text=jTextField3 +tunnelDestinationLabel.text=Destination: +tunnelProfileLabel.text=Profile: +delayConnect.text=Delay connect +sharedClient.text=Shared client +autoStart.text=Auto start +tunnelDepthLabel.text=Tunnel depth: +depthVarianceLabel.text=Depth variance: +tunnelCountLabel.text=Tunnel count: +backupTunnelCountLabel.text=Backup tunnel count: +reduceIdle.text=Reduce tunnel count when idle +closeIdle.text=Close tunnels when idle +delayIdle.text=Delay opening of tunnels when idle +save.text=Save +cancel.text=Cancel +changeTunnelState.text=Start Tunnel diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/GeneralConfiguration.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/GeneralConfiguration.properties index c6af27a51..d53ac80d0 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/GeneralConfiguration.properties +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/GeneralConfiguration.properties @@ -13,7 +13,7 @@ downloadspeed.text=jTextField2 uploadgb.text=jTextField3 downloadgb.text=jTextField4 updateMethod.text=What is your preferred automatic update setting? -updateInform.text=Only inform about updates +updateInform.text=Only inform about updates (not advised) updateDownload.text=Download and verify update file, do not restart updateDownloadRestart.text=Download, verify and restart checkUpdates.text=Check for updates now @@ -21,9 +21,17 @@ updateNow.text=Update available: update now advancedUpdateConfig.text=Advanced update configuration clientTunnelLabel.text=Client tunnels: serverTunnelLabel.text=Server tunnels: -tunnelsExplanation.text=Tunnel explanation +tunnelsExplanation.text=Click on a tunnel to view and change its configuration. + Tunnel explanation uploadUsageLabel.text=Monthly usage: downloadUsageLabel.text=Monthly usage: gbUploadLabel.text=GB gbDownloadLabel.text=GB uploadDownloadExplanation.text=Explanation ... +clientTable.columnModel.title3=Status +clientTable.columnModel.title2=Address +clientTable.columnModel.title1=Type +clientTable.columnModel.title0=Name +serverTable.columnModel.title0=Name +serverTable.columnModel.title3=Title 4 +serverTable.columnModel.title2=Status +serverTable.columnModel.title1=Address diff --git a/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ServerTunnelWindow.properties b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ServerTunnelWindow.properties new file mode 100644 index 000000000..683f3caa7 --- /dev/null +++ b/apps/desktopgui/src/net/i2p/desktopgui/gui/resources/ServerTunnelWindow.properties @@ -0,0 +1 @@ +jLabel1.text=Name: diff --git a/history.txt b/history.txt index 28b3be69d..0be304fcb 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,8 @@ +2009-06-17 Mathiasdm + * desktopgui: + - Added client and server tunnel view + (saving does not work yet) + 2009-06-17 zzz * PeerSelector: - Limit exploratory tunnels to connected peers when over From 1eb4473e9d7a4cbf85f832064c149c9ec6bee15a Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Fri, 19 Jun 2009 00:04:19 +0000 Subject: [PATCH 02/24] * News Fetcher: - Change default news URL, use it instead of the old one even if the old one is saved in the configuration, to assist in the transition --- .../i2p/router/web/ConfigUpdateHandler.java | 5 ++-- .../i2p/router/web/ConfigUpdateHelper.java | 26 +++++++++---------- .../src/net/i2p/router/web/NewsFetcher.java | 2 +- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java index 1729a209b..9366591fc 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java @@ -19,7 +19,8 @@ public class ConfigUpdateHandler extends FormHandler { public static final String PROP_NEWS_URL = "router.newsURL"; // public static final String DEFAULT_NEWS_URL = "http://dev.i2p.net/cgi-bin/cvsweb.cgi/i2p/news.xml?rev=HEAD"; - public static final String DEFAULT_NEWS_URL = "http://complication.i2p/news.xml"; + public static final String OLD_DEFAULT_NEWS_URL = "http://complication.i2p/news.xml"; + public static final String DEFAULT_NEWS_URL = "http://echelon.i2p/i2p/news.xml"; public static final String PROP_REFRESH_FREQUENCY = "router.newsRefreshFrequency"; public static final String DEFAULT_REFRESH_FREQUENCY = 24*60*60*1000 + ""; public static final String PROP_UPDATE_POLICY = "router.updatePolicy"; @@ -57,7 +58,7 @@ public class ConfigUpdateHandler extends FormHandler { } if ( (_newsURL != null) && (_newsURL.length() > 0) ) { - String oldURL = _context.router().getConfigSetting(PROP_NEWS_URL); + String oldURL = ConfigUpdateHelper.getNewsURL(_context); if ( (oldURL == null) || (!_newsURL.equals(oldURL)) ) { _context.router().setConfigSetting(PROP_NEWS_URL, _newsURL); addFormNotice("Updating news URL to " + _newsURL); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java index d0d243799..4aac71dff 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java @@ -1,5 +1,6 @@ package net.i2p.router.web; +import net.i2p.I2PAppContext; import net.i2p.crypto.TrustedUpdate; import net.i2p.data.DataHelper; import net.i2p.router.RouterContext; @@ -12,8 +13,14 @@ public class ConfigUpdateHelper extends HelperBase { } public String getNewsURL() { - String url = _context.getProperty(ConfigUpdateHandler.PROP_NEWS_URL); - if (url != null) + return getNewsURL(_context); + } + + /** hack to replace the old news location with the new one, even if they have saved + the update page at some point */ + public static String getNewsURL(I2PAppContext ctx) { + String url = ctx.getProperty(ConfigUpdateHandler.PROP_NEWS_URL); + if (url != null && !url.equals(ConfigUpdateHandler.OLD_DEFAULT_NEWS_URL)) return url; else return ConfigUpdateHandler.DEFAULT_NEWS_URL; @@ -26,18 +33,10 @@ public class ConfigUpdateHelper extends HelperBase { return ConfigUpdateHandler.DEFAULT_UPDATE_URL; } public String getProxyHost() { - String host = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST); - if (host != null) - return host; - else - return ConfigUpdateHandler.DEFAULT_PROXY_HOST; + return _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST); } public String getProxyPort() { - String port = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_PORT); - if (port != null) - return port; - else - return ConfigUpdateHandler.DEFAULT_PROXY_PORT; + return _context.getProperty(ConfigUpdateHandler.PROP_PROXY_PORT, ConfigUpdateHandler.DEFAULT_PROXY_PORT); } public String getUpdateThroughProxy() { @@ -76,8 +75,7 @@ public class ConfigUpdateHelper extends HelperBase { } public String getUpdatePolicySelectBox() { - String policy = _context.getProperty(ConfigUpdateHandler.PROP_UPDATE_POLICY); - if (policy == null) policy = ConfigUpdateHandler.DEFAULT_UPDATE_POLICY; + String policy = _context.getProperty(ConfigUpdateHandler.PROP_UPDATE_POLICY, ConfigUpdateHandler.DEFAULT_UPDATE_POLICY); StringBuffer buf = new StringBuffer(256); buf.append("<select name=\"updatePolicy\">"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java index 98fac325d..0eeaca32b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java @@ -110,7 +110,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener { } } public void fetchNews() { - String newsURL = _context.getProperty(ConfigUpdateHandler.PROP_NEWS_URL, ConfigUpdateHandler.DEFAULT_NEWS_URL); + String newsURL = ConfigUpdateHelper.getNewsURL(_context); boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue(); String proxyHost = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_HOST, ConfigUpdateHandler.DEFAULT_PROXY_HOST); String port = _context.getProperty(ConfigUpdateHandler.PROP_PROXY_PORT, ConfigUpdateHandler.DEFAULT_PROXY_PORT); From 4622f369c399b3fd9c7e9675371bd0e6f94173f0 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sun, 21 Jun 2009 00:00:39 +0000 Subject: [PATCH 03/24] Pluck of revision aad5b15235be51189b696e6cabb7cc04e1b5e89f from branch i2p.i2p.zzz.test --------------------------------------------------------------------------------------- post-0.7.4 cleanup --- .../src/net/i2p/router/StatisticsManager.java | 30 ++----------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/router/java/src/net/i2p/router/StatisticsManager.java b/router/java/src/net/i2p/router/StatisticsManager.java index f107c5e1e..9293a6234 100644 --- a/router/java/src/net/i2p/router/StatisticsManager.java +++ b/router/java/src/net/i2p/router/StatisticsManager.java @@ -87,14 +87,9 @@ public class StatisticsManager implements Service { if (_includePeerRankings) { long publishedUptime = _context.router().getUptime(); - boolean commentOutIn074 = RouterVersion.VERSION.equals("0.7.3"); // Don't publish these for first hour - if (publishedUptime > 62*60*1000) { - if (commentOutIn074) - includeThroughput(stats); - else - includeAverageThroughput(stats); - } + if (publishedUptime > 62*60*1000) + includeAverageThroughput(stats); //includeRate("router.invalidMessageTime", stats, new long[] { 10*60*1000 }); //includeRate("router.duplicateMessageId", stats, new long[] { 24*60*60*1000 }); //includeRate("tunnel.duplicateIV", stats, new long[] { 24*60*60*1000 }); @@ -245,27 +240,6 @@ public class StatisticsManager implements Service { stats.setProperty("stat_bandwidthReceiveBps.60m", str); } - private void includeThroughput(Properties stats) { - RateStat sendRate = _context.statManager().getRate("bw.sendRate"); - if (sendRate != null) { - if (_context.router().getUptime() > 60*60*1000) { - Rate r = sendRate.getRate(60*60*1000); - if (r != null) - stats.setProperty("stat_bandwidthSendBps.60m", num(r.getAverageValue()) + ';' + num(r.getExtremeAverageValue()) + ";0;0;"); - } - } - - RateStat recvRate = _context.statManager().getRate("bw.recvRate"); - if (recvRate != null) { - if (_context.router().getUptime() > 60*60*1000) { - Rate r = recvRate.getRate(60*60*1000); - if (r != null) - stats.setProperty("stat_bandwidthReceiveBps.60m", num(r.getAverageValue()) + ';' + num(r.getExtremeAverageValue()) + ";0;0;"); - } - } - } - - private String getPeriod(Rate rate) { return DataHelper.formatDuration(rate.getPeriod()); } private final String num(double num) { From 8e2df567d809c443cd4be73443a576f0345015ae Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sun, 21 Jun 2009 00:00:54 +0000 Subject: [PATCH 04/24] Pluck of revision 546257906e9b26c3a35e38967ebcaa54098d969f from branch i2p.i2p.zzz.test --------------------------------------------------------------------------------------- * ReseedHandler: - check for upper case HREF to be compatible with apache indexes --- .../java/src/net/i2p/router/web/ReseedHandler.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ReseedHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ReseedHandler.java index e701ede99..ceb8a280e 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ReseedHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ReseedHandler.java @@ -137,11 +137,16 @@ public class ReseedHandler { * Fetch a directory listing and then up to 200 routerInfo files in the listing. * The listing must contain (exactly) strings that match: * href="routerInfo-{hash}.dat"> + * OR + * HREF="routerInfo-{hash}.dat"> * and then it fetches the files * {seedURL}routerInfo-{hash}.dat * after appending a '/' to seedURL if it doesn't have one. * Essentially this means that the seedURL must be a directory, it * can't end with 'index.html', for example. + * + * Jetty directory listings are not compatible, as they look like + * HREF="/full/path/to/routerInfo-... **/ private void reseedOne(String seedURL, boolean echoStatus) { @@ -165,8 +170,11 @@ public class ReseedHandler { int total = 0; while (total++ < 1000) { int start = content.indexOf("href=\"routerInfo-", cur); - if (start < 0) - break; + if (start < 0) { + start = content.indexOf("HREF=\"routerInfo-", cur); + if (start < 0) + break; + } int end = content.indexOf(".dat\">", start); String name = content.substring(start+"href=\"routerInfo-".length(), end); From ce92b6cb6677e81319973554b8642b0f40d50cb2 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sun, 21 Jun 2009 00:01:02 +0000 Subject: [PATCH 05/24] Pluck of revision 0dc8693b99a852b0183ffc6cd06804878f37ec89 from branch i2p.i2p.zzz.test --------------------------------------------------------------------------------------- Treat 5.0.0.0/8 (Hamachi) as local --- router/java/src/net/i2p/router/transport/TransportImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/router/java/src/net/i2p/router/transport/TransportImpl.java b/router/java/src/net/i2p/router/transport/TransportImpl.java index 2dbd9af3a..e6e3c80e5 100644 --- a/router/java/src/net/i2p/router/transport/TransportImpl.java +++ b/router/java/src/net/i2p/router/transport/TransportImpl.java @@ -559,6 +559,7 @@ public abstract class TransportImpl implements Transport { if ((addr[0]&0xFF) >= 224) return false; // no multicast if ((addr[0]&0xFF) == 0) return false; if ( ((addr[0]&0xFF) == 169) && ((addr[1]&0xFF) == 254) ) return false; + if ((addr[0]&0xFF) == 5) return false; // Hamachi return true; // or at least possible to be true } else if (addr.length == 16) { return false; From 306b3017e437a2cebbd32a8fc63f3fd3bd8c510f Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sun, 21 Jun 2009 00:01:14 +0000 Subject: [PATCH 06/24] Pluck of revision 493986d03c43bac019996ea0b10b8a6a40e92a32 from branch i2p.i2p.zzz.test --------------------------------------------------------------------------------------- * Browser Launch: Wait until the routerconsole is up before launching the browser --- .../src/net/i2p/apps/systray/UrlLauncher.java | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java b/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java index c7524054e..b62b8ae1d 100644 --- a/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java +++ b/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java @@ -12,9 +12,12 @@ package net.i2p.apps.systray; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; +import java.net.InetSocketAddress; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; +import java.net.Socket; +import java.net.SocketAddress; import java.net.URL; import net.i2p.util.ShellCommand; @@ -33,6 +36,56 @@ public class UrlLauncher { ShellCommand _shellCommand = new ShellCommand(); + private static final int WAIT_TIME = 5*1000; + private static final int MAX_WAIT_TIME = 5*60*1000; + private static final int MAX_TRIES = 99; + + /** + * Prevent bad user experience by waiting for the server to be there + * before launching the browser. + * @return success + */ + public boolean waitForServer(String urlString) { + URL url; + try { + url = new URL(urlString); + } catch (MalformedURLException e) { + return false; + } + String host = url.getHost(); + int port = url.getPort(); + if (port <= 0) { + port = url.getDefaultPort(); + if (port <= 0) + return false; + } + SocketAddress sa; + try { + sa = new InetSocketAddress(host, port); + } catch (IllegalArgumentException iae) { + return false; + } + long done = System.currentTimeMillis() + MAX_WAIT_TIME; + for (int i = 0; i < MAX_TRIES; i++) { + try { + Socket test = new Socket(); + // this will usually fail right away if it's going to fail since it's local + test.connect(sa, WAIT_TIME); + // it worked + try { + test.close(); + } catch (IOException ioe) {} + return true; + } catch (Exception e) {} + if (System.currentTimeMillis() > done) + break; + try { + Thread.sleep(WAIT_TIME); + } catch (InterruptedException ie) {} + } + return false; + } + /** * Discovers the operating system the installer is running under and tries * to launch the given URL using the default browser for that platform; if @@ -49,6 +102,7 @@ public class UrlLauncher { String osName = System.getProperty("os.name"); + waitForServer(url); if (validateUrlFormat(url)) { if (osName.toLowerCase().indexOf("mac") > -1) { if (osName.toLowerCase().startsWith("mac os x")) { @@ -141,6 +195,7 @@ public class UrlLauncher { */ public boolean openUrl(String url, String browser) throws Exception { + waitForServer(url); if (validateUrlFormat(url)) if (_shellCommand.executeSilentAndWaitTimed(browser + " " + url, 5)) return true; From bc38ca4f914bf2ae06777b7ccc9ae90cf136fc01 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sun, 21 Jun 2009 00:03:59 +0000 Subject: [PATCH 07/24] Pluck of revision 45a25185236e38606e761060427ee8fa60144a8c from branch i2p.i2p.zzz.test --------------------------------------------------------------------------------------- * netdb.jsp: Add country chart at bottom, clean up version chart --- core/java/src/net/i2p/util/ObjectCounter.java | 42 ++++++++++++ .../src/net/i2p/router/CommSystemFacade.java | 1 + .../KademliaNetworkDatabaseFacade.java | 67 +++++++++++-------- .../transport/CommSystemFacadeImpl.java | 16 +++-- .../router/tunnel/pool/TunnelPoolManager.java | 38 +++-------- 5 files changed, 102 insertions(+), 62 deletions(-) create mode 100644 core/java/src/net/i2p/util/ObjectCounter.java diff --git a/core/java/src/net/i2p/util/ObjectCounter.java b/core/java/src/net/i2p/util/ObjectCounter.java new file mode 100644 index 000000000..19c92ae66 --- /dev/null +++ b/core/java/src/net/i2p/util/ObjectCounter.java @@ -0,0 +1,42 @@ +package net.i2p.util; + +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Count things. + * + * @author zzz + */ +public class ObjectCounter<K> { + private ConcurrentHashMap<K, Integer> _map; + public ObjectCounter() { + _map = new ConcurrentHashMap(); + } + /** + * Add one. + * Not perfectly concurrent, new AtomicInteger(1) would be better, + * at the cost of some object churn. + */ + public void increment(K h) { + Integer i = _map.putIfAbsent(h, Integer.valueOf(1)); + if (i != null) + _map.put(h, Integer.valueOf(i.intValue() + 1)); + } + /** + * @return current count + */ + public int count(K h) { + Integer i = _map.get(h); + if (i != null) + return i.intValue(); + return 0; + } + /** + * @return set of objects with counts > 0 + */ + public Set<K> objects() { + return _map.keySet(); + } +} + diff --git a/router/java/src/net/i2p/router/CommSystemFacade.java b/router/java/src/net/i2p/router/CommSystemFacade.java index 436501324..c26d9efbf 100644 --- a/router/java/src/net/i2p/router/CommSystemFacade.java +++ b/router/java/src/net/i2p/router/CommSystemFacade.java @@ -63,6 +63,7 @@ public abstract class CommSystemFacade implements Service { public byte[] getIP(Hash dest) { return null; } public void queueLookup(byte[] ip) {} public String getCountry(Hash peer) { return null; } + public String getCountryName(String code) { return code; } public String renderPeerHTML(Hash peer) { return null; } /** diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java index 31d6dc04b..5a8c2f641 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java @@ -10,12 +10,15 @@ package net.i2p.router.networkdb.kademlia; import java.io.IOException; import java.io.Writer; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; @@ -42,6 +45,7 @@ import net.i2p.router.networkdb.DatabaseStoreMessageHandler; import net.i2p.router.networkdb.PublishLocalRouterInfoJob; import net.i2p.router.peermanager.PeerProfile; import net.i2p.util.Log; +import net.i2p.util.ObjectCounter; /** * Kademlia based version of the network database @@ -999,8 +1003,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { out.write(buf.toString()); buf.setLength(0); - /* coreVersion to Map of routerVersion to Integer */ - Map versions = new TreeMap(); + ObjectCounter<String> versions = new ObjectCounter(); + ObjectCounter<String> countries = new ObjectCounter(); Set routers = new TreeSet(new RouterInfoComparator()); routers.addAll(getRouters()); @@ -1012,40 +1016,47 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade { renderRouterInfo(buf, ri, false, full); out.write(buf.toString()); buf.setLength(0); - String coreVersion = ri.getOption("coreVersion"); String routerVersion = ri.getOption("router.version"); - if ( (coreVersion != null) && (routerVersion != null) ) { - Map routerVersions = (Map)versions.get(coreVersion); - if (routerVersions == null) { - routerVersions = new TreeMap(); - versions.put(coreVersion, routerVersions); - } - Integer val = (Integer)routerVersions.get(routerVersion); - if (val == null) - routerVersions.put(routerVersion, Integer.valueOf(1)); - else - routerVersions.put(routerVersion, Integer.valueOf(val.intValue() + 1)); - } + if (routerVersion != null) + versions.increment(routerVersion); + String country = _context.commSystem().getCountry(key); + if(country != null) + countries.increment(country); } } - if (versions.size() > 0) { + buf.append("<table border=\"0\" cellspacing=\"30\"><tr><td valign=\"top\">"); + List<String> versionList = new ArrayList(versions.objects()); + if (versionList.size() > 0) { + Collections.sort(versionList, Collections.reverseOrder()); buf.append("<table border=\"1\">\n"); - buf.append("<tr><td><b>Core version</b></td><td><b>Router version</b></td><td><b>Number</b></td></tr>\n"); - for (Iterator iter = versions.entrySet().iterator(); iter.hasNext(); ) { - Map.Entry entry = (Map.Entry)iter.next(); - String coreVersion = (String)entry.getKey(); - Map routerVersions = (Map)entry.getValue(); - for (Iterator routerIter = routerVersions.keySet().iterator(); routerIter.hasNext(); ) { - String routerVersion = (String)routerIter.next(); - Integer num = (Integer)routerVersions.get(routerVersion); - buf.append("<tr><td>").append(DataHelper.stripHTML(coreVersion)); - buf.append("</td><td>").append(DataHelper.stripHTML(routerVersion)); - buf.append("</td><td>").append(num.intValue()).append("</td></tr>\n"); - } + buf.append("<tr><th>Version</th><th>Count</th></tr>\n"); + for (String routerVersion : versionList) { + int num = versions.count(routerVersion); + buf.append("<tr><td>").append(DataHelper.stripHTML(routerVersion)); + buf.append("</td><td align=\"right\">").append(num).append("</td></tr>\n"); } buf.append("</table>\n"); } + buf.append("</td><td valign=\"top\">"); + out.write(buf.toString()); + buf.setLength(0); + + List<String> countryList = new ArrayList(countries.objects()); + if (countryList.size() > 0) { + Collections.sort(countryList); + buf.append("<table border=\"1\">\n"); + buf.append("<tr><th>Country</th><th>Count</th></tr>\n"); + for (String country : countryList) { + int num = countries.count(country); + buf.append("<tr><td><img alt=\"").append(country.toUpperCase()).append("\""); + buf.append(" src=\"/flags.jsp?c=").append(country).append("\"> "); + buf.append(_context.commSystem().getCountryName(country)); + buf.append("</td><td align=\"right\">").append(num).append("</td></tr>\n"); + } + buf.append("</table>\n"); + } + buf.append("</td></tr></table>"); out.write(buf.toString()); out.flush(); } diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java index 528337239..03d3071bb 100644 --- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java +++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java @@ -435,6 +435,16 @@ public class CommSystemFacadeImpl extends CommSystemFacade { return props.getProperty("host"); } + /** full name for a country code, or the code if we don't know the name */ + public String getCountryName(String c) { + if (_geoIP == null) + return c; + String n = _geoIP.fullName(c); + if (n == null) + return c; + return n; + } + /** Provide a consistent "look" for displaying router IDs in the console */ public String renderPeerHTML(Hash peer) { String h = peer.toBase64().substring(0, 4); @@ -442,11 +452,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade { String c = getCountry(peer); if (c != null) { buf.append("<img alt=\"").append(c.toUpperCase()).append("\" title=\""); - String n = _geoIP.fullName(c); - if (n != null) - buf.append(n); - else - buf.append(c); + buf.append(getCountryName(c)); buf.append("\" src=\"/flags.jsp?c=").append(c).append("\"> "); } buf.append("<tt><font size=\"+1\">"); diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java index 9845a72f3..7293b6a1e 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java @@ -29,6 +29,7 @@ import net.i2p.router.tunnel.HopConfig; import net.i2p.stat.RateStat; import net.i2p.util.I2PThread; import net.i2p.util.Log; +import net.i2p.util.ObjectCounter; /** * @@ -588,15 +589,15 @@ public class TunnelPoolManager implements TunnelManagerFacade { private void renderPeers(Writer out) throws IOException { // count up the peers in the local pools - HashCounter lc = new HashCounter(); + ObjectCounter<Hash> lc = new ObjectCounter(); int tunnelCount = countTunnelsPerPeer(lc); // count up the peers in the participating tunnels - HashCounter pc = new HashCounter(); + ObjectCounter<Hash> pc = new ObjectCounter(); int partCount = countParticipatingPerPeer(pc); - Set<Hash> peers = new HashSet(lc.hashes()); - peers.addAll(pc.hashes()); + Set<Hash> peers = new HashSet(lc.objects()); + peers.addAll(pc.objects()); List<Hash> peerList = new ArrayList(peers); Collections.sort(peerList, new HashComparator()); @@ -625,7 +626,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { } /** @return total number of non-fallback expl. + client tunnels */ - private int countTunnelsPerPeer(HashCounter lc) { + private int countTunnelsPerPeer(ObjectCounter<Hash> lc) { List<TunnelPool> pools = new ArrayList(); listPools(pools); int tunnelCount = 0; @@ -661,12 +662,12 @@ public class TunnelPoolManager implements TunnelManagerFacade { * @return Set of peers that should not be allowed in another tunnel */ public Set<Hash> selectPeersInTooManyTunnels() { - HashCounter lc = new HashCounter(); + ObjectCounter<Hash> lc = new ObjectCounter(); int tunnelCount = countTunnelsPerPeer(lc); Set<Hash> rv = new HashSet(); if (tunnelCount >= 4 && _context.router().getUptime() > 10*60*1000) { int max = _context.getProperty("router.maxTunnelPercentage", DEFAULT_MAX_PCT_TUNNELS); - for (Hash h : lc.hashes()) { + for (Hash h : lc.objects()) { if (lc.count(h) > 0 && (lc.count(h) + 1) * 100 / (tunnelCount + 1) > max) rv.add(h); } @@ -675,7 +676,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { } /** @return total number of part. tunnels */ - private int countParticipatingPerPeer(HashCounter pc) { + private int countParticipatingPerPeer(ObjectCounter<Hash> pc) { List<HopConfig> participating = _context.tunnelDispatcher().listParticipatingTunnels(); for (HopConfig cfg : participating) { Hash from = cfg.getReceiveFrom(); @@ -694,27 +695,6 @@ public class TunnelPoolManager implements TunnelManagerFacade { } } - private static class HashCounter { - private ConcurrentHashMap<Hash, Integer> _map; - public HashCounter() { - _map = new ConcurrentHashMap(); - } - public void increment(Hash h) { - Integer i = _map.putIfAbsent(h, Integer.valueOf(1)); - if (i != null) - _map.put(h, Integer.valueOf(i.intValue() + 1)); - } - public int count(Hash h) { - Integer i = _map.get(h); - if (i != null) - return i.intValue(); - return 0; - } - public Set<Hash> hashes() { - return _map.keySet(); - } - } - private String getCapacity(Hash peer) { RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer); if (info != null) { From 4a6d0e4ba20133d3a41a93ee9a5792633bf5df08 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sun, 21 Jun 2009 00:06:54 +0000 Subject: [PATCH 08/24] Fix wrapper.config installs on windows --- installer/install.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installer/install.xml b/installer/install.xml index 1d3d09fed..d51bd7f2a 100644 --- a/installer/install.xml +++ b/installer/install.xml @@ -106,7 +106,7 @@ http://www.javalobby.org/forums/thread.jspa?threadID=15967&tstart=0 and the izpack docs for some guidance. --> - <parsable targetfile="$INSTALL_PATH/wrapper.config" type="javaprop" /> + <parsable targetfile="$INSTALL_PATH/wrapper.config" type="plain" /> <parsable targetfile="$INSTALL_PATH/i2prouter" type="shell" os="unix|mac" /> <!-- postinstall stuff for windows --> From 9792336b337da36a7001acac973730d3e85fb48c Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sun, 21 Jun 2009 00:23:14 +0000 Subject: [PATCH 09/24] -3 --- history.txt | 12 ++++++++++++ router/java/src/net/i2p/router/RouterVersion.java | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/history.txt b/history.txt index 0be304fcb..e88deb36a 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,15 @@ +2009-06-21 zzz + * Browser Launch: Wait until the routerconsole is up before launching the browser + * Installer: Fix wrapper.config parsing on windows + * netdb.jsp: Add country chart at bottom, clean up version chart + * News Fetcher: + - Change default news URL, use it instead of the old one even if + the old one is saved in the configuration, to assist in the transition + * ReseedHandler: + - check for upper case HREF to be compatible with apache indexes + * Statistics Manager: post-0.7.4 cleanup + * Transport: Treat 5.0.0.0/8 (Hamachi) as local + 2009-06-17 Mathiasdm * desktopgui: - Added client and server tunnel view diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index bd644cee5..ef84e9e97 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 2; + public final static long BUILD = 3; /** for example "-test" */ public final static String EXTRA = ""; public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA; From abc83362e767950ef5dc0c3ecbdbfcc5ac6dd1da Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Mon, 22 Jun 2009 12:57:38 +0000 Subject: [PATCH 10/24] Try again to prevent two EventPumpers --- .../java/src/net/i2p/router/transport/ntcp/EventPumper.java | 6 +++--- .../src/net/i2p/router/transport/ntcp/NTCPTransport.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java index 3f9e5acfc..89c12250c 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java +++ b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java @@ -31,7 +31,7 @@ import net.i2p.util.Log; public class EventPumper implements Runnable { private RouterContext _context; private Log _log; - private boolean _alive; + private volatile boolean _alive; private Selector _selector; private final List _bufCache; private final List _wantsRead = new ArrayList(16); @@ -64,7 +64,7 @@ public class EventPumper implements Runnable { _expireIdleWriteTime = MAX_EXPIRE_IDLE_TIME; } - public void startPumping() { + public synchronized void startPumping() { if (_log.shouldLog(Log.INFO)) _log.info("Starting pumper"); // _wantsRead = new ArrayList(16); @@ -83,7 +83,7 @@ public class EventPumper implements Runnable { } } - public void stopPumping() { + public synchronized void stopPumping() { _alive = false; if (_selector != null && _selector.isOpen()) _selector.wakeup(); diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java index 9f6b8e7ca..84cd76732 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -416,7 +416,7 @@ public class NTCPTransport extends TransportImpl { private static final int NUM_CONCURRENT_READERS = 3; private static final int NUM_CONCURRENT_WRITERS = 3; - public RouterAddress startListening() { + public synchronized RouterAddress startListening() { if (_log.shouldLog(Log.DEBUG)) _log.debug("Starting ntcp transport listening"); _finisher.start(); _pumper.startPumping(); @@ -428,7 +428,7 @@ public class NTCPTransport extends TransportImpl { return bindAddress(); } - public RouterAddress restartListening(RouterAddress addr) { + public synchronized RouterAddress restartListening(RouterAddress addr) { if (_log.shouldLog(Log.DEBUG)) _log.debug("Restarting ntcp transport listening"); _finisher.start(); _pumper.startPumping(); @@ -602,7 +602,7 @@ public class NTCPTransport extends TransportImpl { * This doesn't (completely) block, caller should check isAlive() * before calling startListening() or restartListening() */ - public void stopListening() { + public synchronized void stopListening() { if (_log.shouldLog(Log.DEBUG)) _log.debug("Stopping ntcp transport"); _pumper.stopPumping(); _writer.stopWriting(); From 1fd5a20373869e1c57f795264c32e2ac4f935dbb Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Mon, 22 Jun 2009 14:07:31 +0000 Subject: [PATCH 11/24] Include console.css in new installs! --- build.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build.xml b/build.xml index ae6224a70..b80f6fd12 100644 --- a/build.xml +++ b/build.xml @@ -297,6 +297,9 @@ <copy todir="pkg-temp/docs/themes/" > <fileset dir="installer/resources/themes/" /> </copy> + <!-- CSS now in docs/, not in the .war --> + <copy file="apps/routerconsole/jsp/default.css" tofile="pkg-temp/docs/themes/console/console.css" /> + <copy file="apps/routerconsole/jsp/default.css" tofile="pkg-temp/docs/themes/console/defCon1/console.css" /> <mkdir dir="pkg-temp/eepsite" /> <mkdir dir="pkg-temp/eepsite/webapps" /> <mkdir dir="pkg-temp/eepsite/logs" /> From 917e1023e4ec37eabcd6e4be6eca5547ca63f970 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Mon, 22 Jun 2009 14:16:52 +0000 Subject: [PATCH 12/24] Catch AIOOBE reported by tuna http://zzz.i2p/topics/332 --- router/java/src/org/cybergarage/upnp/ControlPoint.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/router/java/src/org/cybergarage/upnp/ControlPoint.java b/router/java/src/org/cybergarage/upnp/ControlPoint.java index f1d56f44b..d66209f97 100644 --- a/router/java/src/org/cybergarage/upnp/ControlPoint.java +++ b/router/java/src/org/cybergarage/upnp/ControlPoint.java @@ -276,7 +276,14 @@ public class ControlPoint implements HTTPRequestListener { int nRoots = devNodeList.size(); for (int n=0; n<nRoots; n++) { - Node rootNode = devNodeList.getNode(n); + // AIOOB was thrown from here, maybe would be better to + // copy the list before traversal? + Node rootNode; + try { + rootNode = devNodeList.getNode(n); + } catch (ArrayIndexOutOfBoundsException aioob) { + break; + } Device dev = getDevice(rootNode); if (dev == null) continue; From 29d0c19b0ea1eeca20ce3f379933e8372dd28b1f Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Mon, 22 Jun 2009 14:50:59 +0000 Subject: [PATCH 13/24] Update: increase max retries --- .../java/src/net/i2p/router/web/UpdateHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java index 35edadfb6..fc0a2177d 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java @@ -137,7 +137,8 @@ public class UpdateHandler { try { EepGet get = null; if (shouldProxy) - get = new EepGet(_context, proxyHost, proxyPort, 20, SIGNED_UPDATE_FILE, updateURL, false); + // 40 retries!! + get = new EepGet(_context, proxyHost, proxyPort, 40, SIGNED_UPDATE_FILE, updateURL, false); else get = new EepGet(_context, 1, SIGNED_UPDATE_FILE, updateURL, false); get.addStatusListener(UpdateRunner.this); From 5d0d7aca58943a77bfdfca1bed9d1919b1f6385b Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Mon, 22 Jun 2009 17:01:56 +0000 Subject: [PATCH 14/24] minor cleanup --- .../i2p/router/client/ClientListenerRunner.java | 2 +- .../i2p/router/client/ClientManagerFacadeImpl.java | 14 ++------------ 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/router/java/src/net/i2p/router/client/ClientListenerRunner.java b/router/java/src/net/i2p/router/client/ClientListenerRunner.java index 38105e9c9..0f26b8d00 100644 --- a/router/java/src/net/i2p/router/client/ClientListenerRunner.java +++ b/router/java/src/net/i2p/router/client/ClientListenerRunner.java @@ -43,7 +43,7 @@ public class ClientListenerRunner implements Runnable { _running = false; _listening = false; - String val = context.getProperty(BIND_ALL_INTERFACES, "False"); + String val = context.getProperty(BIND_ALL_INTERFACES); _bindAllInterfaces = Boolean.valueOf(val).booleanValue(); } diff --git a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java index 543b5e29c..9e706beda 100644 --- a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java +++ b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java @@ -49,18 +49,8 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade { public void startup() { _log.info("Starting up the client subsystem"); - String portStr = _context.router().getConfigSetting(PROP_CLIENT_PORT); - if (portStr != null) { - try { - int port = Integer.parseInt(portStr); - _manager = new ClientManager(_context, port); - } catch (NumberFormatException nfe) { - _log.error("Error setting the port: " + portStr + " is not valid", nfe); - _manager = new ClientManager(_context, DEFAULT_PORT); - } - } else { - _manager = new ClientManager(_context, DEFAULT_PORT); - } + int port = _context.getProperty(PROP_CLIENT_PORT, DEFAULT_PORT); + _manager = new ClientManager(_context, port); } public void shutdown() { From 66993665972e237dde89a55e181d17fb9d52f7f9 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Mon, 22 Jun 2009 19:56:03 +0000 Subject: [PATCH 15/24] * Browser Launch: Add sensible-browser, x-www-browser, defaultbrowser, and www-browser in an attempt to launch the user's preferred browser --- .../src/net/i2p/apps/systray/UrlLauncher.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java b/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java index b62b8ae1d..7cce9e59e 100644 --- a/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java +++ b/apps/systray/java/src/net/i2p/apps/systray/UrlLauncher.java @@ -155,6 +155,20 @@ public class UrlLauncher { // fall through } + // This debian script tries everything in $BROWSER, then gnome-www-browser and x-www-browser + // if X is running and www-browser otherwise. Those point to the user's preferred + // browser using the update-alternatives system. + if (_shellCommand.executeSilentAndWaitTimed("sensible-browser " + url, 5)) + return true; + + // Try x-www-browser directly + if (_shellCommand.executeSilentAndWaitTimed("x-www-browser " + url, 5)) + return true; + + // puppy linux + if (_shellCommand.executeSilentAndWaitTimed("defaultbrowser " + url, 5)) + return true; + if (_shellCommand.executeSilentAndWaitTimed("opera -newpage " + url, 5)) return true; @@ -173,6 +187,10 @@ public class UrlLauncher { if (_shellCommand.executeSilentAndWaitTimed("galeon " + url, 5)) return true; + // Text Mode Browsers only below here + if (_shellCommand.executeSilentAndWaitTimed("www-browser " + url, 5)) + return true; + if (_shellCommand.executeSilentAndWaitTimed("links " + url, 5)) return true; From 1c9d84771ed071cf32e645d5d5f038936c3cf98d Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Tue, 23 Jun 2009 01:35:55 +0000 Subject: [PATCH 16/24] configupdate.jsp cleanup --- apps/routerconsole/jsp/configupdate.jsp | 37 ++++++++++++++----------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/apps/routerconsole/jsp/configupdate.jsp b/apps/routerconsole/jsp/configupdate.jsp index 433cea665..043541275 100644 --- a/apps/routerconsole/jsp/configupdate.jsp +++ b/apps/routerconsole/jsp/configupdate.jsp @@ -27,27 +27,32 @@ if (prev != null) System.setProperty("net.i2p.router.web.ConfigUpdateHandler.noncePrev", prev); System.setProperty("net.i2p.router.web.ConfigUpdateHandler.nonce", new java.util.Random().nextLong()+""); %> <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigUpdateHandler.nonce")%>" /> +<table border="0" cellspacing="5"><tr><td valign="top"><b>News:</b><td> <% if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress", "false"))) { %> <i>Update In Progress</i><br /><br /> <% } else { %> <input type="submit" name="action" value="Check for update now" /><br /><br /> <% } %> - News URL: - <input type="text" size="60" name="newsURL" value="<jsp:getProperty name="updatehelper" property="newsURL" />"><br /> - Refresh frequency: - <jsp:getProperty name="updatehelper" property="refreshFrequencySelectBox" /><br /> - Update policy: - <jsp:getProperty name="updatehelper" property="updatePolicySelectBox" /><br /> - <p>Update through the eepProxy? - <jsp:getProperty name="updatehelper" property="updateThroughProxy" /><br /> - eepProxy host: <input type="text" size="10" name="proxyHost" value="<jsp:getProperty name="updatehelper" property="proxyHost" />" /><br /> - eepProxy port: <input type="text" size="4" name="proxyPort" value="<jsp:getProperty name="updatehelper" property="proxyPort" />" /></p> - <p>Update URLs:<br /> - <textarea name="updateURL" cols="90" rows="4" wrap="off"><jsp:getProperty name="updatehelper" property="updateURL" /></textarea></p> - <p>Trusted keys:</br /> - <textarea name="trustedKeys" cols="90" rows="4" wrap="off"><jsp:getProperty name="updatehelper" property="trustedKeys" /></textarea></p> - <br /> - <input type="submit" name="action" value="Save" /> +<tr><td><td> +<tr><td valign="top"><b>News URL:</b> +<td><input type="text" size="60" name="newsURL" value="<jsp:getProperty name="updatehelper" property="newsURL" />"> +<tr><td valign="top"><b>Refresh frequency:</b> +<td><jsp:getProperty name="updatehelper" property="refreshFrequencySelectBox" /> +<tr><td valign="top"><b>Update policy:</b> +<td><jsp:getProperty name="updatehelper" property="updatePolicySelectBox" /> +<tr><td valign="top"><b>Update through the eepProxy?</b> +<td><jsp:getProperty name="updatehelper" property="updateThroughProxy" /> +<tr><td valign="top"><b>eepProxy host:</b> +<td><input type="text" size="10" name="proxyHost" value="<jsp:getProperty name="updatehelper" property="proxyHost" />" /> +<tr><td valign="top"><b>eepProxy port:</b> +<td><input type="text" size="4" name="proxyPort" value="<jsp:getProperty name="updatehelper" property="proxyPort" />" /> +<tr><td valign="top"><b>Update URLs:</b> +<td><textarea name="updateURL" cols="90" rows="4" wrap="off"><jsp:getProperty name="updatehelper" property="updateURL" /></textarea> +<tr><td valign="top"><b>Trusted keys:</b> +<td><textarea name="trustedKeys" cols="90" rows="4" wrap="off"><jsp:getProperty name="updatehelper" property="trustedKeys" /></textarea> +<tr><td><td> +<tr><td><td><input type="submit" name="action" value="Save" /> <input type="reset" value="Cancel" /> +</table> </form> </div> From b93aada21312b5b3c25e28e84604f532f98d131c Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Tue, 23 Jun 2009 15:59:30 +0000 Subject: [PATCH 17/24] -4 --- history.txt | 9 +++++++++ router/java/src/net/i2p/router/RouterVersion.java | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/history.txt b/history.txt index e88deb36a..d34c0e94e 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,12 @@ +2009-06-23 zzz + * Browser Launch: Add sensible-browser, x-www-browser, defaultbrowser, and + www-browser in an attempt to launch the user's preferred browser + * configupdate.jsp: Cleanup + * Installer: Include console.css!!! + * NTCP: Try again to prevent two Event Pumpers + * Update: Increase max retries + * UPnP: Catch AIOOBE reported by tuna + 2009-06-21 zzz * Browser Launch: Wait until the routerconsole is up before launching the browser * Installer: Fix wrapper.config parsing on windows diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index ef84e9e97..e4d51a2bb 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 3; + public final static long BUILD = 4; /** for example "-test" */ public final static String EXTRA = ""; public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA; From 47cd9beefae87102c08280e4a384d5c75a459c26 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Wed, 24 Jun 2009 18:47:17 +0000 Subject: [PATCH 18/24] Change table headings to th tags to prep for css changes --- .../i2p/router/web/ConfigClientsHelper.java | 4 +- .../i2p/router/web/ConfigTunnelsHelper.java | 14 +++--- router/java/src/net/i2p/router/JobQueue.java | 6 +-- .../peermanager/ProfileOrganizerRenderer.java | 46 +++++++++---------- .../router/transport/udp/UDPTransport.java | 44 +++++++++--------- .../router/tunnel/pool/TunnelPoolManager.java | 8 ++-- 6 files changed, 61 insertions(+), 61 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java index 984569b96..7acccdc49 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java @@ -15,7 +15,7 @@ public class ConfigClientsHelper extends HelperBase { public String getForm1() { StringBuffer buf = new StringBuffer(1024); buf.append("<table border=\"1\">\n"); - buf.append("<tr><td>Client</td><td>Run at Startup?</td><td>Start Now</td><td>Class and arguments</td></tr>\n"); + buf.append("<tr><th>Client</th><th>Run at Startup?</th><th>Start Now</th><th>Class and arguments</th></tr>\n"); List clients = ClientAppConfig.getClientApps(_context); for (int cur = 0; cur < clients.size(); cur++) { @@ -31,7 +31,7 @@ public class ConfigClientsHelper extends HelperBase { public String getForm2() { StringBuffer buf = new StringBuffer(1024); buf.append("<table border=\"1\">\n"); - buf.append("<tr><td>WebApp</td><td>Run at Startup?</td><td>Start Now</td><td>Description</td></tr>\n"); + buf.append("<tr><th>WebApp</th><th>Run at Startup?</th><th>Start Now</th><th>Description</th></tr>\n"); Properties props = RouterConsoleRunner.webAppProperties(); Set keys = new TreeSet(props.keySet()); for (Iterator iter = keys.iterator(); iter.hasNext(); ) { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java index 2e53be6b5..f1a63e421 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java @@ -56,27 +56,27 @@ public class ConfigTunnelsHelper extends HelperBase { private static final int MIN_NEG_VARIANCE = -1; private void renderForm(StringBuffer buf, int index, String prefix, String name, TunnelPoolSettings in, TunnelPoolSettings out) { - buf.append("<tr><td colspan=\"3\"><b><a name=\"").append(prefix).append("\">"); - buf.append(name).append("</a></b></td></tr>\n"); + buf.append("<tr><th colspan=\"3\"><a name=\"").append(prefix).append("\">"); + buf.append(name).append("</a></th></tr>\n"); if (in.getLength() <= 0 || in.getLength() + in.getLengthVariance() <= 0 || out.getLength() <= 0 || out.getLength() + out.getLengthVariance() <= 0) - buf.append("<tr><td colspan=\"3\"><font color=\"red\">ANONYMITY WARNING - Settings include 0-hop tunnels</font></td></tr>"); + buf.append("<tr><th colspan=\"3\"><font color=\"red\">ANONYMITY WARNING - Settings include 0-hop tunnels</font></th></tr>"); else if (in.getLength() <= 1 || in.getLength() + in.getLengthVariance() <= 1 || out.getLength() <= 1 || out.getLength() + out.getLengthVariance() <= 1) - buf.append("<tr><td colspan=\"3\"><font color=\"red\">ANONYMITY WARNING - Settings include 1-hop tunnels</font></td></tr>"); + buf.append("<tr><th colspan=\"3\"><font color=\"red\">ANONYMITY WARNING - Settings include 1-hop tunnels</font></th></tr>"); if (in.getLength() + Math.abs(in.getLengthVariance()) >= WARN_LENGTH || out.getLength() + Math.abs(out.getLengthVariance()) >= WARN_LENGTH) - buf.append("<tr><td colspan=\"3\"><font color=\"red\">PERFORMANCE WARNING - Settings include very long tunnels</font></td></tr>"); + buf.append("<tr><th colspan=\"3\"><font color=\"red\">PERFORMANCE WARNING - Settings include very long tunnels</font></th></tr>"); if (in.getQuantity() + in.getBackupQuantity() >= WARN_QUANTITY || out.getQuantity() + out.getBackupQuantity() >= WARN_QUANTITY) - buf.append("<tr><td colspan=\"3\"><font color=\"red\">PERFORMANCE WARNING - Settings include high tunnel quantities</font></td></tr>"); + buf.append("<tr><th colspan=\"3\"><font color=\"red\">PERFORMANCE WARNING - Settings include high tunnel quantities</font></th></tr>"); - buf.append("<tr><td></td><td><b>Inbound</b></td><td><b>Outbound</b></td></tr>\n"); + buf.append("<tr><th></th><th>Inbound</th><th>Outbound</th></tr>\n"); // tunnel depth buf.append("<tr><td>Depth</td>\n"); diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java index 8ec40f56e..890b303c0 100644 --- a/router/java/src/net/i2p/router/JobQueue.java +++ b/router/java/src/net/i2p/router/JobQueue.java @@ -669,9 +669,9 @@ public class JobQueue { /** render the HTML for the job stats */ private void getJobStats(StringBuffer buf) { buf.append("<table border=\"1\">\n"); - buf.append("<tr><td><b>Job</b></td><td><b>Runs</b></td>"); - buf.append("<td><b>Time</b></td><td><b><i>Avg</i></b></td><td><b><i>Max</i></b></td><td><b><i>Min</i></b></td>"); - buf.append("<td><b>Pending</b></td><td><b><i>Avg</i></b></td><td><b><i>Max</i></b></td><td><b><i>Min</i></b></td></tr>\n"); + buf.append("<tr><th>Job</th><th>Runs</th>"); + buf.append("<th>Time</th><th><i>Avg</i></th><th><i>Max</i></th><th><i>Min</i></th>"); + buf.append("<th>Pending</th><th><i>Avg</i></th><th><i>Max</i></th><th><i>Min</i></th></tr>\n"); long totRuns = 0; long totExecTime = 0; long avgExecTime = 0; diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java index 0aff93485..20806cca7 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java +++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java @@ -61,13 +61,13 @@ class ProfileOrganizerRenderer { buf.append("<p>Showing ").append(order.size()).append(" recent profiles, hiding ").append(peers.size()-order.size()).append(" older profiles</p>"); buf.append("<table border=\"1\">"); buf.append("<tr>"); - buf.append("<td><b>Peer</b></td>"); - buf.append("<td><b>Groups (Caps)</b></td>"); - buf.append("<td><b>Speed</b></td>"); - buf.append("<td><b>Capacity</b></td>"); - buf.append("<td><b>Integration</b></td>"); - buf.append("<td><b>Failing?</b></td>"); - buf.append("<td> </td>"); + buf.append("<th>Peer</th>"); + buf.append("<th>Groups (Caps)</th>"); + buf.append("<th>Speed</th>"); + buf.append("<th>Capacity</th>"); + buf.append("<th>Integration</th>"); + buf.append("<th>Failing?</th>"); + buf.append("<th> </th>"); buf.append("</tr>"); int prevTier = 1; for (Iterator iter = order.iterator(); iter.hasNext();) { @@ -159,22 +159,22 @@ class ProfileOrganizerRenderer { buf.append("<h2>Floodfill and Integrated Peers</h2>\n"); buf.append("<table border=\"1\">"); buf.append("<tr>"); - buf.append("<td><b>Peer</b></td>"); - buf.append("<td><b>Caps</b></td>"); - buf.append("<td><b>Integ. Value</b></td>"); - buf.append("<td><b>Last Heard About</b></td>"); - buf.append("<td><b>Last Heard From</b></td>"); - buf.append("<td><b>Last Successful Send</b></td>"); - buf.append("<td><b>Last Failed Send</b></td>"); - buf.append("<td><b>10m Resp. Time</b></td>"); - buf.append("<td><b>1h Resp. Time</b></td>"); - buf.append("<td><b>1d Resp. Time</b></td>"); - buf.append("<td><b>Successful Lookups</b></td>"); - buf.append("<td><b>Failed Lookups</b></td>"); - buf.append("<td><b>New Stores</b></td>"); - buf.append("<td><b>Old Stores</b></td>"); - buf.append("<td><b>1h Fail Rate</b></td>"); - buf.append("<td><b>1d Fail Rate</b></td>"); + buf.append("<th>Peer</th>"); + buf.append("<th>Caps</th>"); + buf.append("<th>Integ. Value</th>"); + buf.append("<th>Last Heard About</th>"); + buf.append("<th>Last Heard From</th>"); + buf.append("<th>Last Successful Send</th>"); + buf.append("<th>Last Failed Send</th>"); + buf.append("<th>10m Resp. Time</th>"); + buf.append("<th>1h Resp. Time</th>"); + buf.append("<th>1d Resp. Time</th>"); + buf.append("<th>Successful Lookups</th>"); + buf.append("<th>Failed Lookups</th>"); + buf.append("<th>New Stores</th>"); + buf.append("<th>Old Stores</th>"); + buf.append("<th>1h Fail Rate</th>"); + buf.append("<th>1d Fail Rate</th>"); buf.append("</tr>"); for (Iterator iter = integratedPeers.iterator(); iter.hasNext();) { PeerProfile prof = (PeerProfile)iter.next(); diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index b42efbfae..e010e5213 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -1769,48 +1769,48 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority buf.append(" timeout: ").append(DataHelper.formatDuration(_expireTimeout)); buf.append("</b><br />\n"); buf.append("<table border=\"1\">\n"); - buf.append("<tr><td><b><a href=\"#def.peer\">Peer</a></b>"); + buf.append("<tr><th><a href=\"#def.peer\">Peer</a>"); if (sortFlags != FLAG_ALPHA) buf.append(" <a href=\"").append(urlBase).append("?sort=0\">V</a> "); - buf.append("</td><td><b><a href=\"#def.dir\">Dir/Intro</a></b></td><td><b><a href=\"#def.idle\">Idle</a></b>"); + buf.append("</th><th><a href=\"#def.dir\">Dir/Intro</a></th><th><a href=\"#def.idle\">Idle</a>"); appendSortLinks(buf, urlBase, sortFlags, "Sort by idle inbound", FLAG_IDLE_IN); buf.append("/"); appendSortLinks(buf, urlBase, sortFlags, "Sort by idle outbound", FLAG_IDLE_OUT); - buf.append("</td>"); - buf.append("<td><b><a href=\"#def.rate\">In/Out</a></b>"); + buf.append("</th>"); + buf.append("<th><a href=\"#def.rate\">In/Out</a>"); appendSortLinks(buf, urlBase, sortFlags, "Sort by inbound rate", FLAG_RATE_IN); buf.append("/"); appendSortLinks(buf, urlBase, sortFlags, "Sort by outbound rate", FLAG_RATE_OUT); - buf.append("</td>\n"); - buf.append("<td><b><a href=\"#def.up\">Up</a></b>"); + buf.append("</th>\n"); + buf.append("<th><a href=\"#def.up\">Up</a>"); appendSortLinks(buf, urlBase, sortFlags, "Sort by connection uptime", FLAG_UPTIME); - buf.append("</td><td><b><a href=\"#def.skew\">skew</a></b>"); + buf.append("</th><th><a href=\"#def.skew\">skew</a>"); appendSortLinks(buf, urlBase, sortFlags, "Sort by clock skew", FLAG_SKEW); - buf.append("</td>\n"); - buf.append("<td><b><a href=\"#def.cwnd\">Cwnd</a></b>"); + buf.append("</th>\n"); + buf.append("<th><a href=\"#def.cwnd\">Cwnd</a>"); appendSortLinks(buf, urlBase, sortFlags, "Sort by congestion window", FLAG_CWND); - buf.append("</td><td><b><a href=\"#def.ssthresh\">Ssthresh</a></b>"); + buf.append("</th><th><a href=\"#def.ssthresh\">Ssthresh</a>"); appendSortLinks(buf, urlBase, sortFlags, "Sort by slow start threshold", FLAG_SSTHRESH); - buf.append("</td>\n"); - buf.append("<td><b><a href=\"#def.rtt\">Rtt</a></b>"); + buf.append("</th>\n"); + buf.append("<th><a href=\"#def.rtt\">Rtt</a>"); appendSortLinks(buf, urlBase, sortFlags, "Sort by round trip time", FLAG_RTT); - buf.append("</td><td><b><a href=\"#def.dev\">Dev</a></b>"); + buf.append("</th><th><a href=\"#def.dev\">Dev</a>"); appendSortLinks(buf, urlBase, sortFlags, "Sort by round trip time deviation", FLAG_DEV); - buf.append("</td><td><b><a href=\"#def.rto\">Rto</a></b>"); + buf.append("</th><th><a href=\"#def.rto\">Rto</a>"); appendSortLinks(buf, urlBase, sortFlags, "Sort by retransmission timeout", FLAG_RTO); - buf.append("</td>\n"); - buf.append("<td><b><a href=\"#def.mtu\">Mtu</a></b>"); + buf.append("</th>\n"); + buf.append("<th><a href=\"#def.mtu\">Mtu</a>"); appendSortLinks(buf, urlBase, sortFlags, "Sort by maximum transmit unit", FLAG_MTU); - buf.append("</td><td><b><a href=\"#def.send\">Send</a></b>"); + buf.append("</th><th><a href=\"#def.send\">Send</a>"); appendSortLinks(buf, urlBase, sortFlags, "Sort by packets sent", FLAG_SEND); - buf.append("</td><td><b><a href=\"#def.recv\">Recv</a></b>"); + buf.append("</th><th><a href=\"#def.recv\">Recv</a>"); appendSortLinks(buf, urlBase, sortFlags, "Sort by packets received", FLAG_RECV); - buf.append("</td>\n"); - buf.append("<td><b><a href=\"#def.resent\">Resent</a></b>"); + buf.append("</th>\n"); + buf.append("<th><a href=\"#def.resent\">Resent</a>"); appendSortLinks(buf, urlBase, sortFlags, "Sort by packets retransmitted", FLAG_RESEND); - buf.append("</td><td><b><a href=\"#def.dupRecv\">DupRecv</a></b>"); + buf.append("</th><th><a href=\"#def.dupRecv\">DupRecv</a>"); appendSortLinks(buf, urlBase, sortFlags, "Sort by packets received more than once", FLAG_DUP); - buf.append("</td>\n"); + buf.append("</th>\n"); buf.append("</tr>\n"); out.write(buf.toString()); buf.setLength(0); diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java index 7293b6a1e..49f82acae 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java @@ -439,9 +439,9 @@ public class TunnelPoolManager implements TunnelManagerFacade { List participating = _context.tunnelDispatcher().listParticipatingTunnels(); Collections.sort(participating, new TunnelComparator()); out.write("<h2><a name=\"participating\">Participating tunnels</a>:</h2><table border=\"1\">\n"); - out.write("<tr><td><b>Receive on</b></td><td><b>From</b></td><td>" - + "<b>Send on</b></td><td><b>To</b></td><td><b>Expiration</b></td>" - + "<td><b>Usage</b></td><td><b>Rate</b></td><td><b>Role</b></td></tr>\n"); + out.write("<tr><th>Receive on</th><th>From</th><th>" + + "Send on</th><th>To</th><th>Expiration</th>" + + "<th>Usage</th><th>Rate</th><th>Role</th></tr>\n"); long processed = 0; RateStat rs = _context.statManager().getRate("tunnel.participatingMessageCount"); if (rs != null) @@ -602,7 +602,7 @@ public class TunnelPoolManager implements TunnelManagerFacade { Collections.sort(peerList, new HashComparator()); out.write("<h2><a name=\"peers\">Tunnel Counts By Peer</a>:</h2>\n"); - out.write("<table border=\"1\"><tr><td><b>Peer</b></td><td><b>Expl. + Client</b></td><td><b>% of total</b></td><td><b>Part. from + to</b></td><td><b>% of total</b></td></tr>\n"); + out.write("<table border=\"1\"><tr><th>Peer</th><th>Expl. + Client</th><th>% of total</th><th>Part. from + to</th><th>% of total</th></tr>\n"); for (Hash h : peerList) { out.write("<tr><td align=\"right\">"); out.write(netDbLink(h)); From 56a700e82d9134c24b1867f57f53078ab7175df9 Mon Sep 17 00:00:00 2001 From: sponge <sponge@mail.i2p> Date: Thu, 25 Jun 2009 00:16:19 +0000 Subject: [PATCH 19/24] 2009-06-25 sponge * Summary frame layout change so it makes sense. --- .../java/src/net/i2p/router/web/SummaryHelper.java | 2 +- apps/routerconsole/jsp/summarynoframe.jsp | 6 +++--- history.txt | 3 +++ router/java/src/net/i2p/router/RouterVersion.java | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 0810dd950..7cf1965f1 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -365,7 +365,7 @@ public class SummaryHelper extends HelperBase { buf.append("<i>No leases</i><br />\n"); } } - buf.append("<hr />\n"); + // buf.append("<hr />\n"); return buf.toString(); } diff --git a/apps/routerconsole/jsp/summarynoframe.jsp b/apps/routerconsole/jsp/summarynoframe.jsp index f3f8b8002..c12426a85 100644 --- a/apps/routerconsole/jsp/summarynoframe.jsp +++ b/apps/routerconsole/jsp/summarynoframe.jsp @@ -83,8 +83,6 @@ <b>Used:</b> <jsp:getProperty name="helper" property="inboundTransferred" />/<jsp:getProperty name="helper" property="outboundTransferred" /><br /> <hr /> - <jsp:getProperty name="helper" property="destinations" /> - <u><b>Tunnels in/out</b></u><br /> <b>Exploratory:</b> <jsp:getProperty name="helper" property="inboundTunnels" />/<jsp:getProperty name="helper" property="outboundTunnels" /><br /> <b>Client:</b> <jsp:getProperty name="helper" property="inboundClientTunnels" />/<jsp:getProperty name="helper" property="outboundClientTunnels" /><br /> @@ -97,4 +95,6 @@ <b>Tunnel lag:</b> <jsp:getProperty name="helper" property="tunnelLag" /><br /> <b>Handle backlog:</b> <jsp:getProperty name="helper" property="inboundBacklog" /><br /> <b><jsp:getProperty name="helper" property="tunnelStatus" /></b><br /> - + <hr /> + + <jsp:getProperty name="helper" property="destinations" /> diff --git a/history.txt b/history.txt index d34c0e94e..33381eb02 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,6 @@ +2009-06-25 sponge + * Summary frame layout change so it makes sense. + 2009-06-23 zzz * Browser Launch: Add sensible-browser, x-www-browser, defaultbrowser, and www-browser in an attempt to launch the user's preferred browser diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index e4d51a2bb..b54d1de4b 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 4; + public final static long BUILD = 5; /** for example "-test" */ public final static String EXTRA = ""; public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA; From 0606050231f4e5edc698b5b6a9540eefd5a9bc6e Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sat, 27 Jun 2009 01:08:40 +0000 Subject: [PATCH 20/24] * NetDb stats: Normalize tunnel build stats for increased anonymity, effective in 0.7.6 --- .../src/net/i2p/router/StatisticsManager.java | 61 +++++++++++++++++-- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/router/java/src/net/i2p/router/StatisticsManager.java b/router/java/src/net/i2p/router/StatisticsManager.java index 9293a6234..df51e36b4 100644 --- a/router/java/src/net/i2p/router/StatisticsManager.java +++ b/router/java/src/net/i2p/router/StatisticsManager.java @@ -139,12 +139,18 @@ public class StatisticsManager implements Service { //includeRate("tunnel.buildRequestTime", stats, new long[] { 10*60*1000 }); long rate = 60*60*1000; - includeRate("tunnel.buildClientExpire", stats, new long[] { rate }); - includeRate("tunnel.buildClientReject", stats, new long[] { rate }); - includeRate("tunnel.buildClientSuccess", stats, new long[] { rate }); - includeRate("tunnel.buildExploratoryExpire", stats, new long[] { rate }); - includeRate("tunnel.buildExploratoryReject", stats, new long[] { rate }); - includeRate("tunnel.buildExploratorySuccess", stats, new long[] { rate }); + boolean commentOutIn076 = RouterVersion.VERSION.equals("0.7.5"); + if (commentOutIn076) { + includeRate("tunnel.buildClientExpire", stats, new long[] { rate }); + includeRate("tunnel.buildClientReject", stats, new long[] { rate }); + includeRate("tunnel.buildClientSuccess", stats, new long[] { rate }); + includeRate("tunnel.buildExploratoryExpire", stats, new long[] { rate }); + includeRate("tunnel.buildExploratoryReject", stats, new long[] { rate }); + includeRate("tunnel.buildExploratorySuccess", stats, new long[] { rate }); + } else { + includeTunnelRates("Client", stats, rate); + includeTunnelRates("Exploratory", stats, rate); + } //includeRate("tunnel.rejectTimeout", stats, new long[] { 10*60*1000 }); //includeRate("tunnel.rejectOverloaded", stats, new long[] { 10*60*1000 }); //includeRate("tunnel.acceptLoad", stats, new long[] { 10*60*1000 }); @@ -223,6 +229,49 @@ public class StatisticsManager implements Service { return buf.toString(); } + private static final String[] tunnelStats = { "Expire", "Reject", "Success" }; + + /** + * Add tunnel build rates with some mods to hide absolute quantities + * In particular, report counts normalized to 100 (i.e. a percentage) + */ + private void includeTunnelRates(String tunnelType, Properties stats, long selectedPeriod) { + long totalEvents = 0; + for (String tunnelStat : tunnelStats) { + String rateName = "tunnel.build" + tunnelType + tunnelStat; + RateStat stat = _context.statManager().getRate(rateName); + if (stat == null) continue; + Rate curRate = stat.getRate(selectedPeriod); + if (curRate == null) continue; + totalEvents += curRate.getLastEventCount(); + } + if (totalEvents <= 0) + return; + for (String tunnelStat : tunnelStats) { + String rateName = "tunnel.build" + tunnelType + tunnelStat; + RateStat stat = _context.statManager().getRate(rateName); + if (stat == null) continue; + Rate curRate = stat.getRate(selectedPeriod); + if (curRate == null) continue; + double fudgeQuantity = 100.0d * curRate.getLastEventCount() / totalEvents; + stats.setProperty("stat_" + rateName + '.' + getPeriod(curRate), renderRate(curRate, fudgeQuantity)); + } + } + + private String renderRate(Rate rate, double fudgeQuantity) { + StringBuffer buf = new StringBuffer(128); + buf.append(num(rate.getAverageValue())).append(';'); + buf.append(num(rate.getExtremeAverageValue())).append(';'); + buf.append(pct(rate.getPercentageOfLifetimeValue())).append(';'); + if (rate.getLifetimeTotalEventTime() > 0) { + // bah saturation + buf.append("0;0;0;0;"); + } + long numPeriods = rate.getLifetimePeriods(); + buf.append(num(fudgeQuantity)).append(';'); + return buf.toString(); + } + /* report the same data for tx and rx, for enhanced anonymity */ private void includeAverageThroughput(Properties stats) { RateStat sendRate = _context.statManager().getRate("bw.sendRate"); From 5906fb71395adffd116804705b482005fe424e0a Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sat, 27 Jun 2009 01:11:53 +0000 Subject: [PATCH 21/24] * Console CSS: Move css file, make a classic theme to prep for CSS changes --- build.xml | 18 +- .../themes/console/classic/console.css | 0 .../themes/console/classic/default.css | 182 ++++++++++++++++++ .../themes/console/classic/i2ptunnel.css | 178 +++++++++++++++++ .../resources/themes/console/console.css | 112 +++++++++++ .../themes/console/defCon1/console.css | 112 +++++++++++ 6 files changed, 595 insertions(+), 7 deletions(-) rename apps/routerconsole/jsp/default.css => installer/resources/themes/console/classic/console.css (100%) create mode 100644 installer/resources/themes/console/classic/default.css create mode 100644 installer/resources/themes/console/classic/i2ptunnel.css create mode 100644 installer/resources/themes/console/console.css create mode 100644 installer/resources/themes/console/defCon1/console.css diff --git a/build.xml b/build.xml index b80f6fd12..da8cfc4c2 100644 --- a/build.xml +++ b/build.xml @@ -297,9 +297,6 @@ <copy todir="pkg-temp/docs/themes/" > <fileset dir="installer/resources/themes/" /> </copy> - <!-- CSS now in docs/, not in the .war --> - <copy file="apps/routerconsole/jsp/default.css" tofile="pkg-temp/docs/themes/console/console.css" /> - <copy file="apps/routerconsole/jsp/default.css" tofile="pkg-temp/docs/themes/console/defCon1/console.css" /> <mkdir dir="pkg-temp/eepsite" /> <mkdir dir="pkg-temp/eepsite/webapps" /> <mkdir dir="pkg-temp/eepsite/logs" /> @@ -319,6 +316,16 @@ <copy file="installer/lib/launch4j/lib/JGoodies.Looks.LICENSE.txt" tofile="pkg-temp/licenses/LICENSE-JGoodies-Looks.txt" /> <copy file="installer/lib/launch4j/lib/XStream.LICENSE.txt" tofile="pkg-temp/licenses/LICENSE-XStream.txt" /> </target> + <target name="prepthemeupdates"> + <!-- CSS now in docs/, not in the .war --> + <copy file="installer/resources/themes/console/console.css" todir="pkg-temp/docs/themes/console/" /> + <copy file="installer/resources/themes/console/defCon1/console.css" todir="pkg-temp/docs/themes/console/defCon1/" /> + <!-- make a "classic" theme --> + <copy todir="pkg-temp/docs/themes/console/classic/" > + <fileset dir="installer/resources/themes/console/classic/" /> + </copy> + </target> + <!-- this is no longer required, izpack 4.3.0 supports headless installs with java -jar i2pinstall.exe -console --> <target name="tarball" depends="preppkg"> <tar compression="bzip2" destfile="i2p.tar.bz2"> @@ -364,7 +371,7 @@ <copy file="history.txt" todir="pkg-temp/" /> <copy file="news.xml" todir="pkg-temp/docs/" /> </target> - <target name="prepupdateSmall" depends="buildSmall, prepupdateRouter"> + <target name="prepupdateSmall" depends="buildSmall, prepupdateRouter, prepthemeupdates"> <copy file="build/i2ptunnel.jar" todir="pkg-temp/lib/" /> <copy file="build/mstreaming.jar" todir="pkg-temp/lib/" /> <copy file="build/streaming.jar" todir="pkg-temp/lib/" /> @@ -374,9 +381,6 @@ <copy file="build/addressbook.war" todir="pkg-temp/webapps/" /> <!-- New readme_*.html files - For one release only --> <copy file="readme_zh.html" todir="pkg-temp/docs/" /> - <!-- CSS now in docs/, not in the .war --> - <copy file="apps/routerconsole/jsp/default.css" tofile="pkg-temp/docs/themes/console/console.css" /> - <copy file="apps/routerconsole/jsp/default.css" tofile="pkg-temp/docs/themes/console/defCon1/console.css" /> </target> <target name="prepupdateRouter" depends="buildrouter, deletepkg-temp"> <copy file="build/i2p.jar" todir="pkg-temp/lib/" /> diff --git a/apps/routerconsole/jsp/default.css b/installer/resources/themes/console/classic/console.css similarity index 100% rename from apps/routerconsole/jsp/default.css rename to installer/resources/themes/console/classic/console.css diff --git a/installer/resources/themes/console/classic/default.css b/installer/resources/themes/console/classic/default.css new file mode 100644 index 000000000..88aa40d7f --- /dev/null +++ b/installer/resources/themes/console/classic/default.css @@ -0,0 +1,182 @@ +body { + margin : 0px; + padding : 0px; + text-align : center; + font-family : Arial, Helvetica, sans-serif; + background-color : #ffffff; + color : #000000; + font-size : 100%; + + /* we've avoided Tantek Hacks so far, + ** but we can't avoid using the non-w3c method of + ** box rendering. (and therefore one of mozilla's + ** proprietry -moz properties (which hopefully they'll + ** drop soon). + */ + -moz-box-sizing : border-box; + box-sizing : border-box; +} + +div { + -moz-box-sizing : border-box; + box-sizing : border-box; +} + +h4, label { + margin : 0px; + padding : 2px; + float : left; + width : 150px; + height : 24px; + font-weight : bold; + text-align : right; + font-size : 1.0em; + -moz-box-sizing: border-box; + box-sizing : border-box; +} + +h4 { + font-size : 1.2em; + text-align : center; + width : 750px; +} + +a { + text-decoration : none; +} + +form { + margin : 0px; +} + +textarea, input, select, button, a { + font-family : Arial, Helvetica, sans-serif; + -moz-box-sizing : border-box; + box-sizing : border-box; + font-size : 1.0em; + float : left; +} + +button { + float : none; +} + +textarea { + border : 1px solid #ddddc0; +} + +br { + clear : left; +} + +div.statusNotRunning { + float : left; + width : 82px; + height : 24px; + color : #dd0000; +} +div.statusRunning { + float : left; + width : 82px; + height : 24px; + color : #00dd00; +} +div.statusStarting { + float : left; + width : 82px; + height : 24px; + color : #339933; +} + +hr { + display : none; +} + +.separator, .subdivider { + clear : both; + height : 1px; + margin : 3px 0px 3px 0px; + border-bottom : 1px solid #ddddc0; +} + +.subdivider { + border-bottom : 1px dashed #ddddc0; +} + +.freetext { + width : 150px; + height : 22px; + border : 1px solid #aaaac0; +} + +.control { + margin : 0 4px 0 0; + padding : 0 0 4px 0; + overflow : hidden; + height : 20px; + width : 60px; + font-weight : normal; + background-color : #dddddd; + color : black; + border : 1px outset #ddddc0; + text-align : center; + white-space : nowrap; +} + +.control:hover { + background-color : #ffffed; +} + +.control:active { + border : 2px inset; +} + +.panel { + width : 760px; + margin : 16px auto 16px auto; + overflow : hidden; + text-align : left; + font-size : 0.8em; + background-color : #ffffef; + border : 4px solid #ffffd0; +} + +.panel .footer { + float : right; + padding : 4px; +} + +.toolbox { + float : right; +} + +.rowItem { + width : 750px; + float : left; + margin : 0px; +} + +.comment { + font-style : italic; +} + +.text { + height : 24px; + width : 150px; + padding : 2px 0 0 2px; + float : left; + margin : 0; +} + +.accessKey { + text-decoration : underline; +} + +#globalOperationsPanel { + background-color : #ffefef; + border : 4px solid #ffd0d0; +} + +#globalOperationsPanel .control { + width : 100px; +} diff --git a/installer/resources/themes/console/classic/i2ptunnel.css b/installer/resources/themes/console/classic/i2ptunnel.css new file mode 100644 index 000000000..814cab892 --- /dev/null +++ b/installer/resources/themes/console/classic/i2ptunnel.css @@ -0,0 +1,178 @@ +/* I2P Tunnel Edit Page +*/ + +#tunnelEditPage input { + width : 458px; +} + +#tunnelEditPage select { + width : 308px; +} + +#tunnelEditPage option[selected] { + color: green; +} + +#tunnelEditPage #targetField, +#tunnelEditPage #accessField, +#tunnelEditPage #optionsField { + height : 48px; + width : 150px; +} +#tunnelEditPage #tunnelOptionsField { + height : 96px; + width : 150px; +} + +#tunnelEditPage #targetField label, +#tunnelEditPage #accessField label, +#tunnelEditPage #tunnelOptionsField label, +#tunnelEditPage #optionsField label{ + height : 48px; + width : 150px; +} + +#tunnelEditPage #reachField, +#tunnelEditPage #hostField, +#tunnelEditPage #depthField, +#tunnelEditPage #countField, +#tunnelEditPage #optionsHostField { + width : 304px; + margin-right: 4px; +} + +#tunnelEditPage #portField, +#tunnelEditPage #optionsPortField, +#tunnelEditPage #backupField, +#tunnelEditPage #varianceField { + width : 150px; + +} + +#tunnelEditPage #reachField label, +#tunnelEditPage #hostField label, +#tunnelEditPage #portField label, +#tunnelEditPage #optionsHostField label, +#tunnelEditPage #optionsPortField label, +#tunnelEditPage #depthField label, +#tunnelEditPage #countField label, +#tunnelEditPage #backupField label, +#tunnelEditPage #varianceField label { + text-align : left; + +} + +#tunnelEditPage #otherField label { + width : 300px; +} + +#tunnelEditPage #reachableByOther, +#tunnelEditPage #tunnelDepth, +#tunnelEditPage #tunnelQuantity, +#tunnelEditPage #targetHost, +#tunnelEditPage #clientHost { + width : 306px; +} + +#tunnelEditPage #port { + width : 80px; +} + +#tunnelEditPage #targetPort, +#tunnelEditPage #clientPort, +#tunnelEditPage #tunnelBackupQuantity, +#tunnelEditPage #tunnelVariance { + width : 150px; +} + +#tunnelEditPage #shared, +#tunnelEditPage #connectDelay, +#tunnelEditPage #startOnLoad { + width : 16px; +} + +#tunnelEditPage label { + width : 150px; + font-weight : bold; + text-align : right; + float : left; +} + +/* I2P Tunnel List Page +*/ + +#tunnelListPage .rowItem { + width : 150px; +} + +#tunnelListPage select { + width : 150px; +} + +#tunnelListPage textarea { + width : 750px; + height : 100px; + padding : 0 0 0 4px; +} + +#tunnelListPage .footer .control { + margin-left: 2px; +} + +#tunnelListPage .footer label { + text-align : right; + height : 24px; + width : 360px; + float : left; + +} + +/* Use Leary and Langridge content replacement methods (LIR) +** to embed accessibility information into the document. +** Should allow the lists to be rendered nicely by +** screen readers. (and lynx!) +*/ + +#tunnelListPage label { + height : 0; + width : 0; + overflow : hidden; +} + +#tunnelListPage .nameHeaderField label, +#tunnelListPage .portHeaderField label, +#tunnelListPage .typeHeaderField label, +#tunnelListPage .interfaceHeaderField label, +#tunnelListPage .targetHeaderField label, +#tunnelListPage .previewHeaderField label, +#tunnelListPage .statusHeaderField label { + text-align : left; + width : 150px; + height : 24px; + float : left; +} + +#tunnelListPage .targetField, +#tunnelListPage .targetField .text, +#tunnelListPage .targetHeaderField, +#tunnelListPage .targetHeaderField label { + width : 300px; +} + +#tunnelListPage .descriptionField, +#tunnelListPage .destinationField { + width : 750px; +} + +#tunnelListPage .descriptionField .text, +#tunnelListPage .destinationField input { + width : 450px; +} + +#tunnelListPage .descriptionField label, +#tunnelListPage .destinationField label { + text-align : right; + width : 150px; + height : 24px; + float : left; +} diff --git a/installer/resources/themes/console/console.css b/installer/resources/themes/console/console.css new file mode 100644 index 000000000..99077d1e0 --- /dev/null +++ b/installer/resources/themes/console/console.css @@ -0,0 +1,112 @@ +body { + font-family: Verdana, Tahoma, Helvetica, sans-serif; + margin: 1em 0em; + padding: 0em; + text-align: center; + background-color: white; + color: black; + font-size: 100%; +} + +.hide { + display: none; +} + +img { + border: none; +} + +pre { + width: 100%; + overflow-x: scroll; +} + +div.logo { + float: left; + width: 200px; + left: 1em; + top: 1em; + margin: 0em; + padding: .5em; + text-align: center; +} + +div.toolbar { + margin: 0em 0em 2em 0em; + font-weight: bold; +} + +div.routersummaryouter { + float: left; + width: 215px; + margin: 0; + padding: 0; + border: 0; + clear: left; /* fixes a bug in Opera */ + overflow: auto; +} + +div.routersummary { + background-color: #fafaff; + width: 195px; + color: inherit; + margin: 0em; + padding: 5px; + text-align: left; + border: medium solid #efefff; + font-size: 0.82em; +} + +div.warning { + margin: 0em 1em 1em 224px; + padding: .5em 1em; + background-color: #ffefef; + border: medium solid #ffafaf; + text-align: left; + color: inherit; +} + +div.main { + margin: 0em 1em 1em 224px; + padding: .5em 1em; + background-color: #ffffef; + border: medium solid #ffffd0; + text-align: left; + color: inherit; +} + +div.main textarea { + width: 100% !important; +} + +div.news { + margin: 0em 1em 1em 224px; + padding: .5em 1em; + background-color: #ffffc0; + border: medium solid #ffffa0; + text-align: left; + color: inherit; +} + +div.confignav { + padding: 1em; + background-color: #efefff; +} + +div.configure { + padding: 1em; + background-color: #ffffc0; +} + +div.messages { + padding: 1em; + background-color: #fafaff; +} + +div.messages span.error { + color: #d00000; +} + +div.messages span.notice { + font-style: italic; +} diff --git a/installer/resources/themes/console/defCon1/console.css b/installer/resources/themes/console/defCon1/console.css new file mode 100644 index 000000000..99077d1e0 --- /dev/null +++ b/installer/resources/themes/console/defCon1/console.css @@ -0,0 +1,112 @@ +body { + font-family: Verdana, Tahoma, Helvetica, sans-serif; + margin: 1em 0em; + padding: 0em; + text-align: center; + background-color: white; + color: black; + font-size: 100%; +} + +.hide { + display: none; +} + +img { + border: none; +} + +pre { + width: 100%; + overflow-x: scroll; +} + +div.logo { + float: left; + width: 200px; + left: 1em; + top: 1em; + margin: 0em; + padding: .5em; + text-align: center; +} + +div.toolbar { + margin: 0em 0em 2em 0em; + font-weight: bold; +} + +div.routersummaryouter { + float: left; + width: 215px; + margin: 0; + padding: 0; + border: 0; + clear: left; /* fixes a bug in Opera */ + overflow: auto; +} + +div.routersummary { + background-color: #fafaff; + width: 195px; + color: inherit; + margin: 0em; + padding: 5px; + text-align: left; + border: medium solid #efefff; + font-size: 0.82em; +} + +div.warning { + margin: 0em 1em 1em 224px; + padding: .5em 1em; + background-color: #ffefef; + border: medium solid #ffafaf; + text-align: left; + color: inherit; +} + +div.main { + margin: 0em 1em 1em 224px; + padding: .5em 1em; + background-color: #ffffef; + border: medium solid #ffffd0; + text-align: left; + color: inherit; +} + +div.main textarea { + width: 100% !important; +} + +div.news { + margin: 0em 1em 1em 224px; + padding: .5em 1em; + background-color: #ffffc0; + border: medium solid #ffffa0; + text-align: left; + color: inherit; +} + +div.confignav { + padding: 1em; + background-color: #efefff; +} + +div.configure { + padding: 1em; + background-color: #ffffc0; +} + +div.messages { + padding: 1em; + background-color: #fafaff; +} + +div.messages span.error { + color: #d00000; +} + +div.messages span.notice { + font-style: italic; +} From 77ce768cb496e92b83ff7b4d3d105dfac3ee70aa Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sun, 28 Jun 2009 12:50:33 +0000 Subject: [PATCH 22/24] * Console: Move favicon.ico and i2plogo.png out of the .war so that the HTTP proxy can use them directly; proxy error pages must be updated next --- apps/routerconsole/jsp/index.jsp | 2 +- apps/routerconsole/jsp/nav.jsp | 2 +- apps/routerconsole/jsp/viewtheme.jsp | 4 +++- build.xml | 7 +++++++ installer/resources/favicon.ico | Bin 1406 -> 0 bytes .../resources/themes/console/images}/favicon.ico | Bin .../resources/themes/console/images}/i2plogo.png | Bin 7 files changed, 12 insertions(+), 3 deletions(-) delete mode 100644 installer/resources/favicon.ico rename {apps/routerconsole/jsp => installer/resources/themes/console/images}/favicon.ico (100%) rename {apps/routerconsole/jsp => installer/resources/themes/console/images}/i2plogo.png (100%) diff --git a/apps/routerconsole/jsp/index.jsp b/apps/routerconsole/jsp/index.jsp index 87287b412..73ad4e15b 100644 --- a/apps/routerconsole/jsp/index.jsp +++ b/apps/routerconsole/jsp/index.jsp @@ -6,7 +6,7 @@ <title>I2P Router Console - home <%@include file="css.jsp" %> - + <% if (System.getProperty("router.consoleNonce") == null) { diff --git a/apps/routerconsole/jsp/nav.jsp b/apps/routerconsole/jsp/nav.jsp index ad0021487..43d8d336e 100644 --- a/apps/routerconsole/jsp/nav.jsp +++ b/apps/routerconsole/jsp/nav.jsp @@ -1,6 +1,6 @@ <%@page import="java.io.File" %>
<% if (new File("docs/toolbar.html").exists()) { %> diff --git a/apps/routerconsole/jsp/viewtheme.jsp b/apps/routerconsole/jsp/viewtheme.jsp index 05ccfecbf..95b1e91c0 100644 --- a/apps/routerconsole/jsp/viewtheme.jsp +++ b/apps/routerconsole/jsp/viewtheme.jsp @@ -14,7 +14,9 @@ if (uri.endsWith(".css")) { response.setContentType("image/gif"); } else if (uri.endsWith(".jpg")) { response.setContentType("image/jpeg"); +} else if (uri.endsWith(".ico")) { + response.setContentType("image/x-icon"); } - +response.setHeader("Cache-Control", "max-age=86400"); // cache for a day net.i2p.util.FileUtil.readFile(uri, "./docs", response.getOutputStream()); %> \ No newline at end of file diff --git a/build.xml b/build.xml index da8cfc4c2..525364929 100644 --- a/build.xml +++ b/build.xml @@ -320,6 +320,13 @@ + + + + + + + diff --git a/installer/resources/favicon.ico b/installer/resources/favicon.ico deleted file mode 100644 index fd09b1b4cc69cb3eaa0853bda10698e3105d261f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmbtUO=weD6#ibD)U+uYpS4Eks?o+;$8>C=62%Uo(uIr4%%aOKsuXeIvJhb&Xwr@d z(?zRU)F04AabqbcVunFPM06O`MM+$gqOk^%<{=tml=^JuJNKm!8ph%dqvYVs5nQs*4>misZfG=|4d9eAGSVJ|uuShNu? zc42zP!HM!P@(T{~%Ql*d5u}PGsD(W4+;vb|E@5hE8kuJfhToRZ$e8`*A*7ZrqpR49 z;j)Fuf{h0c9XQJl`pN?sTS_4_>!6XjhL|T(?8dE|lE*^+wF8@Z6my5g@4n=4FhA$O z((%JEd)@kjPk3G@|3jV!ayX7Cn;XG;ZIB%91`0O;vqfXzBrwb7dtE)I_EBF;y{k5^ z@$4gKsgDC^(GC0E8<<~da0*CIZ9uwk5ff$x77el`3+X-^6Il}$?I#C=*jspuW^-fT=KjRDmD~CpB9?X9q1E^h@!^8qff2J=rpqtU!`T#&poic};3@f6 zRAMo1LmXblHyA&`_@ci-kN-HY9{p7V!Q>ab#8J*e1{TMjnI0_r58!lXO!t>m6x*{% z@Bno(bqo$B|+s~9Xw6}+OM7*R`N`=LvL8&!@LrUp& z+^JMs74H;1@oK?MN^KNe%K)o4wM8V!mhIaGeoy|bei3fiyxEkq#W0MYXfFN~>?Smf yI@K;XsMIcvw@RBj-#U$VDEZTq`cypy0i{}lT>7;VaGgiTSFNprz9I4Y5&9p!OB Date: Mon, 29 Jun 2009 01:07:51 +0000 Subject: [PATCH 23/24] * Update versions, package release * Remove the last reference to my eepsite as a "news.xml" source, and likewise stop my public key from being included among valid release signing keys. --- .../router/configuration/UpdateHelper.java | 3 +- core/java/src/net/i2p/CoreVersion.java | 2 +- .../src/net/i2p/crypto/TrustedUpdate.java | 1 - history.txt | 8 ++++ initialNews.xml | 4 +- installer/install.xml | 2 +- news.xml | 45 ++++++++++++------- .../src/net/i2p/router/RouterVersion.java | 2 +- 8 files changed, 43 insertions(+), 24 deletions(-) diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHelper.java b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHelper.java index 86db6f708..6e28db108 100644 --- a/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHelper.java +++ b/apps/desktopgui/src/net/i2p/desktopgui/router/configuration/UpdateHelper.java @@ -9,7 +9,7 @@ import net.i2p.desktopgui.router.RouterHelper; public class UpdateHelper { public static final String PROP_NEWS_URL = "router.newsURL"; - public static final String DEFAULT_NEWS_URL = "http://complication.i2p/news.xml"; + public static final String DEFAULT_NEWS_URL = "http://echelon.i2p/i2p/news.xml"; public static final String PROP_REFRESH_FREQUENCY = "router.newsRefreshFrequency"; public static final String DEFAULT_REFRESH_FREQUENCY = 24*60*60*1000 + ""; @@ -31,7 +31,6 @@ public class UpdateHelper { public static final String DEFAULT_UPDATE_URL = "http://echelon.i2p/i2p/i2pupdate.sud\r\n" + "http://stats.i2p/i2p/i2pupdate.sud\r\n" + - "http://complication.i2p/i2p/i2pupdate.sud\r\n" + "http://www.i2p2.i2p/_static/i2pupdate.sud\r\n" + "http://update.postman.i2p/i2pupdate.sud" ; diff --git a/core/java/src/net/i2p/CoreVersion.java b/core/java/src/net/i2p/CoreVersion.java index 972b87966..fecc6c9a8 100644 --- a/core/java/src/net/i2p/CoreVersion.java +++ b/core/java/src/net/i2p/CoreVersion.java @@ -15,7 +15,7 @@ package net.i2p; */ public class CoreVersion { public final static String ID = "$Revision: 1.72 $ $Date: 2008-08-24 12:00:00 $"; - public final static String VERSION = "0.7.4"; + public final static String VERSION = "0.7.5"; public static void main(String args[]) { System.out.println("I2P Core version: " + VERSION); diff --git a/core/java/src/net/i2p/crypto/TrustedUpdate.java b/core/java/src/net/i2p/crypto/TrustedUpdate.java index 06e37544b..33a7e8cb7 100644 --- a/core/java/src/net/i2p/crypto/TrustedUpdate.java +++ b/core/java/src/net/i2p/crypto/TrustedUpdate.java @@ -141,7 +141,6 @@ D8usM7Dxp5yrDrCYZ5AIijc= } else { _trustedKeys.add(DEFAULT_TRUSTED_KEY); _trustedKeys.add(DEFAULT_TRUSTED_KEY2); - _trustedKeys.add(DEFAULT_TRUSTED_KEY3); } if (_log.shouldLog(Log.DEBUG)) _log.debug("TrustedUpdate created, trusting " + _trustedKeys.size() + " keys."); diff --git a/history.txt b/history.txt index 33381eb02..dfd639beb 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,11 @@ +* 2009-06-29 0.7.5 released + +2009-06-29 Complication + * Update versions, package release + * Remove the last reference to my eepsite as a "news.xml" source, + and likewise stop my public key from being included + among valid release signing keys. + 2009-06-25 sponge * Summary frame layout change so it makes sense. diff --git a/initialNews.xml b/initialNews.xml index 0a2c5b12b..9a1d4bb78 100644 --- a/initialNews.xml +++ b/initialNews.xml @@ -1,5 +1,5 @@ - - +

Congratulations on getting I2P installed!

    diff --git a/installer/install.xml b/installer/install.xml index d51bd7f2a..b6aa5528d 100644 --- a/installer/install.xml +++ b/installer/install.xml @@ -4,7 +4,7 @@ i2p - 0.7.4 + 0.7.5 diff --git a/news.xml b/news.xml index e03588a6e..729462ac6 100644 --- a/news.xml +++ b/news.xml @@ -1,5 +1,5 @@ - - +

    • -2009-06-12: 0.7.4 Released +2009-06-29: 0.7.5 Released

    -I2P version 0.7.4 introduces notable new features -like GeoIP capability and UPnP support. While the former -can become a basis for geographically aware tunnel-building, -the latter should immediately enable more routers to accept -inbound TCP connections, helping distribute workload more evenly. +I2P version 0.7.5 foremost addresses network stability issues +by adjusting how exploratory tunnels are built if a router nears +its connection limit, and also by distinguishing between +connected peers and other non-failing peers while picking them +for inclusion in tunnels.

    -Inbound NTCP is now enabled automaticaly if the router -does not appear firewalled, and default bandwidth limits -for new installations are increased. +This version also delivers fixes to installer behaviour on Windows, +to the Router Console, NTCP transport and UPnP mechanism.

    -In addition, multiple bugfixes and updates are included, -addressing issues with the NTCP transport, BOB protocol, -connection limiting, behaviour of new I2PTunnel options -and the SusiDNS user interface. Improvements to the Router Console -are likewise included. Updating is recommended. +Additionally, version 0.7.5 changes the "news.xml" file location +where I2P routers check whether a new version is available. +Instead of the old URL (http://complication.i2p/news.xml) +a new location (http://echelon.i2p./news.xml) will be used. +If your router uses default updater settings, it will start using +the new URL automatically. If not, you will need to visit +configupdate.jsp, and change it manually. +For a while after this update, the old news.xml location will also +redirect all HTTP requests to the new one. +

    +Finally, since Complication is withdrawing from the I2P project, +to make some far-reaching changes in his life, this update removes +Complication's public key from the list of release signing keys. +You should expect the next release to be signed by zzz instead. +If you have non-default updater settings, you may want to remove +Complication's public key manually, by visiting configupdate.jsp, +and removing the key line starting with the characters "JHFA". +If you wish to verify whether this information is correct, +please check the GPG-signed release announcement.

    diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index b54d1de4b..8aa072fcf 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 5; + public final static long BUILD = 0; /** for example "-test" */ public final static String EXTRA = ""; public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA; From 8ca794dc571cf52981f9a1533e14c7b600f313a8 Mon Sep 17 00:00:00 2001 From: zzz Date: Mon, 29 Jun 2009 03:21:12 +0000 Subject: [PATCH 24/24] history for prop from test2 branch --- history.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/history.txt b/history.txt index dfd639beb..4e0957f47 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,12 @@ +2009-06-29 zzz + * Console: Convert table headers to to prep for CSS changes + * Console CSS: Move css file, make a classic theme to prep for CSS changes + * Console: Move favicon.ico and i2plogo.png out of the .war + so that the HTTP proxy can use them directly; + proxy error pages must be updated next + * NetDb stats: Normalize tunnel build stats for increased anonymity, + effective in 0.7.6 + * 2009-06-29 0.7.5 released 2009-06-29 Complication