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 -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -270,12 +297,13 @@ jtorctl-clean:
 | 
			
		|||
#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
 | 
			
		||||
 | 
			
		||||
assets: tor privoxy jtorctl obfsproxy
 | 
			
		||||
assets: tor privoxy jtorctl obfsproxy simple
 | 
			
		||||
	install -d ../res/raw
 | 
			
		||||
	install -d ../libs
 | 
			
		||||
	install bin/privoxy ../res/raw	
 | 
			
		||||
	install bin/obfsproxy ../res/raw
 | 
			
		||||
	install bin/jtorctl.jar ../libs
 | 
			
		||||
	install bin/simple.jar ../libs
 | 
			
		||||
	cd bin && \
 | 
			
		||||
		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