X-Git-Url: https://gitweb.stoutner.com/?p=PrivacyBrowserAndroid.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fcom%2Fstoutner%2Fprivacybrowser%2Fhelpers%2FProxyHelper.kt;h=2339d8d6f0712cd40421aa8beae8008120d1d6c9;hp=0cc5105850f23ea07d8c0171e0003ad0b1f98784;hb=ab11ca2de00c56982e46627c8e7fc670462b0b3c;hpb=484f0b0f0143c53a4722cee3a31e714df0c8c49a diff --git a/app/src/main/java/com/stoutner/privacybrowser/helpers/ProxyHelper.kt b/app/src/main/java/com/stoutner/privacybrowser/helpers/ProxyHelper.kt index 0cc51058..2339d8d6 100644 --- a/app/src/main/java/com/stoutner/privacybrowser/helpers/ProxyHelper.kt +++ b/app/src/main/java/com/stoutner/privacybrowser/helpers/ProxyHelper.kt @@ -19,13 +19,9 @@ package com.stoutner.privacybrowser.helpers -import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.net.Uri -import android.os.Build -import android.os.Parcelable -import android.util.ArrayMap import android.view.View import androidx.preference.PreferenceManager @@ -40,7 +36,6 @@ import com.google.android.material.snackbar.Snackbar import java.lang.Exception import java.lang.IllegalArgumentException -import java.lang.reflect.InvocationTargetException import java.net.InetSocketAddress import java.net.Proxy import java.net.SocketAddress @@ -56,30 +51,12 @@ class ProxyHelper { } fun setProxy(context: Context, activityView: View, proxyMode: String) { - // Initialize the proxy host and port strings. - var proxyHost = "0" - var proxyPort = "0" - // Create a proxy config builder. val proxyConfigBuilder = ProxyConfig.Builder() // Run the commands that correlate to the proxy mode. when (proxyMode) { - NONE -> { - // Clear the proxy values. - System.clearProperty("proxyHost") - System.clearProperty("proxyPort") - } - TOR -> { - // Update the proxy host and port strings. These can be removed once the minimum API >= 21. - proxyHost = "localhost" - proxyPort = "8118" - - // Set the proxy values. These can be removed once the minimum API >= 21. - System.setProperty("proxyHost", proxyHost) - System.setProperty("proxyPort", proxyPort) - // Add the proxy to the builder. The proxy config builder can use a SOCKS proxy. proxyConfigBuilder.addProxyRule("socks://localhost:9050") @@ -100,14 +77,6 @@ class ProxyHelper { } I2P -> { - // Update the proxy host and port strings. These can be removed once the minimum API >= 21. - proxyHost = "localhost" - proxyPort = "4444" - - // Set the proxy values. These can be removed once the minimum API >= 21. - System.setProperty("proxyHost", proxyHost) - System.setProperty("proxyPort", proxyPort) - // Add the proxy to the builder. proxyConfigBuilder.addProxyRule("http://localhost:4444") } @@ -121,17 +90,6 @@ class ProxyHelper { // Parse the custom proxy URL. try { - // Convert the custom proxy URL string to a URI. - val customProxyUri = Uri.parse(customProxyUrlString) - - // Get the proxy host and port strings from the shared preferences. These can be removed once the minimum API >= 21. - proxyHost = customProxyUri.host!! - proxyPort = customProxyUri.port.toString() - - // Set the proxy values. These can be removed once the minimum API >= 21. - System.setProperty("proxyHost", proxyHost) - System.setProperty("proxyPort", proxyPort) - // Add the proxy to the builder. proxyConfigBuilder.addProxyRule(customProxyUrlString!!) } catch (exception: Exception) { // The custom proxy URL is invalid. @@ -142,7 +100,7 @@ class ProxyHelper { } // Apply the proxy settings - if (WebViewFeature.isFeatureSupported(WebViewFeature.PROXY_OVERRIDE)) { // The fancy new proxy config can be used because the API >= 21. + if (WebViewFeature.isFeatureSupported(WebViewFeature.PROXY_OVERRIDE)) { // Convert the proxy config builder into a proxy config. val proxyConfig = proxyConfigBuilder.build() @@ -161,102 +119,18 @@ class ProxyHelper { Snackbar.make(activityView, R.string.custom_proxy_invalid, Snackbar.LENGTH_LONG).show() } } - } else { // The old proxy method must be used, either because an old WebView is installed or because the API == 19; - // Get a handle for the shared preferences. - val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) - - // Check to make sure a SOCKS proxy is not selected. - if ((proxyMode == CUSTOM) && - sharedPreferences.getString(context.getString(R.string.proxy_custom_url_key), context.getString(R.string.proxy_custom_url_default_value))!!.startsWith("socks://")) { - // Display a Snackbar. - Snackbar.make(activityView, R.string.socks_proxies_do_not_work_on_kitkat, Snackbar.LENGTH_LONG).show() - } else { // Use reflection to apply the new proxy values. - try { - // Get the application and APK classes. - val applicationClass = Class.forName("android.app.Application") - - // Suppress the lint warning that reflection may not always work in the future and on all devices. - @SuppressLint("PrivateApi") val loadedApkClass = Class.forName("android.app.LoadedApk") - - // Get the declared fields. Suppress the lint that it is discouraged to access private APIs. - @SuppressLint("DiscouragedPrivateApi") val methodLoadedApkField = applicationClass.getDeclaredField("mLoadedApk") - @SuppressLint("DiscouragedPrivateApi") val methodReceiversField = loadedApkClass.getDeclaredField("mReceivers") - - // Allow the values to be changed. - methodLoadedApkField.isAccessible = true - methodReceiversField.isAccessible = true - - // Get the APK object. - val methodLoadedApkObject = methodLoadedApkField[context] - - // Get an array map of the receivers. - val receivers = methodReceiversField[methodLoadedApkObject] as ArrayMap<*, *> - - // Set the proxy. - for (receiverMap in receivers.values) { - for (receiver in (receiverMap as ArrayMap<*, *>).keys) { - // Get the receiver class. - // `Class<*>`, which is an `unbounded wildcard parameterized type`, must be used instead of `Class`, which is a `raw type`. Otherwise, `receiveClass.getDeclaredMethod()` is unhappy. - val receiverClass: Class<*> = receiver.javaClass - - // Apply the new proxy settings to any classes whose names contain `ProxyChangeListener`. - if (receiverClass.name.contains("ProxyChangeListener")) { - // Get the `onReceive` method from the class. - val onReceiveMethod = receiverClass.getDeclaredMethod("onReceive", Context::class.java, Intent::class.java) - - // Create a proxy change intent. - val proxyChangeIntent = Intent(android.net.Proxy.PROXY_CHANGE_ACTION) - - // Set the proxy for API >= 21. - if (Build.VERSION.SDK_INT >= 21) { - // Get the proxy info class. - val proxyInfoClass = Class.forName("android.net.ProxyInfo") - - // Get the build direct proxy method from the proxy info class. - val buildDirectProxyMethod = proxyInfoClass.getMethod("buildDirectProxy", String::class.java, Integer.TYPE) - - // Populate a proxy info object with the new proxy information. - val proxyInfoObject = buildDirectProxyMethod.invoke(proxyInfoClass, proxyHost, Integer.valueOf(proxyPort)) - - // Add the proxy info object into the proxy change intent. - proxyChangeIntent.putExtra("proxy", proxyInfoObject as Parcelable) - } - - // Pass the proxy change intent to the `onReceive` method of the receiver class. - onReceiveMethod.invoke(receiver, context, proxyChangeIntent) - } - } - } - } catch (exception: ClassNotFoundException) { - // Do nothing. - } catch (exception: NoSuchFieldException) { - // Do nothing. - } catch (exception: IllegalAccessException) { - // Do nothing. - } catch (exception: NoSuchMethodException) { - // Do nothing. - } catch (exception: InvocationTargetException) { - // Do nothing. - } - } } } fun getCurrentProxy(context: Context): Proxy { // Get the proxy according to the current proxy mode. val proxy = when (MainWebViewActivity.proxyMode) { - TOR -> if (Build.VERSION.SDK_INT >= 21) { + TOR -> { // Use localhost port 9050 as the socket address. val torSocketAddress: SocketAddress = InetSocketAddress.createUnresolved("localhost", 9050) // Create a SOCKS proxy. Proxy(Proxy.Type.SOCKS, torSocketAddress) - } else { - // Use localhost port 8118 as the socket address. - val oldTorSocketAddress: SocketAddress = InetSocketAddress.createUnresolved("localhost", 8118) - - // Create an HTTP proxy. - Proxy(Proxy.Type.HTTP, oldTorSocketAddress) } I2P -> {