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