Added DNS configuration functionality. (#24)

* Changed app icon from default to Yggdrasil leaf.

* Added workaround for DNS-reslver and fix for unmetered networks.

* Added DNS configuration functionality.

* Changed DNS configuration UI. Disabled DNS config by default. Added DNS fix for Chrome-based browsers.
This commit is contained in:
Revertron 2022-10-30 22:14:30 +01:00 committed by GitHub
parent 24573625a4
commit 772dfdef8c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 620 additions and 26 deletions

View file

@ -17,6 +17,8 @@ import java.util.concurrent.atomic.AtomicBoolean
import kotlin.concurrent.thread
private const val TAG = "PacketTunnelProvider"
class PacketTunnelProvider: VpnService() {
companion object {
const val RECEIVER_INTENT = "eu.neilalexander.yggdrasil.PacketTunnelProvider.MESSAGE"
@ -50,16 +52,16 @@ class PacketTunnelProvider: VpnService() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
if (intent == null) {
Log.d("PacketTunnelProvider", "Intent is null")
Log.d(TAG, "Intent is null")
return START_NOT_STICKY
}
return when (intent.action ?: ACTION_STOP) {
ACTION_STOP -> {
Log.d("PacketTunnelProvider", "Stopping...")
Log.d(TAG, "Stopping...")
stop(); START_NOT_STICKY
}
else -> {
Log.d("PacketTunnelProvider", "Starting...")
Log.d(TAG, "Starting...")
start(); START_STICKY
}
}
@ -70,11 +72,11 @@ class PacketTunnelProvider: VpnService() {
return
}
Log.d("PacketTunnelProvider", config.getJSON().toString())
Log.d(TAG, config.getJSON().toString())
yggdrasil.startJSON(config.getJSONByteArray())
val address = yggdrasil.addressString
var builder = Builder()
val builder = Builder()
.addAddress(address, 7)
.addRoute("200::", 7)
// We do this to trick the DNS-resolver into thinking that we have "regular" IPv6,
@ -97,6 +99,21 @@ class PacketTunnelProvider: VpnService() {
builder.setMetered(false)
}
val preferences = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this.baseContext)
val serverString = preferences.getString(KEY_DNS_SERVERS, "")
if (serverString!!.isNotEmpty()) {
val servers = serverString.split(",")
if (servers.isNotEmpty()) {
servers.forEach {
Log.i(TAG, "Using DNS server $it")
builder.addDnsServer(it)
}
}
}
if (preferences.getBoolean(KEY_ENABLE_CHROME_FIX, false)) {
builder.addRoute("2001:4860:4860::8888", 128)
}
parcel = builder.establish()
val parcel = parcel
if (parcel == null || !parcel.fileDescriptor.valid()) {
@ -123,7 +140,7 @@ class PacketTunnelProvider: VpnService() {
intent.putExtra("ip", yggdrasil.addressString)
intent.putExtra("subnet", yggdrasil.subnetString)
intent.putExtra("coords", yggdrasil.coordsString)
intent.putExtra("peers", JSONArray(yggdrasil.peersJSON).length())
intent.putExtra("peers", yggdrasil.peersJSON)
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
}
@ -214,7 +231,7 @@ class PacketTunnelProvider: VpnService() {
}
private fun reader() {
var b = ByteArray(65535)
val b = ByteArray(65535)
reads@ while (started.get()) {
val readerStream = readerStream
val readerThread = readerThread