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