diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-12-14 11:34:31 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2020-12-14 11:34:31 -0300 |
| commit | 5329f5a02913ea67f63e53e3eb45a846907bd081 (patch) | |
| tree | 95bb6863c9849bf8c1ee754bb56ee7632e58d1b7 | |
| parent | 78804209e7be8c1171402977f0489275faecf1bc (diff) | |
| parent | 9c414414dea2d90c48d0b1313afd8ab4fd9ff68c (diff) | |
| download | mullvadvpn-5329f5a02913ea67f63e53e3eb45a846907bd081.tar.xz mullvadvpn-5329f5a02913ea67f63e53e3eb45a846907bd081.zip | |
Merge branch 'public-dns-server-warning-dialog'
5 files changed, 139 insertions, 2 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt index a63de128fa..f02f5cca91 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt @@ -5,6 +5,7 @@ import android.support.v7.widget.LinearLayoutManager import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import kotlinx.coroutines.CompletableDeferred import net.mullvad.mullvadvpn.R import net.mullvad.mullvadvpn.model.Settings import net.mullvad.mullvadvpn.ui.customdns.CustomDnsAdapter @@ -35,7 +36,11 @@ class AdvancedFragment : ServiceDependentFragment(OnNoService.GoBack) { titleController = CollapsibleTitleController(view, R.id.contents) - customDnsAdapter = CustomDnsAdapter(customDns) + customDnsAdapter = CustomDnsAdapter(customDns).apply { + showPublicDnsAddressWarning = { confirmation -> + showConfirmPublicDnsServerDialog(confirmation) + } + } view.findViewById<CustomRecyclerView>(R.id.contents).apply { layoutManager = LinearLayoutManager(parentActivity) @@ -118,6 +123,22 @@ class AdvancedFragment : ServiceDependentFragment(OnNoService.GoBack) { } } + private fun showConfirmPublicDnsServerDialog(confirmation: CompletableDeferred<Boolean>) { + val transaction = fragmentManager?.beginTransaction() + + detachBackButtonHandler() + transaction?.addToBackStack(null) + + ConfirmPublicDnsDialogFragment() + .apply { confirmPublicDns = confirmation } + .show(transaction, null) + + jobTracker.newUiJob("restoreBackButtonHandler") { + confirmation.await() + attachBackButtonHandler() + } + } + private fun attachBackButtonHandler() { parentActivity.backButtonHandler = { if (customDnsAdapter.isEditing) { diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConfirmPublicDnsDialogFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConfirmPublicDnsDialogFragment.kt new file mode 100644 index 0000000000..3888e756e0 --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConfirmPublicDnsDialogFragment.kt @@ -0,0 +1,66 @@ +package net.mullvad.mullvadvpn.ui + +import android.app.Dialog +import android.content.DialogInterface +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.support.v4.app.DialogFragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams +import android.widget.Button +import kotlinx.coroutines.CompletableDeferred +import net.mullvad.mullvadvpn.R + +class ConfirmPublicDnsDialogFragment : DialogFragment() { + var confirmPublicDns: CompletableDeferred<Boolean>? = null + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val view = inflater.inflate(R.layout.confirm_public_dns, container, false) + + view.findViewById<Button>(R.id.back_button).setOnClickListener { + activity?.onBackPressed() + } + + view.findViewById<Button>(R.id.confirm_button).setOnClickListener { + confirmPublicDns?.complete(true) + confirmPublicDns = null + dismiss() + } + + return view + } + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) + + dialog.window?.setBackgroundDrawable(ColorDrawable(android.R.color.transparent)) + + return dialog + } + + override fun onStart() { + super.onStart() + + dialog?.window?.setLayout(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT) + + if (confirmPublicDns == null) { + dismiss() + } + } + + override fun onDismiss(dialogInterface: DialogInterface) { + confirmPublicDns?.complete(false) + } + + override fun onDestroy() { + confirmPublicDns?.cancel() + + super.onDestroy() + } +} diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsAdapter.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsAdapter.kt index 5c3eeee3a5..44af15c1f7 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsAdapter.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsAdapter.kt @@ -5,6 +5,7 @@ import android.view.LayoutInflater import android.view.ViewGroup import java.net.InetAddress import kotlin.properties.Delegates.observable +import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import net.mullvad.mullvadvpn.R @@ -53,6 +54,8 @@ class CustomDnsAdapter(val customDns: CustomDns) : Adapter<CustomDnsItemHolder>( val isEditing get() = editingPosition != null + var showPublicDnsAddressWarning: ((CompletableDeferred<Boolean>) -> Unit)? = null + init { customDns.apply { onDnsServersChanged.subscribe(this) { dnsServers -> @@ -282,10 +285,22 @@ class CustomDnsAdapter(val customDns: CustomDns) : Adapter<CustomDnsItemHolder>( if (inetAddressValidator.isValid(addressText)) { val address = InetAddress.getByName(addressText) - if (!address.isLoopbackAddress()) { + if (!address.isLoopbackAddress() && confirmAddIfPublicAddress(address)) { handler(address) } } } } + + private suspend fun confirmAddIfPublicAddress(address: InetAddress): Boolean { + if (address.isLinkLocalAddress() || address.isSiteLocalAddress()) { + return true + } + + val confirmation = CompletableDeferred<Boolean>() + + showPublicDnsAddressWarning?.invoke(confirmation) + + return confirmation.await() + } } diff --git a/android/src/main/res/layout/confirm_public_dns.xml b/android/src/main/res/layout/confirm_public_dns.xml new file mode 100644 index 0000000000..90d72e722b --- /dev/null +++ b/android/src/main/res/layout/confirm_public_dns.xml @@ -0,0 +1,32 @@ +<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:scrollbars="none"> + <LinearLayout android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="30dp" + android:background="@drawable/dialog_background" + android:orientation="vertical" + android:gravity="left" + android:elevation="2dp"> + <ImageView android:layout_width="44dp" + android:layout_height="44dp" + android:layout_marginTop="8dp" + android:layout_gravity="center" + android:src="@drawable/icon_alert" /> + <TextView android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="0" + android:layout_marginTop="16dp" + android:textColor="@color/white80" + android:textSize="@dimen/text_small" + android:text="@string/confirm_public_dns" /> + <Button android:id="@+id/confirm_button" + android:layout_marginVertical="@dimen/button_separation" + android:text="@string/add_anyway" + style="@style/RedButton" /> + <Button android:id="@+id/back_button" + android:text="@string/back" + style="@style/BlueButton" /> + </LinearLayout> +</ScrollView> diff --git a/android/src/main/res/values/strings.xml b/android/src/main/res/values/strings.xml index fb442a9e9b..fbb8182bf4 100644 --- a/android/src/main/res/values/strings.xml +++ b/android/src/main/res/values/strings.xml @@ -168,6 +168,9 @@ <string name="add_a_server">Add a server</string> <string name="custom_dns_example">e.g. 123.456.789.111</string> <string name="custom_dns_footer">Enable to add at least one DNS server.</string> + <string name="confirm_public_dns">The DNS server you are trying to add might not work because + it is public. Currently we only support local DNS servers.</string> + <string name="add_anyway">Add anyway</string> <string name="exclude_applications">Exclude applications</string> <string name="account_url">https://mullvad.net/en/account</string> <string name="wg_key_url">https://mullvad.net/en/account/ports</string> |
