From 3dbe8f2003fafdf94dcd4465f1dcff9f86b6e74b Mon Sep 17 00:00:00 2001
From: zab2 <zab2@mail.i2p>
Date: Thu, 28 Mar 2019 19:47:08 +0000
Subject: [PATCH] document format

---
 .../i2ptunnel/access/DefinitionParser.java    | 107 +++++++++++++++++-
 1 file changed, 106 insertions(+), 1 deletion(-)

diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/access/DefinitionParser.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/access/DefinitionParser.java
index c3164af7dc..a60f76249a 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/access/DefinitionParser.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/access/DefinitionParser.java
@@ -17,8 +17,113 @@ class DefinitionParser {
     /**
      * Processes an array of String objects containing the human-readable definition of
      * the filter.
+     *
+     * The definition of a filter is a list of Strings.  Each line can represent one of 
+     * these items:
+     *
+     * * definition of a default threshold to apply to any remote destinations not
+     *   listed in this file or any of the referenced files
+     * * definition of a threshold to apply to a specific remote destination
+     * * definition of a threshold to apply to remote destinations listed in a file
+     * * definition of a threshold that if breached will cause the offending remote
+     *   destination to be recorded in a specified file
+     *
+     * The order of the definitions matters.  The first threshold for a given destination
+     * (whether explicit or listed in a file) overrides any future thresholds for the
+     * same destination, whether explicit or listed in a file.
+     *
+     * Thresholds:
+     * 
+     * A threshold is defined by the number of connection attempts a remote destination is
+     * permitted to perform over a specified number of minutes before a "breach" occurs.
+     * For example the following threshold definition "15/5" means that the same remote
+     * destination is allowed to make 14 connection attempts over a 5 minute period,  If
+     * it makes one more attempt within the same period, the threshold will be breached.
+     *
+     * The threshold format can be one of the following:
+     *
+     * * Numeric definition of number of connections over number minutes - "15/5", 
+     *   "30/60", and so on.  Note that if the number of connections is 1 (as for 
+     *   example in "1/1") the first connection attempt will result in a breach.
+     * * The word "allow".  This threshold is never breached, i.e. infinite number of 
+     *   connection attempts is permitted.
+     * * The word "deny".  This threshold is always breached, i.e. no connection attempts
+     *   will be allowed.
+     *
+     * Default threshold
+     *
+     * The default threshold applies to any remote destinations that are not explicitly
+     * listed in the definition or in any of the referenced files.  To set a default 
+     * threshold use the keyword "default".  The following are examples of default thresholds:
+     * 
+     * -----------------------------
+     * default 15/5
+     * default allow
+     * default deny
+     * -----------------------------
+     *
+     * Explicit thresholds
+     * 
+     * Explicit thresholds are applied to a remote destination listed in the definition itself.
+     * Examples:
      * 
-     * TODO: format
+     * -----------------------------
+     * 15/5 explicit asdfasdfasdf.b32.i2p
+     * allow explicit fdsafdsafdsa.b32.i2p
+     * deny explicit qwerqwerqwer.b32.i2p
+     * -----------------------------
+     *
+     * Thresholds for destinations listed in a file
+     * 
+     * For convenience it is possible to maintain a list of destinations in a file and define
+     * a threshold for all of them in bulk.  Examples:
+     *
+     * -----------------------------
+     * 15/5 file /path/throttled_destinations.txt
+     * deny file /path/forbidden_destinations.txt
+     * allow file /path/unlimited_destinations.txt
+     * -----------------------------
+     *
+     * Recorders
+     *
+     * Recorders keep track of connection attempts made by a remote destination, and if that
+     * breaches a certain threshold, that destination gets recorded in a given file.  Examples:
+     *
+     * -----------------------------
+     * recorder 30/5 /path/aggressive.txt
+     * recorder 60/5 /path/very_aggressive.txt
+     * -----------------------------
+     *
+     * It is possible to use a recorder to record aggressive destinations to a given file,
+     * and then use that same file to throttle them.  For example, the following snippet will
+     * define a filter that initially allows all connection attempts, but if any single
+     * destination exceeds 30 attempts per 5 minutes it gets throttled down to 15 attempts per 
+     * 5 minutes:
+     *
+     * -----------------------------
+     * # by default there are no limits
+     * default allow
+     * # but record overly aggressive destinations
+     * recorder 30/5 /path/throttled.txt
+     * # and any that end up in that file will get throttled in the future
+     * 15/5 file /path/throttled.txt
+     * -----------------------------
+     *
+     * It is possible to use a recorder in one tunnel that writes to a file that throttles 
+     * another tunnel.  It is possible to reuse the same file with destinations in multiple
+     * tunnels.  And of course, it is possible to edit these files by hand.
+     *
+     * Here is an example filter definition that applies some throttling by default, no throttling
+     * for destinations in the file "friends.txt", forbids any connections from destinations
+     * in the file "enemies.txt" and records any aggressive behavior in a file called
+     * "suspicious.txt":
+     *
+     * -----------------------------
+     * default 15/5
+     * allow file /path/friends.txt
+     * deny file /path/enemies.txt
+     * recorder 60/5 /path/suspicious.txt
+     * -----------------------------
      *
      * @return a FilterDefinition POJO representation for internal use
      * @throws InvalidDefinitionException if the definition is malformed
-- 
GitLab