[tor-commits] [orbot/master] dialog for adding v3 base32 key hashes

n8fr8 at torproject.org n8fr8 at torproject.org
Wed Dec 22 21:55:06 UTC 2021


commit a8b3e167b369e525fb678698344e3d694d7e0d95
Author: bim <dsnake at protonmail.com>
Date:   Wed Jan 27 20:00:11 2021 -0500

    dialog for adding v3 base32 key hashes
---
 app/src/main/AndroidManifest.xml                   |  8 +++
 .../org/torproject/android/OrbotMainActivity.java  |  3 +
 .../ui/hiddenservices/ClientCookiesActivity.java   |  3 +-
 .../AddV3ClientAuthDialogFragment.java             | 80 ++++++++++++++++++++++
 .../ui/v3onionservice/V3ClientAuthActivity.java    | 25 +++++++
 app/src/main/res/layout/activity_v3auth.xml        | 36 ++++++++++
 .../main/res/layout/dialog_add_v3_client_auth.xml  | 33 +++++++++
 app/src/main/res/menu/orbot_main.xml               |  7 +-
 app/src/main/res/values/strings.xml                |  2 +
 9 files changed, 194 insertions(+), 3 deletions(-)

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0f69c722..51fc720a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -103,6 +103,14 @@
                 android:value=".OrbotMainActivity" />
         </activity>
 
+        <activity android:name=".ui.v3onionservice.V3ClientAuthActivity"
+            android:label="@string/v3_client_auth"
+            android:theme="@style/DefaultTheme">
+            <meta-data
+                android:name="android.support.PARENT_ACTIVITY"
+                android:value=".OrbotMainActivity"/>
+        </activity>
+
         <activity
             android:name=".ui.hiddenservices.ClientCookiesActivity"
             android:label="@string/client_cookies"
diff --git a/app/src/main/java/org/torproject/android/OrbotMainActivity.java b/app/src/main/java/org/torproject/android/OrbotMainActivity.java
index 773c7fa6..d58381d4 100644
--- a/app/src/main/java/org/torproject/android/OrbotMainActivity.java
+++ b/app/src/main/java/org/torproject/android/OrbotMainActivity.java
@@ -75,6 +75,7 @@ import org.torproject.android.ui.onboarding.BridgeWizardActivity;
 import org.torproject.android.ui.onboarding.OnboardingActivity;
 import org.torproject.android.ui.v3onionservice.OnionServiceContentProvider;
 import org.torproject.android.ui.v3onionservice.OnionServicesActivity;
+import org.torproject.android.ui.v3onionservice.V3ClientAuthActivity;
 
 import java.io.File;
 import java.io.UnsupportedEncodingException;
@@ -468,6 +469,8 @@ public class OrbotMainActivity extends AppCompatActivity implements OrbotConstan
 
         } else if (item.getItemId() == R.id.menu_v3_onion_services) {
             startActivity(new Intent(this, OnionServicesActivity.class));
+        } else if (item.getItemId() == R.id.menu_v3_onion_client_auth) {
+            startActivity(new Intent(this, V3ClientAuthActivity.class));
         } else if (item.getItemId() == R.id.menu_hidden_services) {
             startActivity(new Intent(this, HiddenServicesActivity.class));
         } else if (item.getItemId() == R.id.menu_client_cookies) {
diff --git a/app/src/main/java/org/torproject/android/ui/hiddenservices/ClientCookiesActivity.java b/app/src/main/java/org/torproject/android/ui/hiddenservices/ClientCookiesActivity.java
index 93443678..7ffe2b43 100644
--- a/app/src/main/java/org/torproject/android/ui/hiddenservices/ClientCookiesActivity.java
+++ b/app/src/main/java/org/torproject/android/ui/hiddenservices/ClientCookiesActivity.java
@@ -48,8 +48,7 @@ public class ClientCookiesActivity extends AppCompatActivity {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.layout_activity_client_cookies);
 
-        Toolbar toolbar = findViewById(R.id.toolbar);
-        setSupportActionBar(toolbar);
+        setSupportActionBar(findViewById(R.id.toolbar));
         getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 
         mResolver = getContentResolver();
diff --git a/app/src/main/java/org/torproject/android/ui/v3onionservice/AddV3ClientAuthDialogFragment.java b/app/src/main/java/org/torproject/android/ui/v3onionservice/AddV3ClientAuthDialogFragment.java
new file mode 100644
index 00000000..a3efe0d6
--- /dev/null
+++ b/app/src/main/java/org/torproject/android/ui/v3onionservice/AddV3ClientAuthDialogFragment.java
@@ -0,0 +1,80 @@
+package org.torproject.android.ui.v3onionservice;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.View;
+import android.widget.EditText;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.DialogFragment;
+
+import org.torproject.android.R;
+
+public class AddV3ClientAuthDialogFragment extends DialogFragment {
+
+    private EditText etOnionUrl, etKeyHash;
+    private TextWatcher inputValidator;
+
+    @NonNull
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        final View dialogView = getActivity().getLayoutInflater().inflate(R.layout.dialog_add_v3_client_auth, null);
+        final AlertDialog ad = new AlertDialog.Builder(getActivity())
+                .setView(dialogView)
+                .setTitle(R.string.v3_client_auth)
+                .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss())
+                .setPositiveButton(R.string.save, (dialog, which) -> doSave(getContext()))
+                .create();
+
+
+        etOnionUrl = dialogView.findViewById(R.id.cookie_onion);
+        etKeyHash = dialogView.findViewById(R.id.cookie_value);
+
+        inputValidator = new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable s) {
+                ad.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(checkInput());
+            }
+        };
+
+        etOnionUrl.addTextChangedListener(inputValidator);
+        etKeyHash.addTextChangedListener(inputValidator);
+
+        return ad;
+    }
+
+    private void doSave(Context context) {
+
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        inputValidator.afterTextChanged(null);
+    }
+
+    private boolean checkInput() {
+        String domain = ".onion";
+        String onion = etOnionUrl.getText().toString();
+        if (onion.endsWith(domain))
+            onion = onion.substring(0, onion.indexOf(domain));
+        if (!onion.matches("([a-z0-9]{56})")) return false;
+        String hash = etKeyHash.getText().toString();
+        return hash.matches("([A-Z2-7]{52})");
+    }
+
+}
diff --git a/app/src/main/java/org/torproject/android/ui/v3onionservice/V3ClientAuthActivity.java b/app/src/main/java/org/torproject/android/ui/v3onionservice/V3ClientAuthActivity.java
new file mode 100644
index 00000000..53a35f30
--- /dev/null
+++ b/app/src/main/java/org/torproject/android/ui/v3onionservice/V3ClientAuthActivity.java
@@ -0,0 +1,25 @@
+package org.torproject.android.ui.v3onionservice;
+
+import android.os.Bundle;
+
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+
+import org.torproject.android.R;
+
+public class V3ClientAuthActivity extends AppCompatActivity {
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_v3auth);
+
+        setSupportActionBar(findViewById(R.id.toolbar));
+        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+        findViewById(R.id.fab).setOnClickListener(v -> {
+            new AddV3ClientAuthDialogFragment().show(getSupportFragmentManager(), "AddV3ClientAuthDialogFragment");
+        });
+
+
+    }
+}
diff --git a/app/src/main/res/layout/activity_v3auth.xml b/app/src/main/res/layout/activity_v3auth.xml
new file mode 100644
index 00000000..a0e66741
--- /dev/null
+++ b/app/src/main/res/layout/activity_v3auth.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.coordinatorlayout.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.hiddenservices.ClientCookiesActivity">
+
+    <com.google.android.material.appbar.AppBarLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:theme="@style/DefaultTheme.AppBarOverlay">
+
+        <androidx.appcompat.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" />
+
+    </com.google.android.material.appbar.AppBarLayout>
+
+    <include layout="@layout/layout_content_client_cookies" />
+
+    <com.google.android.material.floatingactionbutton.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"
+        android:tint="@android:color/black"
+        app:backgroundTint="@android:color/darker_gray"
+        app:srcCompat="@android:drawable/ic_input_add" />
+
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
diff --git a/app/src/main/res/layout/dialog_add_v3_client_auth.xml b/app/src/main/res/layout/dialog_add_v3_client_auth.xml
new file mode 100644
index 00000000..ec310a0c
--- /dev/null
+++ b/app/src/main/res/layout/dialog_add_v3_client_auth.xml
@@ -0,0 +1,33 @@
+<?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="wrap_content"
+    android:orientation="vertical"
+    android:padding="?dialogPreferredPadding">
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/onion"
+        android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" />
+
+    <org.torproject.android.core.ui.NoPersonalizedLearningEditText
+        android:id="@+id/cookie_onion"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:ems="10"
+        android:inputType="text" />
+
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/auth_cookie"
+        android:textAppearance="@style/TextAppearance.AppCompat.Widget.PopupMenu.Small" />
+
+    <org.torproject.android.core.ui.NoPersonalizedLearningEditText
+        android:id="@+id/cookie_value"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:ems="10"
+        android:inputType="text" />
+</LinearLayout>
diff --git a/app/src/main/res/menu/orbot_main.xml b/app/src/main/res/menu/orbot_main.xml
index c0133d44..1f96b968 100644
--- a/app/src/main/res/menu/orbot_main.xml
+++ b/app/src/main/res/menu/orbot_main.xml
@@ -38,7 +38,12 @@
 
             <item
                 android:id="@+id/menu_v3_onion_services"
-                android:title="@string/hosted_services"
+                android:title="@string/v3_hosted_services"
+                yourapp:showAsAction="never" />
+
+            <item
+                android:id="@+id/menu_v3_onion_client_auth"
+                android:title="@string/v3_client_auth"
                 yourapp:showAsAction="never" />
 
             <item
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c888c856..a312d6da 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -170,6 +170,8 @@
     <string name="vpn_default_world">Global (Auto)</string>
     <string name="hidden_services">Onion Services</string>
     <string name="v2_hidden_services">V2 Onion Services (Deprecated)</string>
+    <string name="v3_hosted_services">Hosted V3 Onion Services</string>
+    <string name="v3_client_auth">V3 Onion Service Client Authorization</string>
     <string name="title_activity_hidden_services">Onion Services</string>
     <string name="menu_hidden_services">Onion Services</string>
     <string name="save">Save</string>





More information about the tor-commits mailing list