summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-12-14 11:34:31 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2020-12-14 11:34:31 -0300
commit5329f5a02913ea67f63e53e3eb45a846907bd081 (patch)
tree95bb6863c9849bf8c1ee754bb56ee7632e58d1b7
parent78804209e7be8c1171402977f0489275faecf1bc (diff)
parent9c414414dea2d90c48d0b1313afd8ab4fd9ff68c (diff)
downloadmullvadvpn-5329f5a02913ea67f63e53e3eb45a846907bd081.tar.xz
mullvadvpn-5329f5a02913ea67f63e53e3eb45a846907bd081.zip
Merge branch 'public-dns-server-warning-dialog'
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/AdvancedFragment.kt23
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ConfirmPublicDnsDialogFragment.kt66
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/customdns/CustomDnsAdapter.kt17
-rw-r--r--android/src/main/res/layout/confirm_public_dns.xml32
-rw-r--r--android/src/main/res/values/strings.xml3
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>