Author: toad
Date: 2008-04-12 12:09:28 +0000 (Sat, 12 Apr 2008)
New Revision: 19220

Modified:
   trunk/freenet/src/freenet/node/IPDetectorPluginManager.java
   trunk/freenet/src/freenet/node/NodeCrypto.java
Log:
Make the NAT warning dismissable unless there are ports which are more likely 
NATed than not.

Modified: trunk/freenet/src/freenet/node/IPDetectorPluginManager.java
===================================================================
--- trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2008-04-12 
11:56:51 UTC (rev 19219)
+++ trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2008-04-12 
12:09:28 UTC (rev 19220)
@@ -8,6 +8,7 @@
 import java.util.Set;
 import java.util.Vector;

+import freenet.io.AddressTracker;
 import freenet.io.comm.FreenetInetAddress;
 import freenet.io.comm.Peer;
 import freenet.l10n.L10n;
@@ -63,10 +64,10 @@
                        StringBuffer sb = new StringBuffer();
                        sb.append(super.getText());
                        if(portsNotForwarded.length == 1) {
-                               sb.append(l10n("suggestForwardPort", "port", 
Integer.toString(portsNotForwarded[0])));
+                               sb.append(l10n("suggestForwardPort", "port", 
Integer.toString(Math.abs(portsNotForwarded[0]))));
                        } else if(portsNotForwarded.length >= 2) {
                                sb.append(l10n("suggestForwardTwoPorts", new 
String[] { "port1", "port2" }, 
-                                               new String[] { 
Integer.toString(portsNotForwarded[0]), Integer.toString(portsNotForwarded[1]) 
}));
+                                               new String[] { 
Integer.toString(Math.abs(portsNotForwarded[0])), 
Integer.toString(Math.abs(portsNotForwarded[1])) }));
                                if(portsNotForwarded.length > 2)
                                        Logger.error(this, "Not able to tell 
user about more than 2 ports to forward! ("+portsNotForwarded.length+")");
                        }
@@ -88,7 +89,15 @@
                }

                public boolean userCanDismiss() {
-                       return !suggestPortForward;
+                       // If no ports need forwarding, make it dismissable 
immediately.
+                       if(!suggestPortForward) return true;
+                       // Prevent NPE.
+                       if(portsNotForwarded == null) return false;
+                       // If any port definitely does need forwarding, make it 
non-dismissable.
+                       for(int i=0;i<portsNotForwarded.length;i++)
+                               if(portsNotForwarded[i] < 0) return false; // 
Port definitely needs to be forwarded
+                       // Otherwise it is dismissable.
+                       return true;
                }

        }
@@ -125,17 +134,20 @@

        public int[] getUDPPortsNotForwarded() {
                OpennetManager om = node.getOpennet();
-               if(om == null || om.crypto.definitelyPortForwarded()) {
-                       if(node.darknetCrypto.definitelyPortForwarded()) {
+               int darknetStatus = 
node.darknetCrypto.getDetectedConnectivityStatus();
+               int opennetStatus = om == null ? AddressTracker.DONT_KNOW : 
om.crypto.getDetectedConnectivityStatus();
+               if(om == null || opennetStatus == 
AddressTracker.DEFINITELY_PORT_FORWARDED) {
+                       if(darknetStatus == 
AddressTracker.DEFINITELY_PORT_FORWARDED) {
                                return new int[] { };
                        } else {
-                               return new int[] { node.getDarknetPortNumber() 
};
+                               return new int[] { (darknetStatus < 
AddressTracker.DONT_KNOW ? -1 : 1) * node.getDarknetPortNumber() };
                        }
                } else {
-                       if(node.darknetCrypto.definitelyPortForwarded()) {
-                               return new int[] { om.crypto.portNumber };
+                       if(darknetStatus == 
AddressTracker.DEFINITELY_PORT_FORWARDED) {
+                               return new int[] { (opennetStatus < 
AddressTracker.DONT_KNOW ? -1 : 1 ) * om.crypto.portNumber };
                        } else {
-                               return new int[] { node.getDarknetPortNumber(), 
om.crypto.portNumber };
+                               return new int[] { (darknetStatus < 
AddressTracker.DONT_KNOW ? -1 : 1 ) * node.getDarknetPortNumber(), 
+                                               (opennetStatus < 
AddressTracker.DONT_KNOW ? -1 : 1 ) * om.crypto.portNumber };
                        }
                }
        }

Modified: trunk/freenet/src/freenet/node/NodeCrypto.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeCrypto.java      2008-04-12 11:56:51 UTC 
(rev 19219)
+++ trunk/freenet/src/freenet/node/NodeCrypto.java      2008-04-12 12:09:28 UTC 
(rev 19220)
@@ -504,6 +504,10 @@
        public boolean definitelyPortForwarded() {
                return socket.getDetectedConnectivityStatus() == 
AddressTracker.DEFINITELY_PORT_FORWARDED;
        }
+       
+       public int getDetectedConnectivityStatus() {
+               return socket.getDetectedConnectivityStatus();
+       }

        public FreenetInetAddress getBindTo() {
                return config.getBindTo();


Reply via email to