Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 7367477e authored by Sunik Kupfer's avatar Sunik Kupfer Committed by Ricki Hirner
Browse files

Add option to use socks proxy for orbot (closes bitfireAT/davx5#28) (#64)



* Add option to use SOCKS proxy for Orbot
* Fix tests, add constants
* Add option for "no proxy", add migration
* Improve UI

Co-authored-by: default avatarRicki Hirner <hirner@bitfire.at>
parent 8fb9b3a8
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -5,8 +5,8 @@
package at.bitfire.davdroid.settings

import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test

class SettingsManagerTest {
@@ -14,11 +14,14 @@ class SettingsManagerTest {
    val settingsManager by lazy { SettingsManager.getInstance(InstrumentationRegistry.getInstrumentation().targetContext) }

    @Test
    fun testContainsKey() {
    fun testContainsKey_NotExisting() {
        assertFalse(settingsManager.containsKey("notExisting"))
    }

    @Test
    fun testContainsKey_Existing() {
        // provided by DefaultsProvider
        assertTrue(settingsManager.containsKey(Settings.OVERRIDE_PROXY))
        assertEquals(Settings.PROXY_TYPE_SYSTEM, settingsManager.getInt(Settings.PROXY_TYPE))
    }

}
 No newline at end of file
+17 −8
Original line number Diff line number Diff line
@@ -103,15 +103,24 @@ class HttpClient private constructor(

                // custom proxy support
                try {
                    if (settings.getBoolean(Settings.OVERRIDE_PROXY)) {
                        val address = InetSocketAddress(
                                settings.getString(Settings.OVERRIDE_PROXY_HOST),
                                settings.getInt(Settings.OVERRIDE_PROXY_PORT)
                    val proxyTypeValue = settings.getInt(Settings.PROXY_TYPE)
                    if (proxyTypeValue != Settings.PROXY_TYPE_SYSTEM) {
                        // we set our own proxy
                        val address by lazy {           // lazy because not required for PROXY_TYPE_NONE
                            InetSocketAddress(
                                settings.getString(Settings.PROXY_HOST),
                                settings.getInt(Settings.PROXY_PORT)
                            )

                        val proxy = Proxy(Proxy.Type.HTTP, address)
                        }
                        val proxy =
                            when (proxyTypeValue) {
                                Settings.PROXY_TYPE_NONE -> Proxy.NO_PROXY
                                Settings.PROXY_TYPE_HTTP -> Proxy(Proxy.Type.HTTP, address)
                                Settings.PROXY_TYPE_SOCKS -> Proxy(Proxy.Type.SOCKS, address)
                                else -> throw IllegalArgumentException("Invalid proxy type")
                            }
                        orig.proxy(proxy)
                        Logger.log.log(Level.INFO, "Using proxy", proxy)
                        Logger.log.log(Level.INFO, "Using proxy setting", proxy)
                    }
                } catch (e: Exception) {
                    Logger.log.log(Level.SEVERE, "Can't set proxy, ignoring", e)
+41 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.provider.ContactsContract
import android.util.Base64
import androidx.annotation.WorkerThread
import androidx.core.content.ContextCompat
import androidx.preference.PreferenceManager
import at.bitfire.davdroid.InvalidAccountException
import at.bitfire.davdroid.R
import at.bitfire.davdroid.TasksWatcher
@@ -62,7 +63,7 @@ class AccountSettings(

    companion object {

        const val CURRENT_VERSION = 12
        const val CURRENT_VERSION = 13
        const val KEY_SETTINGS_VERSION = "version"

        const val KEY_SYNC_INTERVAL_ADDRESSBOOKS = "sync_interval_addressbooks"
@@ -429,6 +430,45 @@ class AccountSettings(
    }


    @Suppress("unused","FunctionName")
    /**
     * Not a per-account migration, but not a database migration, too, so it fits best there.
     * Best future solution would be that SettingsManager manages versions and migrations.
     *
     * Updates proxy settings from override_proxy_* to proxy_type, proxy_host, proxy_port.
     */
    private fun update_12_13() {
        // proxy settings are managed by SharedPreferencesProvider
        val preferences = PreferenceManager.getDefaultSharedPreferences(context)

        // old setting names
        val overrideProxy = "override_proxy"
        val overrideProxyHost = "override_proxy_host"
        val overrideProxyPort = "override_proxy_port"

        val edit = preferences.edit()
        if (preferences.contains(overrideProxy)) {
            if (preferences.getBoolean(overrideProxy, false))
                // override_proxy set, migrate to proxy_type = HTTP
                edit.putInt(Settings.PROXY_TYPE, Settings.PROXY_TYPE_HTTP)
            edit.remove(overrideProxy)
        }
        if (preferences.contains(overrideProxyHost)) {
            preferences.getString(overrideProxyHost, null)?.let { host ->
                edit.putString(Settings.PROXY_HOST, host)
            }
            edit.remove(overrideProxyHost)
        }
        if (preferences.contains(overrideProxyPort)) {
            val port = preferences.getInt(overrideProxyPort, 0)
            if (port != 0)
                edit.putInt(Settings.PROXY_PORT, port)
            edit.remove(overrideProxyPort)
        }
        edit.apply()
    }


    @Suppress("unused","FunctionName")
    /**
     * Store event URLs as URL (extended property) instead of unknown property. At the same time,
+4 −4
Original line number Diff line number Diff line
@@ -19,11 +19,11 @@ class DefaultsProvider(

    override val booleanDefaults = mutableMapOf(
        Pair(Settings.DISTRUST_SYSTEM_CERTIFICATES, false),
        Pair(Settings.OVERRIDE_PROXY, false)
    )

    override val intDefaults = mapOf(
            Pair(Settings.OVERRIDE_PROXY_PORT, 8118)
        Pair(Settings.PROXY_TYPE, Settings.PROXY_TYPE_SYSTEM),
        Pair(Settings.PROXY_PORT, 9050)     // Orbot SOCKS
    )

    override val longDefaults = mapOf<String, Long>(
@@ -31,7 +31,7 @@ class DefaultsProvider(
    )

    override val stringDefaults = mapOf(
            Pair(Settings.OVERRIDE_PROXY_HOST, "localhost")
        Pair(Settings.PROXY_HOST, "localhost")
    )

    val dataSaverChangedListener by lazy {
+7 −3
Original line number Diff line number Diff line
@@ -13,9 +13,13 @@ object Settings {

    const val DISTRUST_SYSTEM_CERTIFICATES = "distrust_system_certs"

    const val OVERRIDE_PROXY = "override_proxy"
    const val OVERRIDE_PROXY_HOST = "override_proxy_host"
    const val OVERRIDE_PROXY_PORT = "override_proxy_port"
    const val PROXY_TYPE = "proxy_type"
    const val PROXY_TYPE_SYSTEM = -1
    const val PROXY_TYPE_NONE = 0
    const val PROXY_TYPE_HTTP = 1
    const val PROXY_TYPE_SOCKS = 2
    const val PROXY_HOST = "proxy_host"
    const val PROXY_PORT = "proxy_port"

    /**
     * Default sync interval (long), in seconds.
Loading