Author: toad
Date: 2008-11-14 13:08:14 +0000 (Fri, 14 Nov 2008)
New Revision: 23570

Modified:
   trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
   trunk/freenet/src/freenet/node/FNPPacketMangler.java
   trunk/freenet/src/freenet/node/KeyTracker.java
   trunk/freenet/src/freenet/node/StillNotAckedException.java
Log:
Warn the user via a useralert when peers are being disconnected due to packet 
not acked.
This is a better alternative to flooding the logs - it still gets reported, and 
the user's node doesn't get DoSed.


Modified: trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties
===================================================================
--- trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties   2008-11-14 
13:04:13 UTC (rev 23569)
+++ trunk/freenet/src/freenet/l10n/freenet.l10n.en.properties   2008-11-14 
13:08:14 UTC (rev 23570)
@@ -472,6 +472,8 @@
 FileOffer.succeededReceiveTitle=Successfully received file
 FileOffer.succeededReceiveHeader=The transfer of the file ${filename} from 
${node} was a success.
 FileOffer.succeededReceiveShort=Successfully received ${filename} from ${node}.
+FNPPacketMangler.somePeersDisconnectedStillNotAcked=Probably a bug: please 
report: ${count} peers forcibly disconnected due to not acknowledging packets 
in 10 minutes.
+FNPPacketMangler.somePeersDisconnectedStillNotAckedDetail=${count} of your 
peers are having severe problems. This is probably due to a bug in the code. 
Please report it to us at the bug tracker at 
${link}https://bugs.freenetproject.org/${/link} or at [EMAIL PROTECTED] Please 
include this message and what version of the node you are running. The affected 
peers (you may not want to include this in your bug report if they are darknet 
peers) are:
 GIFFilter.invalidHeader=The file does not contain a valid GIF header.
 GIFFilter.invalidHeaderTitle=Invalid header
 GIFFilter.notGif=The file you tried to fetch is not a GIF. It might be some 
other file format, and your browser may do something dangerous with it, 
therefore we have blocked it.

Modified: trunk/freenet/src/freenet/node/FNPPacketMangler.java
===================================================================
--- trunk/freenet/src/freenet/node/FNPPacketMangler.java        2008-11-14 
13:04:13 UTC (rev 23569)
+++ trunk/freenet/src/freenet/node/FNPPacketMangler.java        2008-11-14 
13:08:14 UTC (rev 23570)
@@ -8,6 +8,7 @@
 import java.security.MessageDigest;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedList;
 
 import net.i2p.util.NativeBigInteger;
@@ -39,8 +40,11 @@
 import freenet.io.comm.ReferenceSignatureVerificationException;
 import freenet.io.comm.SocketHandler;
 import freenet.io.comm.Peer.LocalAddressException;
+import freenet.l10n.L10n;
+import freenet.node.useralerts.UserAlert;
 import freenet.support.ByteArrayWrapper;
 import freenet.support.Fields;
+import freenet.support.HTMLNode;
 import freenet.support.HexUtil;
 import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
@@ -2358,6 +2362,7 @@
                } catch (StillNotAckedException e) {
                        Logger.error(this, "Forcing disconnect on 
"+tracker.pn+" for "+tracker+" because packets not acked after 10 minutes!");
                        tracker.pn.forceDisconnect(true);
+                       disconnectedStillNotAcked(tracker);
                        throw new NotConnectedException();
                }
 
@@ -2554,6 +2559,106 @@
                return ret;
        }
 
+       private HashSet<Peer> peersWithProblems = new HashSet<Peer>();
+       
+       private void disconnectedStillNotAcked(KeyTracker tracker) {
+               synchronized(peersWithProblems) {
+                       peersWithProblems.add(tracker.pn.getPeer());
+                       if(peersWithProblems.size() > 1) return;
+               }
+               node.clientCore.alerts.register(disconnectedStillNotAckedAlert);
+       }
+       
+       private UserAlert disconnectedStillNotAckedAlert = new UserAlert() {
+
+               public String anchor() {
+                       return "disconnectedStillNotAcked";
+               }
+
+               public String dismissButtonText() {
+                       return null;
+               }
+
+               public short getPriorityClass() {
+                       return UserAlert.ERROR;
+               }
+
+               public String getShortText() {
+                       int sz;
+                       synchronized(peersWithProblems) {
+                               sz = peersWithProblems.size();
+                       }
+                       return l10n("somePeersDisconnectedStillNotAcked", 
"count", Integer.toString(sz));
+               }
+
+               public HTMLNode getHTMLText() {
+                       HTMLNode div = new HTMLNode("div");
+                       Peer[] peers;
+                       synchronized(peersWithProblems) {
+                               peers = peersWithProblems.toArray(new 
Peer[peersWithProblems.size()]);
+                       }
+                       L10n.addL10nSubstitution(div, 
"FNPPacketMangler.somePeersDisconnectedStillNotAckedDetail", 
+                                       new String[] { "count", "link", "/link" 
}
+                                       , new String[] { 
Integer.toString(peers.length), "<a 
href=\"/__CHECKED_HTTPS_=https://bugs.freenetproject.org/\";>", "</a>" });
+                       HTMLNode list = div.addChild("ul");
+                       for(Peer peer : peers) {
+                               list.addChild("li", peer.toString());
+                       }
+                       return div;
+               }
+
+               public String getText() {
+                       StringBuffer sb = new StringBuffer();
+                       Peer[] peers;
+                       synchronized(peersWithProblems) {
+                               peers = peersWithProblems.toArray(new 
Peer[peersWithProblems.size()]);
+                       }
+                       
sb.append(l10n("somePeersDisconnectedStillNotAckedDetail", 
+                                       new String[] { "count", "link", "/link" 
},
+                                       new String[] { 
Integer.toString(peers.length), "", "" } ));
+                       sb.append('\n');
+                       for(Peer peer : peers) {
+                               sb.append('\t');
+                               sb.append(peer.toString());
+                               sb.append('\n');
+                       }
+                       return sb.toString();
+               }
+               
+               public String getTitle() {
+                       return getShortText();
+               }
+
+               public Object getUserIdentifier() {
+                       return FNPPacketMangler.this;
+               }
+
+               public boolean isEventNotification() {
+                       return false;
+               }
+
+               public boolean isValid() {
+                       return true;
+               }
+
+               public void isValid(boolean validity) {
+                       // Ignore
+               }
+
+               public void onDismiss() {
+                       // Ignore
+               }
+
+               public boolean shouldUnregisterOnDismiss() {
+                       return false;
+               }
+
+               public boolean userCanDismiss() {
+                       return false;
+               }
+
+       };
+
        /**
         * Encrypt and send a packet.
         * @param plaintext The packet's plaintext, including all formatting,
@@ -2623,6 +2728,14 @@
                return output.length + sock.getHeadersLength();
        }
 
+       protected String l10n(String key, String[] patterns, String[] values) {
+               return L10n.getString("FNPPacketMangler."+key, patterns, 
values);
+       }
+
+       protected String l10n(String key, String pattern, String value) {
+               return L10n.getString("FNPPacketMangler."+key, pattern, value);
+       }
+
        /* (non-Javadoc)
         * @see 
freenet.node.OutgoingPacketMangler#sendHandshake(freenet.node.PeerNode)
         */

Modified: trunk/freenet/src/freenet/node/KeyTracker.java
===================================================================
--- trunk/freenet/src/freenet/node/KeyTracker.java      2008-11-14 13:04:13 UTC 
(rev 23569)
+++ trunk/freenet/src/freenet/node/KeyTracker.java      2008-11-14 13:08:14 UTC 
(rev 23570)
@@ -859,7 +859,7 @@
                                                                
Logger.minor(this, "Packet " + qr.packetNumber + " sent over " + (now - 
qr.createdTime) + "ms ago and still not acked on " + this + " for " + pn);
                                                        if(now - qr.createdTime 
> 10 * 60 * 1000) {
                                                                
Logger.error(this, "Packet " + qr.packetNumber + " sent over " + (now - 
qr.createdTime) + "ms ago and still not acked on " + this + " for " + pn);
-                                                               throw new 
StillNotAckedException();
+                                                               throw new 
StillNotAckedException(this);
                                                        }
                                                }
                                                packetNumbers[realLength++] = 
packetNumber;

Modified: trunk/freenet/src/freenet/node/StillNotAckedException.java
===================================================================
--- trunk/freenet/src/freenet/node/StillNotAckedException.java  2008-11-14 
13:04:13 UTC (rev 23569)
+++ trunk/freenet/src/freenet/node/StillNotAckedException.java  2008-11-14 
13:08:14 UTC (rev 23570)
@@ -12,4 +12,10 @@
  */
 public class StillNotAckedException extends Exception {
 
+       public StillNotAckedException(KeyTracker tracker) {
+               this.tracker = tracker;
+       }
+       
+       final KeyTracker tracker;
+       
 }

_______________________________________________
cvs mailing list
[email protected]
http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs

Reply via email to