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 extends ChatMessageListener> 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 extends DefaultXmppProxy> 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