diff options
| author | Emīls Piņķis <emils@mullvad.net> | 2019-10-10 21:48:45 +0100 |
|---|---|---|
| committer | Emīls Piņķis <emils@mullvad.net> | 2019-10-24 19:38:54 +0100 |
| commit | aed40fe920e6fa7a95670478562592e374f78718 (patch) | |
| tree | 97c73f492ccc2fb142d83b8e5b99024eff2de3e5 /android/src | |
| parent | 7443bca440851d1daeed19ed91730a0ed86eff34 (diff) | |
| download | mullvadvpn-aed40fe920e6fa7a95670478562592e374f78718.tar.xz mullvadvpn-aed40fe920e6fa7a95670478562592e374f78718.zip | |
Use authenticated URLs when opening key management page
Diffstat (limited to 'android/src')
5 files changed, 81 insertions, 12 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt index a033b0fe84..edb1477aa1 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ConnectFragment.kt @@ -75,7 +75,10 @@ class ConnectFragment : Fragment() { } headerBar = HeaderBar(view, resources) - notificationBanner = NotificationBanner(view, context!!, versionInfoCache) + notificationBanner = NotificationBanner(view, + context!!, + versionInfoCache, + parentActivity.wwwAuthTokenRetriever) status = ConnectionStatus(view, resources) locationInfo = LocationInfo(view, context!!) diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt index 96c647c038..cfa4f99000 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt @@ -20,6 +20,7 @@ import net.mullvad.mullvadvpn.dataproxy.LocationInfoCache import net.mullvad.mullvadvpn.dataproxy.MullvadProblemReport import net.mullvad.mullvadvpn.dataproxy.RelayListListener import net.mullvad.mullvadvpn.dataproxy.SettingsListener +import net.mullvad.mullvadvpn.dataproxy.WwwAuthTokenRetriever import net.mullvad.mullvadvpn.util.SmartDeferred class MainActivity : FragmentActivity() { @@ -40,6 +41,7 @@ class MainActivity : FragmentActivity() { var relayListListener = RelayListListener(this) val locationInfoCache = LocationInfoCache(daemon, relayListListener) val accountCache = AccountCache(settingsListener, daemon) + val wwwAuthTokenRetriever = WwwAuthTokenRetriever(daemon) private var quitJob: Job? = null private var serviceToStop: MullvadVpnService.LocalBinder? = null diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt index 02596f6996..a641b6a940 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt @@ -30,6 +30,7 @@ class MullvadDaemon(val vpnService: MullvadVpnService) { external fun disconnect() external fun generateWireguardKey(): KeygenEvent? external fun getAccountData(accountToken: String): GetAccountDataResult + external fun getWwwAuthToken(): String external fun getCurrentLocation(): GeoIpLocation? external fun getCurrentVersion(): String external fun getRelayLocations(): RelayList diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/NotificationBanner.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/NotificationBanner.kt index 1916888576..1a3d7afb43 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/NotificationBanner.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/NotificationBanner.kt @@ -7,7 +7,12 @@ import android.net.Uri import android.view.View import android.widget.ImageView import android.widget.TextView +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.dataproxy.AppVersionInfoCache +import net.mullvad.mullvadvpn.dataproxy.WwwAuthTokenRetriever import net.mullvad.mullvadvpn.model.ActionAfterDisconnect import net.mullvad.mullvadvpn.model.BlockReason import net.mullvad.mullvadvpn.model.KeygenEvent @@ -18,11 +23,14 @@ import net.mullvad.mullvadvpn.model.TunnelState class NotificationBanner( val parentView: View, val context: Context, - val versionInfoCache: AppVersionInfoCache + val versionInfoCache: AppVersionInfoCache, + val authTokenRetriever: WwwAuthTokenRetriever ) { + enum class ExternalLink { Download, KeyManagement } + private val resources = context.resources - private val accountUrl = Uri.parse(context.getString(R.string.account_url)) + private val keyManagementUrl = context.getString(R.string.wg_key_url) private val downloadUrl = Uri.parse(context.getString(R.string.download_url)) private val errorImage = resources.getDrawable(R.drawable.icon_notification_error, null) @@ -34,9 +42,31 @@ class NotificationBanner( private val message: TextView = parentView.findViewById(R.id.notification_message) private val icon: View = parentView.findViewById(R.id.notification_icon) - private var externalLink: Uri? = null + private var externalLink: ExternalLink? = null private var visible = false + private val keyManagementController = BlockingController( + object : BlockableView { + override fun setEnabled(enabled: Boolean) { + if (enabled) { + banner.setAlpha(1f) + banner.setClickable(true) + } else { + banner.setAlpha(0.5f) + banner.setClickable(false) + } + } + + override fun onClick(): Job { + return GlobalScope.launch(Dispatchers.Main) { + val token = authTokenRetriever.getAuthToken() + val url = Uri.parse(keyManagementUrl + "?token=" + token) + context.startActivity(Intent(Intent.ACTION_VIEW, url)) + } + } + } + ) + var keyState: KeygenEvent? = null set(value) { field = value @@ -59,6 +89,7 @@ class NotificationBanner( fun onPause() { versionInfoCache.onUpdate = null + keyManagementController.onPause() } private fun update() { @@ -74,7 +105,7 @@ class NotificationBanner( is KeygenEvent.Failure -> { when (keyState.failure) { is KeygenFailure.TooManyKeys -> { - externalLink = accountUrl + externalLink = ExternalLink.KeyManagement showError(R.string.wireguard_error, R.string.too_many_keys) } is KeygenFailure.GenerationFailure -> { @@ -128,7 +159,7 @@ class NotificationBanner( val parameter = versionInfoCache.upgradeVersion val description = context.getString(template, parameter) - externalLink = downloadUrl + externalLink = ExternalLink.Download show(statusImage, title, description) } @@ -209,8 +240,13 @@ class NotificationBanner( private fun onClick() { val externalLink = this.externalLink - if (externalLink != null) { - context.startActivity(Intent(Intent.ACTION_VIEW, externalLink)) + when (externalLink) { + ExternalLink.Download -> { + context.startActivity(Intent(Intent.ACTION_VIEW, this.downloadUrl)) + } + ExternalLink.KeyManagement -> { + this.keyManagementController.action() + } } } } diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/WireguardKeyFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/WireguardKeyFragment.kt index 14d4803717..3ebb9d6dbf 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/WireguardKeyFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/WireguardKeyFragment.kt @@ -20,6 +20,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.launch import net.mullvad.mullvadvpn.dataproxy.ConnectionProxy import net.mullvad.mullvadvpn.dataproxy.KeyStatusListener +import net.mullvad.mullvadvpn.dataproxy.WwwAuthTokenRetriever import net.mullvad.mullvadvpn.model.KeygenEvent import net.mullvad.mullvadvpn.model.KeygenFailure import net.mullvad.mullvadvpn.model.TunnelState @@ -37,9 +38,11 @@ class WireguardKeyFragment : Fragment() { private var tunnelStateListener: Int? = null private var tunnelStateSubscriptionJob: Long? = null private var tunnelState: TunnelState = TunnelState.Disconnected() - private lateinit var parentActivity: MainActivity private lateinit var connectionProxy: SmartDeferred<ConnectionProxy> private lateinit var keyStatusListener: KeyStatusListener + private lateinit var parentActivity: MainActivity + private lateinit var wwwTokenRetriever: WwwAuthTokenRetriever + private lateinit var urlController: BlockingController private var generatingKey = false private var validatingKey = false @@ -57,6 +60,7 @@ class WireguardKeyFragment : Fragment() { parentActivity = context as MainActivity keyStatusListener = parentActivity.keyStatusListener connectionProxy = parentActivity.connectionProxy + wwwTokenRetriever = parentActivity.wwwAuthTokenRetriever } override fun onCreateView( @@ -80,10 +84,32 @@ class WireguardKeyFragment : Fragment() { publicKeyAge = view.findViewById<TextView>(R.id.wireguard_key_age) visitWebsiteView.visibility = View.VISIBLE + val keyUrl = parentActivity.getString(R.string.wg_key_url) + + urlController = BlockingController( + object : BlockableView { + override fun setEnabled(enabled: Boolean) { + if (!enabled || tunnelState is TunnelState.Blocked) { + visitWebsiteView.setClickable(false) + visitWebsiteView.setAlpha(0.5f) + } else { + visitWebsiteView.setClickable(true) + visitWebsiteView.setAlpha(1f) + } + } + + override fun onClick(): Job { + return GlobalScope.launch(Dispatchers.Default) { + val token = wwwTokenRetriever.getAuthToken() + val intent = Intent(Intent.ACTION_VIEW, + Uri.parse(keyUrl + "?token=" + token)) + startActivity(intent) + } + } + } + ) visitWebsiteView.setOnClickListener { - val intent = Intent(Intent.ACTION_VIEW, - Uri.parse(parentActivity.getString(R.string.account_url))) - startActivity(intent) + urlController.action() } updateViews() @@ -275,6 +301,7 @@ class WireguardKeyFragment : Fragment() { updateViewsJob?.cancel() validatingKey = false generatingKey = false + urlController.onPause() super.onPause() } |
