commit a8b3e167b369e525fb678698344e3d694d7e0d95 Author: bim dsnake@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>
tor-commits@lists.torproject.org