summaryrefslogtreecommitdiff
path: root/main/src/ui/java/de/blinkt/openvpn/fragments/PasswordDialogFragment.kt
diff options
context:
space:
mode:
authorArne Schwabe <arne@rfc2549.org>2019-12-11 11:20:45 +0100
committerArne Schwabe <arne@rfc2549.org>2019-12-11 11:20:45 +0100
commitb5e0eee4b798d3e2bfef3b87500b8625b77a16b4 (patch)
tree309498cb7c9643d62e09ab7eadf20a6b2420ed4c /main/src/ui/java/de/blinkt/openvpn/fragments/PasswordDialogFragment.kt
parent37f2e17f3bcad4e53e6dd4690340123219557a0f (diff)
Modernise 2FA challenge input, use activity alias for non implemented activities
Diffstat (limited to 'main/src/ui/java/de/blinkt/openvpn/fragments/PasswordDialogFragment.kt')
-rw-r--r--main/src/ui/java/de/blinkt/openvpn/fragments/PasswordDialogFragment.kt99
1 files changed, 99 insertions, 0 deletions
diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/PasswordDialogFragment.kt b/main/src/ui/java/de/blinkt/openvpn/fragments/PasswordDialogFragment.kt
new file mode 100644
index 00000000..eedb2e59
--- /dev/null
+++ b/main/src/ui/java/de/blinkt/openvpn/fragments/PasswordDialogFragment.kt
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2012-2019 Arne Schwabe
+ * Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
+ */
+package de.blinkt.openvpn.core
+
+import android.app.AlertDialog
+import android.app.Dialog
+import android.content.ComponentName
+import android.content.DialogInterface
+import android.content.Intent
+import android.content.ServiceConnection
+import android.os.Bundle
+import android.os.IBinder
+import android.os.RemoteException
+import android.text.InputType
+import android.widget.EditText
+import androidx.fragment.app.DialogFragment
+import de.blinkt.openvpn.R
+import de.blinkt.openvpn.core.OpenVPNService.EXTRA_CHALLENGE_TXT
+
+class PasswordDialogFragment : DialogFragment() {
+ private var mService: IOpenVPNServiceInternal? = null
+ private val mConnection: ServiceConnection = object : ServiceConnection {
+ override fun onServiceConnected(className: ComponentName,
+ service: IBinder) {
+ mService = IOpenVPNServiceInternal.Stub.asInterface(service)
+ }
+
+ override fun onServiceDisconnected(arg0: ComponentName) {
+ mService = null
+ }
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val intent = Intent(activity, OpenVPNService::class.java)
+ intent.action = OpenVPNService.START_SERVICE
+ requireActivity().bindService(intent, mConnection, 0)
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ requireActivity().unbindService(mConnection)
+ }
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ val title = requireArguments().getString("title")
+ val echo = requireArguments().getBoolean("echo")
+ val finish = requireArguments().getBoolean("finish")
+ val input = EditText(activity)
+ if (!echo)
+ input.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
+
+ return AlertDialog.Builder(activity)
+ .setTitle("Challenge/Response Authentification")
+ .setMessage(title)
+ .setView(input)
+ .setPositiveButton(android.R.string.ok) { _, _ ->
+ try {
+ mService?.challengeResponse(input.text.toString())
+ if (finish) requireActivity().finish()
+ } catch (e: RemoteException) {
+ VpnStatus.logException(e)
+ e.printStackTrace()
+ }
+ }
+ .setNegativeButton(R.string.cancel
+ ) { _, _ -> if (finish) requireActivity().finish() }
+ .create()
+ }
+
+ companion object {
+ fun newInstance(intent: Intent, finish: Boolean): PasswordDialogFragment? {
+ val extras = intent.extras ?: return null
+ val challenge = extras.getString(EXTRA_CHALLENGE_TXT, "R,E:(empty challenge text)")
+ val message = challenge.split(":", limit = 2)[1]
+ val flagsStr = challenge.split(":", limit = 2)[0]
+ val flags = flagsStr.split(",")
+ var echo = false
+ var response = false
+ for (flag in flags) {
+ if (flag == "R") response = true
+ else if (flag == "E") echo = true
+ }
+ if (!response) {
+ VpnStatus.logError("Error unrecognised challenge from Server: $challenge")
+ return null
+ }
+ val frag = PasswordDialogFragment()
+ val args = Bundle()
+ args.putString("title", message)
+ args.putBoolean("echo", echo)
+ args.putBoolean("finish", finish)
+ frag.arguments = args
+ return frag
+ }
+ }
+} \ No newline at end of file