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.kt98
1 files changed, 0 insertions, 98 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
deleted file mode 100644
index 0179040..0000000
--- a/app/src/main/java/org/pacien/tincapp/activities/LaunchActivity.kt
+++ /dev/null
@@ -1,98 +0,0 @@
1package org.pacien.tincapp.activities
2
3import android.annotation.SuppressLint
4import android.app.Activity
5import android.content.Intent
6import android.net.Uri
7import android.net.VpnService
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
14import org.pacien.tincapp.context.App
15import org.pacien.tincapp.intent.action.ACTION_CONNECT
16import org.pacien.tincapp.intent.action.ACTION_DISCONNECT
17import org.pacien.tincapp.intent.action.TINC_SCHEME
18import org.pacien.tincapp.service.TincVpnService
19import org.pacien.tincapp.utils.PemUtils
20import java.io.FileNotFoundException
21
22/**
23 * @author pacien
24 */
25class LaunchActivity : AppCompatActivity() {
26
27 override fun onCreate(savedInstanceState: Bundle?) {
28 super.onCreate(savedInstanceState)
29
30 when (intent.action) {
31 ACTION_CONNECT -> requestPerm()
32 ACTION_DISCONNECT -> disconnect()
33 }
34 }
35
36 override fun onActivityResult(request: Int, result: Int, data: Intent?) {
37 if (request == PERMISSION_REQUEST_CODE && result == Activity.RESULT_OK) askPassphrase()
38 }
39
40 private fun requestPerm() = VpnService.prepare(this).let {
41 if (it != null)
42 startActivityForResult(it, PERMISSION_REQUEST_CODE)
43 else
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()
72 }
73
74 private fun disconnect() {
75 TincVpnService.stopVpn()
76 finish()
77 }
78
79 companion object {
80
81 private val PERMISSION_REQUEST_CODE = 0
82
83 fun connect(netName: String, passphrase: String? = null) {
84 App.getContext().startActivity(Intent(App.getContext(), LaunchActivity::class.java)
85 .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
86 .setAction(ACTION_CONNECT)
87 .setData(Uri.Builder().scheme(TINC_SCHEME).opaquePart(netName).fragment(passphrase).build()))
88 }
89
90 fun disconnect() {
91 App.getContext().startActivity(Intent(App.getContext(), LaunchActivity::class.java)
92 .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
93 .setAction(ACTION_DISCONNECT))
94 }
95
96 }
97
98}