aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java/org/pacien/tincapp/activities/LaunchActivity.kt
diff options
context:
space:
mode:
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.kt50
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 @@
1package org.pacien.tincapp.activities 1package org.pacien.tincapp.activities
2 2
3import android.annotation.SuppressLint
3import android.app.Activity 4import android.app.Activity
4import android.content.Intent 5import android.content.Intent
5import android.net.Uri 6import android.net.Uri
6import android.net.VpnService 7import android.net.VpnService
7import android.os.Bundle 8import android.os.Bundle
9import android.support.v7.app.AlertDialog
10import android.support.v7.app.AppCompatActivity
11import kotlinx.android.synthetic.main.dialog_decrypt_keys.view.*
12import org.pacien.tincapp.R
13import org.pacien.tincapp.commands.TincApp
8import org.pacien.tincapp.context.App 14import org.pacien.tincapp.context.App
9import org.pacien.tincapp.intent.action.ACTION_CONNECT 15import org.pacien.tincapp.intent.action.ACTION_CONNECT
10import org.pacien.tincapp.intent.action.ACTION_DISCONNECT 16import org.pacien.tincapp.intent.action.ACTION_DISCONNECT
11import org.pacien.tincapp.intent.action.TINC_SCHEME 17import org.pacien.tincapp.intent.action.TINC_SCHEME
12import org.pacien.tincapp.service.TincVpnService 18import org.pacien.tincapp.service.TincVpnService
19import org.pacien.tincapp.utils.PemUtils
20import java.io.FileNotFoundException
13 21
14/** 22/**
15 * @author pacien 23 * @author pacien
16 */ 24 */
17class LaunchActivity : Activity() { 25class 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() {