Commit a3acfbeb authored by Max Lv's avatar Max Lv

resolve the IP using dnsjava

parent 7c4a6c40
...@@ -11,6 +11,7 @@ libraryDependencies ++= Seq( ...@@ -11,6 +11,7 @@ libraryDependencies ++= Seq(
"com.actionbarsherlock" % "actionbarsherlock" % "4.2.0" artifacts(Artifact("actionbarsherlock", "apklib", "apklib")), "com.actionbarsherlock" % "actionbarsherlock" % "4.2.0" artifacts(Artifact("actionbarsherlock", "apklib", "apklib")),
"net.saik0.android.unifiedpreference" % "unifiedpreference" % "0.0.2" artifacts(Artifact("unifiedpreference", "apklib", "apklib")), "net.saik0.android.unifiedpreference" % "unifiedpreference" % "0.0.2" artifacts(Artifact("unifiedpreference", "apklib", "apklib")),
"org.jraf" % "android-switch-backport" % "1.0" artifacts(Artifact("android-switch-backport", "apklib", "apklib")), "org.jraf" % "android-switch-backport" % "1.0" artifacts(Artifact("android-switch-backport", "apklib", "apklib")),
"de.keyboardsurfer.android.widget" % "crouton" % "1.7" "de.keyboardsurfer.android.widget" % "crouton" % "1.7",
"dnsjava" % "dnsjava" % "2.1.1"
) )
...@@ -52,11 +52,11 @@ import android.util.Log ...@@ -52,11 +52,11 @@ import android.util.Log
import com.google.analytics.tracking.android.EasyTracker import com.google.analytics.tracking.android.EasyTracker
import java.io._ import java.io._
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.net.Inet6Address
import java.net.InetAddress
import java.net.UnknownHostException
import android.net.VpnService import android.net.VpnService
import org.apache.http.conn.util.InetAddressUtils import org.apache.http.conn.util.InetAddressUtils
import org.xbill.DNS._
import android.os.Message
import scala.Some
object ShadowVpnService { object ShadowVpnService {
def isServiceStarted: Boolean = { def isServiceStarted: Boolean = {
...@@ -118,6 +118,23 @@ class ShadowVpnService extends VpnService { ...@@ -118,6 +118,23 @@ class ShadowVpnService extends VpnService {
}.start() }.start()
} }
def resolve(host: String, addrType: Int): Option[String] = {
val lookup = new Lookup(host, addrType)
val resolver = new SimpleResolver("8.8.8.8")
resolver.setTimeout(5)
lookup.setResolver(resolver)
val records = lookup.run()
for (r <- records) {
addrType match {
case org.xbill.DNS.Type.A =>
return Some(r.asInstanceOf[ARecord].getAddress.getHostAddress)
case org.xbill.DNS.Type.AAAA =>
return Some(r.asInstanceOf[AAAARecord].getAddress.getHostAddress)
}
}
None
}
def getVersionName: String = { def getVersionName: String = {
var version: String = null var version: String = null
try { try {
...@@ -168,35 +185,30 @@ class ShadowVpnService extends VpnService { ...@@ -168,35 +185,30 @@ class ShadowVpnService extends VpnService {
def run() { def run() {
handler.sendEmptyMessage(MSG_CONNECT_START) handler.sendEmptyMessage(MSG_CONNECT_START)
var resolved: Boolean = false var resolved: Boolean = false
if (appHost != null) { if (!InetAddressUtils.isIPv4Address(appHost) && !InetAddressUtils.isIPv6Address(appHost)) {
var addr: InetAddress = null if (Utils.isIPv6Support) {
val isIPv6Support: Boolean = Utils.isIPv6Support resolve(appHost, Type.AAAA) match {
case Some(host) => {
try { appHost = host
val addrs = InetAddress.getAllByName(appHost) resolved = true
for (a <- addrs) {
if (isIPv6Support && addr == null && a.isInstanceOf[Inet6Address]) {
addr = a
}
} }
if (addr == null) addr = addrs(0)
} catch {
case ignored: UnknownHostException => {
addr = null
} }
} }
if (addr != null) { if (!resolved) {
appHost = addr.getHostAddress resolve(appHost, Type.A) match {
case Some(host) => {
appHost = host
resolved = true resolved = true
} }
} }
Log.d(TAG, "IPTABLES: " + Utils.getIptables) }
hasRedirectSupport = Utils.getHasRedirectSupport } else {
resolved = true
}
if (resolved && handleConnection) { if (resolved && handleConnection) {
notifyAlert(getString(R.string.forward_success), getString(R.string.service_running)) notifyAlert(getString(R.string.forward_success), getString(R.string.service_running))
handler.sendEmptyMessageDelayed(MSG_CONNECT_SUCCESS, 500) handler.sendEmptyMessageDelayed(MSG_CONNECT_SUCCESS, 500)
} } else {
else {
notifyAlert(getString(R.string.forward_fail), getString(R.string.service_failed)) notifyAlert(getString(R.string.forward_fail), getString(R.string.service_failed))
stopSelf() stopSelf()
handler.sendEmptyMessageDelayed(MSG_CONNECT_FAIL, 500) handler.sendEmptyMessageDelayed(MSG_CONNECT_FAIL, 500)
...@@ -391,7 +403,6 @@ class ShadowVpnService extends VpnService { ...@@ -391,7 +403,6 @@ class ShadowVpnService extends VpnService {
var localPort: Int = 0 var localPort: Int = 0
var sitekey: String = null var sitekey: String = null
var settings: SharedPreferences = null var settings: SharedPreferences = null
var hasRedirectSupport: Boolean = true
var isGlobalProxy: Boolean = false var isGlobalProxy: Boolean = false
var isGFWList: Boolean = false var isGFWList: Boolean = false
var isBypassApps: Boolean = false var isBypassApps: Boolean = false
......
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