From 5c99494b288ee0d3c4ac5a3253ada415d2074234 Mon Sep 17 00:00:00 2001 From: myleshorton Date: Thu, 17 Feb 2011 16:33:17 -0800 Subject: [PATCH] Removing common and server projects for now to simplify repo under a single lantern module --- client/clientTest.bash => clientTest.bash | 0 common/pom.xml | 25 - .../src/main/java/org/mg/common/ChatData.java | 15 - .../org/mg/common/InOrderMessageWriter.java | 25 - .../src/main/java/org/mg/common/MgUtils.java | 52 -- .../mg/common/OutOfOrderMessageProcessor.java | 123 ---- common/src/main/java/org/mg/common/Pair.java | 25 - .../src/main/java/org/mg/common/PairImpl.java | 76 --- .../org/mg/common/RangeDownloaderAdaptor.java | 45 -- .../org/mg/common/XmppMessageConstants.java | 36 - ...ttleproxy_cert => lantern_littleproxy_cert | Bin client/mg_16x16.png => mg_16x16.png | Bin pom.xml | 220 +----- client/run.bash => run.bash | 0 server/pom.xml | 68 -- server/run.bash | 17 - .../org/mg/server/ChatMessageListener.java | 641 ------------------ .../java/org/mg/server/DefaultXmppProxy.java | 414 ----------- .../src/main/java/org/mg/server/Launcher.java | 41 -- .../LocalProxyResponseToXmppRelayer.java | 158 ----- .../java/org/mg/server/ServerConstants.java | 7 - .../main/java/org/mg/server/XmppProxy.java | 11 - server/src/main/resources/log4j.properties | 43 -- server/src/test/resources/log4j.properties | 42 -- .../java/org/lantern/client/Configurator.java | 0 .../org/lantern/client/HttpProxyServer.java | 0 .../lantern/client/HttpRequestHandler.java | 0 .../client/HttpRequestHandlerData.java | 0 .../client/HttpServerPipelineFactory.java | 0 .../org/lantern/client/LanternConstants.java | 0 .../client/LanternHttpProxyServer.java | 0 .../client/LanternKeyStoreManager.java | 0 .../lantern/client/LanternTrustManager.java | 0 .../java/org/lantern/client/LanternUtils.java | 0 .../java/org/lantern/client/Launcher.java | 0 .../java/org/lantern/client/NativeUtils.java | 0 .../lantern/client/PeerProxyRelayHandler.java | 0 .../org/lantern/client/ProxyRelayHandler.java | 0 .../lantern/client/ProxyStatusListener.java | 0 .../client/RawSocketProxyRelayHandler.java | 0 .../java/org/lantern/client/SystemTray.java | 0 .../org/lantern/client/SystemTrayImpl.java | 0 .../org/lantern/client/WindowsRegistry.java | 0 .../lantern/client/XmppMessageConstants.java | 0 .../org/lantern/client/contacts/Contact.java | 0 .../org/lantern/client/contacts/Contacts.java | 0 .../lantern/client/contacts/ContactsFeed.java | 0 .../lantern/client/contacts/ContactsUrl.java | 0 .../client/contacts/DefaultContacts.java | 0 .../org/lantern/client/contacts/Email.java | 0 .../org/lantern/client/xmpp/DefaultGChat.java | 0 .../java/org/lantern/client/xmpp/GChat.java | 0 .../main/resources/log4j.properties | 0 .../test/resources/log4j.properties | 0 54 files changed, 35 insertions(+), 2049 deletions(-) rename client/clientTest.bash => clientTest.bash (100%) delete mode 100644 common/pom.xml delete mode 100644 common/src/main/java/org/mg/common/ChatData.java delete mode 100644 common/src/main/java/org/mg/common/InOrderMessageWriter.java delete mode 100644 common/src/main/java/org/mg/common/MgUtils.java delete mode 100644 common/src/main/java/org/mg/common/OutOfOrderMessageProcessor.java delete mode 100644 common/src/main/java/org/mg/common/Pair.java delete mode 100644 common/src/main/java/org/mg/common/PairImpl.java delete mode 100644 common/src/main/java/org/mg/common/RangeDownloaderAdaptor.java delete mode 100644 common/src/main/java/org/mg/common/XmppMessageConstants.java rename client/lantern_littleproxy_cert => lantern_littleproxy_cert (100%) rename client/mg_16x16.png => mg_16x16.png (100%) rename client/run.bash => run.bash (100%) delete mode 100644 server/pom.xml delete mode 100755 server/run.bash delete mode 100644 server/src/main/java/org/mg/server/ChatMessageListener.java delete mode 100644 server/src/main/java/org/mg/server/DefaultXmppProxy.java delete mode 100644 server/src/main/java/org/mg/server/Launcher.java delete mode 100644 server/src/main/java/org/mg/server/LocalProxyResponseToXmppRelayer.java delete mode 100644 server/src/main/java/org/mg/server/ServerConstants.java delete mode 100644 server/src/main/java/org/mg/server/XmppProxy.java delete mode 100644 server/src/main/resources/log4j.properties delete mode 100644 server/src/test/resources/log4j.properties rename {client/src => src}/main/java/org/lantern/client/Configurator.java (100%) rename {client/src => src}/main/java/org/lantern/client/HttpProxyServer.java (100%) rename {client/src => src}/main/java/org/lantern/client/HttpRequestHandler.java (100%) rename {client/src => src}/main/java/org/lantern/client/HttpRequestHandlerData.java (100%) rename {client/src => src}/main/java/org/lantern/client/HttpServerPipelineFactory.java (100%) rename {client/src => src}/main/java/org/lantern/client/LanternConstants.java (100%) rename {client/src => src}/main/java/org/lantern/client/LanternHttpProxyServer.java (100%) rename {client/src => src}/main/java/org/lantern/client/LanternKeyStoreManager.java (100%) rename {client/src => src}/main/java/org/lantern/client/LanternTrustManager.java (100%) rename {client/src => src}/main/java/org/lantern/client/LanternUtils.java (100%) rename {client/src => src}/main/java/org/lantern/client/Launcher.java (100%) rename {client/src => src}/main/java/org/lantern/client/NativeUtils.java (100%) rename {client/src => src}/main/java/org/lantern/client/PeerProxyRelayHandler.java (100%) rename {client/src => src}/main/java/org/lantern/client/ProxyRelayHandler.java (100%) rename {client/src => src}/main/java/org/lantern/client/ProxyStatusListener.java (100%) rename {client/src => src}/main/java/org/lantern/client/RawSocketProxyRelayHandler.java (100%) rename {client/src => src}/main/java/org/lantern/client/SystemTray.java (100%) rename {client/src => src}/main/java/org/lantern/client/SystemTrayImpl.java (100%) rename {client/src => src}/main/java/org/lantern/client/WindowsRegistry.java (100%) rename {client/src => src}/main/java/org/lantern/client/XmppMessageConstants.java (100%) rename {client/src => src}/main/java/org/lantern/client/contacts/Contact.java (100%) rename {client/src => src}/main/java/org/lantern/client/contacts/Contacts.java (100%) rename {client/src => src}/main/java/org/lantern/client/contacts/ContactsFeed.java (100%) rename {client/src => src}/main/java/org/lantern/client/contacts/ContactsUrl.java (100%) rename {client/src => src}/main/java/org/lantern/client/contacts/DefaultContacts.java (100%) rename {client/src => src}/main/java/org/lantern/client/contacts/Email.java (100%) rename {client/src => src}/main/java/org/lantern/client/xmpp/DefaultGChat.java (100%) rename {client/src => src}/main/java/org/lantern/client/xmpp/GChat.java (100%) rename {client/src => src}/main/resources/log4j.properties (100%) rename {client/src => src}/test/resources/log4j.properties (100%) diff --git a/client/clientTest.bash b/clientTest.bash similarity index 100% rename from client/clientTest.bash rename to clientTest.bash diff --git a/common/pom.xml b/common/pom.xml deleted file mode 100644 index 57f3d114c5..0000000000 --- a/common/pom.xml +++ /dev/null @@ -1,25 +0,0 @@ - - 4.0.0 - org.lantern - lantern-common - jar - 0.2-SNAPSHOT - Common - Lantern Common Code - - - org.lantern - lantern-parent - 0.2-SNAPSHOT - - - - - org.jboss.netty - netty - - - - diff --git a/common/src/main/java/org/mg/common/ChatData.java b/common/src/main/java/org/mg/common/ChatData.java deleted file mode 100644 index 8e678e26f3..0000000000 --- a/common/src/main/java/org/mg/common/ChatData.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.mg.common; - -import javax.management.MXBean; - -@MXBean(true) -public interface ChatData { - - double getRate(); - - int getAverageMessageSize(); - - int getTotalMessages(); - - long getTotalBytes(); -} diff --git a/common/src/main/java/org/mg/common/InOrderMessageWriter.java b/common/src/main/java/org/mg/common/InOrderMessageWriter.java deleted file mode 100644 index 9eea217a81..0000000000 --- a/common/src/main/java/org/mg/common/InOrderMessageWriter.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.mg.common; - -import org.jivesoftware.smack.packet.Message; - -/** - * Interface for classes that write ordered messages to a consumer that cares - * they're in the correct order, such as a web browser or a web site. - */ -public interface InOrderMessageWriter { - - /** - * Notification to write the specified message. Called in-order as always. - * - * @param msg The message to write. - */ - void write(Message msg); - - /** - * Called when we get a message to close the connection. This is only - * called when the close is requested in proper sequence. Otherwise, - * the caller will wait for the proper messages before making this call. - */ - void onClose(); - -} diff --git a/common/src/main/java/org/mg/common/MgUtils.java b/common/src/main/java/org/mg/common/MgUtils.java deleted file mode 100644 index 30594f09f8..0000000000 --- a/common/src/main/java/org/mg/common/MgUtils.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.mg.common; - -import java.io.File; -import java.nio.ByteBuffer; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -import org.apache.commons.codec.binary.Base64; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelFutureListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class MgUtils { - - private static final Logger LOG = LoggerFactory.getLogger(MgUtils.class); - - /** - * Closes the specified channel after all queued write requests are flushed. - */ - public static void closeOnFlush(final Channel ch) { - LOG.info("Closing channel on flush: {}", ch); - if (ch == null) { - LOG.warn("Channel is NULL!!"); - return; - } - if (ch.isConnected()) { - ch.write(ChannelBuffers.EMPTY_BUFFER).addListener( - ChannelFutureListener.CLOSE); - } - } - - public static String toMd5(final byte[] raw) { - try { - final MessageDigest md = MessageDigest.getInstance("MD5"); - final byte[] digest = md.digest(raw); - return Base64.encodeBase64URLSafeString(digest); - } catch (final NoSuchAlgorithmException e) { - LOG.error("No MD5 -- will never happen", e); - return "NO MD5"; - } - } - - public static byte[] toRawBytes(final ByteBuffer buf) { - final int mark = buf.position(); - final byte[] bytes = new byte[buf.remaining()]; - buf.get(bytes); - buf.position(mark); - return bytes; - } -} diff --git a/common/src/main/java/org/mg/common/OutOfOrderMessageProcessor.java b/common/src/main/java/org/mg/common/OutOfOrderMessageProcessor.java deleted file mode 100644 index 8fa0caefe0..0000000000 --- a/common/src/main/java/org/mg/common/OutOfOrderMessageProcessor.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.mg.common; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.apache.commons.lang.StringUtils; -import org.jboss.netty.channel.Channel; -import org.jivesoftware.smack.Chat; -import org.jivesoftware.smack.MessageListener; -import org.jivesoftware.smack.packet.Message; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class OutOfOrderMessageProcessor implements MessageListener { - - private final Logger log = LoggerFactory.getLogger(getClass()); - - private long expectedSequenceNumber = 0L; - - private final Map sequenceMap = - new ConcurrentHashMap(); - - private final String key; - - private final InOrderMessageWriter messageWriter; - - public OutOfOrderMessageProcessor(final Channel browserToProxyChannel, - final String key, final InOrderMessageWriter messageWriter) { - this.key = key; - this.messageWriter = messageWriter; - } - - public void processMessage(final Chat ch, final Message msg) { - log.info("Received message with props: {}", - msg.getPropertyNames()); - final long sequenceNumber = (Long) msg.getProperty("SEQ"); - log.info("SEQUENCE NUMBER: "+sequenceNumber+ " FOR: "+hashCode()); - - // If the other side is sending the close directive, we - // need to close the connection to the browser. - if (isClose(msg)) { - // This will happen quite often, as the XMPP server won't - // necessarily deliver messages in order. - if (sequenceNumber != expectedSequenceNumber) { - log.info("BAD SEQUENCE NUMBER ON CLOSE. " + - "EXPECTED "+expectedSequenceNumber+ - " BUT WAS "+sequenceNumber); - sequenceMap.put(sequenceNumber, msg); - } - else { - log.info("Got CLOSE. Notifying in order writer."); - log.info("Remaining messages: "+this.sequenceMap); - this.messageWriter.onClose(); - } - return; - } - - // We need to grab the HTTP data from the message and send - // it to the browser. - final String data = (String) msg.getProperty("HTTP"); - if (data == null) { - log.warn("No HTTP data"); - return; - } - - final String mac = (String) msg.getProperty("MAC"); - final String hc = (String) msg.getProperty("HASHCODE"); - final String localKey = newKey(mac, Integer.parseInt(hc)); - if (!localKey.equals(this.key)) { - log.error("RECEIVED A MESSAGE THAT'S NOT FOR US?!?!?!"); - log.error("\nOUR KEY IS: "+this.key+ - "\nBUT RECEIVED: "+localKey); - } - - synchronized (this) { - if (sequenceNumber != expectedSequenceNumber) { - log.info("BAD SEQUENCE NUMBER. " + - "EXPECTED "+expectedSequenceNumber+ - " BUT WAS "+sequenceNumber+" FOR KEY: "+localKey); - sequenceMap.put(sequenceNumber, msg); - } - else { - this.messageWriter.write(msg); - expectedSequenceNumber++; - - while (sequenceMap.containsKey(expectedSequenceNumber)) { - log.info("WRITING SEQUENCE number: "+ - expectedSequenceNumber); - final Message curMessage = - sequenceMap.remove(expectedSequenceNumber); - - // It's possible to get the close event itself out of - // order, so we need to check if the stored message is a - // close message. - if (isClose(curMessage)) { - log.info("Detected out-of-order CLOSE message!"); - this.messageWriter.onClose(); - break; - } - this.messageWriter.write(msg); - //writeData(curMessage); - expectedSequenceNumber++; - } - } - } - } - - private String newKey(final String mac, final int hc) { - return mac.trim() + hc; - } - - private boolean isClose(final Message msg) { - final String close = (String) msg.getProperty("CLOSE"); - log.info("Close is: {}", close); - - // If the other side is sending the close directive, we - // need to close the connection to the browser. - return - StringUtils.isNotBlank(close) && - close.trim().equalsIgnoreCase("true"); - } - -} diff --git a/common/src/main/java/org/mg/common/Pair.java b/common/src/main/java/org/mg/common/Pair.java deleted file mode 100644 index da69a233de..0000000000 --- a/common/src/main/java/org/mg/common/Pair.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.mg.common; - -/** - * A pair of objects. It is often useful to represent pairs of objects. This - * interface provides a type-safe and reusable way of doing so. - * - * @param The type of the first element of this pair. - * @param The type of the second element of this pair. - */ -public interface Pair - { - /** - * Returns the first object in the pair. - * - * @return The first object in the pair. - */ - T1 getFirst (); - - /** - * Returns the second object in the pair. - * - * @return The second object in the pair. - */ - T2 getSecond (); - } \ No newline at end of file diff --git a/common/src/main/java/org/mg/common/PairImpl.java b/common/src/main/java/org/mg/common/PairImpl.java deleted file mode 100644 index 58bbfaaa8b..0000000000 --- a/common/src/main/java/org/mg/common/PairImpl.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.mg.common; - -import org.apache.commons.lang.ClassUtils; - -/** - * An implementation of the pair interface. - * - * @param The type of the first element of this pair. - * @param The type of the second element of this pair. - */ -public class PairImpl implements Pair { - /** - * The first object. - */ - private final T1 first; - - /** - * The second object. - */ - private final T2 second; - - /** - * Constructs a new pair. - * - * @param first The first object. - * @param second The second object. - */ - public PairImpl(final T1 first, final T2 second) { - if (first == null) { - throw new NullPointerException("Null first arg"); - } - if (second == null) { - throw new NullPointerException("Null second arg"); - } - this.first = first; - this.second = second; - } - - public T1 getFirst() { - return (first); - } - - public T2 getSecond() { - return (second); - } - - @Override - public boolean equals(final Object other) { - if (other instanceof Pair) { - final Pair otherPair = (Pair) other; - - return otherPair.getFirst().equals(first) - && otherPair.getSecond().equals(second); - } else { - return false; - } - } - - @Override - public int hashCode() { - final int prime = 203249; - return (prime * first.hashCode()) + (prime * second.hashCode()); - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder(); - sb.append(ClassUtils.getShortClassName(getClass())); - sb.append(" "); - sb.append(first); - sb.append(" "); - sb.append(second); - return sb.toString(); - } - -} diff --git a/common/src/main/java/org/mg/common/RangeDownloaderAdaptor.java b/common/src/main/java/org/mg/common/RangeDownloaderAdaptor.java deleted file mode 100644 index da244fd04e..0000000000 --- a/common/src/main/java/org/mg/common/RangeDownloaderAdaptor.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.mg.common; - -import java.net.URI; - -import org.apache.commons.lang.math.LongRange; -import org.lastbamboo.common.download.RangeDownloader; -import org.lastbamboo.common.util.Optional; - -public class RangeDownloaderAdaptor implements RangeDownloader { - - public void download(LongRange arg0) { - // TODO Auto-generated method stub - } - - public Optional getKbs() { - // TODO Auto-generated method stub - return null; - } - - public long getNumBytesDownloaded() { - // TODO Auto-generated method stub - return 0; - } - - public long getRangeIndex() { - // TODO Auto-generated method stub - return 0; - } - - public long getRangeStartTime() { - // TODO Auto-generated method stub - return 0; - } - - public URI getSourceUri() { - // TODO Auto-generated method stub - return null; - } - - public void issueHeadRequest() { - // TODO Auto-generated method stub - - } - -} diff --git a/common/src/main/java/org/mg/common/XmppMessageConstants.java b/common/src/main/java/org/mg/common/XmppMessageConstants.java deleted file mode 100644 index ebe63c4e9b..0000000000 --- a/common/src/main/java/org/mg/common/XmppMessageConstants.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.mg.common; - -/** - * Class containing constants for message property keys. - */ -public class XmppMessageConstants { - - private XmppMessageConstants() {} - - public static final String MAC = "M"; - - public static final String HASHCODE = "H"; - - public static final String SEQ = "S"; - - public static final String MD5 = "M5"; - - public static final String HTTP = "HT"; - - public static final String SERVER_MAC = "SM"; - - public static final String CLOSE = "CL"; - - //public static final String TYPE = "T"; - - public static final int INFO_REQUEST_TYPE = 0x1111; - - public static final int INFO_RESPONSE_TYPE = 0x1112; - - public static final int ERROR_TYPE = 0x1113; - - public static final String PROXIES = "P"; - - public static final String MESSAGE = "ME"; - -} diff --git a/client/lantern_littleproxy_cert b/lantern_littleproxy_cert similarity index 100% rename from client/lantern_littleproxy_cert rename to lantern_littleproxy_cert diff --git a/client/mg_16x16.png b/mg_16x16.png similarity index 100% rename from client/mg_16x16.png rename to mg_16x16.png diff --git a/pom.xml b/pom.xml index 7cf8938349..e85b6344fe 100644 --- a/pom.xml +++ b/pom.xml @@ -3,12 +3,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 org.lantern - lantern-parent - pom - 0.2-SNAPSHOT - Lantern Parent Project + lantern + jar + 0.3-SNAPSHOT + Lantern Censorship Circumvention and Monitoring Prevention Tool - Parent project handling all modules of Lantern. + Lantern is a peer-to-peer and trust-network-based tool for circumventing censors and preventing monitoring. @@ -28,105 +28,7 @@ http://dev.littleshoot.org:8081/browse/MG - - common - client - server - - - - com.google.collections - google-collections - - - - com.google.gdata - gdata - - - - commons-codec - commons-codec - - - - commons-io - commons-io - - - - commons-lang - commons-lang - - - - javax.mail - mail - - - - junit - junit - - - - log4j - log4j - - - - net.sf.kxml - kxml2 - - - - org.codehaus.jackson - jackson-core-asl - - - - org.jivesoftware - smack - - - - org.lastbamboo - lastbamboo-common-amazon-ec2 - - - - org.lastbamboo - lastbamboo-common-download - - - - org.littleshoot - littleproxy - - - - org.littleshoot - littleshoot-p2p - - - - org.slf4j - slf4j-log4j12 - - - - org.slf4j - slf4j-api - - - - - - - com.google.collections google-collections @@ -238,11 +140,6 @@ 3.1.0 --> - - org.lantern - lantern-common - 0.2-SNAPSHOT - org.slf4j @@ -256,18 +153,10 @@ ${slf4j.version} - - org.lantern - lantern-client - 0.2-SNAPSHOT - - - - - + - 2.2.0 + 2.2.1 @@ -283,81 +172,42 @@ 1.5 UTF-8 - true - true - true - - - - - - - - - - - org.codehaus.mojo - findbugs-maven-plugin - 2.3.1 - - - - - org.apache.maven.plugins - maven-project-info-reports-plugin - - - - - org.codehaus.mojo - taglist-maven-plugin - - true - - mudo - todo - idea - MUDO - TODO - IDEA - + true + true + true + - - org.codehaus.mojo - surefire-report-maven-plugin + maven-assembly-plugin + 2.2-beta-5 + + + latest-build + package + + + jar-with-dependencies + + + + + org.lantern.Launcher + + + + + single + + + - - - org.apache.maven.plugins - maven-javadoc-plugin - - 1.5 - - - - - - org.codehaus.mojo - jxr-maven-plugin - + - - org.codehaus.mojo - cobertura-maven-plugin - - - xml - - target/cobertura - - + - - diff --git a/client/run.bash b/run.bash similarity index 100% rename from client/run.bash rename to run.bash diff --git a/server/pom.xml b/server/pom.xml deleted file mode 100644 index d9568f1443..0000000000 --- a/server/pom.xml +++ /dev/null @@ -1,68 +0,0 @@ - - 4.0.0 - org.lantern - lantern-server - jar - 0.2-SNAPSHOT - Server - Lantern Server - - - org.lantern - lantern-parent - 0.2-SNAPSHOT - - - - - - - org.lantern - lantern-common - - - - - - - - maven-assembly-plugin - 2.2-beta-5 - - - latest-build - package - - - jar-with-dependencies - - - - - org.mg.server.Launcher - - - - - single - - - - - - - - diff --git a/server/run.bash b/server/run.bash deleted file mode 100755 index d8de1a8d80..0000000000 --- a/server/run.bash +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env bash -function die() { - echo $* - exit 1 -} - -pushd .. -mvn package -Dmaven.test.skip=true || die "Could not package" -popd - -fullPath=`dirname $0` -jar=`find $fullPath/target/*with-dependencies.jar` -cp=`echo $jar | sed 's,./,'$fullPath'/,'` -javaArgs="-server -Xmx600m -jar "$cp" $*" - -echo "Running using Java on path at `which java` with args $javaArgs" -java $javaArgs || die "Java process exited abnormally" diff --git a/server/src/main/java/org/mg/server/ChatMessageListener.java b/server/src/main/java/org/mg/server/ChatMessageListener.java deleted file mode 100644 index 6a2aac71a9..0000000000 --- a/server/src/main/java/org/mg/server/ChatMessageListener.java +++ /dev/null @@ -1,641 +0,0 @@ -package org.mg.server; - -import static org.jboss.netty.channel.Channels.pipeline; - -import java.lang.management.ManagementFactory; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.nio.ByteBuffer; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashSet; -import java.util.Map; -import java.util.PriorityQueue; -import java.util.Queue; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; - -import javax.management.InstanceAlreadyExistsException; -import javax.management.MBeanRegistrationException; -import javax.management.MBeanServer; -import javax.management.MalformedObjectNameException; -import javax.management.NotCompliantMBeanException; -import javax.management.ObjectName; - -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.lang.StringUtils; -import org.jboss.netty.bootstrap.ClientBootstrap; -import org.jboss.netty.buffer.ChannelBuffer; -import org.jboss.netty.buffer.ChannelBuffers; -import org.jboss.netty.channel.Channel; -import org.jboss.netty.channel.ChannelFactory; -import org.jboss.netty.channel.ChannelFuture; -import org.jboss.netty.channel.ChannelFutureListener; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.channel.ChannelPipeline; -import org.jboss.netty.channel.ChannelPipelineFactory; -import org.jboss.netty.channel.ChannelStateEvent; -import org.jboss.netty.channel.ExceptionEvent; -import org.jboss.netty.channel.MessageEvent; -import org.jboss.netty.channel.SimpleChannelUpstreamHandler; -import org.jboss.netty.util.CharsetUtil; -import org.jivesoftware.smack.Chat; -import org.jivesoftware.smack.XMPPConnection; -import org.jivesoftware.smack.XMPPException; -import org.jivesoftware.smack.packet.Message; -import org.jivesoftware.smack.packet.XMPPError; -import org.jivesoftware.smackx.ChatState; -import org.jivesoftware.smackx.ChatStateListener; -import org.lastbamboo.common.amazon.ec2.AmazonEc2Utils; -import org.lastbamboo.common.download.RateCalculator; -import org.lastbamboo.common.download.RateCalculatorImpl; -import org.lastbamboo.common.p2p.P2PConstants; -import org.mg.common.ChatData; -import org.mg.common.MgUtils; -import org.mg.common.Pair; -import org.mg.common.RangeDownloaderAdaptor; -import org.mg.common.XmppMessageConstants; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Class for listening for messages for a specific chat. - */ -public class ChatMessageListener implements ChatStateListener, - ChatData { - - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Collection removedConnections = - new HashSet(); - - private final Map proxyConnections; - - private final String MAC_ADDRESS; - - private final ChannelFactory channelFactory; - - private final ConcurrentHashMap channelsToSequenceNumbers = - new ConcurrentHashMap(); - - private final XMPPConnection conn; - - private final Chat chat; - - private final RateCalculator rateCalculator = new RateCalculatorImpl(); - - private Queue rejected = new PriorityQueue(100, - new Comparator() { - public int compare(final Message msg1, final Message msg2) { - final Long seq1 = (Long) msg1.getProperty(XmppMessageConstants.SEQ); - final Long seq2 = (Long) msg2.getProperty(XmppMessageConstants.SEQ); - return seq1.compareTo(seq2); - } - }); - - - //private final Queue> chatsAndConnections; - - //private final Map rejectedMessages = - // new TreeMap(); - - private volatile long lastResourceConstraintMessage = 0L; - - private volatile long totalHttpBytesSent = 0L; - - private volatile int totalMessages = 0; - - public ChatMessageListener( - final Map proxyConnections, - final Queue> chatsAndConnections, - final String macAddress, final ChannelFactory channelFactory, - final Chat chat, final XMPPConnection conn) { - this.proxyConnections = proxyConnections; - //this.chatsAndConnections = chatsAndConnections; - this.MAC_ADDRESS = macAddress; - this.channelFactory = channelFactory; - this.chat = chat; - this.conn = conn; - addJmx(); - } - - private void addJmx() { - final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); - try { - final Class clazz = getClass(); - final String pack = clazz.getPackage().getName(); - final String oName = pack+":type=XmppChat-"+hashCode(); - final ObjectName mxBeanName = new ObjectName(oName); - if(!mbs.isRegistered(mxBeanName)) { - mbs.registerMBean(this, mxBeanName); - } - } catch (final MalformedObjectNameException e) { - log.error("Could not set up JMX", e); - } catch (final InstanceAlreadyExistsException e) { - log.error("Could not set up JMX", e); - } catch (final MBeanRegistrationException e) { - log.error("Could not set up JMX", e); - } catch (final NotCompliantMBeanException e) { - log.error("Could not set up JMX", e); - } - } - - public void processMessage(final Chat ch, final Message msg) { - log.info("Got message!!"); - log.info("Property names: {}", msg.getPropertyNames()); - final Integer type = - (Integer) msg.getProperty(P2PConstants.MESSAGE_TYPE); - if (type != null) { - switch (type) { - case XmppMessageConstants.INFO_REQUEST_TYPE: - log.info("Sending info response"); - sendInfoResponse(ch); - break; - default: - log.error("Unhandled type? "+type); - } - return; - } - else { - log.info("Type is null"); - } - - final long seq = (Long) msg.getProperty(XmppMessageConstants.SEQ); - log.info("SEQUENCE #: {}", seq); - log.info("HASHCODE #: {}", - msg.getProperty(XmppMessageConstants.HASHCODE)); - - log.info("FROM: {}",msg.getFrom()); - log.info("TO: {}",msg.getTo()); - final String smac = - (String) msg.getProperty(XmppMessageConstants.SERVER_MAC); - log.info("SMAC: {}", smac); - - if (StringUtils.isNotBlank(smac) && - smac.trim().equals(MAC_ADDRESS)) { - log.error("MESSAGE FROM OURSELVES!! AN ERROR?"); - final XMPPError error = msg.getError(); - if (error != null) { - final int code = msg.getError().getCode(); - if (code == 500) { - // Something's up on the server -- we're probably sending - // bytes too fast. Slow down. - lastResourceConstraintMessage = System.currentTimeMillis(); - //rejectedMessages.put(seq, msg); - rejected.add(msg); - } - } - //XmppUtils.printMessage(msg); - return; - } - - final String closeString = - (String) msg.getProperty(XmppMessageConstants.CLOSE); - - log.info("Close value: {}", closeString); - final boolean close; - if (StringUtils.isNotBlank(closeString) && - closeString.trim().equalsIgnoreCase("true")) { - log.info("Got close true"); - close = true; - } - else { - close = false; - final String data = - (String) msg.getProperty(XmppMessageConstants.HTTP); - if (StringUtils.isBlank(data)) { - log.warn("HTTP IS BLANK?? IGNORING..."); - return; - } - } - - final String key = messageKey(msg); - - if (close) { - log.info("Received close from client...closing " + - "connection to the proxy for HASHCODE: {}", - msg.getProperty(XmppMessageConstants.HASHCODE)); - final ChannelFuture cf = proxyConnections.get(key); - - if (cf != null) { - log.info("Closing connection"); - cf.getChannel().close(); - removedConnections.add(key); - proxyConnections.remove(key); - } - else { - log.error("Got close for connection we don't " + - "know about! Removed keys are: {}", - removedConnections); - } - return; - } - log.info("Getting channel future..."); - final ChannelFuture cf = getChannelFuture(msg, close, ch); - log.info("Got channel: {}", cf); - if (cf == null) { - log.info("Null channel future! Returning"); - return; - } - - final ChannelBuffer cb = unwrap(msg); - - final AtomicLong expected = getExpectedSequenceNumber(key); - if (seq != expected.get()) { - log.error("GOT UNEXPECTED REQUEST SEQUENCE NUMBER. EXPECTED " + - expected.get()+" BUT WAS "+seq); - } - expected.incrementAndGet(); - if (cf.getChannel().isConnected()) { - cf.getChannel().write(cb); - } - else { - cf.addListener(new ChannelFutureListener() { - public void operationComplete( - final ChannelFuture future) - throws Exception { - cf.getChannel().write(cb); - } - }); - } - } - - private void sendInfoResponse(final Chat ch) { - log.info("Sending info response"); - final Message msg = new Message(); - msg.setProperty(P2PConstants.MESSAGE_TYPE, - XmppMessageConstants.INFO_RESPONSE_TYPE); - final InetAddress address = AmazonEc2Utils.getPublicAddress(); - final String proxies = - address.getHostAddress() + ":"+ServerConstants.PROXY_PORT; - msg.setProperty(XmppMessageConstants.PROXIES, proxies); - try { - ch.sendMessage(msg); - } catch (final XMPPException e) { - log.error("Could not send info message", e); - } - } - - private AtomicLong getExpectedSequenceNumber(final String key) { - final AtomicLong zero = new AtomicLong(0); - final AtomicLong existing = - channelsToSequenceNumbers.putIfAbsent(key, zero); - if (existing != null) { - return existing; - } - return zero; - } - - public void stateChanged(final Chat monitoredChat, final ChatState state) { - log.info("Got chat state changed: {}", state); - } - - private ChannelBuffer unwrap(final Message msg) { - final String data = (String) msg.getProperty(XmppMessageConstants.HTTP); - final byte[] raw = - Base64.decodeBase64(data.getBytes(CharsetUtil.UTF_8)); - return ChannelBuffers.wrappedBuffer(raw); - } - - /** - * This gets a channel to connect to the local HTTP proxy on. This is - * slightly complex, as we're trying to mimic the state as if this HTTP - * request is coming in to a "normal" LittleProxy instance instead of - * having the traffic tunneled through XMPP. So we create a separate - * connection to the proxy just as those separate connections were made - * from the browser to the proxy originally on the remote end. - * - * If there's already an existing connection mimicking the original - * connection, we use that. - * - * - * @return The {@link ChannelFuture} that will connect to the local - * LittleProxy instance. - */ - private ChannelFuture getChannelFuture(final Message message, - final boolean close, final Chat requestChat) { - - // The other side will also need to know where the - // request came from to differentiate incoming HTTP - // connections. - log.info("Getting properties..."); - - // Note these will fail if the original properties were not set as - // strings. - final String key = messageKey(message); - if (StringUtils.isBlank(key)) { - log.error("Could not create key"); - return null; - } - - log.info("Getting channel future for key: {}", key); - synchronized (this.proxyConnections) { - if (proxyConnections.containsKey(key)) { - log.info("Using existing connection"); - return proxyConnections.get(key); - } - if (close) { - // We've likely already closed the connection in this case. - log.warn("Returning null channel on close call"); - return null; - } - if (removedConnections.contains(key)) { - log.warn("KEY IS IN REMOVED CONNECTIONS: "+key); - } - // Configure the client. - final ClientBootstrap cb = new ClientBootstrap(this.channelFactory); - - final ChannelPipelineFactory cpf = new ChannelPipelineFactory() { - public ChannelPipeline getPipeline() throws Exception { - // Create a default pipeline implementation. - final ChannelPipeline pipeline = pipeline(); - - final class HttpChatRelay extends SimpleChannelUpstreamHandler { - private AtomicLong sequenceNumber = new AtomicLong(0L); - - @Override - public void messageReceived( - final ChannelHandlerContext ctx, - final MessageEvent me) { - log.info("HTTP message received from proxy relay"); - final ByteBuffer buf = - ((ChannelBuffer) me.getMessage()).toByteBuffer(); - final byte[] raw = MgUtils.toRawBytes(buf); - final String base64 = - Base64.encodeBase64URLSafeString(raw); - - final Message msg = new Message(); - msg.setProperty(XmppMessageConstants.HTTP, base64); - msg.setProperty(XmppMessageConstants.MD5, toMd5(raw)); - sendMessage(msg, false); - } - - @Override - public void channelClosed(final ChannelHandlerContext ctx, - final ChannelStateEvent cse) { - // We need to send the CLOSE directive to the other - // side VIA google talk to simulate the proxy - // closing the connection to the browser. - log.info("Got channel closed on C in A->B->C->D chain..."); - log.info("Sending close message"); - final Message msg = new Message(); - msg.setProperty(XmppMessageConstants.CLOSE, "true"); - sendMessage(msg, true); - - removedConnections.add(key); - proxyConnections.remove(key); - } - - private void sendMessage(final Message msg, - final boolean isClose) { - - // We set the sequence number so the client knows - // how many total messages to expect. This is - // necessary because the XMPP server can deliver - // messages out of order. - msg.setProperty(XmppMessageConstants.SEQ, - sequenceNumber.incrementAndGet() - 1); - msg.setProperty(XmppMessageConstants.HASHCODE, - message.getProperty(XmppMessageConstants.HASHCODE)); - msg.setProperty(XmppMessageConstants.MAC, - message.getProperty(XmppMessageConstants.MAC)); - - // This is the server-side MAC address. This is - // useful because there are odd cases where XMPP - // servers echo back our own messages, and we - // want to ignore them. - log.info("Setting SMAC to: {}", MAC_ADDRESS); - msg.setProperty(XmppMessageConstants.SERVER_MAC, - MAC_ADDRESS); - log.info("Sending SEQUENCE #: "+sequenceNumber); - //sentMessages.put(sequenceNumber, msg); - - log.info("Received from: {}", - requestChat.getParticipant()); - - final long elapsed = - System.currentTimeMillis() - - lastResourceConstraintMessage; - if (elapsed < 20000) { - if (isClose) { - log.info("Got close...waiting to send"); - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - } - } - else { - log.info("Caching message for sending later..."); - rejected.add(msg); - log.info("Now {} cached", rejected.size()); - return; - } - } - - sendRejects(); - sendWithChat(msg); - } - - private void sendRejects() { - if (!rejected.isEmpty()) { - log.info("Sending rejects: {}",rejected.size()); - } - long start = lastResourceConstraintMessage; - int newRejects = 0; - while (!rejected.isEmpty()) { - final Message reject = rejected.poll(); - sendWithChat(makeCopy(reject)); - log.info("Waiting before sending message"); - final long sleepTime; - if (lastResourceConstraintMessage != start) { - start = lastResourceConstraintMessage; - newRejects++; - sleepTime = 3000 * newRejects; - log.info("Set sleep time to {}", sleepTime); - } - else { - sleepTime = 1200; - } - try { - Thread.sleep(sleepTime); - } catch (final InterruptedException e) { - log.error("Error while sleeping?"); - } - } - } - - private void sendWithChat(final Message msg) { - log.info("Sending to: {}", chat.getParticipant()); - msg.setTo(chat.getParticipant()); - - //final XMPPConnection conn = pair.getSecond(); - final String from = conn.getUser(); - msg.setFrom(from); - - final long now = System.currentTimeMillis(); - try { - chat.sendMessage(msg); - final String http = (String) msg.getProperty( - XmppMessageConstants.HTTP); - final long length; - if (StringUtils.isBlank(http)) { - length = 0; - } - else { - length = http.length(); - } - totalMessages++; - totalHttpBytesSent += length; - - rateCalculator.addData(new RangeDownloaderAdaptor() { - - @Override - public long getRangeStartTime() { - return now; - } - - @Override - public long getRangeIndex() { - return (Long) msg.getProperty(XmppMessageConstants.SEQ); - } - - @Override - public long getNumBytesDownloaded() { - return length; - } - - }); - - - // Note we don't do this in a finally block. - // if an exception happens, it's likely there's - // something wrong with the chat, and we don't - // want to add it back. - //chatsAndConnections.offer(pair); - } catch (final XMPPException e) { - log.error("Could not send chat message", e); - } - } - - private Message makeCopy(final Message reject) { - final Message msg = new Message(); - msg.setProperty(XmppMessageConstants.SEQ, - reject.getProperty(XmppMessageConstants.SEQ)); - msg.setProperty(XmppMessageConstants.HASHCODE, - reject.getProperty(XmppMessageConstants.HASHCODE)); - msg.setProperty(XmppMessageConstants.MAC, - reject.getProperty(XmppMessageConstants.MAC)); - msg.setProperty(XmppMessageConstants.SERVER_MAC, - MAC_ADDRESS); - //msg.setTo(chat.getParticipant()); - //msg.setFrom(conn.getUser()); - - final String http = - (String) reject.getProperty(XmppMessageConstants.HTTP); - if (StringUtils.isNotBlank(http)) { - msg.setProperty(XmppMessageConstants.HTTP, http); - msg.setProperty(XmppMessageConstants.MD5, - reject.getProperty(XmppMessageConstants.MD5)); - } - return msg; - } - - @Override - public void exceptionCaught(final ChannelHandlerContext ctx, - final ExceptionEvent e) throws Exception { - log.error("Caught exception on C in A->B->C->D " + - "chain...", e.getCause()); - if (e.getChannel().isOpen()) { - log.warn("Closing open connection"); - closeOnFlush(e.getChannel()); - } - else { - // We've seen odd cases where channels seem to - // continually attempt connections. Make sure - // we explicitly close the connection here. - log.info("Channel is not open...ignoring"); - //log.warn("Closing connection even though " + - // "isOpen is false"); - //e.getChannel().close(); - } - } - } - - pipeline.addLast("handler", new HttpChatRelay()); - return pipeline; - } - }; - - // Set up the event pipeline factory. - cb.setPipelineFactory(cpf); - cb.setOption("connectTimeoutMillis", 40*1000); - - log.info("Connecting to localhost proxy"); - final ChannelFuture future = - cb.connect(new InetSocketAddress("127.0.0.1", 7777)); - proxyConnections.put(key, future); - return future; - } - } - - private String messageKey(final Message message) { - final String mac = - (String) message.getProperty(XmppMessageConstants.MAC); - final String hc = - (String) message.getProperty(XmppMessageConstants.HASHCODE); - - // We can sometimes get messages back that were not intended for us. - // Just ignore them. - if (mac == null || hc == null) { - log.error("Message not intended for us?!?!?\n" + - "Null MAC and/or HASH and to: "+message.getTo()); - return null; - } - final String key = mac + hc; - return key; - } - - /** - * Closes the specified channel after all queued write requests are flushed. - */ - private void closeOnFlush(final Channel ch) { - log.info("Closing channel on flush: {}", ch); - if (ch.isConnected()) { - ch.write(ChannelBuffers.EMPTY_BUFFER).addListener( - ChannelFutureListener.CLOSE); - } - } - - private String toMd5(final byte[] raw) { - try { - final MessageDigest md = MessageDigest.getInstance("MD5"); - final byte[] digest = md.digest(raw); - return Base64.encodeBase64URLSafeString(digest); - } catch (final NoSuchAlgorithmException e) { - log.error("No MD5 -- will never happen", e); - return "NO MD5"; - } - } - - public double getRate() { - return rateCalculator.getRate(); - } - - public int getAverageMessageSize() { - if (totalMessages == 0) { - return 0; - } - return (int) (totalHttpBytesSent/totalMessages); - } - - public int getTotalMessages() { - return totalMessages; - } - - public long getTotalBytes() { - return totalHttpBytesSent; - } -} - diff --git a/server/src/main/java/org/mg/server/DefaultXmppProxy.java b/server/src/main/java/org/mg/server/DefaultXmppProxy.java deleted file mode 100644 index 4d464cb750..0000000000 --- a/server/src/main/java/org/mg/server/DefaultXmppProxy.java +++ /dev/null @@ -1,414 +0,0 @@ -package org.mg.server; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.lang.management.ManagementFactory; -import java.net.InetAddress; -import java.net.InetSocketAddress; -import java.net.NetworkInterface; -import java.net.Socket; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Enumeration; -import java.util.Properties; -import java.util.Queue; -import java.util.Random; -import java.util.Timer; -import java.util.TimerTask; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; - -import javax.management.InstanceAlreadyExistsException; -import javax.management.MBeanRegistrationException; -import javax.management.MBeanServer; -import javax.management.MalformedObjectNameException; -import javax.management.NotCompliantMBeanException; -import javax.management.ObjectName; -import javax.net.SocketFactory; - -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.math.RandomUtils; -import org.jboss.netty.channel.ChannelFuture; -import org.jboss.netty.channel.socket.ClientSocketChannelFactory; -import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; -import org.jivesoftware.smack.Chat; -import org.jivesoftware.smack.ChatManager; -import org.jivesoftware.smack.ChatManagerListener; -import org.jivesoftware.smack.ConnectionConfiguration; -import org.jivesoftware.smack.ConnectionListener; -import org.jivesoftware.smack.PacketListener; -import org.jivesoftware.smack.Roster; -import org.jivesoftware.smack.XMPPConnection; -import org.jivesoftware.smack.XMPPException; -import org.jivesoftware.smack.packet.Packet; -import org.jivesoftware.smack.packet.Presence; -import org.jivesoftware.smackx.ChatStateManager; -import org.littleshoot.proxy.Launcher; -import org.mg.common.ChatData; -import org.mg.common.Pair; -import org.mg.common.PairImpl; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DefaultXmppProxy implements XmppProxy, ChatData { - - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final ClientSocketChannelFactory channelFactory = - new NioClientSocketChannelFactory( - Executors.newCachedThreadPool(), - Executors.newCachedThreadPool()); - - private static final String MAC_ADDRESS; - - private final Collection allChats = - new ArrayList(); - - private final ConcurrentHashMap>> userAndMacsToChats = - new ConcurrentHashMap>>(); - - static { - String tempMac; - try { - tempMac = getMacAddress(); - } catch (final SocketException e) { - e.printStackTrace(); - tempMac = String.valueOf(RandomUtils.nextLong()); - } - MAC_ADDRESS = tempMac.trim(); - } - - public DefaultXmppProxy() { - // Start the HTTP proxy server that we relay data to. It has more - // developed logic for handling different types of requests, and we'd - // otherwise have to duplicate that here. - Launcher.main(String.valueOf(ServerConstants.PROXY_PORT)); - addJmx(); - } - - private void addJmx() { - final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); - try { - final Class clazz = getClass(); - final String pack = clazz.getPackage().getName(); - final String oName = - pack+":type=XmppProxy"; - final ObjectName mxBeanName = new ObjectName(oName); - if(!mbs.isRegistered(mxBeanName)) { - mbs.registerMBean(this, mxBeanName); - } - } catch (final MalformedObjectNameException e) { - log.error("Could not set up JMX", e); - } catch (final InstanceAlreadyExistsException e) { - log.error("Could not set up JMX", e); - } catch (final MBeanRegistrationException e) { - log.error("Could not set up JMX", e); - } catch (final NotCompliantMBeanException e) { - log.error("Could not set up JMX", e); - } - } - - public void start() throws XMPPException, IOException { - final Properties props = new Properties(); - final File propsDir = new File(System.getProperty("user.home"), ".mg"); - final File propsFile = new File(propsDir, "mg.properties"); - - if (!propsFile.isFile()) { - System.err.println("No properties file found at "+propsFile+ - ". That file is required and must contain a property for " + - "'user' and 'pass'."); - System.exit(0); - } - props.load(new FileInputStream(propsFile)); - final String user = props.getProperty("google.server.user"); - final String pass = props.getProperty("google.server.pwd"); - - final Collection xmppConnections = - new ArrayList(); - - for (int i = 0; i < 10; i++) { - // We create a bunch of connections to allow us to process as much - // incoming data as possible. - final XMPPConnection xmpp = newConnection(user, pass); - xmppConnections.add(xmpp); - log.info("Created connection for user: {}", xmpp.getUser()); - } - Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { - - public void run() { - for (final XMPPConnection conn : xmppConnections) { - log.info("Disconnecting user: {}", conn.getUser()); - conn.disconnect(); - } - } - - }, "XMPP-Disconnect-On-Shutdown")); - - log(); - } - - private void log() { - final Timer t = new Timer(true); - t.schedule(new TimerTask() { - - @Override - public void run() { - getAverageMessageSize(); - getRate(); - getTotalBytes(); - getTotalMessages(); - } - }, 10000, 15000); - } - - private XMPPConnection newConnection(final String user, final String pass) { - for (int i = 0; i < 10; i++) { - try { - return newSingleConnection(user, pass); - } catch (final XMPPException e) { - log.error("Could not create XMPP connection", e); - } - } - throw new RuntimeException("Could not connect to XMPP server"); - } - - private XMPPConnection newSingleConnection(final String user, - final String pass) throws XMPPException { - final ConnectionConfiguration config = - new ConnectionConfiguration("talk.google.com", 5222, "gmail.com"); - config.setCompressionEnabled(true); - config.setReconnectionAllowed(true); - config.setSocketFactory(new SocketFactory() { - - @Override - public Socket createSocket(final InetAddress host, - final int port, final InetAddress localHost, - final int localPort) throws IOException { - // We ignore the local port binding. - return createSocket(host, port); - } - - @Override - public Socket createSocket(final String host, - final int port, final InetAddress localHost, - final int localPort) - throws IOException, UnknownHostException { - // We ignore the local port binding. - return createSocket(host, port); - } - - @Override - public Socket createSocket(final InetAddress host, int port) - throws IOException { - log.info("Creating socket"); - final Socket sock = new Socket(); - sock.connect(new InetSocketAddress(host, port), 40000); - log.info("Socket connected"); - return sock; - } - - @Override - public Socket createSocket(final String host, final int port) - throws IOException, UnknownHostException { - log.info("Creating socket"); - return createSocket(InetAddress.getByName(host), port); - } - }); - - //final ConnectionConfiguration config = - // new ConnectionConfiguration("talk.google.com", 5222, "gmail.com"); - //config.setCompressionEnabled(true); - - final XMPPConnection conn = new XMPPConnection(config); - conn.connect(); - conn.login(user, pass, "MG"); - - while (!conn.isAuthenticated()) { - log.info("Waiting for authentication"); - try { - Thread.sleep(1000); - } catch (final InterruptedException e1) { - log.error("Exception during sleep?", e1); - } - } - final Roster roster = conn.getRoster(); - roster.setSubscriptionMode(Roster.SubscriptionMode.accept_all); - - conn.addConnectionListener(new ConnectionListener() { - - public void connectionClosed() { - log.warn("XMPP connection closed!!"); - } - - public void connectionClosedOnError(final Exception e) { - log.warn("XMPP connection closed on error!!", e); - } - - public void reconnectingIn(int seconds) { - log.info("XMPP connection reconnecting..."); - } - - public void reconnectionFailed(final Exception e) { - log.info("XMPP connection reconnection failed", e); - } - - public void reconnectionSuccessful() { - log.info("Reconnection succeeded!!"); - } - - }); - - final ChatManager cm = conn.getChatManager(); - cm.addChatListener(new ChatManagerListener() { - - public void chatCreated(final Chat chat, - final boolean createdLocally) { - log.info("Created a chat!!"); - - final Queue> chats = - addToGroup(chat, conn); - - final ConcurrentHashMap proxyConnections = - new ConcurrentHashMap(); - - final String participant = chat.getParticipant(); - // We need to listen for the unavailability of clients we're - // chatting with so we can disconnect from their associated - // remote servers. - final PacketListener pl = new PacketListener() { - public void processPacket(final Packet pack) { - if (!(pack instanceof Presence)) return; - final Presence pres = (Presence) pack; - final String from = pres.getFrom(); - - //log.info("Comparing presence packet from "+from+ - // " to particant "+participant); - if (from.equals(participant) && !pres.isAvailable()) { - log.info("Closing all channels for this chat"); - synchronized(proxyConnections) { - for (final ChannelFuture cf : proxyConnections.values()) { - log.info("Closing channel to local proxy"); - cf.getChannel().close(); - } - } - } - } - }; - // Register the listener. - conn.addPacketListener(pl, null); - - final ChatStateManager csm = ChatStateManager.getInstance(conn); - final ChatMessageListener ml = - new ChatMessageListener(proxyConnections, chats, - MAC_ADDRESS, channelFactory, chat, conn); - allChats.add(ml); - chat.addMessageListener(ml); - } - }); - return conn; - } - - private Queue> addToGroup(final Chat chat, - final XMPPConnection conn) { - final String participant = chat.getParticipant(); - final String userAndMac = - StringUtils.substringBeforeLast(participant, "-"); - log.info("Parsed user and mac: "+ userAndMac+" from "+participant); - final Queue> empty = - new LinkedBlockingQueue>(); - final Queue> existing = - userAndMacsToChats.putIfAbsent(userAndMac, empty); - final Queue> chats; - if (existing == null) { - chats = empty; - } - else { - chats = existing; - } - chats.add(new PairImpl(chat, conn)); - return chats; - } - - private static String getMacAddress() throws SocketException { - final Enumeration nis = - NetworkInterface.getNetworkInterfaces(); - while (nis.hasMoreElements()) { - final NetworkInterface ni = nis.nextElement(); - try { - final byte[] mac = ni.getHardwareAddress(); - if (mac.length > 0) { - return Base64.encodeBase64String(mac); - } - } catch (final SocketException e) { - } - } - try { - return Base64.encodeBase64String( - InetAddress.getLocalHost().getAddress()) + - System.currentTimeMillis(); - } catch (final UnknownHostException e) { - final byte[] bytes = new byte[24]; - new Random().nextBytes(bytes); - return Base64.encodeBase64String(bytes); - } - } - - public double getRate() { - synchronized (allChats) { - if (allChats.isEmpty()) { - log.info("Average rate: 0"); - return 0; - } - double total = 0; - for (final ChatMessageListener ml : allChats) { - total += ml.getRate(); - } - final double average = total/allChats.size(); - log.info("Average rate: "+average+" Kb/s"); - return average; - } - } - - public int getAverageMessageSize() { - synchronized (allChats) { - if (allChats.isEmpty()) { - log.info("Average message size: 0"); - return 0; - } - int total = 0; - for (final ChatMessageListener ml : allChats) { - total += ml.getAverageMessageSize(); - } - final int average = total/allChats.size(); - log.info("Average message size: "+total); - return average; - } - } - - public int getTotalMessages() { - synchronized (allChats) { - int total = 0; - for (final ChatMessageListener ml : allChats) { - total += ml.getTotalMessages(); - } - log.info("Total messages sent: "+total); - return total; - } - } - - public long getTotalBytes() { - synchronized (allChats) { - int total = 0; - for (final ChatMessageListener ml : allChats) { - total += ml.getTotalBytes(); - } - log.info("Total bytes sent: "+total); - return total; - } - } -} diff --git a/server/src/main/java/org/mg/server/Launcher.java b/server/src/main/java/org/mg/server/Launcher.java deleted file mode 100644 index 5445e1b8f7..0000000000 --- a/server/src/main/java/org/mg/server/Launcher.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.mg.server; - -import java.io.IOException; -import java.lang.Thread.UncaughtExceptionHandler; - -import org.jivesoftware.smack.XMPPException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Class for launching the MG server. - */ -public class Launcher { - - private static final Logger log = LoggerFactory.getLogger(Launcher.class); - - public static void main(final String... args) { - Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { - public void uncaughtException(final Thread t, final Throwable e) { - log.error("Uncaught exception", e); - } - }); - - final XmppProxy proxy = new DefaultXmppProxy(); - try { - proxy.start(); - } catch (final XMPPException e) { - log.error("Could not start proxy?", e); - } catch (final IOException e) { - log.error("Could not start proxy?", e); - } - // Keep the server open. - synchronized (proxy) { - try { - proxy.wait(); - } catch (final InterruptedException e) { - log.error("Interrupt while waiting", e); - } - } - } -} diff --git a/server/src/main/java/org/mg/server/LocalProxyResponseToXmppRelayer.java b/server/src/main/java/org/mg/server/LocalProxyResponseToXmppRelayer.java deleted file mode 100644 index b89eea1fc3..0000000000 --- a/server/src/main/java/org/mg/server/LocalProxyResponseToXmppRelayer.java +++ /dev/null @@ -1,158 +0,0 @@ -package org.mg.server; - -import java.nio.ByteBuffer; -import java.util.Map; - -import org.apache.commons.codec.binary.Base64; -import org.jboss.netty.buffer.ChannelBuffer; -import org.jboss.netty.channel.ChannelHandlerContext; -import org.jboss.netty.channel.ChannelStateEvent; -import org.jboss.netty.channel.ExceptionEvent; -import org.jboss.netty.channel.MessageEvent; -import org.jboss.netty.channel.SimpleChannelUpstreamHandler; -import org.jivesoftware.smack.Chat; -import org.jivesoftware.smack.XMPPConnection; -import org.jivesoftware.smack.XMPPException; -import org.jivesoftware.smack.packet.Message; -import org.mg.common.XmppMessageConstants; -import org.mg.common.MgUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This class processes responses from the connection to the local HTTP - * proxy. It wraps the responses in XMPP messages and sends them back to - * the original requester. - */ -public class LocalProxyResponseToXmppRelayer - extends SimpleChannelUpstreamHandler { - - private long sequenceNumber = 0L; - - private final Logger log = LoggerFactory.getLogger(getClass()); - - private final Message incomingXmppMessage; - - private final XMPPConnection conn; - - private final Chat chat; - - private final String macAddress; - - private final Map sentMessages; - - private static volatile int totalSentMessages = 0; - private static volatile int totalHttpBytesSent = 0; - - public LocalProxyResponseToXmppRelayer(final XMPPConnection conn, - final Chat chat, final Message incomingXmppMessage, - final String macAddress, final Map sentMessages) { - this.conn = conn; - this.chat = chat; - this.incomingXmppMessage = incomingXmppMessage; - this.macAddress = macAddress; - this.sentMessages = sentMessages; - } - - @Override - public void messageReceived(final ChannelHandlerContext ctx, - final MessageEvent me) { - log.info("HTTP message received from proxy on relayer..."); - final Message msg = new Message(); - final ByteBuffer buf = ((ChannelBuffer) me.getMessage()).toByteBuffer(); - final byte[] raw = MgUtils.toRawBytes(buf); - final String base64 = Base64.encodeBase64URLSafeString(raw); - - log.info("Connection ID: {}", conn.getConnectionID()); - log.info("Connection host: {}", conn.getHost()); - log.info("Connection service name: {}", conn.getServiceName()); - log.info("Connection user: {}", conn.getUser()); - msg.setTo(chat.getParticipant()); - msg.setFrom(conn.getUser()); - msg.setProperty(XmppMessageConstants.HTTP, base64); - msg.setProperty(XmppMessageConstants.MD5, MgUtils.toMd5(raw)); - msg.setProperty(XmppMessageConstants.SEQ, sequenceNumber); - msg.setProperty(XmppMessageConstants.HASHCODE, - incomingXmppMessage.getProperty(XmppMessageConstants.HASHCODE)); - msg.setProperty(XmppMessageConstants.MAC, - incomingXmppMessage.getProperty(XmppMessageConstants.MAC)); - - // This is the server-side MAC address. This is - // useful because there are odd cases where XMPP - // servers echo back our own messages, and we - // want to ignore them. - log.info("Setting SMAC to: {}", macAddress); - msg.setProperty(XmppMessageConstants.SERVER_MAC, macAddress); - - log.info("Sending to: {}", chat.getParticipant()); - log.info("Sending SEQUENCE #: "+sequenceNumber); - sentMessages.put(sequenceNumber, msg); - try { - chat.sendMessage(msg); - totalSentMessages++; - totalHttpBytesSent += raw.length; - sequenceNumber++; - log.info("TOTAL SENT MESSAGES: "+totalSentMessages); - log.info("TOTAL HTTP BYTES SENT: "+totalHttpBytesSent); - } catch (final XMPPException e) { - log.error("XMPP error sending a message", e); - } - } - - @Override - public void channelClosed(final ChannelHandlerContext ctx, - final ChannelStateEvent cse) { - // We need to send the CLOSE directive to the other - // side VIA google talk to simulate the proxy - // closing the connection to the browser. - log.info("Got channel closed on C in A->B->C->D chain..."); - log.info("Sending close message"); - final Message msg = new Message(); - msg.setProperty(XmppMessageConstants.HASHCODE, - incomingXmppMessage.getProperty(XmppMessageConstants.HASHCODE)); - msg.setProperty(XmppMessageConstants.MAC, - incomingXmppMessage.getProperty(XmppMessageConstants.MAC)); - msg.setFrom(conn.getUser()); - - // We set the sequence number so the client knows - // how many total messages to expect. This is - // necessary because the XMPP server can deliver - // messages out of order. - msg.setProperty(XmppMessageConstants.SEQ, sequenceNumber); - msg.setProperty(XmppMessageConstants.CLOSE, "true"); - - // This is the server-side MAC address. This is - // useful because there are odd cases where XMPP - // servers echo back our own messages, and we - // want to ignore them. - log.info("Setting SMAC to: {}", macAddress); - msg.setProperty(XmppMessageConstants.SERVER_MAC, macAddress); - - try { - chat.sendMessage(msg); - totalSentMessages++; - } catch (final XMPPException e) { - log.warn("Error sending close message", e); - } - } - - @Override - public void exceptionCaught(final ChannelHandlerContext ctx, - final ExceptionEvent e) throws Exception { - log.warn("Caught exception on C in A->B->C->D " + - "chain...", e.getCause()); - if (e.getChannel().isOpen()) { - log.warn("Closing open connection"); - MgUtils.closeOnFlush(e.getChannel()); - } - else { - // We've seen odd cases where channels seem to - // continually attempt connections. Make sure - // we explicitly close the connection here. - log.info("Channel is not open...ignoring"); - //log.warn("Closing connection even though " + - // "isOpen is false"); - //e.getChannel().close(); - } - } -} diff --git a/server/src/main/java/org/mg/server/ServerConstants.java b/server/src/main/java/org/mg/server/ServerConstants.java deleted file mode 100644 index 9ac22ea548..0000000000 --- a/server/src/main/java/org/mg/server/ServerConstants.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.mg.server; - -public class ServerConstants { - - public static final int PROXY_PORT = 7777; - -} diff --git a/server/src/main/java/org/mg/server/XmppProxy.java b/server/src/main/java/org/mg/server/XmppProxy.java deleted file mode 100644 index a6010eebef..0000000000 --- a/server/src/main/java/org/mg/server/XmppProxy.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.mg.server; - -import java.io.IOException; - -import org.jivesoftware.smack.XMPPException; - -public interface XmppProxy { - - void start() throws XMPPException, IOException; - -} diff --git a/server/src/main/resources/log4j.properties b/server/src/main/resources/log4j.properties deleted file mode 100644 index 4278aeef1d..0000000000 --- a/server/src/main/resources/log4j.properties +++ /dev/null @@ -1,43 +0,0 @@ - -# Set the root loggers -log4j.rootLogger=warn, stdout, TextFile - -# stdout is set to be ConsoleAppender sending its output to System.out -log4j.appender.stdout=org.apache.log4j.ConsoleAppender - -# stdout uses PatternLayout. -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout - -# TextFile uses PatternLayout as well -log4j.appender.TextFile=org.apache.log4j.RollingFileAppender -log4j.appender.TextFile.File=log.txt -log4j.appender.TextFile.MaxFileSize=50MB -log4j.appender.TextFile.MaxBackupIndex=5 -log4j.appender.TextFile.layout=org.apache.log4j.PatternLayout - -# XMLFile uses the RollingFileAppender. These files can get VERY big -log4j.appender.XMLFile=org.apache.log4j.RollingFileAppender -log4j.appender.XMLFile.File=log.xml -log4j.appender.XMLFile.MaxFileSize=100MB -log4j.appender.XMLFile.MaxBackupIndex=5 - -# XMLFile uses XML format for the Chainsaw viewer -log4j.appender.XMLFile.layout=org.apache.log4j.xml.XMLLayout -log4j.appender.XMLFile.layout.LocationInfo=true - -# The conversion pattern is: -# time elapsed since start of logging (left justified, pads extra spaces if less than 0) -# logging priority (left justified, pads extra spaces if less than 5) -# [thread name] -# packagename.classname.methodname (only the last part of the package is kept) -# - message -# newline - -log4j.appender.stdout.layout.ConversionPattern=%-6r %d{ISO8601} %-5p [%t] %c{2}.%M (%F:%L) - %m%n -log4j.appender.TextFile.layout.ConversionPattern=%-6r %d{ISO8601} %-5p [%t] %c{2}.%M (%F:%L) - %m%n - -org.apache.commons=off -# will log all information read/written from/to the network using HttpClient -log4j.logger.org.mg.server=all -log4j.logger.org.littleshoot.proxy=all - diff --git a/server/src/test/resources/log4j.properties b/server/src/test/resources/log4j.properties deleted file mode 100644 index 1239d17903..0000000000 --- a/server/src/test/resources/log4j.properties +++ /dev/null @@ -1,42 +0,0 @@ - -# Set the root loggers -log4j.rootLogger=warn, stdout, TextFile - -# stdout is set to be ConsoleAppender sending its output to System.out -log4j.appender.stdout=org.apache.log4j.ConsoleAppender - -# stdout uses PatternLayout. -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout - -# TextFile uses PatternLayout as well -log4j.appender.TextFile=org.apache.log4j.RollingFileAppender -log4j.appender.TextFile.File=log.txt -log4j.appender.TextFile.MaxFileSize=50MB -log4j.appender.TextFile.MaxBackupIndex=5 -log4j.appender.TextFile.layout=org.apache.log4j.PatternLayout - -# XMLFile uses the RollingFileAppender. These files can get VERY big -log4j.appender.XMLFile=org.apache.log4j.RollingFileAppender -log4j.appender.XMLFile.File=log.xml -log4j.appender.XMLFile.MaxFileSize=100MB -log4j.appender.XMLFile.MaxBackupIndex=5 - -# XMLFile uses XML format for the Chainsaw viewer -log4j.appender.XMLFile.layout=org.apache.log4j.xml.XMLLayout -log4j.appender.XMLFile.layout.LocationInfo=true - -# The conversion pattern is: -# time elapsed since start of logging (left justified, pads extra spaces if less than 0) -# logging priority (left justified, pads extra spaces if less than 5) -# [thread name] -# packagename.classname.methodname (only the last part of the package is kept) -# - message -# newline - -log4j.appender.stdout.layout.ConversionPattern=%-6r %d{ISO8601} %-5p [%t] %c{2}.%M (%F:%L) - %m%n -log4j.appender.TextFile.layout.ConversionPattern=%-6r %d{ISO8601} %-5p [%t] %c{2}.%M (%F:%L) - %m%n - -org.apache.commons=off -# will log all information read/written from/to the network using HttpClient -#log4j.logger.org.mg.server=all - diff --git a/client/src/main/java/org/lantern/client/Configurator.java b/src/main/java/org/lantern/client/Configurator.java similarity index 100% rename from client/src/main/java/org/lantern/client/Configurator.java rename to src/main/java/org/lantern/client/Configurator.java diff --git a/client/src/main/java/org/lantern/client/HttpProxyServer.java b/src/main/java/org/lantern/client/HttpProxyServer.java similarity index 100% rename from client/src/main/java/org/lantern/client/HttpProxyServer.java rename to src/main/java/org/lantern/client/HttpProxyServer.java diff --git a/client/src/main/java/org/lantern/client/HttpRequestHandler.java b/src/main/java/org/lantern/client/HttpRequestHandler.java similarity index 100% rename from client/src/main/java/org/lantern/client/HttpRequestHandler.java rename to src/main/java/org/lantern/client/HttpRequestHandler.java diff --git a/client/src/main/java/org/lantern/client/HttpRequestHandlerData.java b/src/main/java/org/lantern/client/HttpRequestHandlerData.java similarity index 100% rename from client/src/main/java/org/lantern/client/HttpRequestHandlerData.java rename to src/main/java/org/lantern/client/HttpRequestHandlerData.java diff --git a/client/src/main/java/org/lantern/client/HttpServerPipelineFactory.java b/src/main/java/org/lantern/client/HttpServerPipelineFactory.java similarity index 100% rename from client/src/main/java/org/lantern/client/HttpServerPipelineFactory.java rename to src/main/java/org/lantern/client/HttpServerPipelineFactory.java diff --git a/client/src/main/java/org/lantern/client/LanternConstants.java b/src/main/java/org/lantern/client/LanternConstants.java similarity index 100% rename from client/src/main/java/org/lantern/client/LanternConstants.java rename to src/main/java/org/lantern/client/LanternConstants.java diff --git a/client/src/main/java/org/lantern/client/LanternHttpProxyServer.java b/src/main/java/org/lantern/client/LanternHttpProxyServer.java similarity index 100% rename from client/src/main/java/org/lantern/client/LanternHttpProxyServer.java rename to src/main/java/org/lantern/client/LanternHttpProxyServer.java diff --git a/client/src/main/java/org/lantern/client/LanternKeyStoreManager.java b/src/main/java/org/lantern/client/LanternKeyStoreManager.java similarity index 100% rename from client/src/main/java/org/lantern/client/LanternKeyStoreManager.java rename to src/main/java/org/lantern/client/LanternKeyStoreManager.java diff --git a/client/src/main/java/org/lantern/client/LanternTrustManager.java b/src/main/java/org/lantern/client/LanternTrustManager.java similarity index 100% rename from client/src/main/java/org/lantern/client/LanternTrustManager.java rename to src/main/java/org/lantern/client/LanternTrustManager.java diff --git a/client/src/main/java/org/lantern/client/LanternUtils.java b/src/main/java/org/lantern/client/LanternUtils.java similarity index 100% rename from client/src/main/java/org/lantern/client/LanternUtils.java rename to src/main/java/org/lantern/client/LanternUtils.java diff --git a/client/src/main/java/org/lantern/client/Launcher.java b/src/main/java/org/lantern/client/Launcher.java similarity index 100% rename from client/src/main/java/org/lantern/client/Launcher.java rename to src/main/java/org/lantern/client/Launcher.java diff --git a/client/src/main/java/org/lantern/client/NativeUtils.java b/src/main/java/org/lantern/client/NativeUtils.java similarity index 100% rename from client/src/main/java/org/lantern/client/NativeUtils.java rename to src/main/java/org/lantern/client/NativeUtils.java diff --git a/client/src/main/java/org/lantern/client/PeerProxyRelayHandler.java b/src/main/java/org/lantern/client/PeerProxyRelayHandler.java similarity index 100% rename from client/src/main/java/org/lantern/client/PeerProxyRelayHandler.java rename to src/main/java/org/lantern/client/PeerProxyRelayHandler.java diff --git a/client/src/main/java/org/lantern/client/ProxyRelayHandler.java b/src/main/java/org/lantern/client/ProxyRelayHandler.java similarity index 100% rename from client/src/main/java/org/lantern/client/ProxyRelayHandler.java rename to src/main/java/org/lantern/client/ProxyRelayHandler.java diff --git a/client/src/main/java/org/lantern/client/ProxyStatusListener.java b/src/main/java/org/lantern/client/ProxyStatusListener.java similarity index 100% rename from client/src/main/java/org/lantern/client/ProxyStatusListener.java rename to src/main/java/org/lantern/client/ProxyStatusListener.java diff --git a/client/src/main/java/org/lantern/client/RawSocketProxyRelayHandler.java b/src/main/java/org/lantern/client/RawSocketProxyRelayHandler.java similarity index 100% rename from client/src/main/java/org/lantern/client/RawSocketProxyRelayHandler.java rename to src/main/java/org/lantern/client/RawSocketProxyRelayHandler.java diff --git a/client/src/main/java/org/lantern/client/SystemTray.java b/src/main/java/org/lantern/client/SystemTray.java similarity index 100% rename from client/src/main/java/org/lantern/client/SystemTray.java rename to src/main/java/org/lantern/client/SystemTray.java diff --git a/client/src/main/java/org/lantern/client/SystemTrayImpl.java b/src/main/java/org/lantern/client/SystemTrayImpl.java similarity index 100% rename from client/src/main/java/org/lantern/client/SystemTrayImpl.java rename to src/main/java/org/lantern/client/SystemTrayImpl.java diff --git a/client/src/main/java/org/lantern/client/WindowsRegistry.java b/src/main/java/org/lantern/client/WindowsRegistry.java similarity index 100% rename from client/src/main/java/org/lantern/client/WindowsRegistry.java rename to src/main/java/org/lantern/client/WindowsRegistry.java diff --git a/client/src/main/java/org/lantern/client/XmppMessageConstants.java b/src/main/java/org/lantern/client/XmppMessageConstants.java similarity index 100% rename from client/src/main/java/org/lantern/client/XmppMessageConstants.java rename to src/main/java/org/lantern/client/XmppMessageConstants.java diff --git a/client/src/main/java/org/lantern/client/contacts/Contact.java b/src/main/java/org/lantern/client/contacts/Contact.java similarity index 100% rename from client/src/main/java/org/lantern/client/contacts/Contact.java rename to src/main/java/org/lantern/client/contacts/Contact.java diff --git a/client/src/main/java/org/lantern/client/contacts/Contacts.java b/src/main/java/org/lantern/client/contacts/Contacts.java similarity index 100% rename from client/src/main/java/org/lantern/client/contacts/Contacts.java rename to src/main/java/org/lantern/client/contacts/Contacts.java diff --git a/client/src/main/java/org/lantern/client/contacts/ContactsFeed.java b/src/main/java/org/lantern/client/contacts/ContactsFeed.java similarity index 100% rename from client/src/main/java/org/lantern/client/contacts/ContactsFeed.java rename to src/main/java/org/lantern/client/contacts/ContactsFeed.java diff --git a/client/src/main/java/org/lantern/client/contacts/ContactsUrl.java b/src/main/java/org/lantern/client/contacts/ContactsUrl.java similarity index 100% rename from client/src/main/java/org/lantern/client/contacts/ContactsUrl.java rename to src/main/java/org/lantern/client/contacts/ContactsUrl.java diff --git a/client/src/main/java/org/lantern/client/contacts/DefaultContacts.java b/src/main/java/org/lantern/client/contacts/DefaultContacts.java similarity index 100% rename from client/src/main/java/org/lantern/client/contacts/DefaultContacts.java rename to src/main/java/org/lantern/client/contacts/DefaultContacts.java diff --git a/client/src/main/java/org/lantern/client/contacts/Email.java b/src/main/java/org/lantern/client/contacts/Email.java similarity index 100% rename from client/src/main/java/org/lantern/client/contacts/Email.java rename to src/main/java/org/lantern/client/contacts/Email.java diff --git a/client/src/main/java/org/lantern/client/xmpp/DefaultGChat.java b/src/main/java/org/lantern/client/xmpp/DefaultGChat.java similarity index 100% rename from client/src/main/java/org/lantern/client/xmpp/DefaultGChat.java rename to src/main/java/org/lantern/client/xmpp/DefaultGChat.java diff --git a/client/src/main/java/org/lantern/client/xmpp/GChat.java b/src/main/java/org/lantern/client/xmpp/GChat.java similarity index 100% rename from client/src/main/java/org/lantern/client/xmpp/GChat.java rename to src/main/java/org/lantern/client/xmpp/GChat.java diff --git a/client/src/main/resources/log4j.properties b/src/main/resources/log4j.properties similarity index 100% rename from client/src/main/resources/log4j.properties rename to src/main/resources/log4j.properties diff --git a/client/src/test/resources/log4j.properties b/src/test/resources/log4j.properties similarity index 100% rename from client/src/test/resources/log4j.properties rename to src/test/resources/log4j.properties