adding new HS/onion based file sharing service
This commit is contained in:
parent
1748cb49e2
commit
216a41d896
|
@ -244,6 +244,33 @@ privoxy-clean:
|
||||||
-rm -f privoxy-build-stamp
|
-rm -f privoxy-build-stamp
|
||||||
-rm -rf privoxy
|
-rm -rf privoxy
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------------#
|
||||||
|
# SimpleServer library #
|
||||||
|
simple/bin/simple.jar:
|
||||||
|
tar xzvf simple.tar.gz
|
||||||
|
mv simple-* simple
|
||||||
|
test -d simple/bin || mkdir simple/bin
|
||||||
|
cd simple/src && \
|
||||||
|
javac -source 1.6 -target 1.6 org/simpleframework/http/core/ContainerServer.java -d ../bin
|
||||||
|
cd simple/src && \
|
||||||
|
javac -source 1.6 -target 1.6 org/simpleframework/transport/connect/Connection.java -d ../bin
|
||||||
|
cd simple/src && \
|
||||||
|
javac -source 1.6 -target 1.6 org/simpleframework/transport/connect/SocketConnection.java -d ../bin
|
||||||
|
cd simple/bin && \
|
||||||
|
jar cvf simple.jar *
|
||||||
|
|
||||||
|
simple-build-stamp: simple/bin/simple.jar
|
||||||
|
touch simple-build-stamp
|
||||||
|
|
||||||
|
simple: simple-build-stamp
|
||||||
|
test -d bin || mkdir bin
|
||||||
|
cp simple/bin/simple.jar bin
|
||||||
|
|
||||||
|
simple-clean:
|
||||||
|
- rm -f bin/simple.jar
|
||||||
|
- rm -f simple-build-stamp
|
||||||
|
- rm -rf simple
|
||||||
|
|
||||||
#------------------------------------------------------------------------------#
|
#------------------------------------------------------------------------------#
|
||||||
# JTorControl library
|
# JTorControl library
|
||||||
|
|
||||||
|
@ -270,12 +297,13 @@ jtorctl-clean:
|
||||||
#in order to stop Android OS (older devices) from trying to compress/decompress it
|
#in order to stop Android OS (older devices) from trying to compress/decompress it
|
||||||
#this is related to a bug in compression of assets and resources > 1MB
|
#this is related to a bug in compression of assets and resources > 1MB
|
||||||
|
|
||||||
assets: tor privoxy jtorctl obfsproxy
|
assets: tor privoxy jtorctl obfsproxy simple
|
||||||
install -d ../res/raw
|
install -d ../res/raw
|
||||||
install -d ../libs
|
install -d ../libs
|
||||||
install bin/privoxy ../res/raw
|
install bin/privoxy ../res/raw
|
||||||
install bin/obfsproxy ../res/raw
|
install bin/obfsproxy ../res/raw
|
||||||
install bin/jtorctl.jar ../libs
|
install bin/jtorctl.jar ../libs
|
||||||
|
install bin/simple.jar ../libs
|
||||||
cd bin && \
|
cd bin && \
|
||||||
zip ../../res/raw/tor.mp3 tor
|
zip ../../res/raw/tor.mp3 tor
|
||||||
|
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,10 @@
|
||||||
|
package org.torproject.android.share;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
|
||||||
|
public class ShareItem {
|
||||||
|
|
||||||
|
public String mContentType;
|
||||||
|
public long mContentLength;
|
||||||
|
public Uri mUriData;
|
||||||
|
}
|
|
@ -0,0 +1,160 @@
|
||||||
|
package org.torproject.android.share;
|
||||||
|
|
||||||
|
import java.io.BufferedOutputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.net.SocketAddress;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
import org.simpleframework.http.Path;
|
||||||
|
import org.simpleframework.http.Request;
|
||||||
|
import org.simpleframework.http.Response;
|
||||||
|
import org.simpleframework.http.core.Container;
|
||||||
|
import org.simpleframework.http.core.ContainerServer;
|
||||||
|
import org.simpleframework.transport.Server;
|
||||||
|
import org.simpleframework.transport.connect.Connection;
|
||||||
|
import org.simpleframework.transport.connect.SocketConnection;
|
||||||
|
|
||||||
|
import android.content.ContentResolver;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.AssetFileDescriptor;
|
||||||
|
import android.database.Cursor;
|
||||||
|
import android.provider.MediaStore;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
public class ShareService implements Container {
|
||||||
|
|
||||||
|
private final static String TAG = "OrbotShare";
|
||||||
|
|
||||||
|
public static class Task implements Runnable {
|
||||||
|
|
||||||
|
private final Response response;
|
||||||
|
private final Request request;
|
||||||
|
|
||||||
|
public Task(Request request, Response response) {
|
||||||
|
this.response = response;
|
||||||
|
this.request = request;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
|
||||||
|
Path path = request.getPath();
|
||||||
|
String rPath = path.toString();
|
||||||
|
if (rPath.length() > 0)
|
||||||
|
rPath = rPath.substring(1);
|
||||||
|
|
||||||
|
ShareItem sItem = sShareItems.get(rPath);
|
||||||
|
|
||||||
|
if (sItem != null)
|
||||||
|
{
|
||||||
|
|
||||||
|
long time = System.currentTimeMillis();
|
||||||
|
|
||||||
|
response.setValue("Server", "OrbotShare/1.0 (Orbot 0.0.12-alpha)");
|
||||||
|
response.setDate("Date", time);
|
||||||
|
response.setDate("Last-Modified", time);
|
||||||
|
response.setValue("Content-Type", sItem.mContentType);
|
||||||
|
|
||||||
|
|
||||||
|
ContentResolver cr = sContext.getContentResolver();
|
||||||
|
InputStream is = cr.openInputStream(sItem.mUriData);
|
||||||
|
|
||||||
|
AssetFileDescriptor fileDesc = cr.openAssetFileDescriptor(sItem.mUriData, "r");
|
||||||
|
fileDesc.getLength();
|
||||||
|
|
||||||
|
response.setValue("Content-Length", fileDesc.getLength()+"");
|
||||||
|
|
||||||
|
String fileName = rPath;
|
||||||
|
|
||||||
|
String scheme = sItem.mUriData.getScheme();
|
||||||
|
if (scheme.equals("file")) {
|
||||||
|
fileName = sItem.mUriData.getLastPathSegment();
|
||||||
|
}
|
||||||
|
else if (scheme.equals("content")) {
|
||||||
|
String[] proj = { MediaStore.Images.Media.TITLE };
|
||||||
|
Cursor cursor = cr.query(sItem.mUriData, proj, null, null, null);
|
||||||
|
if (cursor != null && cursor.getCount() != 0) {
|
||||||
|
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.TITLE);
|
||||||
|
cursor.moveToFirst();
|
||||||
|
fileName = cursor.getString(columnIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//force file to be downloaded
|
||||||
|
response.setValue("Content-Disposition","attachment; filename=" + fileName);
|
||||||
|
|
||||||
|
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
|
||||||
|
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
int len = -1;
|
||||||
|
while ( (len = is.read(buffer)) != -1)
|
||||||
|
{
|
||||||
|
bos.write(buffer, 0, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
bos.flush();
|
||||||
|
bos.close();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
response.setCode(404);
|
||||||
|
response.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch(Exception e) {
|
||||||
|
Log.e(TAG,"error handling request",e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ShareService(int size, Context context) {
|
||||||
|
this.executor = Executors.newFixedThreadPool(size);
|
||||||
|
sContext = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handle(Request request, Response response) {
|
||||||
|
Task task = new Task(request, response);
|
||||||
|
|
||||||
|
executor.execute(task);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void startService (int port) throws Exception {
|
||||||
|
|
||||||
|
mServer = new ContainerServer(this);
|
||||||
|
mConnection = new SocketConnection(mServer);
|
||||||
|
SocketAddress address = new InetSocketAddress(port);
|
||||||
|
|
||||||
|
mConnection.connect(address);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopService () throws Exception {
|
||||||
|
mConnection.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized String addShare (ShareItem sItem)
|
||||||
|
{
|
||||||
|
if (sShareItems == null)
|
||||||
|
{
|
||||||
|
sShareItems = new HashMap<String,ShareItem>();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
String guid = java.util.UUID.randomUUID().toString().substring(0,6);//short guid
|
||||||
|
|
||||||
|
sShareItems.put (guid, sItem);
|
||||||
|
|
||||||
|
return guid;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Executor executor;
|
||||||
|
|
||||||
|
private Server mServer;
|
||||||
|
private Connection mConnection;
|
||||||
|
|
||||||
|
private static HashMap<String, ShareItem> sShareItems;
|
||||||
|
private static Context sContext;
|
||||||
|
}
|
Loading…
Reference in New Issue