diff --git a/addresspublisher/build.xml b/addresspublisher/build.xml index 15431dd..f8d299c 100644 --- a/addresspublisher/build.xml +++ b/addresspublisher/build.xml @@ -12,7 +12,7 @@ - + Must set build.dir @@ -26,5 +26,22 @@ + + + + Must set build.dir + + + + + + + + + + + + + diff --git a/addresspublisher/nbproject/build-impl.xml b/addresspublisher/nbproject/build-impl.xml index dcf3b0f..a2ffc77 100644 --- a/addresspublisher/nbproject/build-impl.xml +++ b/addresspublisher/nbproject/build-impl.xml @@ -316,15 +316,18 @@ is divided into following sections: Must set javac.includes - + + + - + + diff --git a/addresspublisher/nbproject/genfiles.properties b/addresspublisher/nbproject/genfiles.properties index d9736b6..529faeb 100644 --- a/addresspublisher/nbproject/genfiles.properties +++ b/addresspublisher/nbproject/genfiles.properties @@ -4,5 +4,5 @@ build.xml.stylesheet.CRC32=28e38971@1.38.2.45 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. nbproject/build-impl.xml.data.CRC32=00fdd0af -nbproject/build-impl.xml.script.CRC32=967d9836 -nbproject/build-impl.xml.stylesheet.CRC32=f33e10ff@1.38.2.45 +nbproject/build-impl.xml.script.CRC32=b5dc77d5 +nbproject/build-impl.xml.stylesheet.CRC32=229523de@1.38.3.45 diff --git a/addresspublisher/nbproject/private/private.xml b/addresspublisher/nbproject/private/private.xml index a337f2e..c1f155a 100644 --- a/addresspublisher/nbproject/private/private.xml +++ b/addresspublisher/nbproject/private/private.xml @@ -1,11 +1,4 @@ - - file:/mnt/bb/dream/packages/mtn/i2p.scripts/addresspublisher/src/i2p/dream/addresspublisher/Servlet.java - file:/mnt/bb/dream/packages/mtn/i2p.scripts/addresspublisher/src/i2p/dream/addresspublisher/RecordIndex.java - file:/mnt/bb/dream/packages/mtn/i2p.scripts/addresspublisher/src/i2p/dream/addresspublisher/PersistentLong.java - file:/mnt/bb/dream/packages/mtn/i2p.scripts/addresspublisher/src/i2p/dream/addresspublisher/Configuration.java - file:/mnt/bb/dream/packages/mtn/i2p.scripts/addresspublisher/src/i2p/dream/addresspublisher/Record.java - diff --git a/addresspublisher/src/i2p/dream/addresspublisher/BlackList.java b/addresspublisher/src/i2p/dream/addresspublisher/BlackList.java new file mode 100644 index 0000000..e1a0aaa --- /dev/null +++ b/addresspublisher/src/i2p/dream/addresspublisher/BlackList.java @@ -0,0 +1,123 @@ +package i2p.dream.addresspublisher; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import java.util.Timer; +import java.util.TimerTask; +import java.util.logging.Level; +import java.util.logging.Logger; +import net.i2p.data.Destination; +import net.i2p.data.Hash; + +// This just implements a persistent blacklist of addresses that were deleted + +/** + * + * @author dream + */ +class BlackList implements Iterable { + public Iterator iterator() { + return blacklist.iterator(); + } + private static class HashReader implements Iterator, Iterable{ + private final FileInputStream in; + boolean done = false; + Hash queued = null; + public HashReader(FileInputStream in) { + this.in = in; + queueNext(); + } + + final void queueNext() { + try { + byte[] buf = new byte[Hash.HASH_LENGTH]; + int amount = in.read(buf); + if(amount < Hash.HASH_LENGTH) + done = true; + queued = new Hash(buf); + } catch (IOException ex) { + Logger.getLogger(BlackList.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public boolean hasNext() { + return !done; + } + + public Hash next() { + Hash next = queued; + queueNext(); + return next; + } + + public void remove() { + throw new UnsupportedOperationException("Not supported yet."); + } + + public Iterator iterator() { + return this; + } + } + + final Set blacklist = new HashSet(); + + final Timer timer; + + File theList() { + return new File(Configuration.getConfDir(),"blacklist.dat"); + } + + BlackList(Context context) { + timer = context.timer; + load(); + } + + public final void load() { + FileInputStream in = null; + try { + in = new FileInputStream(theList()); + in.getChannel().lock(); + for(Hash hash : new HashReader(in)) { + blacklist.add(hash); + } + } + catch (IOException ex) { + Logger.getLogger(BlackList.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public void save() { + FileOutputStream out = null; + try { + out = new FileOutputStream(theList()); + out.getChannel().lock(); + for(Hash hash : blacklist) { + out.write(hash.getData()); + } + } + catch (IOException ex) { + Logger.getLogger(BlackList.class.getName()).log(Level.SEVERE, null, ex); + } + } + + boolean contains(Destination dest) { + return blacklist.contains(dest.calculateHash()); + } + + void add(Destination dest) { + blacklist.add(dest.calculateHash()); + final BlackList that = this; + timer.schedule(new TimerTask() { + @Override + public void run() { + that.save(); + } + }, 100); + } +} diff --git a/addresspublisher/src/i2p/dream/addresspublisher/BookServlet.java b/addresspublisher/src/i2p/dream/addresspublisher/BookServlet.java new file mode 100644 index 0000000..de742ab --- /dev/null +++ b/addresspublisher/src/i2p/dream/addresspublisher/BookServlet.java @@ -0,0 +1,105 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package i2p.dream.addresspublisher; + +import java.io.IOException; +import java.io.PrintWriter; +import java.text.DateFormat; +import java.util.TimeZone; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import net.i2p.I2PAppContext; +import net.i2p.data.Base32; +import net.i2p.data.Hash; + +/** + * + * @author dream + */ + +public class BookServlet extends HttpServlet { + static final Context context = new Context("Book Servlet"); + + static final BlackList blacklist = new BlackList(context); + + /** just check if console password option is set, jetty will do auth */ + private boolean validPassphrase() { + String pass = I2PAppContext.getGlobalContext().getProperty("consolePassword"); + return pass != null && pass.trim().length() > 0; + } + + static final DateFormat formatter = DateFormat.getDateTimeInstance(); + static { + formatter.setTimeZone(TimeZone.getTimeZone("UTC")); + } + + @Override + protected void doGet(HttpServletRequest request, + HttpServletResponse response) + throws ServletException, IOException + { + if(!validPassphrase()) return; + + response.setContentType("text/html"); + PrintWriter out = null; + try { + out = response.getWriter(); + out.println("Addresses"); + out.println(""); + out.println(""); + for(Record record : RecordIndex.getInstance()) { + out.println(""); + out.println(""); + out.println(" "+record.getName()+""); + out.println(" "+ + formatter.format(record.getModified()) + ""); + out.println(" " + record.getAddress().toBase64() + ""); + out.println(""); + } + out.println(""); + + out.println(""); + out.println(""); + out.println("Deleted addresses:"); + out.println(""); + out.println(""); + for(Hash hash : blacklist) { + String shash = Base32.encode(hash.getData()); + out.println(""); + out.println(" "); + out.println(" "+shash+""); + out.println(""); + } + out.println(""); + + out.println(""); + + out.println("