Author: zothar
Date: 2006-08-17 05:37:31 +0000 (Thu, 17 Aug 2006)
New Revision: 10154

Modified:
   trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/PeerNodeStatus.java
Log:
Added per-peer private notes and a FProxy interface.  New features and minor 
tweaks to the extra peer data facility.

Modified: trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java       
2006-08-17 03:02:43 UTC (rev 10153)
+++ trunk/freenet/src/freenet/clients/http/DarknetConnectionsToadlet.java       
2006-08-17 05:37:31 UTC (rev 10154)
@@ -319,6 +319,7 @@
                                
peerTableHeaderRow.addChild("th").addChild("span", new String[] { "title", 
"style" }, new String[] { "Probability of the node rejecting a request due to 
overload or causing a timeout.", "border-bottom: 1px dotted; cursor: help;" }, 
"Overload Probability");
                        }
                        peerTableHeaderRow.addChild("th").addChild("span", new 
String[] { "title", "style" }, new String[] { "How long since the node 
connected or was last seen", "border-bottom: 1px dotted; cursor: help;" }, 
"Connected\u00a0/\u00a0Idle");
+                       peerTableHeaderRow.addChild("th").addChild("span", new 
String[] { "title", "style" }, new String[] { "A private note concerning this 
peer", "border-bottom: 1px dotted; cursor: help;" }, "Private Note");

                        for (int peerIndex = 0, peerCount = 
peerNodeStatuses.length; peerIndex < peerCount; peerIndex++) {
                                PeerNodeStatus peerNodeStatus = 
peerNodeStatuses[peerIndex];
@@ -392,6 +393,9 @@
                                        peerRow.addChild("td", "class", 
"peer-idle", idleToString(now, idle));
                                }

+                               // private darknet node comment note column
+                               peerRow.addChild("td", "class", 
"peer-private-darknet-comment-note").addChild("input", new String[] { "type", 
"name", "size", "maxlength", "value" }, new String[] { "text", 
"peerPrivateNote_" + peerNodeStatus.hashCode(), "16", "250", 
peerNodeStatus.getPrivateDarknetCommentNote() });
+                               
                                if (path.endsWith("displaymessagetypes.html")) {
                                        HTMLNode messageCountRow = 
peerTable.addChild("tr", "class", "message-status");
                                        messageCountRow.addChild("td", 
"colspan", "2");
@@ -443,6 +447,7 @@
                        } else {
                                HTMLNode actionSelect = 
peerForm.addChild("select", "name", "action");
                                actionSelect.addChild("option", "value", "", 
"-- Select action --");
+                               actionSelect.addChild("option", "value", 
"update_notes", "Update changed private notes");
                                actionSelect.addChild("option", "value", 
"enable", "Enable selected peers");
                                actionSelect.addChild("option", "value", 
"disable", "Disable selected peers");
                                actionSelect.addChild("option", "value", 
"set_burst_only", "On selected peers, set BurstOnly");
@@ -576,6 +581,21 @@
                        headers.put("Location", "/darknet/");
                        ctx.sendReplyHeaders(302, "Found", headers, null, 0);
                        return;
+               } else if (request.isPartSet("submit") && 
request.getPartAsString("action",25).equals("update_notes")) {
+                       //int hashcode = 
Integer.decode(request.getParam("node")).intValue();
+                       
+                       PeerNode[] peerNodes = node.getDarknetConnections();
+                       for(int i = 0; i < peerNodes.length; i++) {
+                               if 
(request.isPartSet("peerPrivateNote_"+peerNodes[i].hashCode())) {
+                                       
if(!request.getPartAsString("peerPrivateNote_"+peerNodes[i].hashCode(),250).equals(peerNodes[i].getPrivateDarknetCommentNote()))
 {
+                                               
peerNodes[i].setPrivateDarknetCommentNote(request.getPartAsString("peerPrivateNote_"+peerNodes[i].hashCode(),250));
+                                       }
+                               }
+                       }
+                       MultiValueTable headers = new MultiValueTable();
+                       headers.put("Location", "/darknet/");
+                       ctx.sendReplyHeaders(302, "Found", headers, null, 0);
+                       return;
                } else if (request.isPartSet("submit") && 
request.getPartAsString("action",25).equals("enable")) {
                        //int hashcode = 
Integer.decode(request.getParam("node")).intValue();


Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2006-08-17 03:02:43 UTC (rev 
10153)
+++ trunk/freenet/src/freenet/node/Node.java    2006-08-17 05:37:31 UTC (rev 
10154)
@@ -393,6 +393,8 @@
        public static final int PEER_NODE_STATUS_LISTEN_ONLY = 10;
        public static final int N2N_TEXT_MESSAGE_TYPE_USERALERT = 1;
        public static final int EXTRA_PEER_DATA_TYPE_N2NTM = 1;
+       public static final int EXTRA_PEER_DATA_TYPE_PEER_NOTE = 2;
+       public static final int PEER_NOTE_TYPE_PRIVATE_DARKNET_COMMENT = 1;

        public final long bootID;
        public final long startupTime;

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2006-08-17 03:02:43 UTC 
(rev 10153)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2006-08-17 05:37:31 UTC 
(rev 10154)
@@ -271,6 +271,12 @@
     /** Average proportion of requests which are rejected or timed out */
     private TimeDecayingRunningAverage pRejected;

+    /** Private comment on the peer for /darknet/ page */
+    private String privateDarknetComment;
+    
+    /** Private comment on the peer for /darknet/ page's extra peer data file 
number */
+    private int privateDarknetCommentFileNumber;
+    
     /**
      * Create a PeerNode from a SimpleFieldSet containing a
      * node reference for one. This must contain the following
@@ -508,6 +514,9 @@

         // status may have changed from PEER_NODE_STATUS_DISCONNECTED to 
PEER_NODE_STATUS_NEVER_CONNECTED
         setPeerNodeStatus(now);
+        
+        privateDarknetComment = new String();
+        privateDarknetCommentFileNumber = -1;

                // Setup the extraPeerDataFileNumbers
                extraPeerDataFileNumbers = new Vector();
@@ -2432,6 +2441,29 @@
                if(extraPeerDataType == Node.EXTRA_PEER_DATA_TYPE_N2NTM) {
                        node.handleNodeToNodeTextMessageSimpleFieldSet(fs, 
this, fileNumber);
                        return true;
+               } else if(extraPeerDataType == 
Node.EXTRA_PEER_DATA_TYPE_PEER_NOTE) {
+                       String peerNoteTypeString = fs.get("peerNoteType");
+                       int peerNoteType = -1;
+                       try {
+                               peerNoteType = 
Integer.parseInt(peerNoteTypeString);
+                       } catch (NumberFormatException e) {
+                               Logger.error(this, "NumberFormatException 
parsing peerNoteType ("+peerNoteTypeString+") in file 
"+extraPeerDataFile.getPath());
+                               return false;
+                       }
+                       if(peerNoteType == 
Node.PEER_NOTE_TYPE_PRIVATE_DARKNET_COMMENT) {
+                               synchronized(privateDarknetComment) {
+                                       try {
+                                               privateDarknetComment = new 
String(Base64.decode(fs.get("privateDarknetComment")));
+                                       } catch (IllegalBase64Exception e) {
+                                               Logger.error(this, "Bad Base64 
encoding when decoding a private darknet comment SimpleFieldSet", e);
+                                               return false;
+                                       }
+                                       privateDarknetCommentFileNumber = 
fileNumber;
+                               }
+                               return true;
+                       }
+                       Logger.error(this, "Read unknown peer note type 
'"+peerNoteType+"' from file "+extraPeerDataFile.getPath());
+                       return false;
                }
                Logger.error(this, "Read unknown extra peer data type 
'"+extraPeerDataType+"' from file "+extraPeerDataFile.getPath());
                return false;
@@ -2466,12 +2498,12 @@
                        extraPeerDataFileNumbers.addElement(new 
Integer(nextFileNumber));
                }
                FileOutputStream fos;
-               File extraPeerDataPeerDataFile = new 
File(extraPeerDataPeerDir.getPath()+File.separator+nextFileNumber);
-               if(extraPeerDataPeerDataFile.exists()) {
-                       Logger.error(this, "Extra peer data file already 
exists: "+extraPeerDataPeerDataFile.getPath());
+               File extraPeerDataFile = new 
File(extraPeerDataPeerDir.getPath()+File.separator+nextFileNumber);
+               if(extraPeerDataFile.exists()) {
+                       Logger.error(this, "Extra peer data file already 
exists: "+extraPeerDataFile.getPath());
                        return -1;
                }
-               String f = extraPeerDataPeerDataFile.getPath();
+               String f = extraPeerDataFile.getPath();
                try {
                        fos = new FileOutputStream(f);
                } catch (FileNotFoundException e2) {
@@ -2508,7 +2540,7 @@
                }
                File extraPeerDataFile = new 
File(extraPeerDataDirPath+File.separator+getIdentityString()+File.separator+fileNumber);
                if(!extraPeerDataFile.exists()) {
-                       Logger.error(this, "Extra peer data directory for peer 
does not exist: "+extraPeerDataFile.getPath());
+                       Logger.error(this, "Extra peer data file for peer does 
not exist: "+extraPeerDataFile.getPath());
                        return;
                }
                synchronized(extraPeerDataFileNumbers) {
@@ -2518,5 +2550,70 @@
                }
                extraPeerDataFile.delete();
        }
+
+       public boolean rewriteExtraPeerDataFile(SimpleFieldSet fs, int 
extraPeerDataType, int fileNumber) {
+               String extraPeerDataDirPath = node.getExtraPeerDataDir();
+               if(extraPeerDataType > 0)
+                       fs.put("extraPeerDataType", 
Integer.toString(extraPeerDataType));
+               File extraPeerDataPeerDir = new 
File(extraPeerDataDirPath+File.separator+getIdentityString());
+               if(!extraPeerDataPeerDir.exists()) {
+                       Logger.error(this, "Extra peer data directory for peer 
does not exist: "+extraPeerDataPeerDir.getPath());
+                       return false;
+               }
+               if(!extraPeerDataPeerDir.isDirectory()) {
+                       Logger.error(this, "Extra peer data directory for peer 
not a directory: "+extraPeerDataPeerDir.getPath());
+                       return false;
+               }
+               File extraPeerDataFile = new 
File(extraPeerDataDirPath+File.separator+getIdentityString()+File.separator+fileNumber);
+               if(!extraPeerDataFile.exists()) {
+                       Logger.error(this, "Extra peer data file for peer does 
not exist: "+extraPeerDataFile.getPath());
+                       return false;
+               }
+               String f = extraPeerDataFile.getPath();
+               FileOutputStream fos;
+               try {
+                       fos = new FileOutputStream(f);
+               } catch (FileNotFoundException e2) {
+                       Logger.error(this, "Cannot write extra peer data file 
to disk: Cannot open "
+                                       + f + " - " + e2, e2);
+                       return false;
+               }
+               OutputStreamWriter w = new OutputStreamWriter(fos);
+               try {
+                       fs.writeTo(w);
+                       w.close();
+               } catch (IOException e) {
+                       try {
+                               w.close();
+                       } catch (IOException e1) {
+                               Logger.error(this, "Cannot close extra peer 
data file: "+e, e);
+                       }
+                       Logger.error(this, "Cannot write file: " + e, e);
+                       return false;
+               }
+               return true;
+       }
+       
+       public synchronized String getPrivateDarknetCommentNote() {
+               return privateDarknetComment;
+       }
+       
+       public synchronized void setPrivateDarknetCommentNote(String comment) {
+               int localFileNumber;
+               synchronized(privateDarknetComment) {
+                       privateDarknetComment = comment;
+                       localFileNumber = privateDarknetCommentFileNumber;
+               }
+               SimpleFieldSet fs = new SimpleFieldSet();
+               fs.put("peerNoteType", 
Integer.toString(Node.PEER_NOTE_TYPE_PRIVATE_DARKNET_COMMENT));
+               fs.put("privateDarknetComment", 
Base64.encode(comment.getBytes()));
+               if(localFileNumber == -1) {
+                       localFileNumber = writeNewExtraPeerDataFile(fs, 
Node.EXTRA_PEER_DATA_TYPE_PEER_NOTE);
+                       synchronized(privateDarknetComment) {
+                               privateDarknetCommentFileNumber = 
localFileNumber;
+                       }
+               } else {
+                       rewriteExtraPeerDataFile(fs, 
Node.EXTRA_PEER_DATA_TYPE_PEER_NOTE, localFileNumber);
+               }
+       }
 }
-       
\ No newline at end of file

Modified: trunk/freenet/src/freenet/node/PeerNodeStatus.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNodeStatus.java  2006-08-17 03:02:43 UTC 
(rev 10153)
+++ trunk/freenet/src/freenet/node/PeerNodeStatus.java  2006-08-17 05:37:31 UTC 
(rev 10154)
@@ -73,6 +73,8 @@

        private final double pReject;

+       private final String privateDarknetCommentNote;
+
        public PeerNodeStatus(PeerNode peerNode) {
                this.name = peerNode.getName();
                this.peerAddress = (peerNode.getDetectedPeer() != null) ? 
peerNode.getDetectedPeer().getFreenetAddress().toString() : null;
@@ -103,6 +105,7 @@
                this.localMessagesSent = new 
Hashtable(peerNode.getLocalNodeSentMessagesToStatistic());
                this.hashCode = peerNode.hashCode;
                this.pReject = peerNode.getPRejected();
+               this.privateDarknetCommentNote = 
peerNode.getPrivateDarknetCommentNote();
        }

        /**
@@ -305,4 +308,11 @@
        public double getPReject() {
                return pReject;
        }
+
+       /**
+        * @return the privateDarknetCommentNote
+        */
+       public String getPrivateDarknetCommentNote() {
+               return privateDarknetCommentNote;
+       }
 }


Reply via email to