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 | 98 |
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 @@ | |||
1 | package org.pacien.tincapp.activities | ||
2 | |||
3 | import android.annotation.SuppressLint | ||
4 | import android.app.Activity | ||
5 | import android.content.Intent | ||
6 | import android.net.Uri | ||
7 | import android.net.VpnService | ||
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 | ||
14 | import org.pacien.tincapp.context.App | ||
15 | import org.pacien.tincapp.intent.action.ACTION_CONNECT | ||
16 | import org.pacien.tincapp.intent.action.ACTION_DISCONNECT | ||
17 | import org.pacien.tincapp.intent.action.TINC_SCHEME | ||
18 | import org.pacien.tincapp.service.TincVpnService | ||
19 | import org.pacien.tincapp.utils.PemUtils | ||
20 | import java.io.FileNotFoundException | ||
21 | |||
22 | /** | ||
23 | * @author pacien | ||
24 | */ | ||
25 | class 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 | } | ||