-
Notifications
You must be signed in to change notification settings - Fork 0
/
WireGuard.kt
103 lines (90 loc) · 2.98 KB
/
WireGuard.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
* Copyright (c) 2024 Proton AG
*
* This file is part of ProtonVPN.
*
* ProtonVPN is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ProtonVPN is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ProtonVPN. If not, see <https://www.gnu.org/licenses/>.
*/
package proton.example.vpn
import android.content.Context
import com.wireguard.android.backend.GoBackend
import com.wireguard.android.backend.Tunnel
import com.wireguard.config.Config
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import okhttp3.OkHttpClient
import okhttp3.Request
import okio.IOException
import java.util.concurrent.Executors
import javax.inject.Inject
import javax.inject.Singleton
enum class VpnState {
UP,
DOWN,
}
@Singleton
class WireGuard @Inject constructor(
@ApplicationContext private val appContext: Context,
) {
private val wgBackend = GoBackend(appContext)
private val tunnel = WireGuardTunnel()
private val wgScope = CoroutineScope(Executors.newSingleThreadExecutor().asCoroutineDispatcher())
private val _state = MutableStateFlow(VpnState.DOWN)
val state : StateFlow<VpnState> = _state
fun connect(
peer: List<String>,
iface: List<String>,
) {
val config = Config.Builder()
.parsePeer(peer)
.parseInterface(iface)
.build()
wgScope.launch {
apiCall("https://example.com")
wgBackend.setState(tunnel, Tunnel.State.UP, config)
_state.value = VpnState.UP
launch {
delay(1000)
apiCall("https://example.com")
}
}
}
fun disconnect() {
wgScope.launch {
wgBackend.setState(tunnel, Tunnel.State.DOWN, null)
_state.value = VpnState.DOWN
}
}
private fun apiCall(url: String) {
val client = OkHttpClient()
try {
val request = Request.Builder()
.url(url)
.build();
val response = client.newCall(request).execute()
println("API response: $response")
} catch (e: IOException) {
println("API response error: ${e.message}")
}
}
}
private class WireGuardTunnel : Tunnel {
override fun getName() = "VpnTunnel"
override fun onStateChange(newState: Tunnel.State) {}
}