tor-commits
Threads by month
- ----- 2025 -----
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
March 2017
- 20 participants
- 1183 discussions
commit 135e6c4ae077e22b8379676ead315707b8e9e39c
Author: arrase <arrase(a)gmail.com>
Date: Thu Nov 17 02:35:38 2016 +0100
Move layout
---
app/src/main/res/layout-v21/onion_item.xml | 25 -------------------------
app/src/main/res/layout/onion_item.xml | 22 ++++++++++++++++++++++
2 files changed, 22 insertions(+), 25 deletions(-)
diff --git a/app/src/main/res/layout-v21/onion_item.xml b/app/src/main/res/layout-v21/onion_item.xml
deleted file mode 100644
index 2d6aa05..0000000
--- a/app/src/main/res/layout-v21/onion_item.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="5dp">
-
-
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/hs_name" />
-
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/hs_onion" />
- </LinearLayout>
-
-</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/onion_item.xml b/app/src/main/res/layout/onion_item.xml
new file mode 100644
index 0000000..717ed79
--- /dev/null
+++ b/app/src/main/res/layout/onion_item.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <TextView
+ android:id="@+id/hs_name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
+ <TextView
+ android:id="@+id/hs_onion"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+ </LinearLayout>
+</LinearLayout>
\ No newline at end of file
1
0
commit 3f7435c90e3aa468046b1994938bf6b2b3d821a2
Author: arrase <arrase(a)gmail.com>
Date: Thu Nov 17 02:57:37 2016 +0100
Hidden Service dialog
---
.../android/ui/hs/HiddenServicesActivity.java | 6 +-
.../android/ui/hs/dialogs/HSDataDialog.java | 84 ++++++++++++++++++++++
app/src/main/res/layout/dialog_hs_data.xml | 63 ++++++++++++++++
app/src/main/res/values/strings.xml | 6 ++
proguard-project.txt | 20 ++++++
project.properties | 2 +-
6 files changed, 177 insertions(+), 4 deletions(-)
diff --git a/app/src/main/java/org/torproject/android/ui/hs/HiddenServicesActivity.java b/app/src/main/java/org/torproject/android/ui/hs/HiddenServicesActivity.java
index 85665fb..ebf1ec3 100644
--- a/app/src/main/java/org/torproject/android/ui/hs/HiddenServicesActivity.java
+++ b/app/src/main/java/org/torproject/android/ui/hs/HiddenServicesActivity.java
@@ -5,7 +5,6 @@ import android.database.ContentObserver;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.FloatingActionButton;
-import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
@@ -14,6 +13,7 @@ import android.view.View;
import org.torproject.android.R;
import org.torproject.android.ui.hs.adapters.HSAdapter;
+import org.torproject.android.ui.hs.dialogs.HSDataDialog;
import org.torproject.android.ui.hs.providers.HSContentProvider;
public class HiddenServicesActivity extends AppCompatActivity {
@@ -37,8 +37,8 @@ public class HiddenServicesActivity extends AppCompatActivity {
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
- Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
- .setAction("Action", null).show();
+ HSDataDialog dialog = new HSDataDialog();
+ dialog.show(getSupportFragmentManager(), "HSDataDialog");
}
});
diff --git a/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSDataDialog.java b/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSDataDialog.java
new file mode 100644
index 0000000..e62d2cb
--- /dev/null
+++ b/app/src/main/java/org/torproject/android/ui/hs/dialogs/HSDataDialog.java
@@ -0,0 +1,84 @@
+package org.torproject.android.ui.hs.dialogs;
+
+
+import android.app.Dialog;
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.DialogFragment;
+import android.support.v7.app.AlertDialog;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import org.torproject.android.R;
+import org.torproject.android.ui.hs.providers.HSContentProvider;
+
+public class HSDataDialog extends DialogFragment {
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ // Get the layout
+ final View dialog_view = getActivity().getLayoutInflater().inflate(R.layout.dialog_hs_data, null);
+
+ // Use the Builder class for convenient dialog construction
+ final AlertDialog serverDataDialog = new AlertDialog.Builder(getActivity())
+ .setView(dialog_view)
+ .setTitle(R.string.hs_dialog_title)
+ .create();
+
+ // Buttons action
+ Button save = (Button) dialog_view.findViewById(R.id.HSDialogSave);
+ save.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ String serverName = ((EditText) dialog_view.findViewById(R.id.hsName)).getText().toString();
+ Integer serverPort = Integer.parseInt(
+ ((EditText) dialog_view.findViewById(R.id.serverPort)).getText().toString()
+ );
+
+ if (checkInput(serverPort)) {
+ saveData(serverName, serverPort);
+ serverDataDialog.dismiss();
+ }
+ }
+ });
+
+ Button cancel = (Button) dialog_view.findViewById(R.id.HSDialogCancel);
+ cancel.setOnClickListener(new View.OnClickListener() {
+ public void onClick(View v) {
+ serverDataDialog.cancel();
+ }
+ });
+
+ return serverDataDialog;
+ }
+
+ private boolean checkInput(Integer port) {
+ boolean is_ok = true;
+ Integer error_msg = 0;
+
+ if (port <= 1 || port > 65535) {
+ error_msg = R.string.invalid_port;
+ is_ok = false;
+ }
+
+ if (!is_ok) {
+ Toast.makeText(getContext(), error_msg, Toast.LENGTH_SHORT).show();
+ }
+
+ return is_ok;
+ }
+
+ private void saveData(String name, Integer port) {
+ ContentValues fields = new ContentValues();
+ fields.put("name", name);
+ fields.put("port", port);
+
+ ContentResolver cr = getContext().getContentResolver();
+
+ cr.insert(HSContentProvider.CONTENT_URI, fields);
+ }
+}
diff --git a/app/src/main/res/layout/dialog_hs_data.xml b/app/src/main/res/layout/dialog_hs_data.xml
new file mode 100644
index 0000000..2f4daa6
--- /dev/null
+++ b/app/src/main/res/layout/dialog_hs_data.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingLeft="5dp"
+ android:paddingRight="5dp"
+ android:paddingTop="5dp"
+ android:paddingBottom="5dp">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/HSNameLabel"
+ android:text="@string/name"
+ android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small"
+ android:paddingLeft="5dp" />
+
+ <EditText
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:inputType="text"
+ android:ems="10"
+ android:id="@+id/hsName" />
+
+ <TextView
+ android:text="@string/port"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/HSPortLabel"
+ android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small"
+ android:paddingLeft="5dp" />
+
+ <EditText
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:ems="10"
+ android:id="@+id/serverPort"
+ android:inputType="number" />
+
+ <LinearLayout
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <Button
+ android:text="@string/cancel"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/HSDialogCancel"
+ android:layout_weight="1"
+ style="@style/Widget.AppCompat.Button.Borderless.Colored" />
+
+ <Button
+ android:text="@string/save"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:id="@+id/HSDialogSave"
+ android:layout_weight="1"
+ style="@style/Widget.AppCompat.Button.Borderless.Colored" />
+ </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index bd93d6d..333ac58 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -331,4 +331,10 @@
<string name="vpn_default_world">World (Location)</string>
<string name="title_activity_hidden_services">Hidden Services</string>
+ <string name="save">Save</string>
+ <string name="cancel">Cancel</string>
+ <string name="hs_dialog_title">Hidden Service</string>
+ <string name="port">Port</string>
+ <string name="name">Name</string>
+ <string name="invalid_port">Invalid Port</string>
</resources>
diff --git a/proguard-project.txt b/proguard-project.txt
index e69de29..f2fe155 100644
--- a/proguard-project.txt
+++ b/proguard-project.txt
@@ -0,0 +1,20 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
diff --git a/project.properties b/project.properties
index 145c9f2..240497d 100644
--- a/project.properties
+++ b/project.properties
@@ -9,6 +9,6 @@
#proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
# Project target.
-target=android-23
+target=android-15
android.library.reference.1=external/jsocks/jsockslib
android.library.reference.2=external/appcompat
1
0
commit 0131cf20f0d37000f72f87baea5bd3de5bb86a34
Author: arrase <arrase(a)gmail.com>
Date: Thu Nov 17 04:09:45 2016 +0100
adds optional string to the intent
---
.../org/torproject/android/OrbotMainActivity.java | 92 +++++++++-------------
1 file changed, 36 insertions(+), 56 deletions(-)
diff --git a/app/src/main/java/org/torproject/android/OrbotMainActivity.java b/app/src/main/java/org/torproject/android/OrbotMainActivity.java
index 762ef8e..a33e8ad 100644
--- a/app/src/main/java/org/torproject/android/OrbotMainActivity.java
+++ b/app/src/main/java/org/torproject/android/OrbotMainActivity.java
@@ -27,6 +27,7 @@ import org.torproject.android.ui.hs.HiddenServicesActivity;
import org.torproject.android.ui.ImageProgressView;
import org.torproject.android.ui.PromoAppsActivity;
import org.torproject.android.ui.Rotate3dAnimation;
+import org.torproject.android.ui.hs.providers.HSContentProvider;
import org.torproject.android.vpn.VPNEnableActivity;
import android.annotation.SuppressLint;
@@ -35,6 +36,8 @@ import android.app.ActivityManager.RunningServiceInfo;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
+import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
@@ -44,6 +47,7 @@ import android.content.SharedPreferences.Editor;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
@@ -561,65 +565,40 @@ public class OrbotMainActivity extends AppCompatActivity
stopVpnService();
}
- private void enableHiddenServicePort (int hsPort) throws RemoteException, InterruptedException
+ private void enableHiddenServicePort (String hsName, int hsPort) throws RemoteException, InterruptedException
{
-
- Editor pEdit = mPrefs.edit();
-
- String hsPortString = mPrefs.getString("pref_hs_ports", "");
- String onionHostname = mPrefs.getString("pref_hs_hostname","");
-
- if (hsPortString.indexOf(hsPort+"")==-1)
- {
- if (hsPortString.length() > 0 && hsPortString.indexOf(hsPort+"")==-1)
- hsPortString += ',' + hsPort;
- else
- hsPortString = hsPort + "";
-
- pEdit.putString("pref_hs_ports", hsPortString);
- pEdit.putBoolean("pref_hs_enable", true);
-
- pEdit.commit();
+ String onionHostname="";
+ String[] mProjection = new String[]{
+ HSContentProvider.HiddenService._ID,
+ HSContentProvider.HiddenService.NAME,
+ HSContentProvider.HiddenService.DOMAIN,
+ HSContentProvider.HiddenService.PORT};
+
+ if(hsName == null)
+ hsName = "hs"+hsPort;
+
+ ContentValues fields = new ContentValues();
+ fields.put("name", hsName);
+ fields.put("port", hsPort);
+ ContentResolver cr = getContentResolver();
+ Cursor row = cr.query(HSContentProvider.CONTENT_URI, mProjection, "port="+hsPort, null, null);
+
+ if(row == null) {
+ cr.insert(HSContentProvider.CONTENT_URI, fields);
+ } else {
+ onionHostname = row.getString(row.getColumnIndex(HSContentProvider.HiddenService.NAME));
+ cr.update(HSContentProvider.CONTENT_URI, fields, "port=" + hsPort, null);
+ row.close();
}
- if (onionHostname == null || onionHostname.length() == 0)
- {
- requestTorRereadConfig();
+ requestTorRereadConfig();
- new Thread () {
+ // TODO: Wait for hostname
- public void run ()
- {
- String onionHostname = mPrefs.getString("pref_hs_hostname","");
-
- while (onionHostname.length() == 0)
- {
- //we need to stop and start Tor
- try {
- Thread.sleep(3000); //wait three seconds
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- onionHostname = mPrefs.getString("pref_hs_hostname","");
- }
-
- Intent nResult = new Intent();
- nResult.putExtra("hs_host", onionHostname);
- setResult(RESULT_OK, nResult);
- finish();
- }
- }.start();
-
- }
- else
- {
- Intent nResult = new Intent();
- nResult.putExtra("hs_host", onionHostname);
- setResult(RESULT_OK, nResult);
- finish();
- }
+ Intent nResult = new Intent();
+ nResult.putExtra("hs_host", onionHostname);
+ setResult(RESULT_OK, nResult);
+ finish();
}
@@ -640,7 +619,8 @@ public class OrbotMainActivity extends AppCompatActivity
if (action.equals(INTENT_ACTION_REQUEST_HIDDEN_SERVICE))
{
- final int hiddenServicePortRequest = getIntent().getIntExtra("hs_port", -1);
+ final int hiddenServicePort = getIntent().getIntExtra("hs_port", -1);
+ final String hiddenServiceName = getIntent().getStringExtra("hs_name");
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@@ -649,7 +629,7 @@ public class OrbotMainActivity extends AppCompatActivity
case DialogInterface.BUTTON_POSITIVE:
try {
- enableHiddenServicePort (hiddenServicePortRequest);
+ enableHiddenServicePort (hiddenServiceName, hiddenServicePort);
} catch (RemoteException e) {
// TODO Auto-generated catch block
1
0
commit 94a3b0b107cab9a2b5b46e889e65266053bc24cb
Author: arrase <arrase(a)gmail.com>
Date: Thu Nov 17 04:17:08 2016 +0100
adds optional boolean to the intent
---
.../main/java/org/torproject/android/OrbotMainActivity.java | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/app/src/main/java/org/torproject/android/OrbotMainActivity.java b/app/src/main/java/org/torproject/android/OrbotMainActivity.java
index a33e8ad..15506da 100644
--- a/app/src/main/java/org/torproject/android/OrbotMainActivity.java
+++ b/app/src/main/java/org/torproject/android/OrbotMainActivity.java
@@ -565,7 +565,7 @@ public class OrbotMainActivity extends AppCompatActivity
stopVpnService();
}
- private void enableHiddenServicePort (String hsName, int hsPort) throws RemoteException, InterruptedException
+ private void enableHiddenServicePort (String hsName, int hsPort, boolean getGey) throws RemoteException, InterruptedException
{
String onionHostname="";
String[] mProjection = new String[]{
@@ -580,6 +580,7 @@ public class OrbotMainActivity extends AppCompatActivity
ContentValues fields = new ContentValues();
fields.put("name", hsName);
fields.put("port", hsPort);
+
ContentResolver cr = getContentResolver();
Cursor row = cr.query(HSContentProvider.CONTENT_URI, mProjection, "port="+hsPort, null, null);
@@ -594,9 +595,9 @@ public class OrbotMainActivity extends AppCompatActivity
requestTorRereadConfig();
// TODO: Wait for hostname
-
Intent nResult = new Intent();
nResult.putExtra("hs_host", onionHostname);
+ // TODO: Add key
setResult(RESULT_OK, nResult);
finish();
@@ -621,6 +622,7 @@ public class OrbotMainActivity extends AppCompatActivity
{
final int hiddenServicePort = getIntent().getIntExtra("hs_port", -1);
final String hiddenServiceName = getIntent().getStringExtra("hs_name");
+ final boolean getHiddenServiceKey = getIntent().getBooleanExtra("hs_key",false);
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@@ -629,8 +631,9 @@ public class OrbotMainActivity extends AppCompatActivity
case DialogInterface.BUTTON_POSITIVE:
try {
- enableHiddenServicePort (hiddenServiceName, hiddenServicePort);
-
+ enableHiddenServicePort (
+ hiddenServiceName, hiddenServicePort, getHiddenServiceKey
+ );
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
1
0
commit 1e93ef46062d393b1ccccfcd482d7451f688cba1
Author: Hans-Christoph Steiner <hans(a)eds.org>
Date: Fri Jun 3 11:30:08 2016 +0200
improved javadoc of start process
---
src/org/torproject/android/service/TorService.java | 4 +++-
src/org/torproject/android/service/TorServiceConstants.java | 4 +++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/org/torproject/android/service/TorService.java b/src/org/torproject/android/service/TorService.java
index b90442b..147ca78 100644
--- a/src/org/torproject/android/service/TorService.java
+++ b/src/org/torproject/android/service/TorService.java
@@ -698,7 +698,9 @@ public class TorService extends VpnService implements TorServiceConstants, Orbot
/**
* Send Orbot's status in reply to an
* {@link TorServiceConstants#ACTION_START} {@link Intent}, targeted only to
- * the app that sent the initial request.
+ * the app that sent the initial request. If the user has disabled auto-
+ * starts, the reply {@code ACTION_START Intent} will include the extra
+ * {@link TorServiceConstants#STATUS_STARTS_DISABLED}
*/
private void replyWithStatus(Intent startRequest) {
String packageName = startRequest.getStringExtra(EXTRA_PACKAGE_NAME);
diff --git a/src/org/torproject/android/service/TorServiceConstants.java b/src/org/torproject/android/service/TorServiceConstants.java
index e2f0964..86c6a64 100644
--- a/src/org/torproject/android/service/TorServiceConstants.java
+++ b/src/org/torproject/android/service/TorServiceConstants.java
@@ -117,9 +117,11 @@ public interface TorServiceConstants {
public final static String STATUS_ON = "ON";
public final static String STATUS_STARTING = "STARTING";
public final static String STATUS_STOPPING = "STOPPING";
+
/**
* The user has disabled the ability for background starts triggered by
- * apps. Fallback to the old Intent that brings up Orbot.
+ * apps. Fallback to the old {@link Intent} action that brings up Orbot:
+ * {@link org.torproject.android.OrbotMainActivity#INTENT_ACTION_REQUEST_START_TOR}
*/
public final static String STATUS_STARTS_DISABLED = "STARTS_DISABLED";
1
0

[orbot/master] New hidden services management screen and database
by n8fr8@torproject.org 02 Mar '17
by n8fr8@torproject.org 02 Mar '17
02 Mar '17
commit 26d938126f9ec9075cfe58efef5830f54a2b2118
Author: arrase <arrase(a)gmail.com>
Date: Thu Nov 17 02:27:48 2016 +0100
New hidden services management screen and database
---
app/build.gradle | 3 +-
app/src/main/AndroidManifest.xml | 211 +++----
.../org/torproject/android/OrbotMainActivity.java | 5 +
.../android/settings/SettingsPreferences.java | 20 +-
.../android/ui/hs/HiddenServicesActivity.java | 76 +++
.../ui/hs/adapters/CursorRecyclerViewAdapter.java | 144 +++++
.../android/ui/hs/adapters/HSAdapter.java | 54 ++
.../android/ui/hs/database/HSDatabase.java | 33 ++
.../android/ui/hs/providers/HSContentProvider.java | 121 ++++
app/src/main/res/layout-v21/onion_item.xml | 25 +
.../main/res/layout/activity_hidden_services.xml | 34 ++
.../main/res/layout/content_hidden_services.xml | 22 +
app/src/main/res/menu/orbot_main.xml | 6 +-
app/src/main/res/values-v21/styles.xml | 1 +
app/src/main/res/values-w820dp/dimens.xml | 6 +
app/src/main/res/values/dimens.xml | 22 +-
app/src/main/res/values/strings.xml | 621 ++++++++++-----------
app/src/main/res/values/styles.xml | 6 +
app/src/main/res/xml/preferences.xml | 11 -
19 files changed, 969 insertions(+), 452 deletions(-)
diff --git a/app/build.gradle b/app/build.gradle
index b963164..54cbf5f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -28,7 +28,8 @@ android {
dependencies {
compile project(':orbotservice')
+
compile 'com.android.support:support-v4:23.4.0'
compile 'com.android.support:appcompat-v7:23.4.0'
-
+ compile 'com.android.support:design:23.4.0'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 171567e..57dc32d 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,137 +1,150 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="org.torproject.android"
- android:versionName="15.2.0-RC-8-multi"
- android:versionCode="15208000"
- android:installLocation="auto"
- >
- <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23"/>
- <!--
+ package="org.torproject.android"
+ android:installLocation="auto"
+ android:versionCode="15208000"
+ android:versionName="15.2.0-RC-8-multi">
+
+ <uses-sdk
+ android:minSdkVersion="16"
+ android:targetSdkVersion="23" />
+ <!--
<permission android:name="org.torproject.android.MANAGE_TOR"
android:label="@string/permission_manage_tor_label"
android:description="@string/permission_manage_tor_description"
android:protectionLevel="signature"/>
<uses-permission android:name="org.torproject.android.MANAGE_TOR"/>
- -->
-
- <uses-permission android:name="android.permission.INTERNET"/>
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
- <uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
-
- <application android:name="org.torproject.android.OrbotApp" android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:description="@string/app_description"
- android:configChanges="locale|orientation|screenSize"
- android:theme="@style/DefaultTheme"
- android:allowBackup="false"
- android:allowClearUserData="true"
- android:largeHeap="false"
- android:hardwareAccelerated="false"
-
- >
-
- <activity android:name=".OrbotMainActivity"
+ -->
+
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+ <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
+ <uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
+
+ <android:uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <android:uses-permission android:name="android.permission.READ_PHONE_STATE" />
+ <android:uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+
+ <application
+ android:name=".OrbotApp"
+ android:allowBackup="false"
+ android:allowClearUserData="true"
+ android:configChanges="locale|orientation|screenSize"
+ android:description="@string/app_description"
+ android:hardwareAccelerated="false"
+ android:icon="@drawable/ic_launcher"
+ android:label="@string/app_name"
+ android:largeHeap="false"
+ android:theme="@style/DefaultTheme">
+ <activity
+ android:name=".OrbotMainActivity"
android:configChanges="orientation|screenSize"
android:excludeFromRecents="true"
- android:launchMode="singleTop"
- >
+ android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
+
<category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
-
+ </intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
+
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
+
<data android:scheme="bridge" />
</intent-filter>
-
- <intent-filter>
+ <intent-filter>
<category android:name="android.intent.category.DEFAULT" />
+
<action android:name="org.torproject.android.REQUEST_HS_PORT" />
</intent-filter>
- <intent-filter>
+ <intent-filter>
<category android:name="android.intent.category.DEFAULT" />
+
<action android:name="org.torproject.android.START_TOR" />
</intent-filter>
-
</activity>
- <!--
- This is for ensuring the background service still runs when/if the app is swiped away
- -->
- <activity
- android:name=".service.util.DummyActivity"
- android:theme="@android:style/Theme.Translucent"
- android:enabled="true"
- android:allowTaskReparenting="true"
- android:noHistory="true"
- android:excludeFromRecents="true"
- android:alwaysRetainTaskState="false"
- android:stateNotNeeded="true"
- android:clearTaskOnLaunch="true"
- android:finishOnTaskLaunch="true"
-
- />
-
- <activity
- android:name=".vpn.VPNEnableActivity" android:label="@string/app_name" android:exported="false"
- />
-
-
- <activity android:name="org.torproject.android.ui.PromoAppsActivity" android:exported="false"/>
-
-
- <activity android:name=".settings.SettingsPreferences" android:label="@string/app_name"/>
- <activity android:name=".ui.AppManager" android:label="@string/app_name"
- android:theme="@style/Theme.AppCompat"
- />
-
+ <!-- This is for ensuring the background service still runs when/if the app is swiped away -->
+ <activity
+ android:name=".service.util.DummyActivity"
+ android:allowTaskReparenting="true"
+ android:alwaysRetainTaskState="false"
+ android:clearTaskOnLaunch="true"
+ android:enabled="true"
+ android:excludeFromRecents="true"
+ android:finishOnTaskLaunch="true"
+ android:noHistory="true"
+ android:stateNotNeeded="true"
+ android:theme="@android:style/Theme.Translucent" />
+ <activity
+ android:name=".vpn.VPNEnableActivity"
+ android:exported="false"
+ android:label="@string/app_name" />
+ <activity
+ android:name=".ui.PromoAppsActivity"
+ android:exported="false" />
+ <activity
+ android:name=".settings.SettingsPreferences"
+ android:label="@string/app_name" />
+ <activity
+ android:name=".ui.AppManager"
+ android:label="@string/app_name"
+ android:theme="@style/Theme.AppCompat" />
+
<service
android:name=".service.TorService"
android:enabled="true"
android:permission="android.permission.BIND_VPN_SERVICE"
- android:stopWithTask="false" >
+ android:stopWithTask="false" />
+ <service
+ android:name=".service.vpn.TorVpnService"
+ android:enabled="true"
+ android:permission="android.permission.BIND_VPN_SERVICE">
+ <intent-filter>
+ <action android:name="android.net.VpnService" />
+ </intent-filter>
</service>
-
- <service
- android:name=".service.vpn.TorVpnService"
- android:enabled="true"
- android:permission="android.permission.BIND_VPN_SERVICE" >
- <intent-filter>
- <action android:name="android.net.VpnService"/>
- </intent-filter>
- </service>
-
<receiver
android:name=".service.StartTorReceiver"
android:exported="true">
- <intent-filter>
- <action android:name="org.torproject.android.intent.action.START" />
- </intent-filter>
+ <intent-filter>
+ <action android:name="org.torproject.android.intent.action.START" />
+ </intent-filter>
</receiver>
+ <receiver
+ android:name=".OnBootReceiver"
+ android:enabled="true"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.BOOT_COMPLETED" />
+
+ <category android:name="android.intent.category.HOME" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.QUICKBOOT_POWERON" />
+
+ <category android:name="android.intent.category.HOME" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.MEDIA_MOUNTED" />
+
+ <category android:name="android.intent.category.HOME" />
+ </intent-filter>
+ </receiver>
+
+ <activity
+ android:name=".ui.hs.HiddenServicesActivity"
+ android:label="@string/title_activity_hidden_services"
+ android:theme="@style/DefaultTheme" />
+
+ <provider
+ android:name=".ui.hs.providers.HSContentProvider"
+ android:exported="false"
+ android:authorities="org.torproject.android.ui.hs.providers" />
+ </application>
- <receiver android:name=".OnBootReceiver"
- android:enabled="true" android:exported="true"
-
- >
- <intent-filter>
- <action android:name="android.intent.action.BOOT_COMPLETED" />
- <category android:name="android.intent.category.HOME" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.QUICKBOOT_POWERON" />
- <category android:name="android.intent.category.HOME" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.MEDIA_MOUNTED"/>
- <category android:name="android.intent.category.HOME" />
- </intent-filter>
- </receiver>
-
-</application>
-</manifest>
+</manifest>
\ No newline at end of file
diff --git a/app/src/main/java/org/torproject/android/OrbotMainActivity.java b/app/src/main/java/org/torproject/android/OrbotMainActivity.java
index c43928e..762ef8e 100644
--- a/app/src/main/java/org/torproject/android/OrbotMainActivity.java
+++ b/app/src/main/java/org/torproject/android/OrbotMainActivity.java
@@ -23,6 +23,7 @@ import org.torproject.android.service.TorServiceConstants;
import org.torproject.android.service.util.TorServiceUtils;
import org.torproject.android.settings.SettingsPreferences;
import org.torproject.android.ui.AppManager;
+import org.torproject.android.ui.hs.HiddenServicesActivity;
import org.torproject.android.ui.ImageProgressView;
import org.torproject.android.ui.PromoAppsActivity;
import org.torproject.android.ui.Rotate3dAnimation;
@@ -479,6 +480,10 @@ public class OrbotMainActivity extends AppCompatActivity
}
}
+ else if (item.getItemId() == R.id.menu_hidden_services)
+ {
+ startActivity(new Intent(this, HiddenServicesActivity.class));
+ }
return super.onOptionsItemSelected(item);
}
diff --git a/app/src/main/java/org/torproject/android/settings/SettingsPreferences.java b/app/src/main/java/org/torproject/android/settings/SettingsPreferences.java
index c14cb5a..adacba7 100644
--- a/app/src/main/java/org/torproject/android/settings/SettingsPreferences.java
+++ b/app/src/main/java/org/torproject/android/settings/SettingsPreferences.java
@@ -37,9 +37,6 @@ public class SettingsPreferences
private Preference prefTransProxyFlush = null;
private Preference prefTransProxyApps = null;
- private CheckBoxPreference prefHiddenServices = null;
- private EditTextPreference prefHiddenServicesPorts;
- private EditTextPreference prefHiddenServicesHostname;
private CheckBoxPreference prefRequestRoot = null;
private ListPreference prefLocale = null;
@@ -104,22 +101,14 @@ public class SettingsPreferences
prefTransProxyApps.setOnPreferenceClickListener(this);
prefCBTransProxy.setOnPreferenceClickListener(this);
prefcBTransProxyAll.setOnPreferenceClickListener(this);
- prefHiddenServices = (CheckBoxPreference) findPreference("pref_hs_enable");
- prefHiddenServices.setOnPreferenceClickListener(this);
- prefHiddenServicesHostname = (EditTextPreference) findPreference("pref_hs_hostname");
-
-
+
prefCBTransProxy.setEnabled(prefRequestRoot.isChecked());
prefcBTransProxyAll.setEnabled(prefCBTransProxy.isChecked());
prefcbTransTethering.setEnabled(prefCBTransProxy.isChecked());
if (prefCBTransProxy.isChecked())
prefTransProxyApps.setEnabled((!prefcBTransProxyAll.isChecked()));
-
- prefHiddenServicesPorts = (EditTextPreference) findPreference("pref_hs_ports");
- prefHiddenServicesHostname.setEnabled(prefHiddenServices.isChecked());
- prefHiddenServicesPorts.setEnabled(prefHiddenServices.isChecked());
-
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
prefTransProxyApps.setEnabled(true);
@@ -154,11 +143,6 @@ public class SettingsPreferences
startActivity(new Intent(this, AppManager.class));
}
- else if (preference == prefHiddenServices)
- {
- prefHiddenServicesPorts.setEnabled(prefHiddenServices.isChecked());
- prefHiddenServicesHostname.setEnabled(prefHiddenServices.isChecked());
- }
else
{
prefcBTransProxyAll.setEnabled(prefCBTransProxy.isChecked());
diff --git a/app/src/main/java/org/torproject/android/ui/hs/HiddenServicesActivity.java b/app/src/main/java/org/torproject/android/ui/hs/HiddenServicesActivity.java
new file mode 100644
index 0000000..85665fb
--- /dev/null
+++ b/app/src/main/java/org/torproject/android/ui/hs/HiddenServicesActivity.java
@@ -0,0 +1,76 @@
+package org.torproject.android.ui.hs;
+
+import android.content.ContentResolver;
+import android.database.ContentObserver;
+import android.os.Bundle;
+import android.os.Handler;
+import android.support.design.widget.FloatingActionButton;
+import android.support.design.widget.Snackbar;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.support.v7.widget.Toolbar;
+import android.view.View;
+
+import org.torproject.android.R;
+import org.torproject.android.ui.hs.adapters.HSAdapter;
+import org.torproject.android.ui.hs.providers.HSContentProvider;
+
+public class HiddenServicesActivity extends AppCompatActivity {
+ private HSAdapter mHiddenServices;
+ private ContentResolver mCR;
+ private HSObserver mHSObserver;
+ private String[] mProjection = new String[]{
+ HSContentProvider.HiddenService._ID,
+ HSContentProvider.HiddenService.NAME,
+ HSContentProvider.HiddenService.DOMAIN,
+ HSContentProvider.HiddenService.PORT};
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_hidden_services);
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+
+ FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
+ fab.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
+ .setAction("Action", null).show();
+ }
+ });
+
+ mCR = getContentResolver();
+ // View adapter
+ mHiddenServices = new HSAdapter(
+ mCR.query(
+ HSContentProvider.CONTENT_URI, mProjection, null, null, null
+ ));
+
+ mHSObserver = new HSObserver(new Handler());
+ mCR.registerContentObserver(HSContentProvider.CONTENT_URI, true, mHSObserver);
+
+ // Fill view
+ RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.onion_list);
+ mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
+ mRecyclerView.setAdapter(mHiddenServices);
+ }
+
+ class HSObserver extends ContentObserver {
+ public HSObserver(Handler handler) {
+ super(handler);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ // New data
+ mHiddenServices.changeCursor(mCR.query(
+ HSContentProvider.CONTENT_URI, mProjection, null, null, null
+ ));
+ }
+
+ }
+
+}
diff --git a/app/src/main/java/org/torproject/android/ui/hs/adapters/CursorRecyclerViewAdapter.java b/app/src/main/java/org/torproject/android/ui/hs/adapters/CursorRecyclerViewAdapter.java
new file mode 100644
index 0000000..9798413
--- /dev/null
+++ b/app/src/main/java/org/torproject/android/ui/hs/adapters/CursorRecyclerViewAdapter.java
@@ -0,0 +1,144 @@
+package org.torproject.android.ui.hs.adapters;
+
+/*
+ * Copyright (C) 2014 skyfish.jy(a)gmail.com
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import android.database.Cursor;
+import android.database.DataSetObserver;
+import android.support.v7.widget.RecyclerView;
+
+/**
+ * Created by skyfishjy on 10/31/14.
+ */
+
+public abstract class CursorRecyclerViewAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
+
+ private Cursor mCursor;
+
+ private boolean mDataValid;
+
+ private int mRowIdColumn;
+
+ private DataSetObserver mDataSetObserver;
+
+ public CursorRecyclerViewAdapter(Cursor cursor) {
+ mCursor = cursor;
+ mDataValid = cursor != null;
+ mRowIdColumn = mDataValid ? mCursor.getColumnIndex("_id") : -1;
+ mDataSetObserver = new NotifyingDataSetObserver();
+ if (mCursor != null) {
+ mCursor.registerDataSetObserver(mDataSetObserver);
+ }
+ }
+
+ @Override
+ public int getItemCount() {
+ if (mDataValid && mCursor != null) {
+ return mCursor.getCount();
+ }
+ return 0;
+ }
+
+ @Override
+ public long getItemId(int position) {
+ if (mDataValid && mCursor != null && mCursor.moveToPosition(position)) {
+ return mCursor.getLong(mRowIdColumn);
+ }
+ return 0;
+ }
+
+ @Override
+ public void setHasStableIds(boolean hasStableIds) {
+ super.setHasStableIds(true);
+ }
+
+ public abstract void onBindViewHolder(VH viewHolder, Cursor cursor);
+
+ @Override
+ public void onBindViewHolder(VH viewHolder, int position) {
+ if (!mDataValid) {
+ throw new IllegalStateException("this should only be called when the cursor is valid");
+ }
+ if (!mCursor.moveToPosition(position)) {
+ throw new IllegalStateException("couldn't move cursor to position " + position);
+ }
+ onBindViewHolder(viewHolder, mCursor);
+ }
+
+ /**
+ * Change the underlying cursor to a new cursor. If there is an existing cursor it will be
+ * closed.
+ */
+ public void changeCursor(Cursor cursor) {
+ Cursor old = swapCursor(cursor);
+ if (old != null) {
+ old.close();
+ }
+ }
+
+ public void closeCursor() {
+ mCursor.unregisterDataSetObserver(mDataSetObserver);
+ mCursor.close();
+ }
+
+ /**
+ * Swap in a new Cursor, returning the old Cursor. Unlike
+ * {@link #changeCursor(Cursor)}, the returned old Cursor is <em>not</em>
+ * closed.
+ */
+ private Cursor swapCursor(Cursor newCursor) {
+ if (newCursor == mCursor) {
+ return null;
+ }
+ final Cursor oldCursor = mCursor;
+ if (oldCursor != null && mDataSetObserver != null) {
+ oldCursor.unregisterDataSetObserver(mDataSetObserver);
+ }
+ mCursor = newCursor;
+ if (mCursor != null) {
+ if (mDataSetObserver != null) {
+ mCursor.registerDataSetObserver(mDataSetObserver);
+ }
+ mRowIdColumn = newCursor.getColumnIndexOrThrow("_id");
+ mDataValid = true;
+ notifyDataSetChanged();
+ } else {
+ mRowIdColumn = -1;
+ mDataValid = false;
+ notifyDataSetChanged();
+ //There is no notifyDataSetInvalidated() method in RecyclerView.Adapter
+ }
+ return oldCursor;
+ }
+
+ private class NotifyingDataSetObserver extends DataSetObserver {
+ @Override
+ public void onChanged() {
+ super.onChanged();
+ mDataValid = true;
+ notifyDataSetChanged();
+ }
+
+ @Override
+ public void onInvalidated() {
+ super.onInvalidated();
+ mDataValid = false;
+ notifyDataSetChanged();
+ //There is no notifyDataSetInvalidated() method in RecyclerView.Adapter
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/torproject/android/ui/hs/adapters/HSAdapter.java b/app/src/main/java/org/torproject/android/ui/hs/adapters/HSAdapter.java
new file mode 100644
index 0000000..66ecb22
--- /dev/null
+++ b/app/src/main/java/org/torproject/android/ui/hs/adapters/HSAdapter.java
@@ -0,0 +1,54 @@
+package org.torproject.android.ui.hs.adapters;
+
+import android.database.Cursor;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.torproject.android.R;
+import org.torproject.android.ui.hs.providers.HSContentProvider;
+
+public class HSAdapter extends CursorRecyclerViewAdapter<HSAdapter.ViewHolder> {
+
+ public HSAdapter(Cursor cursor) {
+ super(cursor);
+ }
+
+ @Override
+ public HSAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View v = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.onion_item, parent, false);
+
+ ViewHolder vh = new ViewHolder(v);
+
+ return vh;
+ }
+
+ @Override
+ public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor) {
+ viewHolder.id = cursor.getInt(cursor.getColumnIndex(HSContentProvider.HiddenService._ID));
+
+ String name_string = cursor.getString(cursor.getColumnIndex(HSContentProvider.HiddenService.NAME));
+ Integer port = cursor.getInt(cursor.getColumnIndex(HSContentProvider.HiddenService.PORT));
+
+ viewHolder.name.setText(name_string + ": " + port.toString());
+
+ viewHolder.domain.setText(
+ cursor.getString(cursor.getColumnIndex(HSContentProvider.HiddenService.DOMAIN))
+ );
+ }
+
+ class ViewHolder extends RecyclerView.ViewHolder {
+ TextView name;
+ TextView domain;
+ Integer id;
+
+ ViewHolder(View itemView) {
+ super(itemView);
+ name = (TextView) itemView.findViewById(R.id.hs_name);
+ domain = (TextView) itemView.findViewById(R.id.hs_onion);
+ }
+ }
+}
diff --git a/app/src/main/java/org/torproject/android/ui/hs/database/HSDatabase.java b/app/src/main/java/org/torproject/android/ui/hs/database/HSDatabase.java
new file mode 100644
index 0000000..9cbaacc
--- /dev/null
+++ b/app/src/main/java/org/torproject/android/ui/hs/database/HSDatabase.java
@@ -0,0 +1,33 @@
+package org.torproject.android.ui.hs.database;
+
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+public class HSDatabase extends SQLiteOpenHelper {
+
+ public static final String HS_DATA_TABLE_NAME = "hs_data";
+ private static final int DATABASE_VERSION = 2;
+ private static final String DATABASE_NAME = "hidden_services";
+ private static final String HS_DATA_TABLE_CREATE =
+ "CREATE TABLE " + HS_DATA_TABLE_NAME + " (" +
+ "_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
+ "name TEXT, " +
+ "domain TEXT, " +
+ "port INTEGER);";
+
+ public HSDatabase(Context context) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ db.execSQL(HS_DATA_TABLE_CREATE);
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ }
+}
+
diff --git a/app/src/main/java/org/torproject/android/ui/hs/providers/HSContentProvider.java b/app/src/main/java/org/torproject/android/ui/hs/providers/HSContentProvider.java
new file mode 100644
index 0000000..3714e64
--- /dev/null
+++ b/app/src/main/java/org/torproject/android/ui/hs/providers/HSContentProvider.java
@@ -0,0 +1,121 @@
+package org.torproject.android.ui.hs.providers;
+
+import android.content.ContentProvider;
+import android.content.ContentUris;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.UriMatcher;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.net.Uri;
+import android.provider.BaseColumns;
+import android.support.annotation.Nullable;
+
+import org.torproject.android.ui.hs.database.HSDatabase;
+
+
+public class HSContentProvider extends ContentProvider {
+ private static final String AUTH = "org.torproject.android.ui.hs.providers";
+ public static final Uri CONTENT_URI =
+ Uri.parse("content://" + AUTH + "/hs");
+ //UriMatcher
+ private static final int ONIONS = 1;
+ private static final int ONION_ID = 2;
+
+ private static final UriMatcher uriMatcher;
+
+ //Inicializamos el UriMatcher
+ static {
+ uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
+ uriMatcher.addURI(AUTH, "hs", ONIONS);
+ uriMatcher.addURI(AUTH, "hs/#", ONION_ID);
+ }
+
+ private HSDatabase mServerDB;
+ private Context mContext;
+
+ @Override
+ public boolean onCreate() {
+ mContext = getContext();
+ mServerDB = new HSDatabase(mContext);
+ return true;
+ }
+
+ @Nullable
+ @Override
+ public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
+ //Si es una consulta a un ID concreto construimos el WHERE
+ String where = selection;
+ if (uriMatcher.match(uri) == ONION_ID) {
+ where = "_id=" + uri.getLastPathSegment();
+ }
+
+ SQLiteDatabase db = mServerDB.getReadableDatabase();
+
+ return db.query(HSDatabase.HS_DATA_TABLE_NAME, projection, where,
+ selectionArgs, null, null, sortOrder);
+ }
+
+ @Nullable
+ @Override
+ public String getType(Uri uri) {
+ int match = uriMatcher.match(uri);
+
+ switch (match) {
+ case ONIONS:
+ return "vnd.android.cursor.dir/vnd.torproject.onions";
+ case ONION_ID:
+ return "vnd.android.cursor.item/vnd.torproject.onion";
+ default:
+ return null;
+ }
+ }
+
+ @Nullable
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ long regId;
+
+ SQLiteDatabase db = mServerDB.getWritableDatabase();
+
+ regId = db.insert(HSDatabase.HS_DATA_TABLE_NAME, null, values);
+
+ mContext.getContentResolver().notifyChange(CONTENT_URI, null);
+
+ return ContentUris.withAppendedId(CONTENT_URI, regId);
+ }
+
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+
+ //Si es una consulta a un ID concreto construimos el WHERE
+ String where = selection;
+ if (uriMatcher.match(uri) == ONION_ID) {
+ where = "_id=" + uri.getLastPathSegment();
+ }
+
+ SQLiteDatabase db = mServerDB.getWritableDatabase();
+
+ Integer rows = db.delete(HSDatabase.HS_DATA_TABLE_NAME, where, selectionArgs);
+
+ mContext.getContentResolver().notifyChange(CONTENT_URI, null);
+
+ return rows;
+
+ }
+
+ @Override
+ public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
+ return 0;
+ }
+
+ public static final class HiddenService implements BaseColumns {
+ //Nombres de columnas
+ public static final String NAME = "name";
+ public static final String PORT = "port";
+ public static final String DOMAIN = "domain";
+
+ private HiddenService() {
+ }
+ }
+}
diff --git a/app/src/main/res/layout-v21/onion_item.xml b/app/src/main/res/layout-v21/onion_item.xml
new file mode 100644
index 0000000..2d6aa05
--- /dev/null
+++ b/app/src/main/res/layout-v21/onion_item.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:padding="5dp">
+
+
+ <LinearLayout
+ android:orientation="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/hs_name" />
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:id="@+id/hs_onion" />
+ </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_hidden_services.xml b/app/src/main/res/layout/activity_hidden_services.xml
new file mode 100644
index 0000000..a2e8663
--- /dev/null
+++ b/app/src/main/res/layout/activity_hidden_services.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fitsSystemWindows="true"
+ tools:context="org.torproject.android.ui.hs.HiddenServicesActivity">
+
+ <android.support.design.widget.AppBarLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:theme="@style/DefaultTheme.AppBarOverlay">
+
+ <android.support.v7.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ app:popupTheme="@style/DefaultTheme.PopupOverlay" />
+
+ </android.support.design.widget.AppBarLayout>
+
+ <include layout="@layout/content_hidden_services" />
+
+ <android.support.design.widget.FloatingActionButton
+ android:id="@+id/fab"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom|end"
+ android:layout_margin="@dimen/fab_margin"
+ app:srcCompat="@android:drawable/stat_notify_more" />
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/app/src/main/res/layout/content_hidden_services.xml b/app/src/main/res/layout/content_hidden_services.xml
new file mode 100644
index 0000000..ba760de
--- /dev/null
+++ b/app/src/main/res/layout/content_hidden_services.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/content_hidden_services"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ android:paddingLeft="@dimen/activity_horizontal_margin"
+ android:paddingRight="@dimen/activity_horizontal_margin"
+ android:paddingTop="@dimen/activity_vertical_margin"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior"
+ tools:context="org.torproject.android.ui.hs.HiddenServicesActivity"
+ tools:showIn="@layout/activity_hidden_services">
+
+ <android.support.v7.widget.RecyclerView
+ android:id="@+id/onion_list"
+ android:scrollbars="vertical"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"/>
+
+</RelativeLayout>
diff --git a/app/src/main/res/menu/orbot_main.xml b/app/src/main/res/menu/orbot_main.xml
index 54d2493..179675a 100644
--- a/app/src/main/res/menu/orbot_main.xml
+++ b/app/src/main/res/menu/orbot_main.xml
@@ -43,7 +43,11 @@
/>
</menu>
</item>
-
+
+ <item android:id="@+id/menu_hidden_services"
+ android:title="@string/menu_hidden_services"
+ yourapp:showAsAction="never"
+ />
<!--
<item android:id="@+id/menu_promo_apps"
diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml
new file mode 100644
index 0000000..7abc06d
--- /dev/null
+++ b/app/src/main/res/values-v21/styles.xml
@@ -0,0 +1 @@
+<resources></resources>
diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..63fc816
--- /dev/null
+++ b/app/src/main/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+<resources>
+ <!-- Example customization of dimensions originally defined in res/values/dimens.xml
+ (such as screen margins) for screens with more than 820dp of available width. This
+ would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
+ <dimen name="activity_horizontal_margin">64dp</dimen>
+</resources>
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index f96195c..c719a5b 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -1,5 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
+<?xml version="1.0" encoding="utf-8"?><!--
/* //device/apps/common/assets/res/any/dimens.xml
**
** Copyright 2006, The Android Open Source Project
@@ -118,26 +117,27 @@
<!-- The platform's desired minimum size for a dialog's width when it
is along the major axis (that is the screen is landscape). This may
be either a fraction or a dimension. -->
- <item type="dimen" name="dialog_min_width_major">65%</item>
+ <item name="dialog_min_width_major" type="dimen">65%</item>
<!-- The platform's desired fixed width for a dialog along the major axis
(the screen is in landscape). This may be either a fraction or a dimension.-->
- <item type="dimen" name="dialog_fixed_width_major">320dp</item>
+ <item name="dialog_fixed_width_major" type="dimen">320dp</item>
<!-- The platform's desired fixed width for a dialog along the minor axis
(the screen is in portrait). This may be either a fraction or a dimension.-->
- <item type="dimen" name="dialog_fixed_width_minor">320dp</item>
+ <item name="dialog_fixed_width_minor" type="dimen">320dp</item>
<!-- The platform's desired fixed height for a dialog along the major axis
(the screen is in portrait). This may be either a fraction or a dimension.-->
- <item type="dimen" name="dialog_fixed_height_major">80%</item>
+ <item name="dialog_fixed_height_major" type="dimen">80%</item>
<!-- The platform's desired fixed height for a dialog along the minor axis
(the screen is in landscape). This may be either a fraction or a dimension.-->
- <item type="dimen" name="dialog_fixed_height_minor">100%</item>
+ <item name="dialog_fixed_height_minor" type="dimen">100%</item>
<!-- Preference activity, vertical padding for the header list -->
<dimen name="preference_screen_header_vertical_padding">0dp</dimen>
<dimen name="preference_screen_header_padding_side">16dip</dimen>
- <integer name="preference_screen_header_scrollbarStyle">0x02000000</integer> <!-- outsideOverlay -->
+ <integer name="preference_screen_header_scrollbarStyle">0x02000000
+ </integer> <!-- outsideOverlay -->
<integer name="preference_fragment_scrollbarStyle">0x02000000</integer> <!-- outsideOverlay -->
@@ -148,7 +148,7 @@
<!-- The platform's desired minimum size for a dialog's width when it
is along the minor axis (that is the screen is portrait). This may
be either a fraction or a dimension. -->
- <item type="dimen" name="dialog_min_width_minor">95%</item>
+ <item name="dialog_min_width_minor" type="dimen">95%</item>
<!-- The width of the big icons in notifications. -->
<dimen name="notification_large_icon_width">64dp</dimen>
@@ -358,4 +358,8 @@
<!-- width of ImmersiveModeConfirmation (-1 for match_parent) -->
<dimen name="immersive_mode_cling_width">-1px</dimen>
+ <!-- Default screen margins, per the Android Design guidelines. -->
+ <dimen name="activity_horizontal_margin">16dp</dimen>
+ <dimen name="activity_vertical_margin">16dp</dimen>
+ <dimen name="fab_margin">16dp</dimen>
</resources>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 26a7aeb..bd93d6d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,257 +1,251 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
- <string name="app_name">Orbot</string>
- <string name="app_description">Orbot is a free proxy app that empowers other apps to use the internet more securely. Orbot uses Tor to encrypt your Internet traffic and then hides it by bouncing through a series of computers around the world. Tor is free software and an open network that helps you defend against a form of network surveillance that threatens personal freedom and privacy, confidential business activities and relationships, and state security known as traffic analysis.</string>
- <string name="internal_web_url">http://orbot/</string>
- <string name="default_web_url">http://check.torproject.org</string>
- <string name="secure_default_web_url">https://check.torproject.org</string>
- <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
- <string name="control_permission_label">start and stop Tor</string>
- <string name="tor_proxy_service_process">torproxyservice</string>
- <string name="status_starting_up">Orbot is starting…</string>
- <string name="status_activated">Connected to the Tor network</string>
- <string name="status_disabled">Orbot is deactivated</string>
- <string name="status_shutting_down">TorService is shutting down</string>
- <string name="tor_process_starting">Starting Tor client…</string>
- <string name="tor_process_complete">complete.</string>
- <string name="tor_process_waiting">waiting.</string>
- <string name="not_anonymous_yet">WARNING: Your traffic is not anonymous yet! Please configure your applications to use HTTP proxy 127.0.0.1:8118 or SOCKS4A or SOCKS5 proxy 127.0.0.1:9050</string>
- <string name="menu_home">Home</string>
- <string name="menu_browse">Browse</string>
- <string name="menu_settings">Settings</string>
- <string name="menu_log">Log</string>
- <string name="menu_info">Help</string>
- <string name="menu_apps">VPN</string>
- <string name="menu_start">Start</string>
- <string name="menu_stop">Stop</string>
- <string name="menu_about">About</string>
- <string name="menu_promo_apps">Get apps…</string>
- <string name="main_layout_download">Download</string>
- <string name="main_layout_upload">Upload</string>
- <string name="button_help">Help</string>
- <string name="button_close">Close</string>
- <string name="button_about">About</string>
- <string name="button_clear_log">Clear Log</string>
- <string name="menu_verify">Check</string>
- <string name="menu_exit">Exit</string>
- <string name="menu_scan">Scan BridgeQR</string>
- <string name="menu_share_bridge">Share BridgeQR</string>
- <string name="press_to_start">- long press to start -</string>
- <string name="pref_trans_proxy_group">Transparent Proxying (Requires Root)</string>
- <string name="pref_trans_proxy_title">Transparent Proxying</string>
- <string name="pref_trans_proxy_summary">Automatic Torifying of Apps</string>
- <string name="pref_transparent_all_title">Tor Everything</string>
- <string name="pref_transparent_all_summary">Proxy traffic for all apps through Tor</string>
- <string name="pref_transparent_port_fallback_title">Port Proxy Fallback</string>
- <string name="pref_transparent_port_fallback_summary">WARNING: Circumvents common ports (80, 443, etc). *USE ONLY* if \'All\' or \'App\' mode doesn\'t work.</string>
- <string name="pref_transparent_port_title">Port List</string>
- <string name="pref_transparent_port_summary">List of ports to proxy. *USE ONLY* if \'All\' or \'App\' mode doesn\'t work</string>
- <string name="pref_transparent_port_dialog">Enter ports to proxy</string>
- <string name="pref_has_root">Request Root Access</string>
- <string name="pref_has_root_summary">Request root access for transparent proxying</string>
- <string name="status_install_success">Tor binaries successfully installed!</string>
- <string name="status_install_fail">The Tor binary files were unable to be installed. Please check the log and notify tor-assistants(a)torproject.org</string>
- <string name="title_error">Application Error</string>
- <string name="wizard_title">Orbot</string>
- <string name="wizard_btn_tell_me_more">About Orbot</string>
- <string name="btn_next">Next</string>
- <string name="btn_back">Back</string>
- <string name="btn_finish">Finish</string>
- <string name="btn_okay">Okay</string>
- <string name="btn_cancel">Cancel</string>
- <!--Welcome Wizard strings (DJH)-->
- <string name="wizard_details">Some Orbot Details</string>
- <string name="wizard_details_msg">Orbot is an open-source application that contains Tor, LibEvent and Polipo. It provides a local HTTP proxy (8118) and a SOCKS proxy (9050) into the Tor network. Orbot also has the ability, on rooted device, to send all internet traffic through Tor.</string>
- <string name="wizard_permissions_root">Permission Granted</string>
- <string name="wizard_permissions_stock">Orbot Permissions</string>
- <string name="wizard_premissions_msg_root">Excellent! We\'ve detected that you have root permissions enabled for Orbot. We will use this power wisely.</string>
- <string name="wizard_permissions_msg_stock"> While it is not required, Orbot can become a more powerful tool if your device has root access. Use the button below to grant Orbot superpowers! </string>
- <string name="wizard_permissions_no_root">If you don\'t have root access or have no idea what we\'re talking about, just be sure to use apps made to work with Orbot.</string>
- <string name="wizard_permissions_consent">I understand and would like to continue without Superuser</string>
- <string name="wizard_permission_enable_root">Grant Root for Orbot</string>
- <string name="wizard_configure">Configure Torification</string>
- <string name="wizard_configure_msg">Orbot gives you the option to route all application traffic through Tor OR to choose your applications individually.</string>
- <string name="wizard_configure_all">Proxy All Apps Through Tor</string>
- <string name="wizard_configure_select_apps">Select Individual Apps for Tor</string>
- <string name="wizard_tips_tricks">Orbot-enabled Apps</string>
- <string name="wizard_tips_msg">The apps below were developed to work with Orbot. Click each button to install now, or you can find them later on Google Play, at GuardianProject.info website or via F-Droid.org.</string>
- <string name="wizard_tips_otrchat">ChatSecure - Secure instant messaging client for Android</string>
- <string name="wizard_tips_proxy">Proxy Settings - Learn how to configure apps to work with Orbot</string>
- <string name="wizard_tips_duckgo">DuckDuckGo Search Engine app</string>
- <string name="wizard_tips_twitter">Set Twitter proxy to host \"localhost\" and port 8118</string>
- <string name="wizard_tips_story_maker">StoryMaker - Make a story and leave it to tor for security!</string>
- <string name="twitter_setup_url">https://guardianproject.info/2012/05/02/orbot-your-twitter/</string>
- <string name="wizard_proxy_help_info">Proxy Settings</string>
- <string name="wizard_proxy_help_msg">If the Android app you are using can support the use of an HTTP or SOCKS proxy, then you can configure it to connect to Orbot and use Tor.\n\n\n The host settings is 127.0.0.1 or \"localhost\". For HTTP, the port setting is 8118. For SOCKS, the proxy is 9050. You should use SOCKS4A or SOCKS5 if possible.\n \n\n\n You can learn more about proxying on Android via the FAQ at: http://tinyurl.com/proxyandroid\n </string>
- <string name="wizard_final">Orbot is ready!</string>
- <string name="wizard_final_msg">Millions of people around the world use Tor for a wide variety of reasons.\n\nJournalists and bloggers, human rights defenders, law enforcement officers, soldiers, corporations, citizens of repressive regimes, and just ordinary citizens… and now you are ready to, as well!</string>
- <string name="wizard_exit_at_first_screen_toast">Please configure Orbot before you can start using it!</string>
- <!--END Welcome Wizard strings (DJH)-->
- <string name="connect_first_time">You\'ve successfully connected to the Tor network - but this does NOT mean your device is secure. You can use the \'Browser\' button to test your connection. \n\nVisit us at https://guardianproject.info/apps/orbot or send an email to help(a)guardianproject.info to learn more.</string>
- <string name="tor_check">This will open your web browser to https://check.torproject.org in order to see if Orbot is probably configured and you are connected to Tor.</string>
- <string name="pref_hs_group">Hidden Service Hosting</string>
- <string name="pref_general_group">General</string>
- <string name="pref_start_boot_title">Start Orbot on Boot</string>
- <string name="pref_start_boot_summary">Automatically start Orbot and connect Tor when your Android device boots</string>
- <!--New Wizard Strings-->
- <!--Title Screen-->
- <string name="wizard_title_msg">Orbot brings Tor to Android!\n\nTor helps you defend against content filtering, traffic analysis and network surveillance that threatens privacy, confidential information and personal relationships.\n\nThis wizard will help you configure Orbot and Tor on your device.</string>
- <!--Warning screen-->
- <string name="wizard_warning_title">Warning</string>
- <string name="wizard_warning_msg">Simply installing Orbot will not automatically anonymize your mobile traffic.\n\nYou must properly configure Orbot, your device and other apps to successfully use Tor.</string>
- <!--Permissions screen-->
- <string name="wizard_permissions_title">Permissions</string>
- <string name="wizard_permissions_root_msg1">You can optionally grant Orbot \'Superuser\' access to enable advanced features, such as Transparent Proxying.</string>
- <string name="wizard_permissions_root_msg2">If you do not want to do this, please make sure to use apps made to work with Orbot</string>
- <string name="wizard_permissions_no_root_msg">Your device does not appear to be rooted or provide root or \'Superuser\' access.\n\nPlease try the \'Apps\' mode on the main screen instead.</string>
- <!--TipsAndTricks screen-->
- <string name="wizard_tips_title">Orbot-Enabled Apps</string>
- <string name="wizard_tips_gibberbot">ChatSecure: Secure chat app with Off-the-Record Encryption</string>
- <string name="wizard_tips_orweb">Orfox: Privacy-enhanced browser that works through Tor</string>
- <string name="wizard_tips_play">Find all Guardian Project apps on Google Play</string>
- <string name="wizard_tips_fdroid">Find all Guardian Project apps on F-Droid</string>
- <string name="wizard_tips_fdroid_org">Find all Guardian Project apps on https://f-droid.org</string>
- <!--Transparent Proxy screen-->
- <string name="wizard_transproxy_title">Transparent Proxying</string>
- <string name="wizard_transproxy_msg">This allows your apps to automatically run through the Tor network without any configuration.</string>
- <string name="wizard_transproxy_hint">(Check this box if you have no idea what we are talking about)</string>
- <string name="wizard_transproxy_none">None</string>
- <string name="pref_transparent_tethering_title">Tor Tethering</string>
- <string name="pref_transparent_tethering_summary">Enable Tor Transparent Proxying for Wifi and USB Tethered Devices (requires restart)</string>
- <string name="button_grant_superuser">Request Superuser Access</string>
- <string name="pref_select_apps">Select Apps</string>
- <string name="pref_select_apps_summary">Choose Apps to Route Through Tor</string>
- <string name="pref_node_configuration">Node Configuration</string>
- <string name="pref_node_configuration_summary">These are advanced settings that can reduce your anonymity</string>
- <string name="pref_entrance_node">Entrance Nodes</string>
- <string name="pref_entrance_node_summary">Fingerprints, nicks, countries and addresses for the first hop</string>
- <string name="pref_entrance_node_dialog">Enter Entrance Nodes</string>
- <string name="pref_allow_background_starts_title">Allow Background Starts</string>
- <string name="pref_allow_background_starts_summary">Let any app tell Orbot to start Tor and related services</string>
-
- <string name="button_proxy_all">Proxy All</string>
- <string name="button_proxy_none">Proxy None</string>
- <string name="button_invert_selection">Invert Selection</string>
-
- <string name="pref_proxy_title">Outbound Network Proxy (Optional)</string>
-
- <string name="pref_proxy_type_title">Outbound Proxy Type</string>
- <string name="pref_proxy_type_summary">Protocol to use for proxy server: HTTP, HTTPS, Socks4, Socks5</string>
- <string name="pref_proxy_type_dialog">Enter Proxy Type</string>
-
- <string name="pref_proxy_host_title">Outbound Proxy Host</string>
- <string name="pref_proxy_host_summary">Proxy Server hostname</string>
- <string name="pref_proxy_host_dialog">Enter Proxy Host</string>
-
- <string name="pref_proxy_port_title">Outbound Proxy Port</string>
- <string name="pref_proxy_port_summary">Proxy Server port</string>
- <string name="pref_proxy_port_dialog">Enter Proxy port</string>
-
- <string name="pref_proxy_username_title">Outbound Proxy Username</string>
- <string name="pref_proxy_username_summary">Proxy Username (Optional)</string>
- <string name="pref_proxy_username_dialog">Enter Proxy Username</string>
-
- <string name="pref_proxy_password_title">Outbound Proxy Password</string>
- <string name="pref_proxy_password_summary">Proxy Password (Optional)</string>
- <string name="pref_proxy_password_dialog">Enter Proxy Password</string>
-
-
-
- <string name="status">Status</string>
- <string name="setting_up_full_transparent_proxying_">Setting up full transparent proxying…</string>
- <string name="setting_up_app_based_transparent_proxying_">Setting up app-based transparent proxying…</string>
- <string name="transparent_proxying_enabled">Transparent proxying ENABLED</string>
- <string name="transproxy_enabled_for_tethering_">TransProxy enabled for Tethering!</string>
- <string name="warning_error_starting_transparent_proxying_">WARNING: error starting transparent proxying!</string>
- <string name="transproxy_rules_cleared">TransProxy rules cleared</string>
- <string name="couldn_t_start_tor_process_">Couldn\'t start Tor process: </string>
- <string name="privoxy_is_running_on_port_">Polipo is running on port: </string>
- <string name="setting_up_port_based_transparent_proxying_">Setting up port-based transparent proxying…</string>
- <string name="bridge_error">Bridge Error</string>
- <string name="bridge_requires_ip">In order to use the bridge feature, you must enter at least one bridge IP address.</string>
- <string name="send_email_for_bridges">Send an email to bridges(a)torproject.org with the line \"get bridges\" by itself in the body of the mail from a gmail account.</string>
- <string name="error">Error</string>
- <string name="your_reachableaddresses_settings_caused_an_exception_">Your ReachableAddresses settings caused an exception!</string>
- <string name="your_relay_settings_caused_an_exception_">Your relay settings caused an exception!</string>
- <string name="exit_nodes">Exit Nodes</string>
- <string name="fingerprints_nicks_countries_and_addresses_for_the_last_hop">Fingerprints, nicks, countries and addresses for the last hop</string>
- <string name="enter_exit_nodes">Enter Exit Nodes</string>
- <string name="exclude_nodes">Exclude Nodes</string>
- <string name="fingerprints_nicks_countries_and_addresses_to_exclude">Fingerprints, nicks, countries and addresses to exclude</string>
- <string name="enter_exclude_nodes">Enter Exclude Nodes</string>
- <string name="strict_nodes">Strict Nodes</string>
- <string name="use_only_these_specified_nodes">Use *only* these specified nodes</string>
- <string name="bridges">Bridges</string>
- <string name="use_bridges">Use Bridges</string>
- <string name="bridges_obfuscated">Obfuscated Bridges</string>
- <string name="enable_alternate_entrance_nodes_into_the_tor_network">Enable alternate entrance nodes into the Tor Network</string>
- <string name="enable_if_configured_bridges_are_obfuscated_bridges">Enable if configured bridges are obfuscated bridges</string>
- <string name="ip_address_and_port_of_bridges">IP address and port of bridges</string>
- <string name="enter_bridge_addresses">Enter Bridge Addresses</string>
- <string name="relays">Relays</string>
- <string name="relaying">Relaying</string>
- <string name="enable_your_device_to_be_a_non_exit_relay">Enable your device to be a non-exit relay</string>
- <string name="relay_port">Relay Port</string>
- <string name="listening_port_for_your_tor_relay">Listening port for your Tor relay</string>
- <string name="enter_or_port">Enter OR port</string>
- <string name="relay_nickname">Relay nickname</string>
- <string name="the_nickname_for_your_tor_relay">The nickname for your Tor relay</string>
- <string name="enter_a_custom_relay_nickname">Enter a custom relay nickname</string>
- <string name="reachable_addresses">Reachable Addresses</string>
- <string name="run_as_a_client_behind_a_firewall_with_restrictive_policies">Run as a client behind a firewall with restrictive policies</string>
- <string name="reachable_ports">Reachable ports</string>
- <string name="ports_reachable_behind_a_restrictive_firewall">Ports reachable behind a restrictive firewall</string>
- <string name="enter_ports">Enter ports</string>
- <string name="enable_hidden_services">Hidden Service Hosting</string>
- <string name="run_servers_accessible_via_the_tor_network">allow on-device server to be accessible via the Tor network</string>
- <string name="enter_localhost_ports_for_hidden_services">enter localhost ports for hidden services</string>
- <string name="hidden_service_ports">Hidden Service Ports</string>
- <string name="the_addressable_name_for_your_hidden_service_generated_automatically_">the addressable name for your hidden service (generated automatically)</string>
- <string name="enable_debug_log_to_output_must_use_adb_or_alogcat_to_view_">enable debug log to output (must use adb or aLogCat to view)</string>
- <string name="project_home">Project Home(s): </string>
- <string name="project_urls">https://www.torproject.org/docs/android\nhttps://guardianproject.info/apps/…</string>
- <string name="the_tor_license">The Tor License</string>
- <string name="https_torproject_org">https://torproject.org</string>
- <string name="third_party_software">3rd-Party-Software: </string>
- <string name="tor_version">Tor: https://www.torproject.org</string>
- <string name="libevent_version">LibEvent v2.0.21: http://www.monkey.org/~provos/libevent/</string>
- <string name="polipo_version">Polipo v1.1.9: https://github.com/jech/polipo</string>
- <string name="iptables_version">IPtables v1.4.21: http://www.netfilter.org</string>
- <string name="openssl_version">OpenSSL v1.0.2j: http://www.openssl.org</string>
- <string name="hidden_service_request">An app wants to open hidden server port %1$s to the Tor network. This is safe if you trust the app.</string>
- <string name="found_existing_tor_process">found existing Tor process…</string>
- <string name="something_bad_happened">Something bad happened. Check the log</string>
- <string name="hidden_service_on">hidden service on:</string>
- <string name="unable_to_read_hidden_service_name">unable to read hidden service name</string>
- <string name="unable_to_start_tor">Unable to start Tor:</string>
- <string name="unable_to_reset_tor">Reboot your device, unable to reset Tor!</string>
- <string name="pref_use_sys_iptables_title">Use Default Iptables</string>
- <string name="pref_use_sys_iptables_summary">use the built-in iptables binary instead of the one bundled with Orbot</string>
-
- <string name="error_installing_binares">The Tor binaries were not able to be installed or upgraded.</string>
-
- <string name="pref_use_persistent_notifications">Always keep the icon in toolbar when Orbot is connected</string>
- <string name="pref_use_persistent_notifications_title">Always-On Notifications</string>
-
- <string name="pref_use_expanded_notifications">Show expanded notification with Tor exit country and IP</string>
- <string name="pref_use_expanded_notifications_title">Expanded Notifications</string>
-
- <string name="notification_using_bridges">Bridges enabled!</string>
- <string name="default_bridges"/>
- <string name="set_locale_title">Language</string>
- <string name="set_locale_summary">Choose the locale and language for Orbot</string>
- <string name="wizard_locale_title">Choose Language</string>
- <string name="wizard_locale_msg">Leave default or switch the current language</string>
- <string name="powered_by">powered by Tor</string>
- <string name="btn_save_settings">Save Settings</string>
- <string name="no_internet_connection_tor">No internet connection; Tor is on standby…</string>
- <string name="bandwidth_">Bandwidth:</string>
- <string name="down">down</string>
- <string name="up">up</string>
- <string name="pref_disable_network_title">No Network Auto-Sleep</string>
- <string name="pref_disable_network_summary">Put Tor to sleep when there is no internet available</string>
- <string name="newnym">You\'ve switched to a new Tor identity!</string>
-
+ <string name="app_name">Orbot</string>
+ <string name="app_description">Orbot is a free proxy app that empowers other apps to use the internet more securely. Orbot uses Tor to encrypt your Internet traffic and then hides it by bouncing through a series of computers around the world. Tor is free software and an open network that helps you defend against a form of network surveillance that threatens personal freedom and privacy, confidential business activities and relationships, and state security known as traffic analysis.</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">start and stop Tor</string>
+ <string name="tor_proxy_service_process">torproxyservice</string>
+ <string name="status_starting_up">Orbot is starting…</string>
+ <string name="status_activated">Connected to the Tor network</string>
+ <string name="status_disabled">Orbot is deactivated</string>
+ <string name="status_shutting_down">TorService is shutting down</string>
+ <string name="tor_process_starting">Starting Tor client…</string>
+ <string name="tor_process_complete">complete.</string>
+ <string name="tor_process_waiting">waiting.</string>
+ <string name="not_anonymous_yet">WARNING: Your traffic is not anonymous yet! Please configure your applications to use HTTP proxy 127.0.0.1:8118 or SOCKS4A or SOCKS5 proxy 127.0.0.1:9050</string>
+ <string name="menu_home">Home</string>
+ <string name="menu_browse">Browse</string>
+ <string name="menu_settings">Settings</string>
+ <string name="menu_log">Log</string>
+ <string name="menu_info">Help</string>
+ <string name="menu_apps">VPN</string>
+ <string name="menu_start">Start</string>
+ <string name="menu_stop">Stop</string>
+ <string name="menu_about">About</string>
+ <string name="menu_promo_apps">Get apps…</string>
+ <string name="main_layout_download">Download</string>
+ <string name="main_layout_upload">Upload</string>
+ <string name="button_help">Help</string>
+ <string name="button_close">Close</string>
+ <string name="button_about">About</string>
+ <string name="button_clear_log">Clear Log</string>
+ <string name="menu_verify">Check</string>
+ <string name="menu_exit">Exit</string>
+ <string name="menu_scan">Scan BridgeQR</string>
+ <string name="menu_share_bridge">Share BridgeQR</string>
+ <string name="press_to_start">- long press to start -</string>
+ <string name="pref_trans_proxy_group">Transparent Proxying (Requires Root)</string>
+ <string name="pref_trans_proxy_title">Transparent Proxying</string>
+ <string name="pref_trans_proxy_summary">Automatic Torifying of Apps</string>
+ <string name="pref_transparent_all_title">Tor Everything</string>
+ <string name="pref_transparent_all_summary">Proxy traffic for all apps through Tor</string>
+ <string name="pref_transparent_port_fallback_title">Port Proxy Fallback</string>
+ <string name="pref_transparent_port_fallback_summary">WARNING: Circumvents common ports (80, 443, etc). *USE ONLY* if \'All\' or \'App\' mode doesn\'t work.</string>
+ <string name="pref_transparent_port_title">Port List</string>
+ <string name="pref_transparent_port_summary">List of ports to proxy. *USE ONLY* if \'All\' or \'App\' mode doesn\'t work</string>
+ <string name="pref_transparent_port_dialog">Enter ports to proxy</string>
+ <string name="pref_has_root">Request Root Access</string>
+ <string name="pref_has_root_summary">Request root access for transparent proxying</string>
+ <string name="status_install_success">Tor binaries successfully installed!</string>
+ <string name="status_install_fail">The Tor binary files were unable to be installed. Please check the log and notify tor-assistants(a)torproject.org</string>
+ <string name="title_error">Application Error</string>
+ <string name="wizard_title">Orbot</string>
+ <string name="wizard_btn_tell_me_more">About Orbot</string>
+ <string name="btn_next">Next</string>
+ <string name="btn_back">Back</string>
+ <string name="btn_finish">Finish</string>
+ <string name="btn_okay">Okay</string>
+ <string name="btn_cancel">Cancel</string>
+ <!--Welcome Wizard strings (DJH)-->
+ <string name="wizard_details">Some Orbot Details</string>
+ <string name="wizard_details_msg">Orbot is an open-source application that contains Tor, LibEvent and Polipo. It provides a local HTTP proxy (8118) and a SOCKS proxy (9050) into the Tor network. Orbot also has the ability, on rooted device, to send all internet traffic through Tor.</string>
+ <string name="wizard_permissions_root">Permission Granted</string>
+ <string name="wizard_permissions_stock">Orbot Permissions</string>
+ <string name="wizard_premissions_msg_root">Excellent! We\'ve detected that you have root permissions enabled for Orbot. We will use this power wisely.</string>
+ <string name="wizard_permissions_msg_stock"> While it is not required, Orbot can become a more powerful tool if your device has root access. Use the button below to grant Orbot superpowers! </string>
+ <string name="wizard_permissions_no_root">If you don\'t have root access or have no idea what we\'re talking about, just be sure to use apps made to work with Orbot.</string>
+ <string name="wizard_permissions_consent">I understand and would like to continue without Superuser</string>
+ <string name="wizard_permission_enable_root">Grant Root for Orbot</string>
+ <string name="wizard_configure">Configure Torification</string>
+ <string name="wizard_configure_msg">Orbot gives you the option to route all application traffic through Tor OR to choose your applications individually.</string>
+ <string name="wizard_configure_all">Proxy All Apps Through Tor</string>
+ <string name="wizard_configure_select_apps">Select Individual Apps for Tor</string>
+ <string name="wizard_tips_tricks">Orbot-enabled Apps</string>
+ <string name="wizard_tips_msg">The apps below were developed to work with Orbot. Click each button to install now, or you can find them later on Google Play, at GuardianProject.info website or via F-Droid.org.</string>
+ <string name="wizard_tips_otrchat">ChatSecure - Secure instant messaging client for Android</string>
+ <string name="wizard_tips_proxy">Proxy Settings - Learn how to configure apps to work with Orbot</string>
+ <string name="wizard_tips_duckgo">DuckDuckGo Search Engine app</string>
+ <string name="wizard_tips_twitter">Set Twitter proxy to host \"localhost\" and port 8118</string>
+ <string name="wizard_tips_story_maker">StoryMaker - Make a story and leave it to tor for security!</string>
+ <string name="twitter_setup_url">https://guardianproject.info/2012/05/02/orbot-your-twitter/</string>
+ <string name="wizard_proxy_help_info">Proxy Settings</string>
+ <string name="wizard_proxy_help_msg">If the Android app you are using can support the use of an HTTP or SOCKS proxy, then you can configure it to connect to Orbot and use Tor.\n\n\n The host settings is 127.0.0.1 or \"localhost\". For HTTP, the port setting is 8118. For SOCKS, the proxy is 9050. You should use SOCKS4A or SOCKS5 if possible.\n \n\n\n You can learn more about proxying on Android via the FAQ at: http://tinyurl.com/proxyandroid\n </string>
+ <string name="wizard_final">Orbot is ready!</string>
+ <string name="wizard_final_msg">Millions of people around the world use Tor for a wide variety of reasons.\n\nJournalists and bloggers, human rights defenders, law enforcement officers, soldiers, corporations, citizens of repressive regimes, and just ordinary citizens… and now you are ready to, as well!</string>
+ <string name="wizard_exit_at_first_screen_toast">Please configure Orbot before you can start using it!</string>
+ <!--END Welcome Wizard strings (DJH)-->
+ <string name="connect_first_time">You\'ve successfully connected to the Tor network - but this does NOT mean your device is secure. You can use the \'Browser\' button to test your connection. \n\nVisit us at https://guardianproject.info/apps/orbot or send an email to help(a)guardianproject.info to learn more.</string>
+ <string name="tor_check">This will open your web browser to https://check.torproject.org in order to see if Orbot is probably configured and you are connected to Tor.</string>
+ <string name="pref_general_group">General</string>
+ <string name="pref_start_boot_title">Start Orbot on Boot</string>
+ <string name="pref_start_boot_summary">Automatically start Orbot and connect Tor when your Android device boots</string>
+ <!--New Wizard Strings-->
+ <!--Title Screen-->
+ <string name="wizard_title_msg">Orbot brings Tor to Android!\n\nTor helps you defend against content filtering, traffic analysis and network surveillance that threatens privacy, confidential information and personal relationships.\n\nThis wizard will help you configure Orbot and Tor on your device.</string>
+ <!--Warning screen-->
+ <string name="wizard_warning_title">Warning</string>
+ <string name="wizard_warning_msg">Simply installing Orbot will not automatically anonymize your mobile traffic.\n\nYou must properly configure Orbot, your device and other apps to successfully use Tor.</string>
+ <!--Permissions screen-->
+ <string name="wizard_permissions_title">Permissions</string>
+ <string name="wizard_permissions_root_msg1">You can optionally grant Orbot \'Superuser\' access to enable advanced features, such as Transparent Proxying.</string>
+ <string name="wizard_permissions_root_msg2">If you do not want to do this, please make sure to use apps made to work with Orbot</string>
+ <string name="wizard_permissions_no_root_msg">Your device does not appear to be rooted or provide root or \'Superuser\' access.\n\nPlease try the \'Apps\' mode on the main screen instead.</string>
+ <!--TipsAndTricks screen-->
+ <string name="wizard_tips_title">Orbot-Enabled Apps</string>
+ <string name="wizard_tips_gibberbot">ChatSecure: Secure chat app with Off-the-Record Encryption</string>
+ <string name="wizard_tips_orweb">Orfox: Privacy-enhanced browser that works through Tor</string>
+ <string name="wizard_tips_play">Find all Guardian Project apps on Google Play</string>
+ <string name="wizard_tips_fdroid">Find all Guardian Project apps on F-Droid</string>
+ <string name="wizard_tips_fdroid_org">Find all Guardian Project apps on https://f-droid.org</string>
+ <!--Transparent Proxy screen-->
+ <string name="wizard_transproxy_title">Transparent Proxying</string>
+ <string name="wizard_transproxy_msg">This allows your apps to automatically run through the Tor network without any configuration.</string>
+ <string name="wizard_transproxy_hint">(Check this box if you have no idea what we are talking about)</string>
+ <string name="wizard_transproxy_none">None</string>
+ <string name="pref_transparent_tethering_title">Tor Tethering</string>
+ <string name="pref_transparent_tethering_summary">Enable Tor Transparent Proxying for Wifi and USB Tethered Devices (requires restart)</string>
+ <string name="button_grant_superuser">Request Superuser Access</string>
+ <string name="pref_select_apps">Select Apps</string>
+ <string name="pref_select_apps_summary">Choose Apps to Route Through Tor</string>
+ <string name="pref_node_configuration">Node Configuration</string>
+ <string name="pref_node_configuration_summary">These are advanced settings that can reduce your anonymity</string>
+ <string name="pref_entrance_node">Entrance Nodes</string>
+ <string name="pref_entrance_node_summary">Fingerprints, nicks, countries and addresses for the first hop</string>
+ <string name="pref_entrance_node_dialog">Enter Entrance Nodes</string>
+ <string name="pref_allow_background_starts_title">Allow Background Starts</string>
+ <string name="pref_allow_background_starts_summary">Let any app tell Orbot to start Tor and related services</string>
+
+ <string name="button_proxy_all">Proxy All</string>
+ <string name="button_proxy_none">Proxy None</string>
+ <string name="button_invert_selection">Invert Selection</string>
+
+ <string name="pref_proxy_title">Outbound Network Proxy (Optional)</string>
+
+ <string name="pref_proxy_type_title">Outbound Proxy Type</string>
+ <string name="pref_proxy_type_summary">Protocol to use for proxy server: HTTP, HTTPS, Socks4, Socks5</string>
+ <string name="pref_proxy_type_dialog">Enter Proxy Type</string>
+
+ <string name="pref_proxy_host_title">Outbound Proxy Host</string>
+ <string name="pref_proxy_host_summary">Proxy Server hostname</string>
+ <string name="pref_proxy_host_dialog">Enter Proxy Host</string>
+
+ <string name="pref_proxy_port_title">Outbound Proxy Port</string>
+ <string name="pref_proxy_port_summary">Proxy Server port</string>
+ <string name="pref_proxy_port_dialog">Enter Proxy port</string>
+
+ <string name="pref_proxy_username_title">Outbound Proxy Username</string>
+ <string name="pref_proxy_username_summary">Proxy Username (Optional)</string>
+ <string name="pref_proxy_username_dialog">Enter Proxy Username</string>
+
+ <string name="pref_proxy_password_title">Outbound Proxy Password</string>
+ <string name="pref_proxy_password_summary">Proxy Password (Optional)</string>
+ <string name="pref_proxy_password_dialog">Enter Proxy Password</string>
+
+
+ <string name="status">Status</string>
+ <string name="setting_up_full_transparent_proxying_">Setting up full transparent proxying…</string>
+ <string name="setting_up_app_based_transparent_proxying_">Setting up app-based transparent proxying…</string>
+ <string name="transparent_proxying_enabled">Transparent proxying ENABLED</string>
+ <string name="transproxy_enabled_for_tethering_">TransProxy enabled for Tethering!</string>
+ <string name="warning_error_starting_transparent_proxying_">WARNING: error starting transparent proxying!</string>
+ <string name="transproxy_rules_cleared">TransProxy rules cleared</string>
+ <string name="couldn_t_start_tor_process_">Couldn\'t start Tor process: </string>
+ <string name="privoxy_is_running_on_port_">Polipo is running on port: </string>
+ <string name="setting_up_port_based_transparent_proxying_">Setting up port-based transparent proxying…</string>
+ <string name="bridge_error">Bridge Error</string>
+ <string name="bridge_requires_ip">In order to use the bridge feature, you must enter at least one bridge IP address.</string>
+ <string name="send_email_for_bridges">Send an email to bridges(a)torproject.org with the line \"get bridges\" by itself in the body of the mail from a gmail account.</string>
+ <string name="error">Error</string>
+ <string name="your_reachableaddresses_settings_caused_an_exception_">Your ReachableAddresses settings caused an exception!</string>
+ <string name="your_relay_settings_caused_an_exception_">Your relay settings caused an exception!</string>
+ <string name="exit_nodes">Exit Nodes</string>
+ <string name="fingerprints_nicks_countries_and_addresses_for_the_last_hop">Fingerprints, nicks, countries and addresses for the last hop</string>
+ <string name="enter_exit_nodes">Enter Exit Nodes</string>
+ <string name="exclude_nodes">Exclude Nodes</string>
+ <string name="fingerprints_nicks_countries_and_addresses_to_exclude">Fingerprints, nicks, countries and addresses to exclude</string>
+ <string name="enter_exclude_nodes">Enter Exclude Nodes</string>
+ <string name="strict_nodes">Strict Nodes</string>
+ <string name="use_only_these_specified_nodes">Use *only* these specified nodes</string>
+ <string name="bridges">Bridges</string>
+ <string name="use_bridges">Use Bridges</string>
+ <string name="bridges_obfuscated">Obfuscated Bridges</string>
+ <string name="enable_alternate_entrance_nodes_into_the_tor_network">Enable alternate entrance nodes into the Tor Network</string>
+ <string name="enable_if_configured_bridges_are_obfuscated_bridges">Enable if configured bridges are obfuscated bridges</string>
+ <string name="ip_address_and_port_of_bridges">IP address and port of bridges</string>
+ <string name="enter_bridge_addresses">Enter Bridge Addresses</string>
+ <string name="relays">Relays</string>
+ <string name="relaying">Relaying</string>
+ <string name="enable_your_device_to_be_a_non_exit_relay">Enable your device to be a non-exit relay</string>
+ <string name="relay_port">Relay Port</string>
+ <string name="listening_port_for_your_tor_relay">Listening port for your Tor relay</string>
+ <string name="enter_or_port">Enter OR port</string>
+ <string name="relay_nickname">Relay nickname</string>
+ <string name="the_nickname_for_your_tor_relay">The nickname for your Tor relay</string>
+ <string name="enter_a_custom_relay_nickname">Enter a custom relay nickname</string>
+ <string name="reachable_addresses">Reachable Addresses</string>
+ <string name="run_as_a_client_behind_a_firewall_with_restrictive_policies">Run as a client behind a firewall with restrictive policies</string>
+ <string name="reachable_ports">Reachable ports</string>
+ <string name="ports_reachable_behind_a_restrictive_firewall">Ports reachable behind a restrictive firewall</string>
+ <string name="enter_ports">Enter ports</string>
+ <string name="menu_hidden_services">Hidden Services</string>
+ <string name="enable_debug_log_to_output_must_use_adb_or_alogcat_to_view_">enable debug log to output (must use adb or aLogCat to view)</string>
+ <string name="project_home">Project Home(s): </string>
+ <string name="project_urls">https://www.torproject.org/docs/android\nhttps://guardianproject.info/apps/…</string>
+ <string name="the_tor_license">The Tor License</string>
+ <string name="https_torproject_org">https://torproject.org</string>
+ <string name="third_party_software">3rd-Party-Software: </string>
+ <string name="tor_version">Tor: https://www.torproject.org</string>
+ <string name="libevent_version">LibEvent v2.0.21: http://www.monkey.org/~provos/libevent/</string>
+ <string name="polipo_version">Polipo v1.1.9: https://github.com/jech/polipo</string>
+ <string name="iptables_version">IPtables v1.4.21: http://www.netfilter.org</string>
+ <string name="openssl_version">OpenSSL v1.0.2j: http://www.openssl.org</string>
+ <string name="hidden_service_request">An app wants to open hidden server port %1$s to the Tor network. This is safe if you trust the app.</string>
+ <string name="found_existing_tor_process">found existing Tor process…</string>
+ <string name="something_bad_happened">Something bad happened. Check the log</string>
+ <string name="hidden_service_on">hidden service on:</string>
+ <string name="unable_to_read_hidden_service_name">unable to read hidden service name</string>
+ <string name="unable_to_start_tor">Unable to start Tor:</string>
+ <string name="unable_to_reset_tor">Reboot your device, unable to reset Tor!</string>
+ <string name="pref_use_sys_iptables_title">Use Default Iptables</string>
+ <string name="pref_use_sys_iptables_summary">use the built-in iptables binary instead of the one bundled with Orbot</string>
+
+ <string name="error_installing_binares">The Tor binaries were not able to be installed or upgraded.</string>
+
+ <string name="pref_use_persistent_notifications">Always keep the icon in toolbar when Orbot is connected</string>
+ <string name="pref_use_persistent_notifications_title">Always-On Notifications</string>
+
+ <string name="pref_use_expanded_notifications">Show expanded notification with Tor exit country and IP</string>
+ <string name="pref_use_expanded_notifications_title">Expanded Notifications</string>
+
+ <string name="notification_using_bridges">Bridges enabled!</string>
+ <string name="default_bridges" />
+ <string name="set_locale_title">Language</string>
+ <string name="set_locale_summary">Choose the locale and language for Orbot</string>
+ <string name="wizard_locale_title">Choose Language</string>
+ <string name="wizard_locale_msg">Leave default or switch the current language</string>
+ <string name="powered_by">powered by Tor</string>
+ <string name="btn_save_settings">Save Settings</string>
+ <string name="no_internet_connection_tor">No internet connection; Tor is on standby…</string>
+ <string name="bandwidth_">Bandwidth:</string>
+ <string name="down">down</string>
+ <string name="up">up</string>
+ <string name="pref_disable_network_title">No Network Auto-Sleep</string>
+ <string name="pref_disable_network_summary">Put Tor to sleep when there is no internet available</string>
+ <string name="newnym">You\'ve switched to a new Tor identity!</string>
+
<string name="menu_verify_browser">Browser</string>
<string name="menu_use_chatsecure">Use ChatSecure</string>
@@ -262,78 +256,79 @@
<string name="no_network_connectivity_putting_tor_to_sleep_">No network connectivity. Putting Tor to sleep…</string>
<string name="network_connectivity_is_good_waking_tor_up_">Network connectivity is good. Waking Tor up…</string>
<string name="updating_settings_in_tor_service">updating settings in Tor service</string>
-
+
<string name="pref_socks_title">Tor SOCKS</string>
<string name="pref_socks_summary">Port that Tor offers its SOCKS proxy on (default: 9050 or 0 to disable)</string>
<string name="pref_socks_dialog">SOCKS Port Config</string>
-
+
<string name="pref_transport_title">Tor TransProxy Port</string>
<string name="pref_transport_summary">Port that Tor offers its Transparent Proxy on (default: 9040 or 0 to disable)</string>
<string name="pref_transport_dialog">TransProxy Port Config</string>
-
-
+
+
<string name="pref_dnsport_title">Tor DNS Port</string>
<string name="pref_dnsport_summary">Port that Tor offers its DNS on (default: 5400 or 0 to disable)</string>
<string name="pref_dnsport_dialog">DNS Port Config</string>
-
-
+
+
<string name="pref_torrc_title">Torrc Custom Config</string>
<string name="pref_torrc_summary">EXPERTS ONLY: enter direct torrc config lines</string>
<string name="pref_torrc_dialog">Custom Torrc</string>
-
+
<string name="wizard_tips_martus">Mobile Martus - Benetech Human Rights Documentation App</string>
- <string name="your_tor_public_ips_">Your Tor Public IPs:</string>
- <string name="please_disable_this_app_in_android_settings_apps_if_you_are_having_problems_with_orbot_">"Please disable this app in Android->Settings->Apps if you are having problems with Orbot: "</string>
- <string name="app_conflict">App Conflict</string>
-
-
- <string name="pref_transproxy_refresh_title">Transproxy Auto-Refresh</string>
- <string name="pref_transproxy_refresh_summary">Re-apply Transproxy rules when the network state changes</string>
-
- <string name="pref_transproxy_flush_title">Transproxy FORCE REMOVE</string>
- <string name="pref_transproxy_flush_summary">Tap here to flush all transproxy network rules NOW</string>
- <string name="transparent_proxy_rules_flushed_">Transparent proxy rules flushed!</string>
- <string name="you_do_not_have_root_access_enabled">You do not have ROOT access enabled</string>
- <string name="you_may_need_to_stop_and_start_orbot_for_settings_change_to_be_enabled_">You may need to stop and start Orbot for settings change to be enabled.</string>
-
- <string name="menu_vpn">Apps</string>
-
- <string name="kbps">kbps</string>
-
- <string name="mbps">mbps</string>
-
- <string name="kb">KB</string>
-
- <string name="mb">MB</string>
-
- <string name="bridges_updated">Bridges Updated</string>
-
- <string name="restart_orbot_to_use_this_bridge_">Please restart Orbot to enable the changes</string>
-
- <string name="menu_qr">QR Codes</string>
-
- <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">If your mobile network actively blocks Tor, you can use a Bridge to access the network. SELECT one of the bridge types above to enable bridges.</string>
-
- <string name="bridge_mode">Bridge Mode</string>
-
- <string name="get_bridges_email">Email</string>
- <string name="get_bridges_web">Web</string>
-
- <string name="activate">Activate</string>
-
- <string name="apps_mode">Apps VPN Mode</string>
-
- <string name="you_can_enable_all_apps_on_your_device_to_run_through_the_tor_network_using_the_vpn_feature_of_android_">You can enable all apps on your device to run through the Tor network using the VPN feature of Android.\n\n*WARNING* This is a new, experimental feature and in some cases may not start automatically, or may stop. It should NOT be used for anonymity, and ONLY used for getting through firewalls and filters.</string>
-
- <string name="send_email">Send Email</string>
-
- <string name="you_must_get_a_bridge_address_by_email_web_or_from_a_friend_once_you_have_this_address_please_paste_it_into_the_bridges_preference_in_orbot_s_setting_and_restart_">You can get a bridge address through email, the web or by scanning a bridge QR code. Select \'Email\' or \'Web\' below to request a bridge address.\n\nOnce you have an address, copy & paste it into the \"Bridges\" preference in Orbot\'s setting and restart.</string>
-
- <string name="install_orweb">Install Orfox</string>
-
- <string name="standard_browser">Standard Browser</string>
-
- <string name="note_only_standard_tor_bridges_work_on_intel_x86_atom_devices">NOTE: Only standard Tor bridges work on Intel X86/ATOM devices</string>
-
- <string name="vpn_default_world">World (Location)</string>
+ <string name="your_tor_public_ips_">Your Tor Public IPs:</string>
+ <string name="please_disable_this_app_in_android_settings_apps_if_you_are_having_problems_with_orbot_">"Please disable this app in Android->Settings->Apps if you are having problems with Orbot: "</string>
+ <string name="app_conflict">App Conflict</string>
+
+
+ <string name="pref_transproxy_refresh_title">Transproxy Auto-Refresh</string>
+ <string name="pref_transproxy_refresh_summary">Re-apply Transproxy rules when the network state changes</string>
+
+ <string name="pref_transproxy_flush_title">Transproxy FORCE REMOVE</string>
+ <string name="pref_transproxy_flush_summary">Tap here to flush all transproxy network rules NOW</string>
+ <string name="transparent_proxy_rules_flushed_">Transparent proxy rules flushed!</string>
+ <string name="you_do_not_have_root_access_enabled">You do not have ROOT access enabled</string>
+ <string name="you_may_need_to_stop_and_start_orbot_for_settings_change_to_be_enabled_">You may need to stop and start Orbot for settings change to be enabled.</string>
+
+ <string name="menu_vpn">Apps</string>
+
+ <string name="kbps">kbps</string>
+
+ <string name="mbps">mbps</string>
+
+ <string name="kb">KB</string>
+
+ <string name="mb">MB</string>
+
+ <string name="bridges_updated">Bridges Updated</string>
+
+ <string name="restart_orbot_to_use_this_bridge_">Please restart Orbot to enable the changes</string>
+
+ <string name="menu_qr">QR Codes</string>
+
+ <string name="if_your_mobile_network_actively_blocks_tor_you_can_use_a_tor_bridge_to_access_the_network_another_way_to_get_bridges_is_to_send_an_email_to_bridges_torproject_org_please_note_that_you_must_send_the_email_using_an_address_from_one_of_the_following_email_providers_riseup_gmail_or_yahoo_">If your mobile network actively blocks Tor, you can use a Bridge to access the network. SELECT one of the bridge types above to enable bridges.</string>
+
+ <string name="bridge_mode">Bridge Mode</string>
+
+ <string name="get_bridges_email">Email</string>
+ <string name="get_bridges_web">Web</string>
+
+ <string name="activate">Activate</string>
+
+ <string name="apps_mode">Apps VPN Mode</string>
+
+ <string name="you_can_enable_all_apps_on_your_device_to_run_through_the_tor_network_using_the_vpn_feature_of_android_">You can enable all apps on your device to run through the Tor network using the VPN feature of Android.\n\n*WARNING* This is a new, experimental feature and in some cases may not start automatically, or may stop. It should NOT be used for anonymity, and ONLY used for getting through firewalls and filters.</string>
+
+ <string name="send_email">Send Email</string>
+
+ <string name="you_must_get_a_bridge_address_by_email_web_or_from_a_friend_once_you_have_this_address_please_paste_it_into_the_bridges_preference_in_orbot_s_setting_and_restart_">You can get a bridge address through email, the web or by scanning a bridge QR code. Select \'Email\' or \'Web\' below to request a bridge address.\n\nOnce you have an address, copy & paste it into the \"Bridges\" preference in Orbot\'s setting and restart.</string>
+
+ <string name="install_orweb">Install Orfox</string>
+
+ <string name="standard_browser">Standard Browser</string>
+
+ <string name="note_only_standard_tor_bridges_work_on_intel_x86_atom_devices">NOTE: Only standard Tor bridges work on Intel X86/ATOM devices</string>
+
+ <string name="vpn_default_world">World (Location)</string>
+ <string name="title_activity_hidden_services">Hidden Services</string>
</resources>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index b3fe8af..6089ad7 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
+
<style name="NotificationText" parent="android:TextAppearance.StatusBar.EventContent" />
+
<style name="NotificationTitle" parent="android:TextAppearance.StatusBar.EventContent.Title" />
+
+ <style name="DefaultTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
+
+ <style name="DefaultTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
</resources>
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index d2b5854..c20dc4f 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -157,17 +157,6 @@ android:dialogTitle="@string/enter_ports"
/>
</PreferenceCategory>
-<PreferenceCategory android:title="@string/pref_hs_group">
-<CheckBoxPreference android:title="@string/enable_hidden_services"
-android:summary="@string/run_servers_accessible_via_the_tor_network" android:key="pref_hs_enable"></CheckBoxPreference>
-<EditTextPreference android:summary="@string/enter_localhost_ports_for_hidden_services"
-android:title="@string/hidden_service_ports" android:enabled="false" android:key="pref_hs_ports"></EditTextPreference>
-
-<EditTextPreference android:key="pref_hs_hostname"
-android:summary="@string/the_addressable_name_for_your_hidden_service_generated_automatically_"
-android:title=".Onion Hostname"></EditTextPreference>
-</PreferenceCategory>
-
<PreferenceCategory android:title="@string/pref_proxy_title">
<EditTextPreference android:key="pref_proxy_type"
android:title="@string/pref_proxy_type_title"
1
0
commit 639bc3241e969fbe5a2a70b466b09f1138c064c8
Author: Unpublished <unpublished(a)gmx.net>
Date: Fri Jun 24 00:49:34 2016 +0200
fix usage of system iptables
---
.../torproject/android/service/TorTransProxy.java | 27 ++++++++--------------
1 file changed, 10 insertions(+), 17 deletions(-)
diff --git a/src/org/torproject/android/service/TorTransProxy.java b/src/org/torproject/android/service/TorTransProxy.java
index f88e46b..b8b9c6a 100644
--- a/src/org/torproject/android/service/TorTransProxy.java
+++ b/src/org/torproject/android/service/TorTransProxy.java
@@ -80,28 +80,21 @@ public class TorTransProxy implements TorServiceConstants {
private String findSystemIPTables ()
{
- if (mSysIptables != null)
- {
- return mSysIptables;
- }
+
+ //if the user wants us to use the built-in iptables, then we have to find it
+ File fileIpt = new File("/system/xbin/iptables");
+
+ if (fileIpt.exists())
+ mSysIptables = fileIpt.getAbsolutePath();
else
{
-
- //if the user wants us to use the built-in iptables, then we have to find it
- File fileIpt = new File("/system/xbin/iptables");
-
+
+ fileIpt = new File("/system/bin/iptables");
+
if (fileIpt.exists())
mSysIptables = fileIpt.getAbsolutePath();
- else
- {
-
- fileIpt = new File("/system/bin/iptables");
-
- if (fileIpt.exists())
- mSysIptables = fileIpt.getAbsolutePath();
- }
}
-
+
return mSysIptables;
}
1
0
commit 610abf5b79d80a37e4dbc705085f1fa69429aab8
Author: Hans-Christoph Steiner <hans(a)eds.org>
Date: Mon Sep 26 21:06:12 2016 +0200
fix ant builds by using frozen SDK
legacy! This uses a copy of the Android SDK that is frozen to the last
version that works with ant builds.
---
jenkins-build | 6 ++++--
make-release-build | 4 ++--
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/jenkins-build b/jenkins-build
index 0bc0b6f..3c8546d 100755
--- a/jenkins-build
+++ b/jenkins-build
@@ -1,11 +1,13 @@
#!/bin/bash
+# bash is required because we need bash's printf to guarantee a cross-platform
+# timestamp format.
set -e
set -x
if [ -z $ANDROID_HOME ]; then
- if [ -e ~/.android/bashrc ]; then
- . ~/.android/bashrc
+ if [ -e ~/.android/bashrc-ant-build ]; then
+ . ~/.android/bashrc-ant-build
else
echo "ANDROID_HOME must be set!"
exit
diff --git a/make-release-build b/make-release-build
index 41166c4..33980f8 100755
--- a/make-release-build
+++ b/make-release-build
@@ -27,8 +27,8 @@ fi
if [ -z $ANDROID_HOME ]; then
- if [ -e ~/.android/bashrc ]; then
- . ~/.android/bashrc
+ if [ -e ~/.android/bashrc-ant-build ]; then
+ . ~/.android/bashrc-ant-build
else
echo "ANDROID_HOME must be set!"
exit
1
0

[orbot/master] option for map a local port to different onion port number
by n8fr8@torproject.org 02 Mar '17
by n8fr8@torproject.org 02 Mar '17
02 Mar '17
commit ebc736be8d8ab0651bd091b0f08787ce0d8d2be6
Author: Juan Ezquerro LLanes <juan(a)paynopain.com>
Date: Thu Nov 17 09:48:27 2016 +0100
option for map a local port to different onion port number
---
.../main/java/org/torproject/android/OrbotMainActivity.java | 10 +++++++---
.../java/org/torproject/android/ui/hs/database/HSDatabase.java | 1 +
.../torproject/android/ui/hs/providers/HSContentProvider.java | 1 +
3 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/app/src/main/java/org/torproject/android/OrbotMainActivity.java b/app/src/main/java/org/torproject/android/OrbotMainActivity.java
index 15506da..06c77cf 100644
--- a/app/src/main/java/org/torproject/android/OrbotMainActivity.java
+++ b/app/src/main/java/org/torproject/android/OrbotMainActivity.java
@@ -565,14 +565,15 @@ public class OrbotMainActivity extends AppCompatActivity
stopVpnService();
}
- private void enableHiddenServicePort (String hsName, int hsPort, boolean getGey) throws RemoteException, InterruptedException
+ private void enableHiddenServicePort (String hsName, int hsPort, int hsRemotePort, boolean getGey) throws RemoteException, InterruptedException
{
String onionHostname="";
String[] mProjection = new String[]{
HSContentProvider.HiddenService._ID,
HSContentProvider.HiddenService.NAME,
HSContentProvider.HiddenService.DOMAIN,
- HSContentProvider.HiddenService.PORT};
+ HSContentProvider.HiddenService.PORT,
+ HSContentProvider.HiddenService.REMOTE_PORT};
if(hsName == null)
hsName = "hs"+hsPort;
@@ -580,6 +581,7 @@ public class OrbotMainActivity extends AppCompatActivity
ContentValues fields = new ContentValues();
fields.put("name", hsName);
fields.put("port", hsPort);
+ fields.put("remote_port", hsRemotePort);
ContentResolver cr = getContentResolver();
Cursor row = cr.query(HSContentProvider.CONTENT_URI, mProjection, "port="+hsPort, null, null);
@@ -621,6 +623,7 @@ public class OrbotMainActivity extends AppCompatActivity
if (action.equals(INTENT_ACTION_REQUEST_HIDDEN_SERVICE))
{
final int hiddenServicePort = getIntent().getIntExtra("hs_port", -1);
+ final int hiddenServiceRemotePort = getIntent().getIntExtra("hs_remote_port", -1);
final String hiddenServiceName = getIntent().getStringExtra("hs_name");
final boolean getHiddenServiceKey = getIntent().getBooleanExtra("hs_key",false);
@@ -632,7 +635,8 @@ public class OrbotMainActivity extends AppCompatActivity
try {
enableHiddenServicePort (
- hiddenServiceName, hiddenServicePort, getHiddenServiceKey
+ hiddenServiceName, hiddenServicePort,
+ hiddenServiceRemotePort, getHiddenServiceKey
);
} catch (RemoteException e) {
// TODO Auto-generated catch block
diff --git a/app/src/main/java/org/torproject/android/ui/hs/database/HSDatabase.java b/app/src/main/java/org/torproject/android/ui/hs/database/HSDatabase.java
index 9cbaacc..0cfb6e5 100644
--- a/app/src/main/java/org/torproject/android/ui/hs/database/HSDatabase.java
+++ b/app/src/main/java/org/torproject/android/ui/hs/database/HSDatabase.java
@@ -15,6 +15,7 @@ public class HSDatabase extends SQLiteOpenHelper {
"_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"name TEXT, " +
"domain TEXT, " +
+ "remote_port INTEGER, " +
"port INTEGER);";
public HSDatabase(Context context) {
diff --git a/app/src/main/java/org/torproject/android/ui/hs/providers/HSContentProvider.java b/app/src/main/java/org/torproject/android/ui/hs/providers/HSContentProvider.java
index 3714e64..6fec6b0 100644
--- a/app/src/main/java/org/torproject/android/ui/hs/providers/HSContentProvider.java
+++ b/app/src/main/java/org/torproject/android/ui/hs/providers/HSContentProvider.java
@@ -113,6 +113,7 @@ public class HSContentProvider extends ContentProvider {
//Nombres de columnas
public static final String NAME = "name";
public static final String PORT = "port";
+ public static final String REMOTE_PORT = "remote_port";
public static final String DOMAIN = "domain";
private HiddenService() {
1
0
commit 471c5ac5fb0c04f4a6a748c94292a668dc4ab4e3
Author: Juan Ezquerro LLanes <juan(a)paynopain.com>
Date: Thu Nov 17 12:02:40 2016 +0100
revert
---
app/src/main/res/values-v21/styles.xml | 1 -
project.properties | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml
deleted file mode 100644
index 7abc06d..0000000
--- a/app/src/main/res/values-v21/styles.xml
+++ /dev/null
@@ -1 +0,0 @@
-<resources></resources>
diff --git a/project.properties b/project.properties
index 240497d..145c9f2 100644
--- a/project.properties
+++ b/project.properties
@@ -9,6 +9,6 @@
#proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
# Project target.
-target=android-15
+target=android-23
android.library.reference.1=external/jsocks/jsockslib
android.library.reference.2=external/appcompat
1
0