diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java
index 82b197a344..8b8d202e94 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java
@@ -633,11 +633,11 @@ public class Snark
boolean allocating = false;
public void storageCreateFile(Storage storage, String name, long length)
{
- if (allocating)
- System.out.println(); // Done with last file.
+ //if (allocating)
+ // System.out.println(); // Done with last file.
- System.out.print("Creating file '" + name
- + "' of length " + length + ": ");
+ //System.out.print("Creating file '" + name
+ // + "' of length " + length + ": ");
allocating = true;
}
@@ -647,10 +647,10 @@ public class Snark
public void storageAllocated(Storage storage, long length)
{
allocating = true;
- System.out.print(".");
+ //System.out.print(".");
allocated += length;
- if (allocated == meta.getTotalLength())
- System.out.println(); // We have all the disk space we need.
+ //if (allocated == meta.getTotalLength())
+ // System.out.println(); // We have all the disk space we need.
}
boolean allChecked = false;
@@ -664,10 +664,10 @@ public class Snark
// Use the MetaInfo from the storage since our own might not
// yet be setup correctly.
MetaInfo meta = storage.getMetaInfo();
- if (meta != null)
- System.out.print("Checking existing "
- + meta.getPieces()
- + " pieces: ");
+ //if (meta != null)
+ // System.out.print("Checking existing "
+ // + meta.getPieces()
+ // + " pieces: ");
checking = true;
}
if (!checking)
@@ -677,8 +677,8 @@ public class Snark
public void storageAllChecked(Storage storage)
{
- if (checking)
- System.out.println();
+ //if (checking)
+ // System.out.println();
allChecked = true;
checking = false;
@@ -688,7 +688,7 @@ public class Snark
{
Snark.debug("Completely received " + torrent, Snark.INFO);
//storage.close();
- System.out.println("Completely received: " + torrent);
+ //System.out.println("Completely received: " + torrent);
if (completeListener != null)
completeListener.torrentComplete(this);
}
diff --git a/apps/syndie/java/src/net/i2p/syndie/Archive.java b/apps/syndie/java/src/net/i2p/syndie/Archive.java
index 0664ba2ea3..cdba757701 100644
--- a/apps/syndie/java/src/net/i2p/syndie/Archive.java
+++ b/apps/syndie/java/src/net/i2p/syndie/Archive.java
@@ -6,6 +6,7 @@ import java.text.*;
import net.i2p.I2PAppContext;
import net.i2p.data.*;
import net.i2p.syndie.data.*;
+import net.i2p.util.FileUtil;
import net.i2p.util.Log;
/**
@@ -332,6 +333,15 @@ public class Archive {
return rv;
}
+ public synchronized void delete(Hash blog) {
+ if (blog == null) return;
+ File blogDir = new File(_rootDir, blog.toBase64());
+ boolean deleted = FileUtil.rmdir(blogDir, false);
+ File cacheDir = new File(_cacheDir, blog.toBase64());
+ deleted = FileUtil.rmdir(cacheDir, false) && deleted;
+ _log.info("Deleted blog " + blog.toBase64() + " completely? " + deleted);
+ }
+
public boolean storeEntry(EntryContainer container) {
if (container == null) return false;
BlogURI uri = container.getURI();
diff --git a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java
index 4e78f9aafd..f0e2cfdc37 100644
--- a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java
+++ b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java
@@ -1060,4 +1060,49 @@ public class BlogManager {
return true;
return false;
}
+
+ public boolean isBanned(Hash blog) {
+ if (blog == null) return false;
+ String str = blog.toBase64();
+ String banned = System.getProperty("syndie.bannedBlogs", "");
+ return (banned.indexOf(str) >= 0);
+ }
+
+ public String[] getBannedBlogs() {
+ List blogs = new ArrayList();
+ String str = System.getProperty("syndie.bannedBlogs", "");
+ StringTokenizer tok = new StringTokenizer(str, ",");
+ while (tok.hasMoreTokens()) {
+ String blog = tok.nextToken();
+ try {
+ Hash h = new Hash();
+ h.fromBase64(blog);
+ blogs.add(blog); // the base64 string, but verified
+ } catch (DataFormatException dfe) {
+ // ignored
+ }
+ }
+ String rv[] = new String[blogs.size()];
+ for (int i = 0; i < blogs.size(); i++)
+ rv[i] = (String)blogs.get(i);
+ return rv;
+ }
+
+ /**
+ * Delete the blog from the archive completely, and ban them from ever being added again
+ */
+ public void purgeAndBan(Hash blog) {
+ String banned[] = getBannedBlogs();
+ StringBuffer buf = new StringBuffer();
+ String str = blog.toBase64();
+ buf.append(str);
+ for (int i = 0; banned != null && i < banned.length; i++) {
+ if (!banned[i].equals(str))
+ buf.append(",").append(banned[i]);
+ }
+ System.setProperty("syndie.bannedBlogs", buf.toString());
+ writeConfig();
+ _archive.delete(blog);
+ _archive.regenerateIndex();
+ }
}
diff --git a/apps/syndie/java/src/net/i2p/syndie/web/AddressesServlet.java b/apps/syndie/java/src/net/i2p/syndie/web/AddressesServlet.java
index d11843d144..628344479c 100644
--- a/apps/syndie/java/src/net/i2p/syndie/web/AddressesServlet.java
+++ b/apps/syndie/java/src/net/i2p/syndie/web/AddressesServlet.java
@@ -46,6 +46,7 @@ public class AddressesServlet extends BaseServlet {
public static final String ACTION_DELETE_BLOG = "Delete author";
public static final String ACTION_UPDATE_BLOG = "Update author";
public static final String ACTION_ADD_BLOG = "Add author";
+ public static final String ACTION_PURGE_AND_BAN_BLOG = "Purge and ban author";
public static final String ACTION_DELETE_ARCHIVE = "Delete archive";
public static final String ACTION_UPDATE_ARCHIVE = "Update archive";
@@ -128,6 +129,8 @@ public class AddressesServlet extends BaseServlet {
if (pn.isMember(FilteredThreadIndex.GROUP_IGNORE)) {
out.write("Ignored? ");
+ if (BlogManager.instance().authorizeRemote(user))
+ out.write(" ");
} else {
out.write("Ignored? ");
diff --git a/apps/syndie/java/src/net/i2p/syndie/web/BaseServlet.java b/apps/syndie/java/src/net/i2p/syndie/web/BaseServlet.java
index 7d22dbfb37..690dafe7a1 100644
--- a/apps/syndie/java/src/net/i2p/syndie/web/BaseServlet.java
+++ b/apps/syndie/java/src/net/i2p/syndie/web/BaseServlet.java
@@ -329,6 +329,34 @@ public abstract class BaseServlet extends HttpServlet {
(AddressesServlet.ACTION_UPDATE_OTHER.equals(action)) ||
(AddressesServlet.ACTION_UPDATE_PEER.equals(action)) ) {
return updateAddress(user, req);
+ } else if (AddressesServlet.ACTION_PURGE_AND_BAN_BLOG.equals(action)) {
+ String name = req.getParameter(AddressesServlet.PARAM_NAME);
+ PetName pn = user.getPetNameDB().getByName(name);
+ if (pn != null) {
+ boolean purged = false;
+ if (BlogManager.instance().authorizeRemote(user)) {
+ Hash h = null;
+ BlogURI uri = new BlogURI(pn.getLocation());
+ if (uri.getKeyHash() != null) {
+ h = uri.getKeyHash();
+ }
+ if (h == null) {
+ byte b[] = Base64.decode(pn.getLocation());
+ if ( (b != null) && (b.length == Hash.HASH_LENGTH) )
+ h = new Hash(b);
+ }
+ if (h != null) {
+ BlogManager.instance().purgeAndBan(h);
+ purged = true;
+ }
+ }
+ if (purged) // force a new thread index
+ return true;
+ else
+ return false;
+ } else {
+ return false;
+ }
} else if ( (AddressesServlet.ACTION_DELETE_ARCHIVE.equals(action)) ||
(AddressesServlet.ACTION_DELETE_BLOG.equals(action)) ||
(AddressesServlet.ACTION_DELETE_EEPSITE.equals(action)) ||
diff --git a/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java b/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java
index 92d2a15782..9c5f929078 100644
--- a/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java
+++ b/apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java
@@ -62,6 +62,8 @@ public class RemoteArchiveBean {
}
private boolean ignoreBlog(User user, Hash blog) {
+ if (BlogManager.instance().isBanned(blog))
+ return true;
PetNameDB db = user.getPetNameDB();
PetName pn = db.getByLocation(blog.toBase64());
return ( (pn!= null) && (pn.isMember("Ignore")) );
diff --git a/history.txt b/history.txt
index ab27b10ce8..5a74175ad7 100644
--- a/history.txt
+++ b/history.txt
@@ -1,4 +1,13 @@
-$Id: history.txt,v 1.437 2006/03/21 18:11:33 jrandom Exp $
+$Id: history.txt,v 1.438 2006/03/24 15:53:31 jrandom Exp $
+
+2006-03-25 jrandom
+ * Added a simple purge and ban of syndie authors, shown as the
+ "Purge and ban" button on the addressbook for authors that are already
+ on the ignore list. All of their entries and metadata are deleted from
+ the archive, and the are transparently filtered from any remote
+ syndication (so no user on the syndie instance will pull any new posts
+ from them)
+ * More strict tunnel join throtting when congested
2006-03-24 jrandom
* Try to desync tunnel building near startup (thanks Complication!)
diff --git a/router/java/src/net/i2p/router/RouterThrottleImpl.java b/router/java/src/net/i2p/router/RouterThrottleImpl.java
index 19b214f928..705adf83d8 100644
--- a/router/java/src/net/i2p/router/RouterThrottleImpl.java
+++ b/router/java/src/net/i2p/router/RouterThrottleImpl.java
@@ -238,6 +238,7 @@ class RouterThrottleImpl implements RouterThrottle {
}
private static final int DEFAULT_MESSAGES_PER_TUNNEL_ESTIMATE = 600; // 1KBps
+ private static final int MIN_AVAILABLE_BPS = 4*1024; // always leave at least 4KBps free when allowing
/**
* with bytesAllocated already accounted for across the numTunnels existing
@@ -279,7 +280,7 @@ class RouterThrottleImpl implements RouterThrottle {
return true;
} else {
double probAllow = availBps / (allocatedBps + availBps);
- boolean allow = _context.random().nextDouble() <= probAllow;
+ boolean allow = (availBps > MIN_AVAILABLE_BPS) && (_context.random().nextDouble() <= probAllow);
if (allow) {
if (_log.shouldLog(Log.INFO))
_log.info("Probabalistically allowing the tunnel w/ " + (pctFull*100d) + "% of our " + availBps
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 2196b2b142..e6256cfbac 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -15,9 +15,9 @@ import net.i2p.CoreVersion;
*
*/
public class RouterVersion {
- public final static String ID = "$Revision: 1.378 $ $Date: 2006/03/21 18:13:09 $";
+ public final static String ID = "$Revision: 1.379 $ $Date: 2006/03/24 15:53:30 $";
public final static String VERSION = "0.6.1.12";
- public final static long BUILD = 16;
+ public final static long BUILD = 17;
public static void main(String args[]) {
System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
System.out.println("Router ID: " + RouterVersion.ID);