From ce36abf20e0ed08feb7447763f72a323aeebb3c3 Mon Sep 17 00:00:00 2001 From: koalasat Date: Sun, 27 Jul 2025 13:56:54 +0200 Subject: [PATCH] Use Orbot button --- .../main/java/com/robosats/MainActivity.kt | 66 ++++++++++++++----- .../main/java/com/robosats/WebAppInterface.kt | 29 ++++---- .../app/src/main/res/layout/activity_main.xml | 11 +++- android/app/src/main/res/values/strings.xml | 1 + .../src/basic/TopBar/MenuDrawer/index.tsx | 22 ++----- frontend/src/models/Settings.model.ts | 4 -- .../Websocket/WebsocketAndroidClient/index.ts | 4 -- .../Websocket/WebsocketWebClient/index.ts | 2 - frontend/src/services/Websocket/index.ts | 1 - .../services/api/ApiAndroidClient/index.ts | 11 ---- .../src/services/api/ApiWebClient/index.ts | 2 - frontend/src/services/api/index.ts | 1 - 12 files changed, 84 insertions(+), 70 deletions(-) diff --git a/android/app/src/main/java/com/robosats/MainActivity.kt b/android/app/src/main/java/com/robosats/MainActivity.kt index 065703f9..41684a95 100644 --- a/android/app/src/main/java/com/robosats/MainActivity.kt +++ b/android/app/src/main/java/com/robosats/MainActivity.kt @@ -23,7 +23,9 @@ import android.webkit.WebViewClient import android.content.Intent import android.content.pm.PackageManager import android.net.Uri +import android.widget.Button import android.widget.TextView +import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.app.ActivityCompat @@ -42,6 +44,8 @@ class MainActivity : AppCompatActivity() { private lateinit var loadingContainer: ConstraintLayout private lateinit var statusTextView: TextView private lateinit var intentData: String + private lateinit var useOrbotButton: Button + var useProxy: Boolean = true override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -58,13 +62,16 @@ class MainActivity : AppCompatActivity() { webView = findViewById(R.id.webView) loadingContainer = findViewById(R.id.loadingContainer) statusTextView = findViewById(R.id.statusTextView) + useOrbotButton = findViewById(R.id.useOrbotButton) + + // Set click listener for action button + useOrbotButton.setOnClickListener { + onUseOrbotButtonClicked() + } // Set initial status message updateStatus("Initializing Tor connection...") - // Initialize Tor and setup WebView only after Tor is properly connected - initializeTor() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && ContextCompat.checkSelfPermission( this, @@ -85,6 +92,15 @@ class MainActivity : AppCompatActivity() { intentData = orderId } } + + // Initialize Tor and setup WebView only after Tor is properly connected + initializeTor() + + val settingProxy = EncryptedStorage.getEncryptedStorage("settings_use_proxy") + if (settingProxy == "false") { + // Setup WebView to use Orbot if the user previously clicked + onUseOrbotButtonClicked() + } } override fun onNewIntent(intent: Intent) { @@ -97,6 +113,26 @@ class MainActivity : AppCompatActivity() { } } + /** + * Disables the built-in proxy for users with Orbot configured + * This assumes that Orbot is already running and properly configured + * to handle .onion addresses through the system proxy settings + */ + private fun onUseOrbotButtonClicked() { + Log.d("OrbotMode", "Switching to Orbot proxy mode") + EncryptedStorage.setEncryptedStorage("settings_use_proxy", "false") + useProxy = false + + // Show a message to the user + Toast.makeText( + this, + "Using Orbot. Make sure it's running!", + Toast.LENGTH_LONG + ).show() + + setupWebView() + } + /** * Initialize Notifications service */ @@ -127,7 +163,7 @@ class MainActivity : AppCompatActivity() { private fun initializeTor() { try { try { - torKmp = TorKmpManager.getTorKmpObject() + torKmp = getTorKmpObject() } catch (e: UninitializedPropertyAccessException) { torKmp = TorKmp(application as Application) TorKmpManager.updateTorKmpObject(torKmp) @@ -218,19 +254,25 @@ class MainActivity : AppCompatActivity() { */ private fun setupWebView() { // Double-check Tor is connected before proceeding - if (!torKmp.isConnected()) { + if (useProxy && !torKmp.isConnected()) { Log.e("SecurityError", "Attempted to set up WebView without Tor connection") return } // Set a blocking WebViewClient to prevent ANY network access webView.webViewClient = object : WebViewClient() { - override fun shouldInterceptRequest(view: WebView, request: WebResourceRequest): WebResourceResponse? { + override fun shouldInterceptRequest( + view: WebView, + request: WebResourceRequest + ): WebResourceResponse? { // Block ALL requests until we're sure Tor proxy is correctly set up return WebResourceResponse("text/plain", "UTF-8", null) } - override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { + override fun shouldOverrideUrlLoading( + view: WebView, + request: WebResourceRequest + ): Boolean { // Block ALL URL loading attempts return true } @@ -241,23 +283,17 @@ class MainActivity : AppCompatActivity() { // Show message that we're setting up secure browsing runOnUiThread { - updateStatus("Setting up secure Tor browsing...") + updateStatus(if (useProxy) "Setting up secure Tor browsing..." else "Setting up Orbot browsing...") } // Configure proxy for WebView in a background thread to avoid NetworkOnMainThreadException Thread { try { // First verify Tor is still connected - if (!torKmp.isConnected()) { + if (useProxy && !torKmp.isConnected()) { throw SecurityException("Tor disconnected during proxy setup") } - // If we get here, proxy setup was successful - // Perform one final Tor connection check - if (!torKmp.isConnected()) { - throw SecurityException("Tor disconnected after proxy setup") - } - // Success - now configure WebViewClient and load URL on UI thread runOnUiThread { updateStatus("Secure connection established. Loading app...") diff --git a/android/app/src/main/java/com/robosats/WebAppInterface.kt b/android/app/src/main/java/com/robosats/WebAppInterface.kt index 3b147d93..20c49100 100644 --- a/android/app/src/main/java/com/robosats/WebAppInterface.kt +++ b/android/app/src/main/java/com/robosats/WebAppInterface.kt @@ -14,7 +14,6 @@ import com.robosats.tor.TorKmpManager.getTorKmpObject import okhttp3.Call import okhttp3.Callback import okhttp3.MediaType.Companion.toMediaType -import okhttp3.OkHttpClient import okhttp3.OkHttpClient.Builder import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody @@ -35,7 +34,7 @@ import okhttp3.Request.Builder as RequestBuilder * sanitization, and proper error handling. */ @SuppressLint("SetJavaScriptEnabled") -class WebAppInterface(private val context: Context, private val webView: WebView) { +class WebAppInterface(private val context: MainActivity, private val webView: WebView) { private val TAG = "WebAppInterface" private val roboIdentities = RoboIdentities() private val webSockets: MutableMap = HashMap() @@ -170,12 +169,16 @@ class WebAppInterface(private val context: Context, private val webView: WebView try { Log.d(TAG, "WebSocket opening: $path") - val client: OkHttpClient = Builder() + // Create OkHttpClient + var builder = Builder() .connectTimeout(60, TimeUnit.SECONDS) // Set connection timeout - .readTimeout(30, TimeUnit.SECONDS) // Set read timeout - .proxy(getTorKmpObject().proxy) - .build() + .readTimeout(120, TimeUnit.SECONDS) // Set read timeout + if (context.useProxy) { + builder = builder.proxy(getTorKmpObject().proxy) + } + + val client = builder.build() // Create a request for the WebSocket connection val request: Request = RequestBuilder() @@ -258,12 +261,16 @@ class WebAppInterface(private val context: Context, private val webView: WebView } try { - // Create OkHttpClient with Tor proxy - val client = Builder() + // Create OkHttpClient + var builder = Builder() .connectTimeout(60, TimeUnit.SECONDS) // Set connection timeout - .readTimeout(30, TimeUnit.SECONDS) // Set read timeout - .proxy(getTorKmpObject().proxy) - .build() + .readTimeout(120, TimeUnit.SECONDS) // Set read timeout + + if (context.useProxy) { + builder = builder.proxy(getTorKmpObject().proxy) + } + + val client = builder.build() // Build request with URL val requestBuilder = RequestBuilder().url(url) diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml index 7277acf7..6c391708 100644 --- a/android/app/src/main/res/layout/activity_main.xml +++ b/android/app/src/main/res/layout/activity_main.xml @@ -68,7 +68,16 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/loadingProgressBar" /> - +