[tor-commits] [orbot/master] on receiving ACTION_START, only send status reply if EXTRA_PACKAGE_NAME set

n8fr8 at torproject.org n8fr8 at torproject.org
Thu Jun 25 14:59:59 UTC 2015


commit 77b1bdfbc5aaee6b25b4e9d9f4468a73d185d4c5
Author: Hans-Christoph Steiner <hans at eds.org>
Date:   Wed Jun 10 17:39:57 2015 -0400

    on receiving ACTION_START, only send status reply if EXTRA_PACKAGE_NAME set
    
    In order to receive a targeted reply, an app has to send its packageName to
    Orbot as an String extra in an ACTION_START Intent.  Also, when Orbot
    internally uses ACTION_START, it shouldn't receive replies.
---
 .../android/service/StartTorReceiver.java          |   12 ++++++---
 src/org/torproject/android/service/TorService.java |   21 ++++++++++++++++
 .../android/service/TorServiceConstants.java       |   26 ++++++++++++++++++++
 3 files changed, 55 insertions(+), 4 deletions(-)

diff --git a/src/org/torproject/android/service/StartTorReceiver.java b/src/org/torproject/android/service/StartTorReceiver.java
index c236484..89df596 100644
--- a/src/org/torproject/android/service/StartTorReceiver.java
+++ b/src/org/torproject/android/service/StartTorReceiver.java
@@ -11,10 +11,14 @@ public class StartTorReceiver extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) {
         /* sanitize the Intent before forwarding it to TorService */
-        if (TextUtils.equals(intent.getAction(), TorServiceConstants.ACTION_START)) {
-            Intent startTorService = new Intent(context, TorService.class);
-            startTorService.setAction(intent.getAction());
-            context.startService(startTorService);
+        String action = intent.getAction();
+        if (TextUtils.equals(action, TorServiceConstants.ACTION_START)) {
+            Intent startTorIntent = new Intent(context, TorService.class);
+            startTorIntent.setAction(action);
+            String packageName = intent.getStringExtra(TorServiceConstants.EXTRA_PACKAGE_NAME);
+            if (packageName != null)
+                startTorIntent.putExtra(TorServiceConstants.EXTRA_PACKAGE_NAME, packageName);
+            context.startService(startTorIntent);
         }
     }
 }
diff --git a/src/org/torproject/android/service/TorService.java b/src/org/torproject/android/service/TorService.java
index efde5c6..ccfc4c8 100644
--- a/src/org/torproject/android/service/TorService.java
+++ b/src/org/torproject/android/service/TorService.java
@@ -28,6 +28,7 @@ import android.os.RemoteException;
 import android.support.v4.app.NotificationCompat;
 import android.support.v4.app.NotificationCompat.Builder;
 import android.support.v4.content.LocalBroadcastManager;
+import android.text.TextUtils;
 import android.util.Log;
 import android.widget.RemoteViews;
 
@@ -342,6 +343,7 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
 
             if (action != null) {
                 if (action.equals(ACTION_START)) {
+                    replyWithStatus(mIntent);
                     startTor();
                     // stopTor() is called when the Service is destroyed
                 } else if (action.equals(CMD_SIGNAL_HUP)) {
@@ -748,6 +750,25 @@ public class TorService extends Service implements TorServiceConstants, OrbotCon
         return success;
     }
 
+    /**
+     * Send Orbot's status in reply to an
+     * {@link TorServiceConstants#ACTION_START} {@link Intent}, targeted only to
+     * the app that sent the initial request.
+     */
+    private void replyWithStatus(Intent startRequest) {
+        String packageName = startRequest.getStringExtra(EXTRA_PACKAGE_NAME);
+        if (TextUtils.isEmpty(packageName)) {
+            return;
+        }
+        Intent reply = new Intent(ACTION_STATUS);
+        reply.putExtra(EXTRA_STATUS, mCurrentStatus);
+        reply.setPackage(packageName);
+        sendBroadcast(reply);
+    }
+
+    /**
+     * The entire process for starting tor and related services is run from this method.
+     */
     private void startTor() {
         if (mCurrentStatus == STATUS_STARTING || mCurrentStatus == STATUS_STOPPING) {
             // these states should probably be handled better
diff --git a/src/org/torproject/android/service/TorServiceConstants.java b/src/org/torproject/android/service/TorServiceConstants.java
index 96715b6..7921ddc 100644
--- a/src/org/torproject/android/service/TorServiceConstants.java
+++ b/src/org/torproject/android/service/TorServiceConstants.java
@@ -1,7 +1,10 @@
 /* Copyright (c) 2009, Nathan Freitas, Orbot / The Guardian Project - http://openideals.com/guardian */
 /* See LICENSE for licensing information */
+
 package org.torproject.android.service;
 
+import android.content.Intent;
+
 public interface TorServiceConstants {
 
 	public final static String TOR_APP_USERNAME = "org.torproject.android";
@@ -67,19 +70,42 @@ public interface TorServiceConstants {
     //control port 
     public final static String TOR_CONTROL_PORT_MSG_BOOTSTRAP_DONE = "Bootstrapped 100%";
 
+    /**
+     * A request to Orbot to transparently start Tor services
+     */
     public final static String ACTION_START = "org.torproject.android.intent.action.START";
+    /**
+     * {@link Intent} send by Orbot with {@code ON/OFF/STARTING/STOPPING} status
+     */
     public final static String ACTION_STATUS = "org.torproject.android.intent.action.STATUS";
+    /**
+     * {@code String} that contains a status constant: {@link #STATUS_ON},
+     * {@link #STATUS_OFF}, {@link #STATUS_STARTING}, or
+     * {@link #STATUS_STOPPING}
+     */
     public final static String EXTRA_STATUS = "org.torproject.android.intent.extra.STATUS";
+    /**
+     * A {@link String} {@code packageName} for Orbot to direct its status reply
+     * to, used in {@link #ACTION_START} {@link Intent}s sent to Orbot
+     */
+    public final static String EXTRA_PACKAGE_NAME = "org.torproject.android.intent.extra.PACKAGE_NAME";
 
     public final static String LOCAL_ACTION_LOG = "log";
     public final static String LOCAL_ACTION_BANDWIDTH = "bandwidth";
     public final static String LOCAL_EXTRA_LOG = "log";
 
+    /**
+     * All tor-related services and daemons are stopped
+     */
     public final static String STATUS_OFF = "OFF";
+    /**
+     * All tor-related services and daemons have completed starting
+     */
     public final static String STATUS_ON = "ON";
     public final static String STATUS_STARTING = "STARTING";
     public final static String STATUS_STOPPING = "STOPPING";
 
+    // actions for internal command Intents
     public static final String CMD_SIGNAL_HUP = "signal_hup";
     public static final String CMD_FLUSH = "flush";
     public static final String CMD_NEWNYM = "newnym";





More information about the tor-commits mailing list