merge of '8f40f2b7ad2272ecedca14c17598ecaf409340e8'

and 'da96c40b16f6e3f2e4e044f0f48cb53f1e9f2264'
This commit is contained in:
m1xxy
2010-11-28 12:36:17 +00:00
41 changed files with 233 additions and 173 deletions

View File

@ -3,9 +3,7 @@
<target name="all" depends="clean, build" /> <target name="all" depends="clean, build" />
<target name="build" depends="builddep, jar, war" /> <target name="build" depends="builddep, jar, war" />
<target name="builddep"> <target name="builddep">
<ant dir="../../jetty/" target="build" /> <!-- run from top level build.xml to get dependencies built -->
<ant dir="../../streaming/java/" target="build" />
<!-- streaming will build ministreaming and core -->
</target> </target>
<condition property="depend.available"> <condition property="depend.available">
<typefound name="depend" /> <typefound name="depend" />

View File

@ -0,0 +1,36 @@
package org.klomp.snark;
import java.util.HashMap;
import java.util.Map;
import org.klomp.snark.bencode.BEncoder;
import org.klomp.snark.bencode.BEValue;
/**
* REF: BEP 10 Extension Protocol
* @since 0.8.2
*/
class ExtensionHandshake {
private static final byte[] _payload = buildPayload();
/**
* @return bencoded data
*/
static byte[] getPayload() {
return _payload;
}
/** just a test for now */
private static byte[] buildPayload() {
Map<String, Object> handshake = new HashMap();
Map<String, Integer> m = new HashMap();
m.put("foo", Integer.valueOf(99));
m.put("bar", Integer.valueOf(101));
handshake.put("m", m);
handshake.put("p", Integer.valueOf(6881));
handshake.put("v", "I2PSnark");
handshake.put("reqq", Integer.valueOf(5));
return BEncoder.bencode(handshake);
}
}

View File

@ -66,6 +66,7 @@ public class Peer implements Comparable
private long options; private long options;
/** /**
* Outgoing connection.
* Creates a disconnected peer given a PeerID, your own id and the * Creates a disconnected peer given a PeerID, your own id and the
* relevant MetaInfo. * relevant MetaInfo.
*/ */
@ -80,6 +81,7 @@ public class Peer implements Comparable
} }
/** /**
* Incoming connection.
* Creates a unconnected peer from the input and output stream got * Creates a unconnected peer from the input and output stream got
* from the socket. Note that the complete handshake (which can take * from the socket. Note that the complete handshake (which can take
* some time or block indefinitely) is done in the calling Thread to * some time or block indefinitely) is done in the calling Thread to
@ -201,6 +203,7 @@ public class Peer implements Comparable
// Do we need to handshake? // Do we need to handshake?
if (din == null) if (din == null)
{ {
// Outgoing connection
sock = util.connect(peerID); sock = util.connect(peerID);
if (_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.DEBUG))
_log.debug("Connected to " + peerID + ": " + sock); _log.debug("Connected to " + peerID + ": " + sock);
@ -234,6 +237,7 @@ public class Peer implements Comparable
+ PeerID.idencode(expected_id) + "'"); + PeerID.idencode(expected_id) + "'");
} }
} else { } else {
// Incoming connection
if (_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.DEBUG))
_log.debug("Already have din [" + sock + "] with " + toString()); _log.debug("Already have din [" + sock + "] with " + toString());
} }
@ -242,6 +246,12 @@ public class Peer implements Comparable
PeerConnectionOut out = new PeerConnectionOut(this, dout); PeerConnectionOut out = new PeerConnectionOut(this, dout);
PeerState s = new PeerState(this, listener, metainfo, in, out); PeerState s = new PeerState(this, listener, metainfo, in, out);
if ((options & OPTION_EXTENSION) != 0) {
if (_log.shouldLog(Log.DEBUG))
_log.debug("Peer supports extensions, sending test message");
out.sendExtension(0, ExtensionHandshake.getPayload());
}
// Send our bitmap // Send our bitmap
if (bitfield != null) if (bitfield != null)
s.out.sendBitfield(bitfield); s.out.sendBitfield(bitfield);
@ -331,12 +341,10 @@ public class Peer implements Comparable
if (_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.DEBUG))
_log.debug("Read the remote side's hash and peerID fully from " + toString()); _log.debug("Read the remote side's hash and peerID fully from " + toString());
// if ((options & OPTION_EXTENSION) != 0) {
if (options != 0) { if (options != 0) {
// send them something // send them something
if (_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.DEBUG))
//_log.debug("Peer supports extension message, what should we say? " + toString()); _log.debug("Peer supports options 0x" + Long.toString(options, 16) + ": " + toString());
_log.debug("Peer supports options 0x" + Long.toString(options, 16) + ", what should we say? " + toString());
} }
return bs; return bs;

View File

@ -114,8 +114,9 @@ class PeerCheckerTask extends TimerTask
// Choke a percentage of them rather than all so it isn't so drastic... // Choke a percentage of them rather than all so it isn't so drastic...
// unless this torrent is over the limit all by itself. // unless this torrent is over the limit all by itself.
// choke 5/8 of the time when seeding and 3/8 when leeching
boolean overBWLimitChoke = upload > 0 && boolean overBWLimitChoke = upload > 0 &&
((overBWLimit && random.nextBoolean()) || ((overBWLimit && (random.nextInt(8) > (coordinator.completed() ? 2 : 4))) ||
(coordinator.overUpBWLimit(uploaded))); (coordinator.overUpBWLimit(uploaded)));
// If we are at our max uploaders and we have lots of other // If we are at our max uploaders and we have lots of other

View File

@ -615,13 +615,13 @@ public class PeerCoordinator implements PeerListener
// share blocks rather than starting from 0 with each peer. // share blocks rather than starting from 0 with each peer.
// This is where the flaws of the snark data model are really exposed. // This is where the flaws of the snark data model are really exposed.
// Could also randomize within the duplicate set rather than strict rarest-first // Could also randomize within the duplicate set rather than strict rarest-first
if (_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.INFO))
_log.debug("parallel request (end game?) for " + peer + ": piece = " + piece); _log.info("parallel request (end game?) for " + peer + ": piece = " + piece);
} }
} }
if (record) { if (record) {
if (_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.INFO))
_log.debug("Now requesting: piece " + piece + " priority " + piece.getPriority()); _log.info(peer + " is now requesting: piece " + piece + " priority " + piece.getPriority());
piece.setRequested(true); piece.setRequested(true);
} }
return piece.getId(); return piece.getId();
@ -945,11 +945,11 @@ public class PeerCoordinator implements PeerListener
PartialPiece pp = iter.next(); PartialPiece pp = iter.next();
int savedPiece = pp.getPiece(); int savedPiece = pp.getPiece();
if (havePieces.get(savedPiece)) { if (havePieces.get(savedPiece)) {
iter.remove();
// this is just a double-check, it should be in there // this is just a double-check, it should be in there
for(Piece piece : wantedPieces) { for(Piece piece : wantedPieces) {
if (piece.getId() == savedPiece) { if (piece.getId() == savedPiece) {
piece.setRequested(true); piece.setRequested(true);
iter.remove();
if (_log.shouldLog(Log.INFO)) { if (_log.shouldLog(Log.INFO)) {
_log.info("Restoring orphaned partial piece " + pp + _log.info("Restoring orphaned partial piece " + pp +
" Partial list size now: " + partialPieces.size()); " Partial list size now: " + partialPieces.size());
@ -957,8 +957,12 @@ public class PeerCoordinator implements PeerListener
return pp; return pp;
} }
} }
if (_log.shouldLog(Log.WARN))
_log.warn("Partial piece " + pp + " NOT in wantedPieces??");
} }
} }
if (_log.shouldLog(Log.WARN) && !partialPieces.isEmpty())
_log.warn("Peer " + peer + " has none of our partials " + partialPieces);
} }
// ...and this section turns this into the general move-requests-around code! // ...and this section turns this into the general move-requests-around code!
// Temporary? So PeerState never calls wantPiece() directly for now... // Temporary? So PeerState never calls wantPiece() directly for now...
@ -1004,7 +1008,7 @@ public class PeerCoordinator implements PeerListener
} }
} }
} }
return wantPiece(peer, havePieces, false) > 0; return wantPiece(peer, havePieces, false) >= 0;
} }
/** /**

View File

@ -609,6 +609,9 @@ class PeerState implements DataLoader
*/ */
synchronized void addRequest() synchronized void addRequest()
{ {
// no bitfield yet? nothing to request then.
if (bitfield == null)
return;
boolean more_pieces = true; boolean more_pieces = true;
while (more_pieces) while (more_pieces)
{ {

View File

@ -3,9 +3,7 @@
<target name="all" depends="clean, build" /> <target name="all" depends="clean, build" />
<target name="build" depends="builddep, jar, war" /> <target name="build" depends="builddep, jar, war" />
<target name="builddep"> <target name="builddep">
<ant dir="../../ministreaming/java/" target="build" /> <!-- run from top level build.xml to get dependencies built -->
<ant dir="../../jetty/" target="build" />
<!-- ministreaming will build core -->
</target> </target>
<condition property="depend.available"> <condition property="depend.available">
<typefound name="depend" /> <typefound name="depend" />

View File

@ -1573,6 +1573,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
* *
* Since file:<filename> isn't really used, this method is deprecated, * Since file:<filename> isn't really used, this method is deprecated,
* just call context.namingService.lookup() directly. * just call context.namingService.lookup() directly.
* @deprecated Don't use i2ptunnel for lookup! Use I2PAppContext.getGlobalContext().namingService().lookup(name) from i2p.jar
*/ */
public static Destination destFromName(String name) throws DataFormatException { public static Destination destFromName(String name) throws DataFormatException {

View File

@ -42,15 +42,11 @@ public class I2PTunnelClient extends I2PTunnelClientBase {
dests = new ArrayList(1); dests = new ArrayList(1);
while (tok.hasMoreTokens()) { while (tok.hasMoreTokens()) {
String destination = tok.nextToken(); String destination = tok.nextToken();
try { Destination destN = _context.namingService().lookup(destination);
Destination destN = I2PTunnel.destFromName(destination);
if (destN == null) if (destN == null)
l.log("Could not resolve " + destination); l.log("Could not resolve " + destination);
else else
dests.add(destN); dests.add(destN);
} catch (DataFormatException dfe) {
l.log("Bad format parsing \"" + destination + "\"");
}
} }
if (dests.isEmpty()) { if (dests.isEmpty()) {

View File

@ -278,7 +278,7 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
return; return;
} }
Destination clientDest = I2PTunnel.destFromName(destination); Destination clientDest = _context.namingService().lookup(destination);
if (clientDest == null) { if (clientDest == null) {
String str; String str;
byte[] header; byte[] header;

View File

@ -28,7 +28,6 @@ import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketOptions; import net.i2p.client.streaming.I2PSocketOptions;
import net.i2p.data.Base32; import net.i2p.data.Base32;
import net.i2p.data.Base64; import net.i2p.data.Base64;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataHelper; import net.i2p.data.DataHelper;
import net.i2p.data.Destination; import net.i2p.data.Destination;
import net.i2p.util.EventDispatcher; import net.i2p.util.EventDispatcher;
@ -431,11 +430,9 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
// Host resolvable from database, verify addresshelper key // Host resolvable from database, verify addresshelper key
// Silently bypass correct keys, otherwise alert // Silently bypass correct keys, otherwise alert
String destB64 = null; String destB64 = null;
try { Destination _dest = _context.namingService().lookup(host);
Destination _dest = I2PTunnel.destFromName(host);
if (_dest != null) if (_dest != null)
destB64 = _dest.toBase64(); destB64 = _dest.toBase64();
} catch (DataFormatException dfe) {}
if (destB64 != null && !destB64.equals(ahelperKey)) if (destB64 != null && !destB64.equals(ahelperKey))
{ {
// Conflict: handle when URL reconstruction done // Conflict: handle when URL reconstruction done
@ -721,7 +718,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
if ("i2p".equals(host)) if ("i2p".equals(host))
clientDest = null; clientDest = null;
else else
clientDest = I2PTunnel.destFromName(destination); clientDest = _context.namingService().lookup(destination);
if (clientDest == null) { if (clientDest == null) {
//l.log("Could not resolve " + destination + "."); //l.log("Could not resolve " + destination + ".");
@ -814,17 +811,13 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
* @return b32hash.b32.i2p, or "i2p" on lookup failure. * @return b32hash.b32.i2p, or "i2p" on lookup failure.
* Prior to 0.7.12, returned b64 key * Prior to 0.7.12, returned b64 key
*/ */
private final static String getHostName(String host) { private final String getHostName(String host) {
if (host == null) return null; if (host == null) return null;
if (host.length() == 60 && host.toLowerCase().endsWith(".b32.i2p")) if (host.length() == 60 && host.toLowerCase().endsWith(".b32.i2p"))
return host; return host;
try { Destination dest = _context.namingService().lookup(host);
Destination dest = I2PTunnel.destFromName(host);
if (dest == null) return "i2p"; if (dest == null) return "i2p";
return Base32.encode(dest.calculateHash().getData()) + ".b32.i2p"; return Base32.encode(dest.calculateHash().getData()) + ".b32.i2p";
} catch (DataFormatException dfe) {
return "i2p";
}
} }
/** /**
@ -947,12 +940,8 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
// Skip jump servers we don't know // Skip jump servers we don't know
String jumphost = jurl.substring(7); // "http://" String jumphost = jurl.substring(7); // "http://"
jumphost = jumphost.substring(0, jumphost.indexOf('/')); jumphost = jumphost.substring(0, jumphost.indexOf('/'));
try { Destination dest = I2PAppContext.getGlobalContext().namingService().lookup(jumphost);
Destination dest = I2PTunnel.destFromName(jumphost);
if (dest == null) continue; if (dest == null) continue;
} catch (DataFormatException dfe) {
continue;
}
out.write("<br><a href=\"".getBytes()); out.write("<br><a href=\"".getBytes());
out.write(jurl.getBytes()); out.write(jurl.getBytes());
@ -1014,7 +1003,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
if (!found) { if (!found) {
try { try {
Destination d = I2PTunnel.destFromName(host); Destination d = _context.namingService().lookup(host);
if (d == null) return false; if (d == null) return false;
} catch (DataFormatException dfe) { } catch (DataFormatException dfe) {
} }

View File

@ -10,7 +10,6 @@ import java.util.List;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocket;
import net.i2p.data.DataFormatException;
import net.i2p.data.Destination; import net.i2p.data.Destination;
import net.i2p.util.EventDispatcher; import net.i2p.util.EventDispatcher;
import net.i2p.util.I2PAppThread; import net.i2p.util.I2PAppThread;
@ -52,15 +51,11 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
dests = new ArrayList(2); dests = new ArrayList(2);
while (tok.hasMoreTokens()) { while (tok.hasMoreTokens()) {
String destination = tok.nextToken(); String destination = tok.nextToken();
try { Destination destN = _context.namingService().lookup(destination);
Destination destN = I2PTunnel.destFromName(destination);
if (destN == null) if (destN == null)
l.log("Could not resolve " + destination); l.log("Could not resolve " + destination);
else else
dests.add(destN); dests.add(destN);
} catch (DataFormatException dfe) {
l.log("Bad format parsing \"" + destination + "\"");
}
} }
if (dests.isEmpty()) { if (dests.isEmpty()) {

View File

@ -10,6 +10,7 @@ import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import net.i2p.I2PAppContext;
import net.i2p.I2PException; import net.i2p.I2PException;
import net.i2p.client.streaming.I2PSocketManager; import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.data.Destination; import net.i2p.data.Destination;
@ -200,7 +201,7 @@ public class I2Ping extends I2PTunnelTask implements Runnable {
@Override @Override
public void run() { public void run() {
try { try {
Destination dest = I2PTunnel.destFromName(destination); Destination dest = I2PAppContext.getGlobalContext().namingService().lookup(destination);
if (dest == null) { if (dest == null) {
synchronized (lock) { // Logger is not thread safe synchronized (lock) { // Logger is not thread safe
l.log("Unresolvable: " + destination + ""); l.log("Unresolvable: " + destination + "");

View File

@ -204,7 +204,7 @@ public class SOCKS4aServer extends SOCKSServer {
// Let's not due a new Dest for every request, huh? // Let's not due a new Dest for every request, huh?
//I2PSocketManager sm = I2PSocketManagerFactory.createManager(); //I2PSocketManager sm = I2PSocketManagerFactory.createManager();
//destSock = sm.connect(I2PTunnel.destFromName(connHostName), null); //destSock = sm.connect(I2PTunnel.destFromName(connHostName), null);
destSock = t.createI2PSocket(I2PTunnel.destFromName(connHostName)); destSock = t.createI2PSocket(I2PAppContext.getGlobalContext().namingService().lookup(connHostName));
} else if ("localhost".equals(connHostName) || "127.0.0.1".equals(connHostName)) { } else if ("localhost".equals(connHostName) || "127.0.0.1".equals(connHostName)) {
String err = "No localhost accesses allowed through the Socks Proxy"; String err = "No localhost accesses allowed through the Socks Proxy";
_log.error(err); _log.error(err);
@ -237,7 +237,7 @@ public class SOCKS4aServer extends SOCKSServer {
_log.debug("connecting to port " + connPort + " proxy " + proxy + " for " + connHostName + "..."); _log.debug("connecting to port " + connPort + " proxy " + proxy + " for " + connHostName + "...");
// this isn't going to work, these need to be socks outproxies so we need // this isn't going to work, these need to be socks outproxies so we need
// to do a socks session to them? // to do a socks session to them?
destSock = t.createI2PSocket(I2PTunnel.destFromName(proxy)); destSock = t.createI2PSocket(I2PAppContext.getGlobalContext().namingService().lookup(proxy));
} }
confirmConnection(); confirmConnection();
_log.debug("connection confirmed - exchanging data..."); _log.debug("connection confirmed - exchanging data...");

View File

@ -360,14 +360,14 @@ public class SOCKS5Server extends SOCKSServer {
// Let's not due a new Dest for every request, huh? // Let's not due a new Dest for every request, huh?
//I2PSocketManager sm = I2PSocketManagerFactory.createManager(); //I2PSocketManager sm = I2PSocketManagerFactory.createManager();
//destSock = sm.connect(I2PTunnel.destFromName(connHostName), null); //destSock = sm.connect(I2PTunnel.destFromName(connHostName), null);
Destination dest = I2PTunnel.destFromName(connHostName); Destination dest = I2PAppContext.getGlobalContext().namingService().lookup(connHostName);
if (dest == null) { if (dest == null) {
try { try {
sendRequestReply(Reply.HOST_UNREACHABLE, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out); sendRequestReply(Reply.HOST_UNREACHABLE, AddressType.DOMAINNAME, null, "0.0.0.0", 0, out);
} catch (IOException ioe) {} } catch (IOException ioe) {}
throw new SOCKSException("Host not found"); throw new SOCKSException("Host not found");
} }
destSock = t.createI2PSocket(I2PTunnel.destFromName(connHostName)); destSock = t.createI2PSocket(I2PAppContext.getGlobalContext().namingService().lookup(connHostName));
} else if ("localhost".equals(connHostName) || "127.0.0.1".equals(connHostName)) { } else if ("localhost".equals(connHostName) || "127.0.0.1".equals(connHostName)) {
String err = "No localhost accesses allowed through the Socks Proxy"; String err = "No localhost accesses allowed through the Socks Proxy";
_log.error(err); _log.error(err);
@ -455,10 +455,10 @@ public class SOCKS5Server extends SOCKSServer {
Properties overrides = new Properties(); Properties overrides = new Properties();
overrides.setProperty("option.i2p.streaming.connectDelay", "1000"); overrides.setProperty("option.i2p.streaming.connectDelay", "1000");
I2PSocketOptions proxyOpts = tun.buildOptions(overrides); I2PSocketOptions proxyOpts = tun.buildOptions(overrides);
Destination dest = I2PTunnel.destFromName(proxy); Destination dest = I2PAppContext.getGlobalContext().namingService().lookup(proxy);
if (dest == null) if (dest == null)
throw new SOCKSException("Outproxy not found"); throw new SOCKSException("Outproxy not found");
I2PSocket destSock = tun.createI2PSocket(I2PTunnel.destFromName(proxy), proxyOpts); I2PSocket destSock = tun.createI2PSocket(I2PAppContext.getGlobalContext().namingService().lookup(proxy), proxyOpts);
try { try {
DataOutputStream out = new DataOutputStream(destSock.getOutputStream()); DataOutputStream out = new DataOutputStream(destSock.getOutputStream());
boolean authAvail = Boolean.valueOf(props.getProperty(I2PTunnelHTTPClientBase.PROP_OUTPROXY_AUTH)).booleanValue(); boolean authAvail = Boolean.valueOf(props.getProperty(I2PTunnelHTTPClientBase.PROP_OUTPROXY_AUTH)).booleanValue();

View File

@ -1,7 +1,7 @@
package net.i2p.i2ptunnel.socks; package net.i2p.i2ptunnel.socks;
import net.i2p.I2PAppContext;
import net.i2p.data.Base32; import net.i2p.data.Base32;
import net.i2p.data.DataFormatException;
import net.i2p.data.Destination; import net.i2p.data.Destination;
import net.i2p.i2ptunnel.I2PTunnel; import net.i2p.i2ptunnel.I2PTunnel;
@ -74,11 +74,8 @@ public class SOCKSHeader {
String name = getHost(); String name = getHost();
if (name == null) if (name == null)
return null; return null;
try {
// the naming service does caching (thankfully) // the naming service does caching (thankfully)
return I2PTunnel.destFromName(name); return I2PAppContext.getGlobalContext().namingService().lookup(name);
} catch (DataFormatException dfe) {}
return null;
} }
public byte[] getBytes() { public byte[] getBytes() {

View File

@ -117,9 +117,7 @@ import net.i2p.util.Log;
// Setup the sink. Always send repliable datagrams. // Setup the sink. Always send repliable datagrams.
if (destination != null && destination.length() > 0) { if (destination != null && destination.length() > 0) {
try { _otherDest = _context.namingService().lookup(destination);
_otherDest = I2PTunnel.destFromName(destination);
} catch (DataFormatException dfe) {}
if (_otherDest == null) { if (_otherDest == null) {
l.log("Could not resolve " + destination); l.log("Could not resolve " + destination);
throw new RuntimeException("failed to create session - could not resolve " + destination); throw new RuntimeException("failed to create session - could not resolve " + destination);

View File

@ -3,7 +3,7 @@
<target name="all" depends="clean, build" /> <target name="all" depends="clean, build" />
<target name="build" depends="builddep, jar" /> <target name="build" depends="builddep, jar" />
<target name="builddep"> <target name="builddep">
<ant dir="../../../core/java/" target="build" /> <!-- run from top level build.xml to get dependencies built -->
</target> </target>
<condition property="depend.available"> <condition property="depend.available">
<typefound name="depend" /> <typefound name="depend" />
@ -45,9 +45,7 @@
<delete dir="./build" /> <delete dir="./build" />
</target> </target>
<target name="cleandep" depends="clean"> <target name="cleandep" depends="clean">
<ant dir="../../../core/java/" target="cleandep" />
</target> </target>
<target name="distclean" depends="clean"> <target name="distclean" depends="clean">
<ant dir="../../../core/java/" target="distclean" />
</target> </target>
</project> </project>

View File

@ -3,12 +3,10 @@
<target name="all" depends="clean, build" /> <target name="all" depends="clean, build" />
<target name="build" depends="builddep, jar" /> <target name="build" depends="builddep, jar" />
<target name="builddep"> <target name="builddep">
<ant dir="../../../router/java/" target="build" /> <!-- run from top level build.xml to get dependencies built -->
<ant dir="../../systray/java/" target="build" />
<!-- router will build core -->
</target> </target>
<target name="prepare"> <target name="prepare">
<ant dir="../../jetty/" target="build" /> <!-- run from top level build.xml to get dependencies built -->
</target> </target>
<condition property="depend.available"> <condition property="depend.available">
<typefound name="depend" /> <typefound name="depend" />
@ -235,13 +233,7 @@
<delete file="../jsp/web-out.xml" /> <delete file="../jsp/web-out.xml" />
</target> </target>
<target name="cleandep" depends="clean"> <target name="cleandep" depends="clean">
<!-- router will clean core -->
<ant dir="../../../router/java/" target="cleandep" />
<ant dir="../../systray/java/" target="cleandep" />
</target> </target>
<target name="distclean" depends="clean"> <target name="distclean" depends="clean">
<!-- router will clean core -->
<ant dir="../../../router/java/" target="distclean" />
<ant dir="../../systray/java/" target="distclean" />
</target> </target>
</project> </project>

View File

@ -3,9 +3,7 @@
<target name="all" depends="clean, build" /> <target name="all" depends="clean, build" />
<target name="build" depends="builddep, jar" /> <target name="build" depends="builddep, jar" />
<target name="builddep"> <target name="builddep">
<ant dir="../../ministreaming/java/" target="build" /> <!-- run from top level build.xml to get dependencies built -->
<ant dir="../../streaming/java/" target="build" />
<!-- ministreaming will build core -->
</target> </target>
<condition property="depend.available"> <condition property="depend.available">
<typefound name="depend" /> <typefound name="depend" />
@ -69,13 +67,7 @@
<delete dir="./build" /> <delete dir="./build" />
</target> </target>
<target name="cleandep" depends="clean"> <target name="cleandep" depends="clean">
<!-- ministreaming will clean core -->
<ant dir="../../ministreaming/java/" target="distclean" />
<ant dir="../../streaming/java/" target="distclean" />
</target> </target>
<target name="distclean" depends="clean"> <target name="distclean" depends="clean">
<!-- ministreaming will clean core -->
<ant dir="../../ministreaming/java/" target="distclean" />
<ant dir="../../streaming/java/" target="distclean" />
</target> </target>
</project> </project>

View File

@ -3,8 +3,7 @@
<target name="all" depends="clean, build" /> <target name="all" depends="clean, build" />
<target name="build" depends="builddep, jar" /> <target name="build" depends="builddep, jar" />
<target name="builddep"> <target name="builddep">
<ant dir="../../ministreaming/java/" target="build" /> <!-- run from top level build.xml to get dependencies built -->
<!-- ministreaming will build core -->
</target> </target>
<condition property="depend.available"> <condition property="depend.available">
<typefound name="depend" /> <typefound name="depend" />
@ -62,11 +61,7 @@
<delete dir="./build" /> <delete dir="./build" />
</target> </target>
<target name="cleandep" depends="clean"> <target name="cleandep" depends="clean">
<!-- ministreaming will clean core -->
<ant dir="../../ministreaming/java/" target="distclean" />
</target> </target>
<target name="distclean" depends="clean"> <target name="distclean" depends="clean">
<!-- ministreaming will clean core -->
<ant dir="../../ministreaming/java/" target="distclean" />
</target> </target>
</project> </project>

View File

@ -3,7 +3,7 @@
<target name="all" depends="clean, build" /> <target name="all" depends="clean, build" />
<target name="build" depends="builddep, jar" /> <target name="build" depends="builddep, jar" />
<target name="builddep"> <target name="builddep">
<ant dir="../jetty/" target="build" /> <!-- run from top level build.xml to get dependencies built -->
</target> </target>
<property name="javac.compilerargs" value="" /> <property name="javac.compilerargs" value="" />
<target name="compile"> <target name="compile">

View File

@ -3,7 +3,7 @@
<target name="all" depends="clean, build" /> <target name="all" depends="clean, build" />
<target name="build" depends="builddep, jar" /> <target name="build" depends="builddep, jar" />
<target name="builddep"> <target name="builddep">
<ant dir="../../../core/java/" target="build" /> <!-- run from top level build.xml to get dependencies built -->
</target> </target>
<property name="javac.compilerargs" value="" /> <property name="javac.compilerargs" value="" />
<target name="compile"> <target name="compile">
@ -55,10 +55,7 @@
<delete dir="./build" /> <delete dir="./build" />
</target> </target>
<target name="cleandep" depends="clean"> <target name="cleandep" depends="clean">
<!-- router will clean core -->
<ant dir="../../../core/java/" target="cleandep" />
</target> </target>
<target name="distclean" depends="clean"> <target name="distclean" depends="clean">
<ant dir="../../../core/java/" target="distclean" />
</target> </target>
</project> </project>

View File

@ -62,33 +62,79 @@
<target name="build2" depends="builddep, jar, buildWEB" /> <target name="build2" depends="builddep, jar, buildWEB" />
<target name="buildSmall" depends="builddepSmall, jarSmall, buildWEB" /> <target name="buildSmall" depends="builddepSmall, jarSmall, buildWEB" />
<target name="buildclean" depends="distclean, build" /> <target name="buildclean" depends="distclean, build" />
<target name="builddep" depends="builddepSmall">
<!-- build *everything* here, but only once --> <target name="builddep" depends="builddepSmall, buildBOB, buildSAM, buildSusiMail, buildSusiDNS, buildI2PSnark" />
<target name="builddepSmall" depends="buildrouter, buildSystray, buildRouterConsole, buildStreaming, buildI2PTunnel, buildAddressbook" />
<!-- start of buildX, one for each sub-build.xml.
Do not put ant tasks in the sub-build.xmls anymore,
so the build will go faster.
-->
<!-- TODO remove I2PTunnel dependency in BOB -->
<target name="buildBOB" depends="buildStreaming, buildI2PTunnel" >
<ant dir="apps/BOB/" target="jar" /> <ant dir="apps/BOB/" target="jar" />
</target>
<target name="buildSAM" depends="buildStreaming" >
<ant dir="apps/sam/java/" target="jar" /> <ant dir="apps/sam/java/" target="jar" />
</target>
<target name="buildSusiMail" depends="buildCore, buildJetty" >
<ant dir="apps/susimail/" target="war" /> <ant dir="apps/susimail/" target="war" />
</target>
<target name="buildSusiDNS" depends="buildCore, buildJetty" >
<ant dir="apps/susidns/src" target="all" /> <ant dir="apps/susidns/src" target="all" />
</target>
<target name="buildI2PSnark" depends="buildStreaming, buildJetty" >
<ant dir="apps/i2psnark/java/" target="war" /> <ant dir="apps/i2psnark/java/" target="war" />
</target> </target>
<target name="builddepSmall">
<ant dir="core/java/" target="jar" /> <target name="buildAddressbook" depends="buildCore, buildJetty" >
<ant dir="router/java/" target="jar" />
<ant dir="apps/systray/java/" target="jar" />
<ant dir="apps/routerconsole/java/" target="jar" />
<ant dir="apps/ministreaming/java/" target="jar" />
<ant dir="apps/streaming/java/" target="jar" />
<ant dir="apps/i2ptunnel/java/" target="build" />
<ant dir="apps/addressbook/" target="war" /> <ant dir="apps/addressbook/" target="war" />
</target> </target>
<target name="buildrouter">
<ant dir="core/java/" target="jar" /> <target name="buildI2PTunnel" depends="buildStreaming, buildJetty" >
<ant dir="apps/i2ptunnel/java/" target="build" />
</target>
<target name="buildRouterConsole" depends="buildrouter, buildSystray, buildJetty" >
<ant dir="apps/routerconsole/java/" target="jar" />
</target>
<target name="buildJetty" >
<ant dir="apps/jetty" target="build" />
</target>
<target name="buildSystray" depends="buildCore" >
<ant dir="apps/systray/java/" target="jar" />
</target>
<target name="buildStreaming" depends="buildMinistreaming" >
<ant dir="apps/streaming/java/" target="jar" />
</target>
<target name="buildMinistreaming" depends="buildCore" >
<ant dir="apps/ministreaming/java/" target="jar" />
</target>
<target name="buildRouter" depends="buildrouter" />
<target name="buildrouter" depends="buildCore" >
<ant dir="router/java/" target="jar" /> <ant dir="router/java/" target="jar" />
<copy file="core/java/build/i2p.jar" todir="build/" />
<copy file="router/java/build/router.jar" todir="build/" /> <copy file="router/java/build/router.jar" todir="build/" />
</target> </target>
<target name="buildWEB">
<ant dir="apps/jetty" target="ensureJettylib" /> <target name="buildCore" >
<ant dir="apps/routerconsole/java" target="build" /> <ant dir="core/java/" target="jar" />
<copy file="core/java/build/i2p.jar" todir="build/" />
</target>
<!-- end of sub-build.xml targets -->
<target name="buildWEB" depends="buildRouterConsole" >
<copy file="apps/routerconsole/java/build/routerconsole.jar" todir="build/" /> <copy file="apps/routerconsole/java/build/routerconsole.jar" todir="build/" />
<copy file="apps/routerconsole/java/build/routerconsole.war" todir="build/" /> <copy file="apps/routerconsole/java/build/routerconsole.war" todir="build/" />
<copy file="apps/jetty/jettylib/org.mortbay.jetty.jar" todir="build/" /> <copy file="apps/jetty/jettylib/org.mortbay.jetty.jar" todir="build/" />
@ -98,6 +144,7 @@
<copy file="apps/jetty/jettylib/commons-el.jar" todir="build/" /> <copy file="apps/jetty/jettylib/commons-el.jar" todir="build/" />
<copy file="apps/jetty/jettylib/javax.servlet.jar" todir="build/" /> <copy file="apps/jetty/jettylib/javax.servlet.jar" todir="build/" />
</target> </target>
<target name="buildexe"> <target name="buildexe">
<condition property="noExe"> <condition property="noExe">
<os arch="x86_64" /> <os arch="x86_64" />

View File

@ -1,3 +1,12 @@
2010-11-28 zzz
* Build: Move all dependencies to top-level build.xml,
so each sub-build.xml is only executed once
* i2psnark:
- Fix NPE and other partials bugs
- More extension message stubbing
- Log tweaks
* I2PTunnel: Deprecate destFromName()
2010-11-27 zzz 2010-11-27 zzz
* Build: * Build:
- Add man pages to package - Add man pages to package
@ -13,7 +22,7 @@
* Streaming: Fix race NPE at stream close * Streaming: Fix race NPE at stream close
2010-11-27 dr|z3d 2010-11-27 dr|z3d
* I2PSnark: New alterntive theme: "Vanilla". * I2PSnark: New alternative theme: "Vanilla".
* Big thanks to sponge for implementing the theme changer! * Big thanks to sponge for implementing the theme changer!
2010-11-27 sponge 2010-11-27 sponge

View File

@ -13,23 +13,29 @@
</div> </div>
</div> </div>
<div class="welcome"><h2>Welcome to the Invisible Internet</h2></div> <div class="welcome"><h2>Welcome to the Invisible Internet</h2></div>
<ul class="links"><li class="tidylist"><b>Starting Up&hellip;</b><br>If you've just started I2P, the number of <i>Active Peers</i> indicated under the <i>Peers Section</i> in the sidepanel on the left should start to grow over the next few minutes and you'll see a <i>Local Destination</i> named <i>Shared Clients</i> listed at the bottom of the lefthand sidepanel <ul class="links"><li class="tidylist"><b>Starting Up&hellip;</b><br>If you've just started I2P, the number of <i>Active Peers</i> indicated under the <i>Peers Section</i> in the sidepanel on the left should start to grow over the next few minutes and you'll see a <i>Local Destination</i> named <i>Shared Clients</i> listed at the bottom of the lefthand sidepanel and possibly other clients and servers depending on how I2P is configured
(if not, <a href="#trouble">see below</a>). The first time you start I2P it may take a few minutes to bootstrap you into the network and find additional peers to optimize your integration, so please be patient. Once green stars are indicated next to your <i>Local Destinations</i>, there is a wide variety of things you can do with I2P, and below we introduce you to some of them.</li></ul> (if not, <a href="#trouble">see below</a>). These <i>Local Destinations</i> provide connections on different ports (and sometimes protocols) to the I2P network enabling your bittorrent, e-mail, web proxy and other services to function.</li>
<li class="tidylist"><b>Network integration</b><br> The first time you start I2P it may take a few minutes to bootstrap (integrate) you into the network and find additional peers to optimize your integration, so please be patient. Once green stars are indicated next to your <i>Local Destinations</i>, there is a wide variety of things you can do with I2P, and below we introduce you to some of them.</ul>
<h3>Services on I2P</h3> <h3>Services on I2P</h3>
<ul class="links"><li class="tidylist"><b>Anonymous File Transfer</b><br><a href="/i2psnark" target="_blank">I2PSnark</a> is integrated into I2P, providing anonymous, encrypted <a href="https://secure.wikimedia.org/wikipedia/en/wiki/BitTorrent_(protocol)" target="_blank">BitTorrent</a> transfers. In addition, Sponge develops a bittorrent client called <a href="http://bob.i2p/Robert.html">Robert</a> written in <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Python_%28programming_language%29" target="_blank">Python</a>. There is also a port of <a href="http://www.emule-project.net/" target="_blank">eMule</a> to I2P called <a href="http://echelon.i2p/imule">iMule</a> [Urgently needs developers!], a hookup into the <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Gnutella" target="_blank">Gnutella network</a> in the shape of <a href="http://echelon.i2p/i2phex/" target="_blank">I2Phex</a>, and additional facilities including web-based file hosting etc.</li> <ul class="links">
<li class="tidylist"><b>Anonymous E-mail</b><br>Postman's I2P-based mail system can be accessed either via <a href="/susimail/">I2P's built-in webmail</a> (aka susimail) or using any mail client that supports smtp and pop3. Accounts can send and receive mail from the normal internet. For an account, visit <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Additionally, <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> is a new serverless, end-to-end encrypted e-mail system (with web interface) developed by HungryHobo, installable as a plugin.</li>
<li class="tidylist"><b>Anonymous E-mail</b><br>Postman's I2P-based mail system can be accessed either via <a href="/susimail/">I2P's built-in webmail</a> (aka susimail) or using any mail client that supports smtp and pop3. Accounts can send and receive mail from the normal internet. For an account, visit <a href="http://hq.postman.i2p/" target="_blank">hq.postman.i2p</a>. Additionally, <a href="http://i2pbote.i2p/" target="_blank">I2P-Bote</a> is a new serverless, end-to-end encrypted e-mail system (with web interface) developed by HungryHobo, installable as a <a href="#plugins">plugin</a>.</li>
<li class="tidylist"<b>Invisible Internet & Public Web Browsing</b><br>On I2P you can host anonymous websites (aka eepsites) and other services (eg. ssh over I2p, your own IRC server etc), and you can also access the normal web anonymously via I2P. <a href="http://www.i2p2.de/htproxyports.html" target="_blank">Configure your browser</a> to use the HTTP <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Proxy_server " target="_blank">proxy</a> I2P provides at <code>127.0.0.1 port 4444</code>, then browse to an eepsite or a normal <code>http://</code> address. <a href="#eepsites">Below</a> we list some of the sites hosted on I2P.</li>
<li class="tidylist"><b>Anonymous File Transfer</b><br><a href="/i2psnark" target="_blank">I2PSnark</a> is integrated into I2P, providing anonymous, encrypted <a href="https://secure.wikimedia.org/wikipedia/en/wiki/BitTorrent_(protocol)" target="_blank">BitTorrent</a> transfers. In addition, Sponge develops a bittorrent client called <a href="http://bob.i2p/Robert.html">Robert</a> written in Python. There is also a port of <a href="http://www.emule-project.net/" target="_blank">eMule</a> to I2P called <a href="http://echelon.i2p/imule">iMule</a> [Needs developers!], an anonymous, secure implementation of a <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Gnutella" target="_blank">Gnutella network</a>, accessible using <a href="http://echelon.i2p/i2phex/" target="_blank">I2Phex</a>, and additional facilities including browser-based file hosting etc.</li>
<li class="tidylist"><b>Anonymous Chat</b><br>Start your IRC client (eg. chatzilla) <li class="tidylist"><b>Anonymous Chat</b><br>Start your IRC client (eg. chatzilla)
and connect to the <a href="irc://127.0.0.1:6668/i2p">server</a> at <code>127.0.0.1 port 6668</code>. Your local I2P IRC proxy on localhost:6668 will direct you to one of two IRC servers hosted on I2P by Postman and Badger, but neither you nor they know where the other is, and your mom, ISP or government is unable to intercept your conversation! Once you're there, #i2p, #i2p-help, #i2p-chat and #i2p-dev are just a few of the available channels you may wish to /join. There's also a I2P based <a href=http://echelon.i2p/qti2pmessenger>instant messenger</a> for unmonitorable, uncensorable, anonymous chat.</li> and connect to the <a href="irc://127.0.0.1:6668/i2p">server</a> at <code>127.0.0.1 port 6668</code>. Your local I2P IRC proxy on localhost:6668 will direct you to one of two IRC servers hosted on I2P by Postman and Badger, but neither you nor they know where the other is, and your mom, ISP or government is unable to intercept your conversation! Once you're there, <code>#i2p</code>, <code>#i2p-help</code>, <code>#i2p-chat</code> and <code>#i2p-dev</code> are just a few of the available channels you may wish to /join. There's also a I2P based <a href=http://echelon.i2p/qti2pmessenger>instant messenger</a> for unmonitorable, uncensorable, anonymous chat.</li>
<li class="tidylist"><b>Forums & Blogging</b><br><a href="http://syndie.i2p2.de/" target="_blank">Syndie</a> is a distributed forum and blogging platform for I2P [Urgently needs developers!]. There's also an I2P plugin port of the Java-based <a href="http://pebble.sourceforge.net/" target="_blank">pebble</a> blogging platform ported to I2P by zzz, available on <a href="http://i2plugins.i2p" target="_blank">i2plugins.i2p</a>. And of course all normal blogging, forum and cms software will run over I2P, though you're advised to take extra precautions with security when setting up and keep all associated software (eg. Php, MySql, Python, Apache etc) up to date and locked down!</li> <li class="tidylist"><b>Forums & Blogging</b><br><a href="http://syndie.i2p2.de/" target="_blank">Syndie</a> is a distributed forum and blogging platform for I2P [Needs developers!]. There's also an I2P plugin port of the Java-based <a href="http://pebble.sourceforge.net/" target="_blank">pebble</a> blogging platform ported to I2P by zzz, available on <a href="http://i2plugins.i2p" target="_blank">i2plugins.i2p</a>. And of course all normal blogging, forum and cms software will run over I2P, though you're advised to take extra precautions with security when setting up and keep all associated software (eg. Php, MySql, Python, Apache etc) up to date and locked down! Also, there are quite a few forums running on I2P in various languages; see <a href="#eepsites">below</a> for some suggestions.</li>
<li class="tidylist"><b>Plugins for I2P</b><br>Extend the usefulness of I2P by installing plugins&hellip; blogging, chatting, filesharing and other plugins have already been written or ported and await your <a href="http://i2plugins.i2p/plugins/" target="_blank">installation</a>! Browse the plugins and related info at <a href="http://i2plugins.i2p" target="_blank">i2plugins.i2p</a>. If you're a <a href="http://i2plugins.i2p/developers/" target="_blank">developer</a>, a complete language agnostic framework for writing your own plugins is provided with <a href="http://i2plugins.i2p/specs/" target="_blank">documentation</a>; I2P plugins can be coded in any language. <a name="plugins"></a><li class="tidylist"><b>Plugins for I2P</b><br>Extend the usefulness of I2P by installing plugins&hellip; blogging, chatting, filesharing and other plugins have already been written or ported and await your <a href="http://i2plugins.i2p/plugins/" target="_blank">installation</a>! Browse the plugins and related info at <a href="http://i2plugins.i2p" target="_blank">i2plugins.i2p</a>. If you're a <a href="http://i2plugins.i2p/developers/" target="_blank">developer</a>, a complete language agnostic framework for writing your own plugins is provided with <a href="http://i2plugins.i2p/specs/" target="_blank">documentation</a>; I2P plugins can be coded in any language.</li>
<li class="tidylist"<b>I2P Darknet & Public Web browsing</b><br>On I2P you can host anonymous websites (aka eepsites) and other services (eg. ssh over I2p, your own IRC server etc), and you can also access the normal web anonymously via I2P. Configure your browser to use the HTTP <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Proxy_server " target="_blank">proxy</a> I2P provides at <code>127.0.0.1 port 4444</code>, then <br></ul>
browse to an eepsite or a normal <code>http://</code> address. <a href="#eepsites">Below</a> we list some of the sites hosted on I2P.<br></ul>
<h3>Anonymous Encrypted Webserving on I2P</h3> <h3>Anonymous Encrypted Webserving on I2P</h3>
<ul class="links"> <ul class="links">
<li class="tidylist"><b>Ready to roll!</b><br>I2P comes built-in with a ready-to-go webserver for hosting your own anonymous website (eepsite) on the I2P <a href="https://secure.wikimedia.org/wikipedia/en/wiki/Darknet_%28file_sharing%29" target="_blank">darknet</a>: a <a href="http://jetty.mortbay.org/" target="_blank">Jetty</a> instance listening on <a href="http://127.0.0.1:7658/" target="_blank">http://127.0.0.1:7658/</a>. To host your own content <li class="tidylist"><b>Ready to roll!</b><br>I2P comes built-in with a ready-to-go webserver for hosting your own anonymous website (eepsite) on the I2P network: a <a href="http://jetty.mortbay.org/" target="_blank">Jetty</a> instance listening on <a href="http://127.0.0.1:7658/" target="_blank">http://127.0.0.1:7658/</a>. To host your own content
simply place your files in the <code>eepsite/docroot/</code> directory (or place simply place your files in the <code>eepsite/docroot/</code> directory (or place
any standard JSP/Servlet <code>.war</code> files under <code>eepsite/webapps</code>, any standard JSP/Servlet <code>.war</code> files under <code>eepsite/webapps</code>,
or standard CGI script under <code>eepsite/cgi-bin</code>) and they'll show or standard CGI script under <code>eepsite/cgi-bin</code>) and they'll show
@ -56,7 +62,7 @@ your eepsite will be visible (but not discoverable) to others. Detailed instruct
Peer into the filesharing world of the <a href="http://freenetproject.org/" target="_blank">Freenet</a> darknet with Tino's I2P to Freenet proxy.</li> Peer into the filesharing world of the <a href="http://freenetproject.org/" target="_blank">Freenet</a> darknet with Tino's I2P to Freenet proxy.</li>
<li class="tidylist"><b>Eepsite Search Engine</b><br><a href="http://eepsites.i2p/" target="_blank">eepsites.i2p</a>: An <li class="tidylist"><b>Eepsite Search Engine</b><br><a href="http://eepsites.i2p/" target="_blank">eepsites.i2p</a>: An
anonymously hosted eepsite search engine.</li> anonymously hosted eepsite search engine.</li>
<li class="tidylist"><b>Explore the darknet!</b><br>There are many more eepsites - just follow the links from the ones you see, <li class="tidylist"><b>Discover I2P</b><br>There are many more eepsites - just follow the links from the ones you see,
bookmark your favorites, and visit them often! There's a custom build of Firefox built especially for I2P called <a href="http://echelon.i2p/i2pfox/">I2PFox</a> you might like to investigate for locked down darknet exploration!</li> bookmark your favorites, and visit them often! There's a custom build of Firefox built especially for I2P called <a href="http://echelon.i2p/i2pfox/">I2PFox</a> you might like to investigate for locked down darknet exploration!</li>
</ul> </ul>
</ul> </ul>

View File

@ -304,7 +304,7 @@ div.main {
} }
div.main ul { div.main ul {
margin: -10px 0 -10px -10px; margin: -10px 0 10px -10px;
} }
div.main li { div.main li {

View File

@ -91,11 +91,10 @@ div.routersummaryouter {
} }
div.routersummary { div.routersummary {
width: 175px; width: 173px;
padding: 10px; padding: 10px;
text-align: center; text-align: center;
border: 1px solid #494; border: 1px solid #494;
background: #000;
background: #000 url(images/camotile2.png); background: #000 url(images/camotile2.png);
color: #EE9; color: #EE9;
font-size: 8pt; font-size: 8pt;
@ -104,10 +103,9 @@ div.routersummary {
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
border-radius: 4px; border-radius: 4px;
float: left; float: left;
/* -moz-box-shadow: inset 0px 0px 0px 0px #EE9;
-khtml-box-shadow: inset 0px 0px 1px 0px #EE9;
box-shadow: inset 0px 0px 1px 0px #EE9;*/
-moz-box-shadow: 0 1px 5px #000; -moz-box-shadow: 0 1px 5px #000;
-khtml-box-shadow: 0 1px 5px #000;
box-shadow: 0 1px 5px #000;
} }
div.routersummary input[type=text] { div.routersummary input[type=text] {
@ -158,7 +156,7 @@ div.routersummary h4 {
div.routersummary table { div.routersummary table {
border: 0; border: 0;
text-align: center !important; text-align: center !important;
margin: -5px -7px -5px -7px !important; margin: -5px -7px -5px -8px !important;
width: 188px !important; width: 188px !important;
overflow: hidden; overflow: hidden;
font-size: 8pt; font-size: 8pt;
@ -219,7 +217,7 @@ div.tunnels {
} }
div.tunnels table { div.tunnels table {
margin: -5px 0 -5px -2px !important; margin: -5px 0 -5px -3px !important;
} }
div.tunnels td { div.tunnels td {
@ -234,6 +232,7 @@ div.tunnels td:first-child {
div.tunnels td:last-child { div.tunnels td:last-child {
text-align: right; text-align: right;
padding-right: 1px;
} }
div.tunnels tr { div.tunnels tr {
@ -315,7 +314,6 @@ div.news {
padding: 5px 30px 10px 30px; padding: 5px 30px 10px 30px;
border: 1px solid #494; border: 1px solid #494;
background: #000; background: #000;
/* background-image: -moz-linear-gradient(top, bottom, from(#030), to(#050), color-stop(30%, #030), color-stop(100%, #000));///*/
background: #000 url("images/bg2.png")no-repeat scroll bottom right; background: #000 url("images/bg2.png")no-repeat scroll bottom right;
color: #7b7; color: #7b7;
border-radius: 4px; border-radius: 4px;
@ -402,11 +400,11 @@ div.messages {
background: #000 /*url('images/infotile.png') center left no-repeat;*/ background: #000 /*url('images/infotile.png') center left no-repeat;*/
font-weight: bold; font-weight: bold;
font-size: 9pt; font-size: 9pt;
color: #ddf; color: #4f4;
} }
div.messages span.error { div.messages span.error {
color: #dd0; color: #d90;
} }
div.messages span.notice { div.messages span.notice {
@ -759,7 +757,7 @@ button:active {
} }
.langbox img { .langbox img {
opacity: 0.7; opacity: 0.5;
-moz-box-shadow: 0 0 1px #000; -moz-box-shadow: 0 0 1px #000;
} }

View File

@ -1,4 +1,6 @@
/* I2P Console Theme "Corporat" by dr|z3d. Aka "light". As in beer.*/ /* I2P Theme: Light */
/* I2P Description: Light theme with soft blue highlights. */
/* Author: dr|z3d */
body { body {
margin: 15px 0 0 10px; margin: 15px 0 0 10px;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 741 B

After

Width:  |  Height:  |  Size: 719 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 B

After

Width:  |  Height:  |  Size: 254 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 543 B

After

Width:  |  Height:  |  Size: 555 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 454 B

After

Width:  |  Height:  |  Size: 740 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 512 B

After

Width:  |  Height:  |  Size: 506 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 492 B

After

Width:  |  Height:  |  Size: 481 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 634 B

After

Width:  |  Height:  |  Size: 666 B

View File

@ -98,13 +98,16 @@ body {
} }
.snarkMessages a:link { .snarkMessages a:link {
color: #37f !important; color: #f60 !important;
} }
.snarkMessages a:hover { .snarkMessages a:hover {
color: #59f !important; color: #f90 !important;
} }
.snarkMessages a:visited {
color: #d30 !important;
}
.logshim { .logshim {
margin-top: -10px !important; margin-top: -10px !important;
} }
@ -128,6 +131,7 @@ table {
color: #323; color: #323;
width: 100%; width: 100%;
opacity: 1 !important; opacity: 1 !important;
font-weight: bold;
} }
tr { tr {
@ -135,7 +139,7 @@ tr {
} }
thead, tfoot { thead, tfoot {
text-shadow:0 1px 1px #b48; text-shadow:0 1px 0px #930;
background: url("images/bling.png") repeat-x scroll center center #867; background: url("images/bling.png") repeat-x scroll center center #867;
} }
@ -234,7 +238,6 @@ td:first-child {
} }
.snarkTorrentAction { .snarkTorrentAction {
text-shadow:1px 1px #540;
padding: 1px 1px 1px 1px !important; padding: 1px 1px 1px 1px !important;
margin: 0 !important; margin: 0 !important;
text-align: center; text-align: center;
@ -242,12 +245,9 @@ td:first-child {
} }
.snarkTorrentAction img { .snarkTorrentAction img {
margin: 0 2px !important;
opacity: 0.6;
} }
.snarkTorrentAction img:hover { .snarkTorrentAction img:hover {
-moz-box-shadow: 0 0 1px 1px #f90;
opacity: 1; opacity: 1;
} }
@ -327,7 +327,7 @@ td:first-child {
.snarkFileSize { .snarkFileSize {
padding: 4px 2px; padding: 4px 2px;
font-weight: bold; font-weight: bold;
color: #b6b !important; color: #727 !important;
} }
.snarkFileStatus { .snarkFileStatus {
@ -341,7 +341,7 @@ td:first-child {
.snarkTorrentETA { .snarkTorrentETA {
font-weight: bold; font-weight: bold;
font-style: italic; font-style: italic;
color: #dd7 !important; color: #505 !important;
} }
.thumb { .thumb {
@ -381,7 +381,7 @@ td:first-child {
} }
.page { .page {
background: #fff; /*url('/themes/snark/ubergine/images/tile2.png');*/ background: #fff url('images/tile2.png');
color: #310; color: #310;
min-width: 970px !important; min-width: 970px !important;
margin: 5px 0 0 0; margin: 5px 0 0 0;
@ -418,20 +418,20 @@ hr {
} }
a:link { a:link {
color: #903; color: #742;
text-decoration: none; text-decoration: none;
font-weight: bold; font-weight: bold;
word-wrap: break-word; word-wrap: break-word;
} }
a:visited { a:visited {
color: #703; color: #962;
text-decoration: none; text-decoration: none;
font-weight: bold; font-weight: bold;
} }
a:hover { a:hover {
color: #b06 color: #f30;
font-weight: bold; font-weight: bold;
} }
@ -456,18 +456,20 @@ input.r {
input[type=submit] { input[type=submit] {
text-shadow: 0px 0px #410; text-shadow: 0px 0px #410;
color: #000; color: #f30;
background: #fff; background: #fff;
border: 1px outset #bbb; border: 1px outset #bbb;
padding: 2px; padding: 2px;
background: #fef url('images/bling.png') repeat-x scroll center center;
} }
input[type=submit]:hover { input[type=submit]:hover {
border: 1px inset #bbb; border: 1px inset #bbb;
text-shadow: 0 0; text-shadow: 0 0;
background: #fef; background: #fef;
color: #fff; color: #f60;
text-shadow: 0px 1px 1px #513; background: #fef url('images/bling2.png') repeat-x scroll center center;
} }
input[type=submit]:active { input[type=submit]:active {
@ -487,7 +489,6 @@ input[type=image] {
} }
input[type=image]:hover { input[type=image]:hover {
border: 1px outset #bbb;
} }
input[type=text]:active, input[type=text]:hover, input.r:hover { input[type=text]:active, input[type=text]:hover, input.r:hover {
@ -589,7 +590,7 @@ div.newtorrentsection {
-khtml-box-shadow: inset 0px 0px 1px 0px #fff; -khtml-box-shadow: inset 0px 0px 1px 0px #fff;
box-shadow: inset 0px 0px 1px 0px #fff; box-shadow: inset 0px 0px 1px 0px #fff;
word-wrap: break-word; word-wrap: break-word;
background: #fef url('/themes/snark/ubergine/images/snark_create.png') no-repeat scroll right center; background: #ffd url('/themes/snark/ubergine/images/snark_create.png') no-repeat scroll right center;
opacity: 1.0; opacity: 1.0;
} }
@ -606,7 +607,7 @@ div.addtorrentsection {
-khtml-box-shadow: inset 0px 0px 1px 0px #fff; -khtml-box-shadow: inset 0px 0px 1px 0px #fff;
box-shadow: inset 0px 0px 1px 0px #fff; box-shadow: inset 0px 0px 1px 0px #fff;
word-wrap: break-word; word-wrap: break-word;
background: #fef url('/themes/snark/ubergine/images/snark_add.png') no-repeat scroll right center; background: #ffd url('/themes/snark/ubergine/images/snark_add.png') no-repeat scroll right center;
opacity: 1.0; opacity: 1.0;
} }
@ -623,7 +624,7 @@ div.configsection {
box-shadow: inset 0px 0px 1px 0px #fff; box-shadow: inset 0px 0px 1px 0px #fff;
word-wrap: break-word; word-wrap: break-word;
text-align: center; text-align: center;
background: #fef; background: #ffd;
font-weight: bold; font-weight: bold;
} }
@ -640,7 +641,7 @@ div.configsectionpanel {
box-shadow: inset 0px 0px 1px 0px #fff; box-shadow: inset 0px 0px 1px 0px #fff;
word-wrap: break-word; word-wrap: break-word;
text-align: center; text-align: center;
background: #fef url('/themes/snark/ubergine/images/configuration.png') no-repeat scroll right center; background: #ffd url('/themes/snark/ubergine/images/configuration.png') no-repeat scroll right center;
font-weight: bold; font-weight: bold;
} }

View File

@ -3,7 +3,7 @@
<target name="all" depends="clean, build" /> <target name="all" depends="clean, build" />
<target name="build" depends="builddep, jar" /> <target name="build" depends="builddep, jar" />
<target name="builddep"> <target name="builddep">
<ant dir="../../core/java/" target="build" /> <!-- run from top level build.xml to get dependencies built -->
</target> </target>
<target name="builddeptest"> <target name="builddeptest">
<ant dir="../../core/java/" target="jarTest" /> <ant dir="../../core/java/" target="jarTest" />
@ -131,9 +131,7 @@
<delete dir="./build" /> <delete dir="./build" />
</target> </target>
<target name="cleandep" depends="clean"> <target name="cleandep" depends="clean">
<ant dir="../../core/java/" target="cleandep" />
</target> </target>
<target name="distclean" depends="clean"> <target name="distclean" depends="clean">
<ant dir="../../core/java/" target="distclean" />
</target> </target>
</project> </project>

View File

@ -18,7 +18,7 @@ public class RouterVersion {
/** deprecated */ /** deprecated */
public final static String ID = "Monotone"; public final static String ID = "Monotone";
public final static String VERSION = CoreVersion.VERSION; public final static String VERSION = CoreVersion.VERSION;
public final static long BUILD = 12; public final static long BUILD = 13;
/** for example "-test" */ /** for example "-test" */
public final static String EXTRA = ""; public final static String EXTRA = "";