diff --git a/src/com/thetransactioncompany/jsonrpc2/client/JSONRPC2Session.java b/src/com/thetransactioncompany/jsonrpc2/client/JSONRPC2Session.java index 3d4c132e8..bba1e64fd 100644 --- a/src/com/thetransactioncompany/jsonrpc2/client/JSONRPC2Session.java +++ b/src/com/thetransactioncompany/jsonrpc2/client/JSONRPC2Session.java @@ -16,10 +16,6 @@ import javax.net.ssl.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import net.i2p.itoopie.i2pcontrol.JSONRPC2Interface; -import net.i2p.itoopie.security.CertificateHelper; -import net.i2p.itoopie.security.CertificateManager; - import com.thetransactioncompany.jsonrpc2.*; diff --git a/src/net/i2p/itoopie/Main.java b/src/net/i2p/itoopie/Main.java index 6585480bb..a7c582e16 100644 --- a/src/net/i2p/itoopie/Main.java +++ b/src/net/i2p/itoopie/Main.java @@ -50,7 +50,7 @@ public class Main { private final Log _log; public Main() { - _conf = ConfigurationManager.getInstance(); + _conf = new ConfigurationManager(); _log = LogFactory.getLog(Main.class); } @@ -59,7 +59,8 @@ public class Main { * @throws Exception */ public void startUp() throws Exception { - trayManager = new TrayManager(this); + JSONRPC2Interface.setupSession(_conf); + trayManager = new TrayManager(this, _conf); trayManager.startManager(); } diff --git a/src/net/i2p/itoopie/configuration/ConfigurationManager.java b/src/net/i2p/itoopie/configuration/ConfigurationManager.java index 49125eb84..f2336d4a9 100644 --- a/src/net/i2p/itoopie/configuration/ConfigurationManager.java +++ b/src/net/i2p/itoopie/configuration/ConfigurationManager.java @@ -24,7 +24,7 @@ import org.apache.commons.logging.LogFactory; */ public class ConfigurationManager { private static final String DEFAULT_CONFIG_NAME = "itoopie.conf"; - private static final Log _log = LogFactory.getLog(ConfigurationManager.class); + private final Log _log = LogFactory.getLog(ConfigurationManager.class); private static final String APP_DIR_NAME = "itoopie"; /** * For plugin @@ -32,25 +32,17 @@ public class ConfigurationManager { public static final String PROP_CONF_DIR = "itoopie.confdir"; - private static ConfigurationManager instance; //Configurations with a String as value - private static Map stringConfigurations = new HashMap(); + private Map stringConfigurations = new HashMap(); //Configurations with a Boolean as value - private static Map booleanConfigurations = new HashMap(); + private Map booleanConfigurations = new HashMap(); //Configurations with an Integer as value - private static Map integerConfigurations = new HashMap(); + private Map integerConfigurations = new HashMap(); - private ConfigurationManager() { + public ConfigurationManager() { readConfFile(); } - public synchronized static ConfigurationManager getInstance() { - if(instance == null) { - instance = new ConfigurationManager(); - } - return instance; - } - /** * Collects settingNameuments of the form --word, --word=otherword and -blah * to determine user parameters. @@ -68,7 +60,7 @@ public class ConfigurationManager { /** * Reads configuration from file itoopie.conf, every line is parsed as key=value. */ - public static void readConfFile(){ + public void readConfFile(){ File f = new File(getAppConfDir(), DEFAULT_CONFIG_NAME); try { BufferedReader br = new BufferedReader(new FileReader(f)); @@ -87,7 +79,7 @@ public class ConfigurationManager { /** * Write configuration into default config file. */ - public static void writeConfFile(){ + public void writeConfFile(){ TreeMap tree = new TreeMap(); for (Entry e : stringConfigurations.entrySet()){ tree.put(e.getKey(), e.getValue()); @@ -115,7 +107,7 @@ public class ConfigurationManager { * where value will (in order) be parsed as integer/boolean/string. * @param str */ - public static void parseConfigStr(String str){ + public void parseConfigStr(String str){ int eqIndex = str.indexOf('='); if (eqIndex != -1){ String key = str.substring(0, eqIndex).trim().toLowerCase(); @@ -219,7 +211,7 @@ public class ConfigurationManager { * Get the file path to the configuration directory. If the directory does not yet exist, creates it. * @return Application configuration directory. */ - public static File getAppConfDir() { + public File getAppConfDir() { String dir; // for plugin String override = System.getProperty(PROP_CONF_DIR); diff --git a/src/net/i2p/itoopie/gui/CertificateGUI.java b/src/net/i2p/itoopie/gui/CertificateGUI.java index 15d82656d..937814471 100644 --- a/src/net/i2p/itoopie/gui/CertificateGUI.java +++ b/src/net/i2p/itoopie/gui/CertificateGUI.java @@ -1,6 +1,7 @@ package net.i2p.itoopie.gui; import java.awt.BorderLayout; +import java.io.File; import javax.security.cert.X509Certificate; import javax.swing.BoxLayout; @@ -22,7 +23,7 @@ public class CertificateGUI { } */ - public static synchronized boolean saveNewCert(Main main, String hostname, X509Certificate cert){ + public static synchronized boolean saveNewCert(Main main, File dir, String hostname, X509Certificate cert){ JFrame frame = new JFrame(); frame.setLayout(new BorderLayout()); JButton bt = new JButton(); @@ -59,7 +60,7 @@ public class CertificateGUI { JOptionPane.INFORMATION_MESSAGE); if (n == JOptionPane.YES_OPTION){ - CertificateManager.forcePutServerCert(hostname, CertificateHelper.convert(cert)); + CertificateManager.forcePutServerCert(dir, hostname, CertificateHelper.convert(cert)); updateUI(main); return true; } else { @@ -68,7 +69,7 @@ public class CertificateGUI { } - public static boolean overwriteCert(Main main, String hostname, X509Certificate cert){ + public static boolean overwriteCert(Main main, File dir, String hostname, X509Certificate cert){ JFrame frame = new JFrame(); String title = Transl._t("Warning, new remote host detected"); @@ -109,7 +110,7 @@ public class CertificateGUI { JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE); if (n == JOptionPane.YES_OPTION){ - CertificateManager.forcePutServerCert(hostname, CertificateHelper.convert(cert)); + CertificateManager.forcePutServerCert(dir, hostname, CertificateHelper.convert(cert)); updateUI(main); return true; // Confirmation positive } else { diff --git a/src/net/i2p/itoopie/gui/Main.java b/src/net/i2p/itoopie/gui/Main.java index 577b99909..6a6e58e9f 100644 --- a/src/net/i2p/itoopie/gui/Main.java +++ b/src/net/i2p/itoopie/gui/Main.java @@ -16,6 +16,7 @@ import javax.swing.JRootPane; import javax.swing.SwingConstants; import javax.swing.ImageIcon; +import net.i2p.itoopie.configuration.ConfigurationManager; import net.i2p.itoopie.gui.component.RegisteredFrame; import net.i2p.itoopie.gui.component.TabLogoPanel; import net.i2p.itoopie.gui.component.util.TabChangeListener; @@ -36,6 +37,7 @@ public class Main { private JFrame frame; private JTabbedPane tabbedPane; private final WindowHandler windowHandler; + private final ConfigurationManager _conf; public final static int FRAME_WIDTH = 550; public final static int FRAME_HEIGHT = 400; public final static int TABBED_PANE_HEIGHT = FRAME_HEIGHT - 66; @@ -61,9 +63,10 @@ public class Main { /** * Create the application. */ - public Main(WindowHandler wh) { + public Main(WindowHandler wh, ConfigurationManager conf) { windowHandler = wh; - HttpsURLConnection.setDefaultHostnameVerifier(new ItoopieHostnameVerifier(this)); + _conf = conf; + HttpsURLConnection.setDefaultHostnameVerifier(new ItoopieHostnameVerifier(this, conf.getAppConfDir())); initialize(); } @@ -88,7 +91,7 @@ public class Main { root.add(tabbedPane); tabbedPane.setBounds(0, 0, FRAME_WIDTH-9, TABBED_PANE_HEIGHT); - OverviewTab overviewTab = new OverviewTab("itoopie-opaque12"); + OverviewTab overviewTab = new OverviewTab("itoopie-opaque12", _conf); tabbedPane.addTab(' ' + Transl._t("Overview") + ' ', null, overviewTab, null); tabbedPane.addChangeListener(new TabChangeListener(overviewTab)); @@ -100,7 +103,7 @@ public class Main { // pass overview tab to settingsframe to reset the charts on change - TabLogoPanel settingsTab = new SettingsFrame("itoopie-opaque12", this, overviewTab); + TabLogoPanel settingsTab = new SettingsFrame("itoopie-opaque12", this, _conf, overviewTab); tabbedPane.addTab(' ' + Transl._t("Settings") + ' ', icon, settingsTab, null); tabbedPane.addChangeListener(new TabChangeListener(settingsTab)); diff --git a/src/net/i2p/itoopie/gui/OverviewTab.java b/src/net/i2p/itoopie/gui/OverviewTab.java index ed43967cf..76ea22b82 100644 --- a/src/net/i2p/itoopie/gui/OverviewTab.java +++ b/src/net/i2p/itoopie/gui/OverviewTab.java @@ -32,7 +32,7 @@ import net.i2p.itoopie.i2pcontrol.methods.RouterInfo.ROUTER_INFO; import net.i2p.itoopie.util.DataHelper; public class OverviewTab extends TabLogoPanel { - private static ConfigurationManager _conf = ConfigurationManager.getInstance(); + private final ConfigurationManager _conf; private final static int DEFAULT_INFO_UPDATE_INTERVAL = 30*1000; // Milliseconds. private final JLabel lblI2P; @@ -47,12 +47,13 @@ public class OverviewTab extends TabLogoPanel { private final BandwidthChart bwChart; private final ParticipatingTunnelsChart partTunnelChart; - public OverviewTab(String imageName) { + public OverviewTab(String imageName, ConfigurationManager conf) { super(imageName); + _conf = conf; super.setLayout(null); - bwChart = new BandwidthChart(); - partTunnelChart = new ParticipatingTunnelsChart(); + bwChart = new BandwidthChart(_conf); + partTunnelChart = new ParticipatingTunnelsChart(_conf); ChartPanel pt = new ChartPanel(partTunnelChart); pt.setSize(300, 135); pt.setLocation(5, 10); @@ -211,6 +212,7 @@ public class OverviewTab extends TabLogoPanel { /** * Launch the application. */ +/* public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { @@ -227,6 +229,6 @@ public class OverviewTab extends TabLogoPanel { }); } - +*/ } diff --git a/src/net/i2p/itoopie/gui/SettingsFrame.java b/src/net/i2p/itoopie/gui/SettingsFrame.java index d0de4aa5e..cb934e715 100644 --- a/src/net/i2p/itoopie/gui/SettingsFrame.java +++ b/src/net/i2p/itoopie/gui/SettingsFrame.java @@ -95,10 +95,10 @@ public class SettingsFrame extends TabLogoPanel { /** * Create the application. */ - public SettingsFrame(String imageName, Main m, OverviewTab otab) { + public SettingsFrame(String imageName, Main m, ConfigurationManager conf, OverviewTab otab) { super(imageName); setLayout(null); - _conf = ConfigurationManager.getInstance(); + _conf = conf; _otab = otab; _main = m; initialize(); @@ -393,7 +393,7 @@ public class SettingsFrame extends TabLogoPanel { _conf.setConf("server.hostname", ipText); _conf.setConf("server.port", port); _conf.setConf("server.password", pwText); - JSONRPC2Interface.testSettings(); + JSONRPC2Interface.testSettings(_conf); if (!oldIP.equals(ipText) || oldPort != port) _otab.clearGraphs(); } catch (InvalidPasswordException e) { diff --git a/src/net/i2p/itoopie/gui/TrayManager.java b/src/net/i2p/itoopie/gui/TrayManager.java index 530c13a09..1a1d400f5 100644 --- a/src/net/i2p/itoopie/gui/TrayManager.java +++ b/src/net/i2p/itoopie/gui/TrayManager.java @@ -19,6 +19,7 @@ import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import net.i2p.itoopie.Main; +import net.i2p.itoopie.configuration.ConfigurationManager; import net.i2p.itoopie.i18n.Transl; import net.i2p.itoopie.util.IconLoader; import net.i2p.itoopie.util.IsJar; @@ -33,19 +34,21 @@ public class TrayManager { ///Our tray icon, or null if unsupported protected TrayIcon trayIcon; private final net.i2p.itoopie.Main main; + private final ConfigurationManager _conf; /** * Instantiate tray manager. */ - public TrayManager(net.i2p.itoopie.Main m) { + public TrayManager(net.i2p.itoopie.Main m, ConfigurationManager conf) { main = m; + _conf = conf; } /** * Add the tray icon to the system tray and start everything up. */ public synchronized void startManager() { - final WindowHandler windowHandler = new WindowHandler(); + final WindowHandler windowHandler = new WindowHandler(_conf); windowHandler.toggleFrames(); // so the tray icon works right on Gnome try { Thread.sleep(500); } catch (InterruptedException ie) {} diff --git a/src/net/i2p/itoopie/gui/WindowHandler.java b/src/net/i2p/itoopie/gui/WindowHandler.java index 0e20f5276..9dcd5c7a7 100644 --- a/src/net/i2p/itoopie/gui/WindowHandler.java +++ b/src/net/i2p/itoopie/gui/WindowHandler.java @@ -5,10 +5,17 @@ import java.util.HashSet; import javax.swing.JFrame; +import net.i2p.itoopie.configuration.ConfigurationManager; + public class WindowHandler { private final HashSet _frames = new HashSet(); private JFrame mainFrame; private boolean areFramesShown; + private final ConfigurationManager _conf; + + public WindowHandler(ConfigurationManager conf) { + _conf = conf; + } public void register(JFrame frame){ _frames.add(frame); @@ -50,7 +57,7 @@ public class WindowHandler { public void toggleFrames(){ if (_frames.isEmpty()){ - new Main(this); + new Main(this, _conf); } else { if (areFramesShown){ hideFrames(); diff --git a/src/net/i2p/itoopie/gui/component/BandwidthChart.java b/src/net/i2p/itoopie/gui/component/BandwidthChart.java index aae008416..2f47233c7 100644 --- a/src/net/i2p/itoopie/gui/component/BandwidthChart.java +++ b/src/net/i2p/itoopie/gui/component/BandwidthChart.java @@ -30,7 +30,7 @@ import net.i2p.itoopie.i18n.Transl; public class BandwidthChart extends Chart2D{ - private static ConfigurationManager _conf = ConfigurationManager.getInstance(); + private final ConfigurationManager _conf; private final static int DEFAULT_UPDATE_INTERVAL = 10000; // Update every 2500th ms private final static int DEFAULT_GRAPH_INTERVAL = 3600*1000; // The graph will cover a maximum of this time private ObjRecorder2Trace2DAdapter bwInAdapter; @@ -38,9 +38,9 @@ public class BandwidthChart extends Chart2D{ private InboundBandwidthTracker bwInTracker; private OutboundBandwidthTracker bwOutTracker; - public BandwidthChart(){ + public BandwidthChart(ConfigurationManager conf) { super(); - + _conf = conf; int updateInterval = _conf.getConf("graph.updateinterval", DEFAULT_UPDATE_INTERVAL); int graphInterval = _conf.getConf("graph.graphinterval", DEFAULT_GRAPH_INTERVAL); @@ -83,14 +83,14 @@ public class BandwidthChart extends Chart2D{ // force ranges: getAxisY().setRangePolicy(new RangePolicyMinimumViewport(new Range(0, 5))); - bwInTracker = new InboundBandwidthTracker(); - bwOutTracker = new OutboundBandwidthTracker(); + bwInTracker = new InboundBandwidthTracker(updateInterval); + bwOutTracker = new OutboundBandwidthTracker(updateInterval); bwInAdapter = new ObjRecorder2Trace2DAdapter(dataBWIn, bwInTracker, "m_value", updateInterval/2); bwOutAdapter = new ObjRecorder2Trace2DAdapter(dataBWOut, bwOutTracker, "m_value", updateInterval/2); } - +/* public static void main(final String[] args) { JFrame frame = new JFrame(); Container contentPane = frame.getContentPane(); @@ -102,4 +102,5 @@ public class BandwidthChart extends Chart2D{ frame.setResizable(true); frame.setVisible(true); } +*/ } diff --git a/src/net/i2p/itoopie/gui/component/ParticipatingTunnelsChart.java b/src/net/i2p/itoopie/gui/component/ParticipatingTunnelsChart.java index 8da1132d6..335b3f1e3 100644 --- a/src/net/i2p/itoopie/gui/component/ParticipatingTunnelsChart.java +++ b/src/net/i2p/itoopie/gui/component/ParticipatingTunnelsChart.java @@ -29,14 +29,15 @@ import net.i2p.itoopie.i18n.Transl; public class ParticipatingTunnelsChart extends Chart2D { - private static ConfigurationManager _conf = ConfigurationManager.getInstance(); + private final ConfigurationManager _conf; private final static int DEFAULT_UPDATE_INTERVAL = 10000; // Update every 1000th ms private final static int DEFAULT_GRAPH_INTERVAL = 3600*1000; // The graph will cover a maximum of this time private ParticipatingTunnelsTracker partTunnelTracker; private ObjRecorder2Trace2DAdapter partTunnelAdapter; - public ParticipatingTunnelsChart(){ + public ParticipatingTunnelsChart(ConfigurationManager conf) { super(); + _conf = conf; int updateInterval = _conf.getConf("graph.updateinterval", DEFAULT_UPDATE_INTERVAL); int graphInterval = _conf.getConf("graph.graphinterval", DEFAULT_GRAPH_INTERVAL); @@ -71,10 +72,11 @@ public class ParticipatingTunnelsChart extends Chart2D { // force ranges: getAxisY().setRangePolicy(new RangePolicyMinimumViewport(new Range(0, 20))); - partTunnelTracker = new ParticipatingTunnelsTracker(); + partTunnelTracker = new ParticipatingTunnelsTracker(updateInterval); partTunnelAdapter = new ObjRecorder2Trace2DAdapter(dataPartTunnels, partTunnelTracker, "m_value", updateInterval/2); } +/* public static void main(final String[] args) { JFrame frame = new JFrame(); Container contentPane = frame.getContentPane(); @@ -86,4 +88,5 @@ public class ParticipatingTunnelsChart extends Chart2D { frame.setResizable(true); frame.setVisible(true); } +*/ } diff --git a/src/net/i2p/itoopie/gui/component/chart/InboundBandwidthTracker.java b/src/net/i2p/itoopie/gui/component/chart/InboundBandwidthTracker.java index 26cd6d401..610db0c22 100644 --- a/src/net/i2p/itoopie/gui/component/chart/InboundBandwidthTracker.java +++ b/src/net/i2p/itoopie/gui/component/chart/InboundBandwidthTracker.java @@ -5,7 +5,6 @@ import java.util.HashMap; import com.thetransactioncompany.jsonrpc2.client.JSONRPC2SessionException; -import net.i2p.itoopie.configuration.ConfigurationManager; import net.i2p.itoopie.i2pcontrol.InvalidParametersException; import net.i2p.itoopie.i2pcontrol.InvalidPasswordException; import net.i2p.itoopie.i2pcontrol.methods.GetRateStat; @@ -14,19 +13,15 @@ import net.i2p.itoopie.i2pcontrol.methods.RouterInfo.ROUTER_INFO; public class InboundBandwidthTracker extends Thread implements Tracker { - private static ConfigurationManager _conf = ConfigurationManager.getInstance(); /** Last read bw */ private double m_value = 0; - - /** Poll router for current ratestat every updateInterval seconds */ - private final static int DEFAULT_UPDATE_INTERVAL = 100; // Update every 100th ms - - private int updateInterval = _conf.getConf("graph.updateinterval", DEFAULT_UPDATE_INTERVAL); + private final int updateInterval; /** * Start daemon that checks to current inbound bandwidth of the router. */ - public InboundBandwidthTracker() { + public InboundBandwidthTracker(int interval) { + updateInterval = interval; this.setDaemon(true); this.start(); } diff --git a/src/net/i2p/itoopie/gui/component/chart/OutboundBandwidthTracker.java b/src/net/i2p/itoopie/gui/component/chart/OutboundBandwidthTracker.java index 0afd419c9..9a0e3dac4 100644 --- a/src/net/i2p/itoopie/gui/component/chart/OutboundBandwidthTracker.java +++ b/src/net/i2p/itoopie/gui/component/chart/OutboundBandwidthTracker.java @@ -5,7 +5,6 @@ import java.util.HashMap; import com.thetransactioncompany.jsonrpc2.client.JSONRPC2SessionException; -import net.i2p.itoopie.configuration.ConfigurationManager; import net.i2p.itoopie.i2pcontrol.InvalidParametersException; import net.i2p.itoopie.i2pcontrol.InvalidPasswordException; import net.i2p.itoopie.i2pcontrol.methods.GetRateStat; @@ -14,19 +13,15 @@ import net.i2p.itoopie.i2pcontrol.methods.RouterInfo.ROUTER_INFO; public class OutboundBandwidthTracker extends Thread implements Tracker { - private static ConfigurationManager _conf = ConfigurationManager.getInstance(); /** Last read bw */ private double m_value = 0; - - /** Poll router for current ratestat every updateInterval seconds */ - private final static int DEFAULT_UPDATE_INTERVAL = 100; // Update every 100th ms - - private int updateInterval = _conf.getConf("graph.updateinterval", DEFAULT_UPDATE_INTERVAL); + private final int updateInterval; /** * Start daemon that checks to current inbound bandwidth of the router. */ - public OutboundBandwidthTracker() { + public OutboundBandwidthTracker(int interval) { + updateInterval = interval; this.setDaemon(true); this.start(); } diff --git a/src/net/i2p/itoopie/gui/component/chart/ParticipatingTunnelsTracker.java b/src/net/i2p/itoopie/gui/component/chart/ParticipatingTunnelsTracker.java index 60d34c300..f1f41a16e 100644 --- a/src/net/i2p/itoopie/gui/component/chart/ParticipatingTunnelsTracker.java +++ b/src/net/i2p/itoopie/gui/component/chart/ParticipatingTunnelsTracker.java @@ -14,19 +14,15 @@ import net.i2p.itoopie.i2pcontrol.methods.RouterInfo.ROUTER_INFO; public class ParticipatingTunnelsTracker extends Thread implements Tracker { - private static ConfigurationManager _conf = ConfigurationManager.getInstance(); /** Last read bw */ private double m_value = 0; - - /** Poll router for current ratestat every updateInterval seconds */ - private final static int DEFAULT_UPDATE_INTERVAL = 100; // Update every 100th ms - - private int updateInterval = _conf.getConf("graph.updateinterval", DEFAULT_UPDATE_INTERVAL); + private final int updateInterval; /** * Start daemon that checks to current inbound bandwidth of the router. */ - public ParticipatingTunnelsTracker() { + public ParticipatingTunnelsTracker(int interval) { + updateInterval = interval; this.setDaemon(true); this.start(); } diff --git a/src/net/i2p/itoopie/gui/component/chart/RateStatTracker.java b/src/net/i2p/itoopie/gui/component/chart/RateStatTracker.java index 9ee98ad99..1dda0d5ce 100644 --- a/src/net/i2p/itoopie/gui/component/chart/RateStatTracker.java +++ b/src/net/i2p/itoopie/gui/component/chart/RateStatTracker.java @@ -2,21 +2,18 @@ package net.i2p.itoopie.gui.component.chart; import com.thetransactioncompany.jsonrpc2.client.JSONRPC2SessionException; -import net.i2p.itoopie.configuration.ConfigurationManager; import net.i2p.itoopie.i2pcontrol.InvalidParametersException; import net.i2p.itoopie.i2pcontrol.InvalidPasswordException; import net.i2p.itoopie.i2pcontrol.methods.GetRateStat; +/** + * Unused + */ public class RateStatTracker extends Thread implements Tracker { - private static ConfigurationManager _conf = ConfigurationManager.getInstance(); /** Last read bw */ private double m_value = 0; - - /** Poll router for current ratestat every updateInterval seconds */ - private final static int DEFAULT_UPDATE_INTERVAL = 100; // Update every 100th ms - - private int updateInterval = _conf.getConf("graph.updateinterval", DEFAULT_UPDATE_INTERVAL); + private final int updateInterval; /** Which RateStat to measure from the router */ private String rateStat; @@ -27,9 +24,10 @@ public class RateStatTracker extends Thread implements Tracker { /** * Start daemon that checks to current inbound bandwidth of the router. */ - public RateStatTracker(String rateStat, long period) { + public RateStatTracker(String rateStat, long period, int interval) { this.rateStat = rateStat; this.period = period; + updateInterval = interval; this.setDaemon(true); this.start(); } diff --git a/src/net/i2p/itoopie/i2pcontrol/JSONRPC2Interface.java b/src/net/i2p/itoopie/i2pcontrol/JSONRPC2Interface.java index 615ed120f..62ebcfab6 100644 --- a/src/net/i2p/itoopie/i2pcontrol/JSONRPC2Interface.java +++ b/src/net/i2p/itoopie/i2pcontrol/JSONRPC2Interface.java @@ -10,8 +10,6 @@ import javax.net.ssl.HttpsURLConnection; import net.i2p.itoopie.ItoopieVersion; import net.i2p.itoopie.configuration.ConfigurationManager; import net.i2p.itoopie.i2pcontrol.methods.Authenticate; -import net.i2p.itoopie.security.CertificateHelper; -import net.i2p.itoopie.security.ItoopieHostnameVerifier; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -24,31 +22,30 @@ import com.thetransactioncompany.jsonrpc2.client.JSONRPC2SessionException; public class JSONRPC2Interface { private static Log _log; - private static ConfigurationManager _conf; private static int nonce; private static final int MAX_NBR_RETRIES = 2; private static JSONRPC2Session session; private static String token; + private final static String DEFAULT_PASSWORD = "itoopie"; + private static String pw = DEFAULT_PASSWORD; static { _log = LogFactory.getLog(JSONRPC2Interface.class); - _conf = ConfigurationManager.getInstance(); Random rnd = new Random(); nonce = rnd.nextInt(); - setupSession(); } public static synchronized int incrNonce() { return ++nonce; } - public static void setupSession() { + public static void setupSession(ConfigurationManager conf) { URL srvURL = null; - String srvHost = _conf.getConf("server.hostname", "localhost"); + String srvHost = conf.getConf("server.hostname", "localhost"); if (srvHost.contains(":")) srvHost = '[' + srvHost + ']'; - int srvPort = _conf.getConf("server.port", 7650); - String srvTarget = _conf.getConf("server.target", "jsonrpc"); + int srvPort = conf.getConf("server.port", 7650); + String srvTarget = conf.getConf("server.target", "jsonrpc"); String method; if (srvPort == 7657) { // Use HTTP for the xmlrpc webapp in the HTTP router console @@ -68,15 +65,16 @@ public class JSONRPC2Interface { _log.error("Bad URL: " + method + "://" + srvHost + ":" + srvPort + "/" + srvTarget, e); } + pw = conf.getConf("server.password", DEFAULT_PASSWORD); session = new JSONRPC2Session(srvURL); session.trustAllCerts(true); } - public static void testSettings() throws InvalidPasswordException, JSONRPC2SessionException{ + public static void testSettings(ConfigurationManager conf) throws InvalidPasswordException, JSONRPC2SessionException{ // set in gui/Main //HttpsURLConnection.setDefaultHostnameVerifier(new ItoopieHostnameVerifier()); - setupSession(); - Authenticate.execute(); + setupSession(conf); + Authenticate.execute(pw); } public static JSONRPC2Response sendReq(JSONRPC2Request req) @@ -133,17 +131,17 @@ public class JSONRPC2Interface { // break; case -32002: // No token - token = Authenticate.execute(); + token = Authenticate.execute(pw); throw new FailedRequestException(); // break; case -32003: // Invalid token - token = Authenticate.execute(); + token = Authenticate.execute(pw); throw new FailedRequestException(); //break; case -32004: // Token expired - token = Authenticate.execute(); + token = Authenticate.execute(pw); throw new FailedRequestException(); // break; case -32005: diff --git a/src/net/i2p/itoopie/i2pcontrol/methods/Authenticate.java b/src/net/i2p/itoopie/i2pcontrol/methods/Authenticate.java index a1e051935..3de4affb8 100644 --- a/src/net/i2p/itoopie/i2pcontrol/methods/Authenticate.java +++ b/src/net/i2p/itoopie/i2pcontrol/methods/Authenticate.java @@ -18,17 +18,13 @@ import com.thetransactioncompany.jsonrpc2.JSONRPC2Response; import com.thetransactioncompany.jsonrpc2.client.JSONRPC2SessionException; public class Authenticate { - private final static ConfigurationManager _conf = ConfigurationManager.getInstance(); - private final static Log _log = LogFactory.getLog(Authenticate.class); - private final static String DEFAULT_PASSWORD = "itoopie"; - public static String execute() + public static String execute(String password) throws InvalidPasswordException, JSONRPC2SessionException { JSONRPC2Request req = new JSONRPC2Request("Authenticate", JSONRPC2Interface.incrNonce()); Map outParams = new HashMap(); - outParams.put("Password", - _conf.getConf("server.password", _conf.getConf("server.password", DEFAULT_PASSWORD))); + outParams.put("Password", password); outParams.put("API", ItoopieVersion.I2PCONTROL_API_VERSION); req.setParams(outParams); @@ -40,6 +36,7 @@ public class Authenticate { }catch (UnrecoverableFailedRequestException e) { return null; // Shouldn't normally happen. } catch (InvalidParametersException e) { + Log _log = LogFactory.getLog(Authenticate.class); _log.error("getNewToken() invalid parameters used"); } return null; diff --git a/src/net/i2p/itoopie/security/CertificateManager.java b/src/net/i2p/itoopie/security/CertificateManager.java index 0a41d0096..891fcafc4 100644 --- a/src/net/i2p/itoopie/security/CertificateManager.java +++ b/src/net/i2p/itoopie/security/CertificateManager.java @@ -22,8 +22,6 @@ import java.security.cert.X509Certificate; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; -import net.i2p.itoopie.configuration.ConfigurationManager; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -44,9 +42,9 @@ public class CertificateManager { } - public static boolean verifyCert(String storedCertAlias, X509Certificate cert){ + public static boolean verifyCert(File dir, String storedCertAlias, X509Certificate cert) { try { - X509Certificate storedCert = (X509Certificate) getDefaultKeyStore().getCertificate(storedCertAlias); + X509Certificate storedCert = (X509Certificate) getDefaultKeyStore(dir).getCertificate(storedCertAlias); storedCert.verify(cert.getPublicKey()); return true; } catch (KeyStoreException e) { @@ -56,9 +54,9 @@ public class CertificateManager { } } - public static boolean contains(String certName) { + public static boolean contains(File dir, String certName) { try { - return getDefaultKeyStore().containsAlias(certName); + return getDefaultKeyStore(dir).containsAlias(certName); } catch (KeyStoreException e) { _log.error("Error reading certificate with alias, " + certName + " from KeyStore", e); } @@ -73,6 +71,7 @@ public class CertificateManager { * @param cert - X509Certificate to store * @return - True if store was successful, false in other cases. */ +/* public static boolean putServerCert(String name, X509Certificate cert) { KeyStore ks = getDefaultKeyStore(); try { @@ -89,6 +88,7 @@ public class CertificateManager { } return false; } +*/ /** @@ -98,11 +98,11 @@ public class CertificateManager { * @param cert - X509Certificate to store * @return - True if store was successful, false in other cases. */ - public static boolean forcePutServerCert(String name, X509Certificate cert) { - KeyStore ks = getDefaultKeyStore(); + public static boolean forcePutServerCert(File dir, String name, X509Certificate cert) { + KeyStore ks = getDefaultKeyStore(dir); try { ks.setCertificateEntry(name, cert); - saveKeyStore(ks); + saveKeyStore(ks, dir); return true; } catch (KeyStoreException e) { e.printStackTrace(); @@ -118,14 +118,14 @@ public class CertificateManager { * @param cert - X509Certificate to overwrite * @return - True if the overwrite was successful, false in other cases */ - public static boolean overwriteServerCert(String name, X509Certificate cert){ - KeyStore ks = getDefaultKeyStore(); + public static boolean overwriteServerCert(File dir, String name, X509Certificate cert){ + KeyStore ks = getDefaultKeyStore(dir); try { if (ks.containsAlias(name)){ return false; } else { - getDefaultKeyStore().setCertificateEntry(name, cert); - saveKeyStore(ks); + getDefaultKeyStore(dir).setCertificateEntry(name, cert); + saveKeyStore(ks, dir); return true; } } catch (KeyStoreException e) { @@ -138,6 +138,7 @@ public class CertificateManager { * Get trustManagers for the currently loaded certificates * @return - Returns trustmanagers for currently loaded certificates */ +/* public static TrustManager[] getTrustManagers(){ try { TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509","SunJSSE"); @@ -152,17 +153,17 @@ public class CertificateManager { } return null; } - +*/ /** * Get KeyStore containing server certs. * @return - KeyStore used for keeping track of server. */ - private static synchronized KeyStore getDefaultKeyStore(){ + private static synchronized KeyStore getDefaultKeyStore(File dir) { if (_ks == null){ try { _ks = KeyStore.getInstance(DEFAULT_KEYSTORE_TYPE); - File f = new File(ConfigurationManager.getAppConfDir(), DEFAULT_KEYSTORE_LOCATION); + File f = new File(dir, DEFAULT_KEYSTORE_LOCATION); if (f.exists()) { InputStream is = new FileInputStream(f); _ks.load(is, DEFAULT_KEYSTORE_PASSWORD.toCharArray()); @@ -176,7 +177,7 @@ public class CertificateManager { try { _ks = KeyStore.getInstance(DEFAULT_KEYSTORE_TYPE); _ks.load(null, DEFAULT_KEYSTORE_PASSWORD.toCharArray()); - saveKeyStore(_ks); + saveKeyStore(_ks, dir); return _ks; } catch (Exception e){ // Log perhaps? @@ -187,9 +188,9 @@ public class CertificateManager { } } - private static void saveKeyStore(KeyStore ks){ + private static void saveKeyStore(KeyStore ks, File dir) { try { - ks.store(new FileOutputStream(new File(ConfigurationManager.getAppConfDir(), DEFAULT_KEYSTORE_LOCATION)), DEFAULT_KEYSTORE_PASSWORD.toCharArray()); + ks.store(new FileOutputStream(new File(dir, DEFAULT_KEYSTORE_LOCATION)), DEFAULT_KEYSTORE_PASSWORD.toCharArray()); } catch (KeyStoreException e) { // TODO Auto-generated catch block e.printStackTrace(); diff --git a/src/net/i2p/itoopie/security/ItoopieHostnameVerifier.java b/src/net/i2p/itoopie/security/ItoopieHostnameVerifier.java index f1750f37c..121d400a5 100644 --- a/src/net/i2p/itoopie/security/ItoopieHostnameVerifier.java +++ b/src/net/i2p/itoopie/security/ItoopieHostnameVerifier.java @@ -1,5 +1,6 @@ package net.i2p.itoopie.security; +import java.io.File; import java.util.HashSet; import javax.net.ssl.HostnameVerifier; @@ -18,9 +19,11 @@ public class ItoopieHostnameVerifier implements HostnameVerifier { private static final HashSet recentlyDeniedHosts = new HashSet(); private static final Object _uiLock = new Object(); private final Main _main; + private final File _dir; - public ItoopieHostnameVerifier(Main main) { + public ItoopieHostnameVerifier(Main main, File dir) { _main = main; + _dir = dir; } public boolean verify(String urlHostName, SSLSession session) { @@ -33,12 +36,12 @@ public class ItoopieHostnameVerifier implements HostnameVerifier { return false; // Deny recently denied hosts. } - if (CertificateManager.contains(serverHost)) { - if (CertificateManager.verifyCert(serverHost, CertificateHelper.convert(certs[0]))) { + if (CertificateManager.contains(_dir, serverHost)) { + if (CertificateManager.verifyCert(_dir, serverHost, CertificateHelper.convert(certs[0]))) { return true; // Remote host has provided valid certificate that is stored locally. } else { // Remote host has provided a certificate that != the stored certificate for this host - if (CertificateGUI.overwriteCert(_main, serverHost, certs[0])) { + if (CertificateGUI.overwriteCert(_main, _dir, serverHost, certs[0])) { return true; } else { recentlyDeniedHosts.add(session.getPeerHost() + ":" + session.getPeerPort()); @@ -47,7 +50,7 @@ public class ItoopieHostnameVerifier implements HostnameVerifier { } } else { // GUI, Add new host! new host - if (CertificateGUI.saveNewCert(_main, serverHost, certs[0])) { + if (CertificateGUI.saveNewCert(_main, _dir, serverHost, certs[0])) { return true; } else { recentlyDeniedHosts.add(session.getPeerHost() + ":" + session.getPeerPort());