diff --git a/src/net/i2p/itoopie/Main.java b/src/net/i2p/itoopie/Main.java index 9557d3686..6585480bb 100644 --- a/src/net/i2p/itoopie/Main.java +++ b/src/net/i2p/itoopie/Main.java @@ -10,7 +10,6 @@ import java.util.Timer; import java.util.Map.Entry; import java.util.Set; -import javax.net.ssl.HttpsURLConnection; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; @@ -23,7 +22,6 @@ import com.thetransactioncompany.jsonrpc2.client.JSONRPC2SessionException; import net.i2p.itoopie.configuration.ConfigurationManager; import net.i2p.itoopie.gui.GUIHelper; import net.i2p.itoopie.gui.TrayManager; -import net.i2p.itoopie.gui.WindowHandler; import net.i2p.itoopie.i2pcontrol.InvalidParametersException; import net.i2p.itoopie.i2pcontrol.InvalidPasswordException; import net.i2p.itoopie.i2pcontrol.JSONRPC2Interface; @@ -39,7 +37,6 @@ import net.i2p.itoopie.i2pcontrol.methods.SetI2PControl; import net.i2p.itoopie.i2pcontrol.methods.SetNetworkSetting; import net.i2p.itoopie.i2pcontrol.methods.SetRouterManager; import net.i2p.itoopie.maintenance.ReseedMonitor; -import net.i2p.itoopie.security.ItoopieHostnameVerifier; /** * The main class of the application. @@ -47,32 +44,35 @@ import net.i2p.itoopie.security.ItoopieHostnameVerifier; public class Main { ///Manages the lifetime of the tray icon. - private TrayManager trayManager = null; - private static ConfigurationManager _conf; + private TrayManager trayManager; + private final ConfigurationManager _conf; private static Timer reseedMonitor; - private static Log _log; + private final Log _log; + + public Main() { + _conf = ConfigurationManager.getInstance(); + _log = LogFactory.getLog(Main.class); + } /** * Start the tray icon code (loads tray icon in the tray area). * @throws Exception */ public void startUp() throws Exception { - trayManager = TrayManager.getInstance(); + trayManager = new TrayManager(this); trayManager.startManager(); } public static void main(String[] args) { - beginStartup(args); + Main main = new Main(); + main.beginStartup(args); } /** * Main method launching the application. */ - public static void beginStartup(String[] args) { + public void beginStartup(String[] args) { System.setProperty("java.awt.headless", "false"); - _conf = ConfigurationManager.getInstance(); - _log = LogFactory.getLog(Main.class); - HttpsURLConnection.setDefaultHostnameVerifier(new ItoopieHostnameVerifier()); try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); @@ -84,16 +84,13 @@ public class Main { } - final Main main = new Main(); - main.launchForeverLoop(); + launchForeverLoop(); try { - main.startUp(); + startUp(); } catch (Exception e) { _log.error("Error during TrayManager launch.", e); } - // Popup Main window. - WindowHandler.toggleFrames(); // Start running periodic task after 2 minutes, run periodically every 10th minute. @@ -104,7 +101,7 @@ public class Main { } @SuppressWarnings("static-access") - public static void beginShutdown(){ + public void beginShutdown(){ _conf.writeConfFile(); System.exit(0); } @@ -131,6 +128,7 @@ public class Main { } +/* private static void testStuff(){ _conf.parseConfigStr("server.hostname=127.0.0.1"); _conf.parseConfigStr("server.port=5555"); @@ -138,7 +136,6 @@ public class Main { // Try port switching - /* System.out.println("\nI2PControl - Port Switch"); try { HashMap hm = new HashMap(); @@ -268,7 +265,6 @@ public class Main { System.out.println("Bad parameters sent.."); } - */ // Test reading all router info System.out.println("\nGetRouterInfo"); try { @@ -287,7 +283,6 @@ public class Main { // Test restart - worked at one point :) Possibly now as well. - /* System.out.println("\nSetRouterRunner: Restart"); try { SetRouterRunner.execute(ROUTER_RUNNER.RESTART); @@ -295,10 +290,9 @@ public class Main { System.out.println("Invalid password.."); } catch (JSONRPC2SessionException e) { System.out.println("Connection failed.."); - }*/ + } // Test restart graceful - worked at one point :) Possibly now as well. - /* System.out.println("\nSetRouterRunner: Restart Graceful"); try { SetRouterRunner.execute(ROUTER_RUNNER.RESTART_GRACEFUL); @@ -306,9 +300,8 @@ public class Main { System.out.println("Invalid password.."); } catch (JSONRPC2SessionException e) { System.out.println("Connection failed.."); - }*/ + } - /* // Test shutdown - worked at one point :) Possibly now as well. System.out.println("\nSetRouterRunner: Shutdown "); try { @@ -318,7 +311,6 @@ public class Main { } catch (JSONRPC2SessionException e) { System.out.println("Connection failed.."); } - */ } - +*/ } diff --git a/src/net/i2p/itoopie/gui/CertificateGUI.java b/src/net/i2p/itoopie/gui/CertificateGUI.java index 24f7f9171..15d82656d 100644 --- a/src/net/i2p/itoopie/gui/CertificateGUI.java +++ b/src/net/i2p/itoopie/gui/CertificateGUI.java @@ -15,12 +15,14 @@ import net.i2p.itoopie.security.CertificateManager; public class CertificateGUI { +/* public static void main(String[] args){ System.out.println("Save new cert: " + saveNewCert(null,null)); System.out.println("Overwrite cert: " + overwriteCert(null,null)); } +*/ - public static synchronized boolean saveNewCert(String hostname, X509Certificate cert){ + public static synchronized boolean saveNewCert(Main main, String hostname, X509Certificate cert){ JFrame frame = new JFrame(); frame.setLayout(new BorderLayout()); JButton bt = new JButton(); @@ -58,7 +60,7 @@ public class CertificateGUI { if (n == JOptionPane.YES_OPTION){ CertificateManager.forcePutServerCert(hostname, CertificateHelper.convert(cert)); - updateUI(); + updateUI(main); return true; } else { return false; @@ -66,7 +68,7 @@ public class CertificateGUI { } - public static boolean overwriteCert(String hostname, X509Certificate cert){ + public static boolean overwriteCert(Main main, String hostname, X509Certificate cert){ JFrame frame = new JFrame(); String title = Transl._t("Warning, new remote host detected"); @@ -108,7 +110,7 @@ public class CertificateGUI { JOptionPane.ERROR_MESSAGE); if (n == JOptionPane.YES_OPTION){ CertificateManager.forcePutServerCert(hostname, CertificateHelper.convert(cert)); - updateUI(); + updateUI(main); return true; // Confirmation positive } else { return false; // Confirmation negative @@ -121,7 +123,7 @@ public class CertificateGUI { /** * Upon new cert accepted it is probable a good idea to show it by updating the GUI. */ - private static void updateUI(){ + private static void updateUI(final Main main) { // Sleep before updating. (new Thread(){ @Override @@ -133,7 +135,7 @@ public class CertificateGUI { @Override public void run() { - Main.fireNewChange(); + main.fireNewChange(); } }); } diff --git a/src/net/i2p/itoopie/gui/Main.java b/src/net/i2p/itoopie/gui/Main.java index 04d8e06a3..577b99909 100644 --- a/src/net/i2p/itoopie/gui/Main.java +++ b/src/net/i2p/itoopie/gui/Main.java @@ -3,6 +3,7 @@ package net.i2p.itoopie.gui; import java.awt.Dimension; import java.awt.EventQueue; +import javax.net.ssl.HttpsURLConnection; import javax.swing.JFrame; import javax.swing.JTabbedPane; import java.awt.BorderLayout; @@ -19,6 +20,7 @@ import net.i2p.itoopie.gui.component.RegisteredFrame; import net.i2p.itoopie.gui.component.TabLogoPanel; import net.i2p.itoopie.gui.component.util.TabChangeListener; import net.i2p.itoopie.i18n.Transl; +import net.i2p.itoopie.security.ItoopieHostnameVerifier; import net.i2p.itoopie.util.IconLoader; import javax.swing.border.Border; @@ -31,8 +33,9 @@ import java.awt.FlowLayout; public class Main { - private static JFrame frame; - private static JTabbedPane tabbedPane; + private JFrame frame; + private JTabbedPane tabbedPane; + private final WindowHandler windowHandler; public final static int FRAME_WIDTH = 550; public final static int FRAME_HEIGHT = 400; public final static int TABBED_PANE_HEIGHT = FRAME_HEIGHT - 66; @@ -40,6 +43,7 @@ public class Main { /** * Launch the application. */ +/* public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { @@ -52,11 +56,14 @@ public class Main { } }); } +*/ /** * Create the application. */ - public Main() { + public Main(WindowHandler wh) { + windowHandler = wh; + HttpsURLConnection.setDefaultHostnameVerifier(new ItoopieHostnameVerifier(this)); initialize(); } @@ -67,7 +74,7 @@ public class Main { GUIHelper.setDefaultStyle(); //GUIHelper.setTabLooks(); - frame = new RegisteredFrame("itoopie"); + frame = new RegisteredFrame("itoopie", windowHandler); frame.setBounds(0, 0, FRAME_WIDTH, FRAME_HEIGHT); frame.setResizable(false); frame.setBackground(GUIHelper.VERY_LIGHT); @@ -75,7 +82,7 @@ public class Main { root.setLayout(null); //root.setBorder(BorderFactory.createLineBorder(GUIHelper.MEDIUM)); - WindowHandler.registerMain(frame); + windowHandler.registerMain(frame); tabbedPane = new JTabbedPane(JTabbedPane.TOP); root.add(tabbedPane); @@ -93,7 +100,7 @@ public class Main { // pass overview tab to settingsframe to reset the charts on change - TabLogoPanel settingsTab = new SettingsFrame("itoopie-opaque12", overviewTab); + TabLogoPanel settingsTab = new SettingsFrame("itoopie-opaque12", this, overviewTab); tabbedPane.addTab(' ' + Transl._t("Settings") + ' ', icon, settingsTab, null); tabbedPane.addChangeListener(new TabChangeListener(settingsTab)); @@ -129,7 +136,7 @@ public class Main { /** * Used to manually trigger updates for the tab being shown. */ - public static void fireNewChange(){ + public void fireNewChange() { for (ChangeListener ch : tabbedPane.getChangeListeners()){ ch.stateChanged(new ChangeEvent(tabbedPane)); } diff --git a/src/net/i2p/itoopie/gui/SettingsFrame.java b/src/net/i2p/itoopie/gui/SettingsFrame.java index 90b0b053f..d0de4aa5e 100644 --- a/src/net/i2p/itoopie/gui/SettingsFrame.java +++ b/src/net/i2p/itoopie/gui/SettingsFrame.java @@ -90,15 +90,17 @@ public class SettingsFrame extends TabLogoPanel { private final ConfigurationManager _conf; private final OverviewTab _otab; + private final Main _main; /** * Create the application. */ - public SettingsFrame(String imageName, OverviewTab otab) { + public SettingsFrame(String imageName, Main m, OverviewTab otab) { super(imageName); setLayout(null); _conf = ConfigurationManager.getInstance(); _otab = otab; + _main = m; initialize(); } @@ -200,7 +202,7 @@ public class SettingsFrame extends TabLogoPanel { newAddressStatus != REMOTE_SAVE_STATUS.SAVE_FAILED_LOCALLY && newAddressStatus != REMOTE_SAVE_STATUS.SAVE_FAILED_REMOTELY */ ) { - Main.fireNewChange(); + _main.fireNewChange(); } } }); diff --git a/src/net/i2p/itoopie/gui/TrayManager.java b/src/net/i2p/itoopie/gui/TrayManager.java index 62c0c8312..530c13a09 100644 --- a/src/net/i2p/itoopie/gui/TrayManager.java +++ b/src/net/i2p/itoopie/gui/TrayManager.java @@ -28,45 +28,44 @@ import net.i2p.itoopie.util.IsJar; */ public class TrayManager { - private static TrayManager instance = null; ///The tray area, or null if unsupported - protected SystemTray tray = null; + protected SystemTray tray; ///Our tray icon, or null if unsupported - protected TrayIcon trayIcon = null; - + protected TrayIcon trayIcon; + private final net.i2p.itoopie.Main main; /** * Instantiate tray manager. */ - protected TrayManager() {} - - public static synchronized TrayManager getInstance() { - if(instance == null) { - instance = new TrayManager(); - } - return instance; + public TrayManager(net.i2p.itoopie.Main m) { + main = m; } - + /** * Add the tray icon to the system tray and start everything up. */ public synchronized void startManager() { + final WindowHandler windowHandler = new WindowHandler(); + windowHandler.toggleFrames(); + // so the tray icon works right on Gnome + try { Thread.sleep(500); } catch (InterruptedException ie) {} SwingUtilities.invokeLater(new Runnable(){ public void run(){ if(SystemTray.isSupported()) { + final Image img = IconLoader.getTrayImage(); tray = SystemTray.getSystemTray(); - trayIcon = new TrayIcon(IconLoader.getTrayImage(), "itoopie", getMainMenu()); + trayIcon = new TrayIcon(img, "itoopie", getMainMenu()); trayIcon.setImageAutoSize(true); //Resize image to fit the system tray + try { + tray.add(trayIcon); + } catch (AWTException e) { e.printStackTrace(); } trayIcon.addMouseListener(new MouseAdapter(){ @Override public void mouseClicked(MouseEvent arg0) { - WindowHandler.toggleFrames(); + windowHandler.toggleFrames(); } }); - try { - tray.add(trayIcon); - } catch (AWTException e) {} } } }); @@ -106,7 +105,7 @@ public class TrayManager { @Override protected Object doInBackground() throws Exception { - Main.beginShutdown(); + main.beginShutdown(); return null; } }.execute(); diff --git a/src/net/i2p/itoopie/gui/WindowHandler.java b/src/net/i2p/itoopie/gui/WindowHandler.java index 46625c3e4..0e20f5276 100644 --- a/src/net/i2p/itoopie/gui/WindowHandler.java +++ b/src/net/i2p/itoopie/gui/WindowHandler.java @@ -6,19 +6,19 @@ import java.util.HashSet; import javax.swing.JFrame; public class WindowHandler { - private static final HashSet _frames = new HashSet(); - private static JFrame mainFrame; - private static boolean areFramesShown = false; - - public static void register(JFrame frame){ + private final HashSet _frames = new HashSet(); + private JFrame mainFrame; + private boolean areFramesShown; + + public void register(JFrame frame){ _frames.add(frame); } - public static void registerMain(JFrame frame){ + public void registerMain(JFrame frame){ mainFrame = frame; } - public static void deRegister(JFrame frame){ + public void deRegister(JFrame frame){ // don't remove the main frame when // the user clicks on the X, so we have the updated // graph when the user clicks on the icon again @@ -28,7 +28,7 @@ public class WindowHandler { _frames.remove(frame); } - public static void hideFrames(){ + public void hideFrames(){ for (JFrame frame : _frames){ frame.setVisible(false); } @@ -38,7 +38,7 @@ public class WindowHandler { areFramesShown = false; } - public static void showFrames(){ + public void showFrames(){ for (JFrame frame : _frames){ frame.setVisible(true); } @@ -48,9 +48,9 @@ public class WindowHandler { areFramesShown = true; } - public static void toggleFrames(){ + public void toggleFrames(){ if (_frames.isEmpty()){ - new Main(); + new Main(this); } else { if (areFramesShown){ hideFrames(); diff --git a/src/net/i2p/itoopie/gui/component/RegisteredFrame.java b/src/net/i2p/itoopie/gui/component/RegisteredFrame.java index 565055e97..2a8c4f887 100644 --- a/src/net/i2p/itoopie/gui/component/RegisteredFrame.java +++ b/src/net/i2p/itoopie/gui/component/RegisteredFrame.java @@ -10,25 +10,18 @@ import net.i2p.itoopie.util.IconLoader; public class RegisteredFrame extends JFrame implements WindowListener{ private static final long serialVersionUID = 3351260168651061327L; + private final WindowHandler windowHandler; - public RegisteredFrame(String name) { - super(name); - super.addWindowListener(this); - WindowHandler.register(this); - this.setIconImage(IconLoader.getIcon("itoopie", 128)); + public RegisteredFrame(String name, WindowHandler wh) { + super(name); + super.addWindowListener(this); + windowHandler = wh; + windowHandler.register(this); + this.setIconImage(IconLoader.getIcon("itoopie", 128)); } - - public RegisteredFrame() { - super(); - super.addWindowListener(this); - WindowHandler.register(this); - this.setIconImage(IconLoader.getIcon("itoopie", 128)); - } - - public void windowClosing(WindowEvent e) { - WindowHandler.deRegister(this); + windowHandler.deRegister(this); this.dispose(); } diff --git a/src/net/i2p/itoopie/i2pcontrol/JSONRPC2Interface.java b/src/net/i2p/itoopie/i2pcontrol/JSONRPC2Interface.java index cc1a78392..615ed120f 100644 --- a/src/net/i2p/itoopie/i2pcontrol/JSONRPC2Interface.java +++ b/src/net/i2p/itoopie/i2pcontrol/JSONRPC2Interface.java @@ -73,7 +73,8 @@ public class JSONRPC2Interface { } public static void testSettings() throws InvalidPasswordException, JSONRPC2SessionException{ - HttpsURLConnection.setDefaultHostnameVerifier(new ItoopieHostnameVerifier()); + // set in gui/Main + //HttpsURLConnection.setDefaultHostnameVerifier(new ItoopieHostnameVerifier()); setupSession(); Authenticate.execute(); } diff --git a/src/net/i2p/itoopie/maintenance/ReseedMonitor.java b/src/net/i2p/itoopie/maintenance/ReseedMonitor.java index bd4ec2e5f..6123c5649 100644 --- a/src/net/i2p/itoopie/maintenance/ReseedMonitor.java +++ b/src/net/i2p/itoopie/maintenance/ReseedMonitor.java @@ -32,11 +32,7 @@ import net.i2p.itoopie.security.ItoopieHostnameVerifier; */ public class ReseedMonitor extends TimerTask{ private static final Long MIN_KNOWN_PEERS = new Long(30); - private static final Log _log; - - static { - _log = LogFactory.getLog(ReseedMonitor.class); - } + private final Log _log = LogFactory.getLog(ReseedMonitor.class); @Override public void run(){ @@ -60,6 +56,7 @@ public class ReseedMonitor extends TimerTask{ } +/* public static void main(String[] args){ System.out.println("Reading config file.."); ConfigurationManager _conf = ConfigurationManager.getInstance(); @@ -105,5 +102,5 @@ public class ReseedMonitor extends TimerTask{ e.printStackTrace(); } } - +*/ } diff --git a/src/net/i2p/itoopie/security/ItoopieHostnameVerifier.java b/src/net/i2p/itoopie/security/ItoopieHostnameVerifier.java index 178d94372..f1750f37c 100644 --- a/src/net/i2p/itoopie/security/ItoopieHostnameVerifier.java +++ b/src/net/i2p/itoopie/security/ItoopieHostnameVerifier.java @@ -11,11 +11,17 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import net.i2p.itoopie.gui.CertificateGUI; +import net.i2p.itoopie.gui.Main; public class ItoopieHostnameVerifier implements HostnameVerifier { - private static final Log _log = LogFactory.getLog(ItoopieHostnameVerifier.class); + private final Log _log = LogFactory.getLog(ItoopieHostnameVerifier.class); private static final HashSet recentlyDeniedHosts = new HashSet(); private static final Object _uiLock = new Object(); + private final Main _main; + + public ItoopieHostnameVerifier(Main main) { + _main = main; + } public boolean verify(String urlHostName, SSLSession session) { String serverHost = session.getPeerHost() + ":" + session.getPeerPort(); @@ -32,7 +38,7 @@ public class ItoopieHostnameVerifier implements HostnameVerifier { 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(serverHost, certs[0])) { + if (CertificateGUI.overwriteCert(_main, serverHost, certs[0])) { return true; } else { recentlyDeniedHosts.add(session.getPeerHost() + ":" + session.getPeerPort()); @@ -41,7 +47,7 @@ public class ItoopieHostnameVerifier implements HostnameVerifier { } } else { // GUI, Add new host! new host - if (CertificateGUI.saveNewCert(serverHost, certs[0])) { + if (CertificateGUI.saveNewCert(_main, serverHost, certs[0])) { return true; } else { recentlyDeniedHosts.add(session.getPeerHost() + ":" + session.getPeerPort()); @@ -60,6 +66,8 @@ public class ItoopieHostnameVerifier implements HostnameVerifier { * host that has had it's certificate denied recently. */ public static void clearRecentlyDenied() { - recentlyDeniedHosts.clear(); + synchronized (_uiLock) { + recentlyDeniedHosts.clear(); + } } }