Commit c9ba87da authored by Mygod's avatar Mygod

Support more DNS address formats

The following formats are now supported:

* 8.8.8.8
* 8.8.8.8:53
* [2606:4700:4700::1001]
* [2606:4700:4700::1001]:53
* 1dot1dot1dot1.cloudflare-dns.com
* 1dot1dot1dot1.cloudflare-dns.com:53

Multiple DNS servers support is dropped.
parent bb6b2d61
...@@ -28,6 +28,7 @@ import com.github.shadowsocks.net.Socks5Endpoint ...@@ -28,6 +28,7 @@ import com.github.shadowsocks.net.Socks5Endpoint
import com.github.shadowsocks.net.Subnet import com.github.shadowsocks.net.Subnet
import com.github.shadowsocks.preference.DataStore import com.github.shadowsocks.preference.DataStore
import java.net.InetSocketAddress import java.net.InetSocketAddress
import java.net.URI
import java.util.* import java.util.*
object LocalDnsService { object LocalDnsService {
...@@ -44,8 +45,9 @@ object LocalDnsService { ...@@ -44,8 +45,9 @@ object LocalDnsService {
override suspend fun startProcesses() { override suspend fun startProcesses() {
super.startProcesses() super.startProcesses()
val profile = data.proxy!!.profile val profile = data.proxy!!.profile
val dns = URI("dns://${profile.remoteDns}")
servers[this] = LocalDnsServer(this::resolver, servers[this] = LocalDnsServer(this::resolver,
Socks5Endpoint(profile.remoteDns.split(",").first(), 53), Socks5Endpoint(dns.host, if (dns.port < 0) 53 else dns.port),
DataStore.proxyAddress).apply { DataStore.proxyAddress).apply {
tcp = !profile.udpdns tcp = !profile.udpdns
when (profile.route) { when (profile.route) {
......
...@@ -47,7 +47,7 @@ import java.security.MessageDigest ...@@ -47,7 +47,7 @@ import java.security.MessageDigest
* This class sets up environment for ss-local. * This class sets up environment for ss-local.
*/ */
class ProxyInstance(val profile: Profile, private val route: String = profile.route) : AutoCloseable { class ProxyInstance(val profile: Profile, private val route: String = profile.route) : AutoCloseable {
var configFile: File? = null private var configFile: File? = null
var trafficMonitor: TrafficMonitor? = null var trafficMonitor: TrafficMonitor? = null
private val plugin = PluginConfiguration(profile.plugin ?: "").selectedOptions private val plugin = PluginConfiguration(profile.plugin ?: "").selectedOptions
val pluginPath by lazy { PluginManager.init(plugin) } val pluginPath by lazy { PluginManager.init(plugin) }
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
package com.github.shadowsocks.net package com.github.shadowsocks.net
import android.os.Build
import android.os.SystemClock import android.os.SystemClock
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
...@@ -29,12 +30,12 @@ import com.github.shadowsocks.acl.Acl ...@@ -29,12 +30,12 @@ import com.github.shadowsocks.acl.Acl
import com.github.shadowsocks.core.R import com.github.shadowsocks.core.R
import com.github.shadowsocks.preference.DataStore import com.github.shadowsocks.preference.DataStore
import com.github.shadowsocks.utils.Key import com.github.shadowsocks.utils.Key
import com.github.shadowsocks.utils.responseLength
import kotlinx.coroutines.* import kotlinx.coroutines.*
import java.io.IOException import java.io.IOException
import java.net.HttpURLConnection import java.net.HttpURLConnection
import java.net.Proxy import java.net.Proxy
import java.net.URL import java.net.URL
import java.net.URLConnection
/** /**
* Based on: https://android.googlesource.com/platform/frameworks/base/+/b19a838/services/core/java/com/android/server/connectivity/NetworkMonitor.java#1071 * Based on: https://android.googlesource.com/platform/frameworks/base/+/b19a838/services/core/java/com/android/server/connectivity/NetworkMonitor.java#1071
...@@ -116,4 +117,7 @@ class HttpsTest : ViewModel() { ...@@ -116,4 +117,7 @@ class HttpsTest : ViewModel() {
cancelTest() cancelTest()
status.value = Status.Idle status.value = Status.Idle
} }
private val URLConnection.responseLength: Long
get() = if (Build.VERSION.SDK_INT >= 24) contentLengthLong else contentLength.toLong()
} }
package com.github.shadowsocks.net package com.github.shadowsocks.net
import com.github.shadowsocks.utils.shutdown import android.system.ErrnoException
import android.system.Os
import android.system.OsConstants
import java.io.FileDescriptor import java.io.FileDescriptor
import java.io.IOException
abstract class SocketListener(name: String) : Thread(name), AutoCloseable { abstract class SocketListener(name: String) : Thread(name), AutoCloseable {
protected abstract val fileDescriptor: FileDescriptor protected abstract val fileDescriptor: FileDescriptor
@Volatile @Volatile
protected var running = true protected var running = true
private fun FileDescriptor.shutdown() {
// see also: https://issuetracker.google.com/issues/36945762#comment15
if (valid()) try {
Os.shutdown(this, OsConstants.SHUT_RDWR)
} catch (e: ErrnoException) {
// suppress fd inactive or already closed
if (e.errno != OsConstants.EBADF && e.errno != OsConstants.ENOTCONN) throw IOException(e)
}
}
override fun close() { override fun close() {
running = false running = false
fileDescriptor.shutdown() fileDescriptor.shutdown()
......
...@@ -30,17 +30,13 @@ import android.graphics.BitmapFactory ...@@ -30,17 +30,13 @@ import android.graphics.BitmapFactory
import android.graphics.ImageDecoder import android.graphics.ImageDecoder
import android.net.Uri import android.net.Uri
import android.os.Build import android.os.Build
import android.system.ErrnoException
import android.system.Os import android.system.Os
import android.system.OsConstants import android.system.OsConstants
import android.util.TypedValue import android.util.TypedValue
import androidx.annotation.AttrRes import androidx.annotation.AttrRes
import androidx.preference.Preference import androidx.preference.Preference
import com.crashlytics.android.Crashlytics import com.crashlytics.android.Crashlytics
import java.io.FileDescriptor
import java.io.IOException
import java.net.InetAddress import java.net.InetAddress
import java.net.URLConnection
private val parseNumericAddress by lazy { private val parseNumericAddress by lazy {
InetAddress::class.java.getDeclaredMethod("parseNumericAddress", String::class.java).apply { InetAddress::class.java.getDeclaredMethod("parseNumericAddress", String::class.java).apply {
...@@ -55,16 +51,6 @@ private val parseNumericAddress by lazy { ...@@ -55,16 +51,6 @@ private val parseNumericAddress by lazy {
fun String?.parseNumericAddress(): InetAddress? = Os.inet_pton(OsConstants.AF_INET, this) fun String?.parseNumericAddress(): InetAddress? = Os.inet_pton(OsConstants.AF_INET, this)
?: Os.inet_pton(OsConstants.AF_INET6, this)?.let { parseNumericAddress.invoke(null, this) as InetAddress } ?: Os.inet_pton(OsConstants.AF_INET6, this)?.let { parseNumericAddress.invoke(null, this) as InetAddress }
fun FileDescriptor.shutdown() {
// see also: https://issuetracker.google.com/issues/36945762#comment15
if (valid()) try {
Os.shutdown(this, OsConstants.SHUT_RDWR)
} catch (e: ErrnoException) {
// suppress fd inactive or already closed
if (e.errno != OsConstants.EBADF && e.errno != OsConstants.ENOTCONN) throw IOException(e)
}
}
fun parsePort(str: String?, default: Int, min: Int = 1025): Int { fun parsePort(str: String?, default: Int, min: Int = 1025): Int {
val value = str?.toIntOrNull() ?: default val value = str?.toIntOrNull() ?: default
return if (value < min || value > 65535) default else value return if (value < min || value > 65535) default else value
...@@ -74,9 +60,6 @@ fun broadcastReceiver(callback: (Context, Intent) -> Unit): BroadcastReceiver = ...@@ -74,9 +60,6 @@ fun broadcastReceiver(callback: (Context, Intent) -> Unit): BroadcastReceiver =
override fun onReceive(context: Context, intent: Intent) = callback(context, intent) override fun onReceive(context: Context, intent: Intent) = callback(context, intent)
} }
val URLConnection.responseLength: Long
get() = if (Build.VERSION.SDK_INT >= 24) contentLengthLong else contentLength.toLong()
fun ContentResolver.openBitmap(uri: Uri) = fun ContentResolver.openBitmap(uri: Uri) =
if (Build.VERSION.SDK_INT >= 28) ImageDecoder.decodeBitmap(ImageDecoder.createSource(this, uri)) if (Build.VERSION.SDK_INT >= 28) ImageDecoder.decodeBitmap(ImageDecoder.createSource(this, uri))
else BitmapFactory.decodeStream(openInputStream(uri)) else BitmapFactory.decodeStream(openInputStream(uri))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment