diff options
Diffstat (limited to 'app/src/main/java/org/pacien/tincapp/activities/LaunchActivity.kt')
-rw-r--r-- | app/src/main/java/org/pacien/tincapp/activities/LaunchActivity.kt | 50 |
1 files changed, 43 insertions, 7 deletions
diff --git a/app/src/main/java/org/pacien/tincapp/activities/LaunchActivity.kt b/app/src/main/java/org/pacien/tincapp/activities/LaunchActivity.kt index 6eb630d..74a059b 100644 --- a/app/src/main/java/org/pacien/tincapp/activities/LaunchActivity.kt +++ b/app/src/main/java/org/pacien/tincapp/activities/LaunchActivity.kt | |||
@@ -1,20 +1,28 @@ | |||
1 | package org.pacien.tincapp.activities | 1 | package org.pacien.tincapp.activities |
2 | 2 | ||
3 | import android.annotation.SuppressLint | ||
3 | import android.app.Activity | 4 | import android.app.Activity |
4 | import android.content.Intent | 5 | import android.content.Intent |
5 | import android.net.Uri | 6 | import android.net.Uri |
6 | import android.net.VpnService | 7 | import android.net.VpnService |
7 | import android.os.Bundle | 8 | import android.os.Bundle |
9 | import android.support.v7.app.AlertDialog | ||
10 | import android.support.v7.app.AppCompatActivity | ||
11 | import kotlinx.android.synthetic.main.dialog_decrypt_keys.view.* | ||
12 | import org.pacien.tincapp.R | ||
13 | import org.pacien.tincapp.commands.TincApp | ||
8 | import org.pacien.tincapp.context.App | 14 | import org.pacien.tincapp.context.App |
9 | import org.pacien.tincapp.intent.action.ACTION_CONNECT | 15 | import org.pacien.tincapp.intent.action.ACTION_CONNECT |
10 | import org.pacien.tincapp.intent.action.ACTION_DISCONNECT | 16 | import org.pacien.tincapp.intent.action.ACTION_DISCONNECT |
11 | import org.pacien.tincapp.intent.action.TINC_SCHEME | 17 | import org.pacien.tincapp.intent.action.TINC_SCHEME |
12 | import org.pacien.tincapp.service.TincVpnService | 18 | import org.pacien.tincapp.service.TincVpnService |
19 | import org.pacien.tincapp.utils.PemUtils | ||
20 | import java.io.FileNotFoundException | ||
13 | 21 | ||
14 | /** | 22 | /** |
15 | * @author pacien | 23 | * @author pacien |
16 | */ | 24 | */ |
17 | class LaunchActivity : Activity() { | 25 | class LaunchActivity : AppCompatActivity() { |
18 | 26 | ||
19 | override fun onCreate(savedInstanceState: Bundle?) { | 27 | override fun onCreate(savedInstanceState: Bundle?) { |
20 | super.onCreate(savedInstanceState) | 28 | super.onCreate(savedInstanceState) |
@@ -26,15 +34,41 @@ class LaunchActivity : Activity() { | |||
26 | } | 34 | } |
27 | 35 | ||
28 | override fun onActivityResult(request: Int, result: Int, data: Intent?) { | 36 | override fun onActivityResult(request: Int, result: Int, data: Intent?) { |
29 | if (result == Activity.RESULT_OK) TincVpnService.startVpn(intent.data.schemeSpecificPart) | 37 | if (request == PERMISSION_REQUEST_CODE && result == Activity.RESULT_OK) askPassphrase() |
30 | finish() | ||
31 | } | 38 | } |
32 | 39 | ||
33 | private fun requestPerm() = VpnService.prepare(this).let { | 40 | private fun requestPerm() = VpnService.prepare(this).let { |
34 | if (it != null) | 41 | if (it != null) |
35 | startActivityForResult(it, 0) | 42 | startActivityForResult(it, PERMISSION_REQUEST_CODE) |
36 | else | 43 | else |
37 | onActivityResult(0, Activity.RESULT_OK, null) | 44 | onActivityResult(PERMISSION_REQUEST_CODE, Activity.RESULT_OK, null) |
45 | } | ||
46 | |||
47 | @SuppressLint("InflateParams") | ||
48 | private fun askPassphrase() { | ||
49 | val netName = intent.data.schemeSpecificPart | ||
50 | |||
51 | if (needPassphrase(netName) && intent.data.fragment == null) { | ||
52 | val dialog = layoutInflater.inflate(R.layout.dialog_decrypt_keys, null, false) | ||
53 | AlertDialog.Builder(this) | ||
54 | .setTitle(R.string.title_unlock_private_keys).setView(dialog) | ||
55 | .setPositiveButton(R.string.action_unlock) { _, _ -> connect(netName, dialog.passphrase.text.toString()) } | ||
56 | .setNegativeButton(R.string.action_cancel, { _, _ -> finish() }) | ||
57 | .show() | ||
58 | } else { | ||
59 | connect(netName, intent.data.fragment) | ||
60 | } | ||
61 | } | ||
62 | |||
63 | private fun needPassphrase(netName: String) = try { | ||
64 | TincApp.listPrivateKeys(netName).filter { it.exists() }.any { PemUtils.isEncrypted(PemUtils.read(it)) } | ||
65 | } catch (e: FileNotFoundException) { | ||
66 | false | ||
67 | } | ||
68 | |||
69 | private fun connect(netName: String, passphrase: String? = null) { | ||
70 | TincVpnService.startVpn(netName, passphrase) | ||
71 | finish() | ||
38 | } | 72 | } |
39 | 73 | ||
40 | private fun disconnect() { | 74 | private fun disconnect() { |
@@ -44,11 +78,13 @@ class LaunchActivity : Activity() { | |||
44 | 78 | ||
45 | companion object { | 79 | companion object { |
46 | 80 | ||
47 | fun connect(netName: String) { | 81 | private val PERMISSION_REQUEST_CODE = 0 |
82 | |||
83 | fun connect(netName: String, passphrase: String? = null) { | ||
48 | App.getContext().startActivity(Intent(App.getContext(), LaunchActivity::class.java) | 84 | App.getContext().startActivity(Intent(App.getContext(), LaunchActivity::class.java) |
49 | .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) | 85 | .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) |
50 | .setAction(ACTION_CONNECT) | 86 | .setAction(ACTION_CONNECT) |
51 | .setData(Uri.Builder().scheme(TINC_SCHEME).opaquePart(netName).build())) | 87 | .setData(Uri.Builder().scheme(TINC_SCHEME).opaquePart(netName).fragment(passphrase).build())) |
52 | } | 88 | } |
53 | 89 | ||
54 | fun disconnect() { | 90 | fun disconnect() { |