From 2cb1eb27ccc1aff8d3e9686f94290f555c49fe31 Mon Sep 17 00:00:00 2001 From: Max Lv Date: Thu, 27 Feb 2014 09:27:01 +0800 Subject: [PATCH 1/4] add upd dns mode --- build-ndk.sh | 2 +- project/Build.scala | 4 +-- src/main/assets/pages/about.html | 2 +- src/main/jni/Android.mk | 25 ++++++++++++++++-- src/main/jni/shadowsocks | 2 +- .../com/github/shadowsocks/Shadowsocks.scala | 9 ++++--- .../shadowsocks/ShadowsocksNatService.scala | 26 ++++++++++++------- .../shadowsocks/ShadowsocksVpnService.scala | 24 ++++++++++------- 8 files changed, 65 insertions(+), 29 deletions(-) diff --git a/build-ndk.sh b/build-ndk.sh index 19d230a8..a8c3608e 100755 --- a/build-ndk.sh +++ b/build-ndk.sh @@ -5,7 +5,7 @@ ndk-build mkdir -p assets/armeabi mkdir -p assets/armeabi-v7a mkdir -p assets/x86 -for app in iptables pdnsd redsocks shadowsocks tun2socks +for app in iptables pdnsd redsocks ss-local ss-tunnel tun2socks do mv libs/armeabi/$app assets/armeabi/ mv libs/armeabi-v7a/$app assets/armeabi-v7a/ diff --git a/project/Build.scala b/project/Build.scala index 3d6450d9..6ba7fb5b 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -5,8 +5,8 @@ import sbtandroid._ import sbtandroid.AndroidPlugin._ object App { - val version = "2.1.1" - val versionCode = 62 + val version = "2.1.2" + val versionCode = 63 } object General { diff --git a/src/main/assets/pages/about.html b/src/main/assets/pages/about.html index d22cdf3b..f64fac6e 100644 --- a/src/main/assets/pages/about.html +++ b/src/main/assets/pages/about.html @@ -274,7 +274,7 @@ img {

A Shadowsocks client for Android, written in Scala.

-

Copyright (C) 2013 Max Lv max.c.lv@gmail.com

+

Copyright (C) 2014 Max Lv max.c.lv@gmail.com

This program 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 diff --git a/src/main/jni/Android.mk b/src/main/jni/Android.mk index 0e23bf66..eaeb435e 100755 --- a/src/main/jni/Android.mk +++ b/src/main/jni/Android.mk @@ -89,14 +89,14 @@ LOCAL_CFLAGS := -Wall -O2 -I$(LOCAL_PATH)/pdnsd include $(BUILD_EXECUTABLE) ######################################################## -## shadowsocks +## shadowsocks local ######################################################## include $(CLEAR_VARS) SHADOWSOCKS_SOURCES := local.c cache.c udprelay.c encrypt.c utils.c json.c jconf.c -LOCAL_MODULE := shadowsocks +LOCAL_MODULE := ss-local LOCAL_SRC_FILES := $(addprefix shadowsocks/src/, $(SHADOWSOCKS_SOURCES)) LOCAL_CFLAGS := -Wall -O2 -fno-strict-aliasing -DUDPRELAY_LOCAL \ -DUSE_CRYPTO_OPENSSL -DANDROID -DHAVE_CONFIG_H \ @@ -109,6 +109,27 @@ LOCAL_LDLIBS := -llog include $(BUILD_EXECUTABLE) +######################################################## +## shadowsocks tunnel +######################################################## + +include $(CLEAR_VARS) + +SHADOWSOCKS_SOURCES := tunnel.c cache.c udprelay.c encrypt.c utils.c json.c jconf.c + +LOCAL_MODULE := ss-tunnel +LOCAL_SRC_FILES := $(addprefix shadowsocks/src/, $(SHADOWSOCKS_SOURCES)) +LOCAL_CFLAGS := -Wall -O2 -fno-strict-aliasing -DUDPRELAY_LOCAL -DUDPRELAY_TUNNEL \ + -DUSE_CRYPTO_OPENSSL -DANDROID -DHAVE_CONFIG_H \ + -I$(LOCAL_PATH)/libev/ \ + -I$(LOCAL_PATH)/openssl/include + +LOCAL_STATIC_LIBRARIES := libev libcrypto + +LOCAL_LDLIBS := -llog + +include $(BUILD_EXECUTABLE) + ######################################################## ## termExec ######################################################## diff --git a/src/main/jni/shadowsocks b/src/main/jni/shadowsocks index 69f8bd61..b2df5a4c 160000 --- a/src/main/jni/shadowsocks +++ b/src/main/jni/shadowsocks @@ -1 +1 @@ -Subproject commit 69f8bd61c096337abb34a9e64534865d08022957 +Subproject commit b2df5a4c26d293469237fd89153e16f1fa47000c diff --git a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala index dbd3d43b..1610ba2d 100644 --- a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala +++ b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala @@ -417,10 +417,12 @@ class Shadowsocks val sb = new StringBuilder sb.append("kill -9 `cat /data/data/com.github.shadowsocks/pdnsd.pid`").append("\n") - sb.append("kill -9 `cat /data/data/com.github.shadowsocks/shadowsocks.pid`").append("\n") + sb.append("kill -9 `cat /data/data/com.github.shadowsocks/ss-local.pid`").append("\n") + sb.append("kill -9 `cat /data/data/com.github.shadowsocks/ss-tunnel.pid`").append("\n") sb.append("kill -9 `cat /data/data/com.github.shadowsocks/tun2socks.pid`").append("\n") sb.append("killall -9 pdnsd").append("\n") - sb.append("killall -9 shadowsocks").append("\n") + sb.append("killall -9 ss-local").append("\n") + sb.append("killall -9 ss-tunnel").append("\n") sb.append("killall -9 tun2socks").append("\n") sb.append("rm /data/data/com.github.shadowsocks/pdnsd.conf").append("\n") sb.append("rm /data/data/com.github.shadowsocks/pdnsd.cache").append("\n") @@ -908,7 +910,8 @@ class Shadowsocks Utils.runCommand("chmod 755 /data/data/com.github.shadowsocks/iptables\n" + "chmod 755 /data/data/com.github.shadowsocks/redsocks\n" + "chmod 755 /data/data/com.github.shadowsocks/pdnsd\n" - + "chmod 755 /data/data/com.github.shadowsocks/shadowsocks\n" + + "chmod 755 /data/data/com.github.shadowsocks/ss-local\n" + + "chmod 755 /data/data/com.github.shadowsocks/ss-tunnel\n" + "chmod 755 /data/data/com.github.shadowsocks/tun2socks\n") } diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala index ee3a7f45..78a353aa 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala @@ -102,20 +102,24 @@ class ShadowsocksNatService extends Service with BaseService { val handler: Handler = new Handler() def startShadowsocksDaemon() { - val cmd: String = (Path.BASE + - "shadowsocks -b 127.0.0.1 -s \"%s\" -p \"%d\" -l \"%d\" -k \"%s\" -m \"%s\" -f " + - Path.BASE + "shadowsocks.pid") + val cmd = (Path.BASE + + "ss-local -b 127.0.0.1 -s \"%s\" -p \"%d\" -l \"%d\" -k \"%s\" -m \"%s\" -f " + + Path.BASE + "ss-local.pid") .format(config.proxy, config.remotePort, config.localPort, config.sitekey, config.encMethod) if (BuildConfig.DEBUG) Log.d(TAG, cmd) Utils.runCommand(cmd) } def startDnsDaemon() { - val cmd: String = Path.BASE + "pdnsd -c " + Path.BASE + "pdnsd.conf" - val conf: String = ConfigUtils.PDNSD.format("127.0.0.1") - ConfigUtils.printToFile(new File(Path.BASE + "pdnsd.conf"))(p => { - p.println(conf) - }) + val cmd = (Path.BASE + + "ss-tunnel -b 127.0.0.1 -s \"%s\" -p \"%d\" -l \"%d\" -k \"%s\" -m \"%s\" -L 8.8.8.8:53 -u -f " + + Path.BASE + "ss-local.pid") + .format(config.proxy, config.remotePort, 8153, config.sitekey, config.encMethod) + // val cmd = Path.BASE + "pdnsd -c " + Path.BASE + "pdnsd.conf" + // val conf = ConfigUtils.PDNSD.format("127.0.0.1") + // ConfigUtils.printToFile(new File(Path.BASE + "pdnsd.conf"))(p => { + // p.println(conf) + // }) Utils.runCommand(cmd) } @@ -271,8 +275,10 @@ class ShadowsocksNatService extends Service with BaseService { sb ++= "kill -9 `cat " ++= Path.BASE ++= "pdnsd.pid`" ++= "\n" sb ++= "killall -9 pdnsd" ++= "\n" - sb ++= "kill -9 `cat " ++= Path.BASE ++= "shadowsocks.pid`" ++= "\n" - sb ++= "killall -9 shadowsocks" ++= "\n" + sb ++= "kill -9 `cat " ++= Path.BASE ++= "ss-local.pid`" ++= "\n" + sb ++= "killall -9 ss-local" ++= "\n" + sb ++= "kill -9 `cat " ++= Path.BASE ++= "ss-tunnel.pid`" ++= "\n" + sb ++= "killall -9 ss-tunnel" ++= "\n" Utils.runCommand(sb.toString()) } diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala index 8df6e702..5c5495c6 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala @@ -84,11 +84,15 @@ class ShadowsocksVpnService extends VpnService with BaseService { } def startDnsDaemon() { - val cmd: String = Path.BASE + "pdnsd -c " + Path.BASE + "pdnsd.conf" - val conf: String = ConfigUtils.PDNSD.format("0.0.0.0") - ConfigUtils.printToFile(new File(Path.BASE + "pdnsd.conf"))(p => { - p.println(conf) - }) + val cmd = (Path.BASE + + "ss-tunnel -b 127.0.0.1 -s \"%s\" -p \"%d\" -l \"%d\" -k \"%s\" -m \"%s\" -L 8.8.8.8:53 -u -f " + + Path.BASE + "ss-local.pid") + .format(config.proxy, config.remotePort, 8153, config.sitekey, config.encMethod) + // val cmd: String = Path.BASE + "pdnsd -c " + Path.BASE + "pdnsd.conf" + // val conf: String = ConfigUtils.PDNSD.format("0.0.0.0") + // ConfigUtils.printToFile(new File(Path.BASE + "pdnsd.conf"))(p => { + // p.println(conf) + // }) Utils.runCommand(cmd) } @@ -243,12 +247,14 @@ class ShadowsocksVpnService extends VpnService with BaseService { def killProcesses() { val sb = new StringBuilder - sb ++= "kill -9 `cat " ++= Path.BASE ++= "shadowsocks.pid`" ++= "\n" - sb ++= "killall -9 shadowsocks" ++= "\n" + sb ++= "kill -9 `cat " ++= Path.BASE ++= "ss-local.pid`" ++= "\n" + sb ++= "killall -9 ss-local" ++= "\n" + sb ++= "kill -9 `cat " ++= Path.BASE ++= "ss-tunnel.pid`" ++= "\n" + sb ++= "killall -9 ss-tunnel" ++= "\n" sb ++= "kill -9 `cat " ++= Path.BASE ++= "tun2socks.pid`" ++= "\n" sb ++= "killall -9 tun2socks" ++= "\n" - sb ++= "kill -9 `cat " ++= Path.BASE ++= "pdnsd.pid`" ++= "\n" - sb ++= "killall -9 pdnsd" ++= "\n" + // sb ++= "kill -9 `cat " ++= Path.BASE ++= "pdnsd.pid`" ++= "\n" + // sb ++= "killall -9 pdnsd" ++= "\n" Utils.runCommand(sb.toString()) } From 110a4eb096dfd4a6409464d0132d6220d29f911a Mon Sep 17 00:00:00 2001 From: Max Lv Date: Fri, 28 Feb 2014 09:53:41 +0800 Subject: [PATCH 2/4] update the s3 bucket path --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 817a3f03..226a30d8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,7 +35,7 @@ after_success: - sbt deploy env: global: - - "ARTIFACTS_AWS_REGION=ap-northeast-1" - - "ARTIFACTS_S3_BUCKET=travis-ci" + - "ARTIFACTS_AWS_REGION=us-east-1" + - "ARTIFACTS_S3_BUCKET=travis-nightly" - secure: "GkAdnMh07id2VKhpCW16lE73A0LK2Jsk3hzkFvdx76JKW8FjLgaimLJ2T/+i\nxFfDw8XBinLE09dqg8JxSNS6JbLHLcav8P3yJIlzFh1NqfJABU9U4I8atb6P\nITSdSo9nb3LX6sB8SOU0nqXb5U+nj7jiekQqiBhmEmu6iDmMtfU=" - secure: "eCh5BjCFccp+sB/FIrjsmxJU4475D4qiWvDV++khcIHLel6lgUjDX18ImBlJ\n+IdiCKxvR6EpRDV1Cs4gJ2jZEAV0PbojQMoQOXbs1FLggM8RRq/Re1qWQFq7\nWkBRjjr8w8ddjJZHRo459cTUvgvD7krhp07coabAnEahDaGWSUo=" From c4429633942758db6e187a594d16b746324feffa Mon Sep 17 00:00:00 2001 From: Max Lv Date: Fri, 28 Feb 2014 17:27:23 +0800 Subject: [PATCH 3/4] unblock the service callback --- .../java/com/github/shadowsocks/aidl/IShadowsocksService.aidl | 4 ++-- .../github/shadowsocks/aidl/IShadowsocksServiceCallback.aidl | 4 ++-- src/main/scala/com/github/shadowsocks/BaseService.scala | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/github/shadowsocks/aidl/IShadowsocksService.aidl b/src/main/java/com/github/shadowsocks/aidl/IShadowsocksService.aidl index 66b2f820..70667310 100644 --- a/src/main/java/com/github/shadowsocks/aidl/IShadowsocksService.aidl +++ b/src/main/java/com/github/shadowsocks/aidl/IShadowsocksService.aidl @@ -7,8 +7,8 @@ interface IShadowsocksService { int getMode(); int getState(); - void registerCallback(IShadowsocksServiceCallback cb); - void unregisterCallback(IShadowsocksServiceCallback cb); + oneway void registerCallback(IShadowsocksServiceCallback cb); + oneway void unregisterCallback(IShadowsocksServiceCallback cb); oneway void start(in Config config); oneway void stop(); diff --git a/src/main/java/com/github/shadowsocks/aidl/IShadowsocksServiceCallback.aidl b/src/main/java/com/github/shadowsocks/aidl/IShadowsocksServiceCallback.aidl index 00ef9b63..d079a20c 100644 --- a/src/main/java/com/github/shadowsocks/aidl/IShadowsocksServiceCallback.aidl +++ b/src/main/java/com/github/shadowsocks/aidl/IShadowsocksServiceCallback.aidl @@ -1,5 +1,5 @@ package com.github.shadowsocks.aidl; interface IShadowsocksServiceCallback { - void stateChanged(int state, String msg); -} \ No newline at end of file + oneway void stateChanged(int state, String msg); +} diff --git a/src/main/scala/com/github/shadowsocks/BaseService.scala b/src/main/scala/com/github/shadowsocks/BaseService.scala index ae4be7a1..9e90efb4 100644 --- a/src/main/scala/com/github/shadowsocks/BaseService.scala +++ b/src/main/scala/com/github/shadowsocks/BaseService.scala @@ -106,9 +106,8 @@ trait BaseService { override def run() { if (state != s) { val n = callbacks.beginBroadcast() - val m = if (msg != null) msg.substring(0, 64) else null for (i <- 0 to n - 1) { - callbacks.getBroadcastItem(i).stateChanged(s, m) + callbacks.getBroadcastItem(i).stateChanged(s, msg) } callbacks.finishBroadcast() state = s From a89ca2d15491da9227ac01c71839e8fffd7eba19 Mon Sep 17 00:00:00 2001 From: Max Lv Date: Fri, 28 Feb 2014 20:14:47 +0800 Subject: [PATCH 4/4] add udp dns option --- .../com/github/shadowsocks/aidl/Config.java | 34 ++++++++++--------- src/main/res/values-zh/strings.xml | 3 ++ src/main/res/values/strings.xml | 2 ++ src/main/res/xml/pref_feature.xml | 14 +++++--- .../com/github/shadowsocks/Shadowsocks.scala | 3 +- .../shadowsocks/ShadowsocksNatService.scala | 22 +++++++----- .../shadowsocks/ShadowsocksVpnService.scala | 25 ++++++++------ .../shadowsocks/database/DBHelper.scala | 8 +++-- .../github/shadowsocks/database/Profile.scala | 3 ++ .../shadowsocks/database/ProfileManager.scala | 2 ++ .../shadowsocks/utils/ConfigUtils.scala | 6 ++-- .../github/shadowsocks/utils/Constants.scala | 1 + 12 files changed, 78 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/github/shadowsocks/aidl/Config.java b/src/main/java/com/github/shadowsocks/aidl/Config.java index cac52c3c..f0afc982 100644 --- a/src/main/java/com/github/shadowsocks/aidl/Config.java +++ b/src/main/java/com/github/shadowsocks/aidl/Config.java @@ -9,6 +9,7 @@ public class Config implements Parcelable { public boolean isGFWList = true; public boolean isBypassApps = false; public boolean isTrafficStat = false; + public boolean isUdpDns = false; public String profileName = "Untitled"; public String proxy = "127.0.0.1"; @@ -20,24 +21,24 @@ public class Config implements Parcelable { public int remotePort = 1984; public int localPort = 1080; - public static final Parcelable.Creator CREATOR = new - Parcelable.Creator() { - public Config createFromParcel(Parcel in) { - return new Config(in); - } + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public Config createFromParcel(Parcel in) { + return new Config(in); + } - public Config[] newArray(int size) { - return new Config[size]; - } - }; + public Config[] newArray(int size) { + return new Config[size]; + } + }; public Config(boolean isGlobalProxy, boolean isGFWList, boolean isBypassApps, - boolean isTrafficStat, String profileName, String proxy, String sitekey, String encMethod, - String proxiedAppString, int remotePort, int localPort) { + boolean isTrafficStat, boolean isUdpDns, String profileName, String proxy, String sitekey, + String encMethod, String proxiedAppString, int remotePort, int localPort) { this.isGlobalProxy = isGlobalProxy; this.isGFWList = isGFWList; this.isBypassApps = isBypassApps; this.isTrafficStat = isTrafficStat; + this.isUdpDns = isUdpDns; this.profileName = profileName; this.proxy = proxy; this.sitekey = sitekey; @@ -56,6 +57,7 @@ public class Config implements Parcelable { isGFWList = in.readInt() == 1; isBypassApps = in.readInt() == 1; isTrafficStat = in.readInt() == 1; + isUdpDns = in.readInt() == 1; profileName = in.readString(); proxy = in.readString(); sitekey = in.readString(); @@ -70,10 +72,11 @@ public class Config implements Parcelable { } @Override public void writeToParcel(Parcel out, int flags) { - out.writeInt(isGlobalProxy ? 1: 0); - out.writeInt(isGFWList ? 1: 0); - out.writeInt(isBypassApps ? 1: 0); - out.writeInt(isTrafficStat ? 1: 0); + out.writeInt(isGlobalProxy ? 1 : 0); + out.writeInt(isGFWList ? 1 : 0); + out.writeInt(isBypassApps ? 1 : 0); + out.writeInt(isTrafficStat ? 1 : 0); + out.writeInt(isUdpDns ? 1 : 0); out.writeString(profileName); out.writeString(proxy); out.writeString(sitekey); @@ -81,6 +84,5 @@ public class Config implements Parcelable { out.writeString(proxiedAppString); out.writeInt(remotePort); out.writeInt(localPort); - } } diff --git a/src/main/res/values-zh/strings.xml b/src/main/res/values-zh/strings.xml index f3b6b1d4..9d1e2df6 100755 --- a/src/main/res/values-zh/strings.xml +++ b/src/main/res/values-zh/strings.xml @@ -67,6 +67,9 @@ 刷新中... 添加配置文件 + DNS转发 + 向远程服务器转发UDP协议的DNS请求 + 为影梭添加此配置文件? diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index a2348b15..0ecd7be2 100755 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -45,6 +45,8 @@ Enable Shadowsocks on startup Traffic Stats Show traffic stats in notification bar + DNS Forwarding + Forward DNS\'s UDP packets to remote server Shadowsocks started. diff --git a/src/main/res/xml/pref_feature.xml b/src/main/res/xml/pref_feature.xml index 758e9c7f..630de01e 100755 --- a/src/main/res/xml/pref_feature.xml +++ b/src/main/res/xml/pref_feature.xml @@ -22,10 +22,16 @@ + android:key="isTrafficStat" + android:defaultValue="true" + android:summary="@string/traffic_stat_summary" + android:title="@string/traffic_stat"> + + updateCheckBoxPreference(pref, profile.chnroute) case Key.isGlobalProxy => updateCheckBoxPreference(pref, profile.global) case Key.isTrafficStat => updateCheckBoxPreference(pref, profile.traffic) + case Key.isUdpDns => updateCheckBoxPreference(pref, profile.udpdns) case _ => } } diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala index 78a353aa..e102c22e 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala @@ -111,15 +111,19 @@ class ShadowsocksNatService extends Service with BaseService { } def startDnsDaemon() { - val cmd = (Path.BASE + - "ss-tunnel -b 127.0.0.1 -s \"%s\" -p \"%d\" -l \"%d\" -k \"%s\" -m \"%s\" -L 8.8.8.8:53 -u -f " + - Path.BASE + "ss-local.pid") - .format(config.proxy, config.remotePort, 8153, config.sitekey, config.encMethod) - // val cmd = Path.BASE + "pdnsd -c " + Path.BASE + "pdnsd.conf" - // val conf = ConfigUtils.PDNSD.format("127.0.0.1") - // ConfigUtils.printToFile(new File(Path.BASE + "pdnsd.conf"))(p => { - // p.println(conf) - // }) + val cmd = if (config.isUdpDns) { + (Path.BASE + + "ss-tunnel -b 127.0.0.1 -s \"%s\" -p \"%d\" -l \"%d\" -k \"%s\" -m \"%s\" -L 8.8.8.8:53 -u -f " + + Path.BASE + "ss-local.pid") + .format(config.proxy, config.remotePort, 8153, config.sitekey, config.encMethod) + } else { + val conf = ConfigUtils.PDNSD.format("127.0.0.1") + ConfigUtils.printToFile(new File(Path.BASE + "pdnsd.conf"))(p => { + p.println(conf) + }) + Path.BASE + "pdnsd -c " + Path.BASE + "pdnsd.conf" + } + Utils.runCommand(cmd) } diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala index 5c5495c6..55503352 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala @@ -76,23 +76,26 @@ class ShadowsocksVpnService extends VpnService with BaseService { def startShadowsocksDaemon() { val cmd: String = (Path.BASE + - "shadowsocks -b 127.0.0.1 -s \"%s\" -p \"%d\" -l \"%d\" -k \"%s\" -m \"%s\" -f " + - Path.BASE + "shadowsocks.pid") + "ss-local -b 127.0.0.1 -s \"%s\" -p \"%d\" -l \"%d\" -k \"%s\" -m \"%s\" -f " + + Path.BASE + "ss-local.pid") .format(config.proxy, config.remotePort, config.localPort, config.sitekey, config.encMethod) if (BuildConfig.DEBUG) Log.d(TAG, cmd) System.exec(cmd) } def startDnsDaemon() { - val cmd = (Path.BASE + - "ss-tunnel -b 127.0.0.1 -s \"%s\" -p \"%d\" -l \"%d\" -k \"%s\" -m \"%s\" -L 8.8.8.8:53 -u -f " + - Path.BASE + "ss-local.pid") - .format(config.proxy, config.remotePort, 8153, config.sitekey, config.encMethod) - // val cmd: String = Path.BASE + "pdnsd -c " + Path.BASE + "pdnsd.conf" - // val conf: String = ConfigUtils.PDNSD.format("0.0.0.0") - // ConfigUtils.printToFile(new File(Path.BASE + "pdnsd.conf"))(p => { - // p.println(conf) - // }) + val cmd = if (config.isUdpDns) { + (Path.BASE + + "ss-tunnel -b 0.0.0.0 -s \"%s\" -p \"%d\" -l \"%d\" -k \"%s\" -m \"%s\" -L 8.8.8.8:53 -u -f " + + Path.BASE + "ss-tunnel.pid") + .format(config.proxy, config.remotePort, 8153, config.sitekey, config.encMethod) + } else { + val conf = ConfigUtils.PDNSD.format("0.0.0.0") + ConfigUtils.printToFile(new File(Path.BASE + "pdnsd.conf"))(p => { + p.println(conf) + }) + Path.BASE + "pdnsd -c " + Path.BASE + "pdnsd.conf" + } Utils.runCommand(cmd) } diff --git a/src/main/scala/com/github/shadowsocks/database/DBHelper.scala b/src/main/scala/com/github/shadowsocks/database/DBHelper.scala index f3582625..d68ca3f4 100644 --- a/src/main/scala/com/github/shadowsocks/database/DBHelper.scala +++ b/src/main/scala/com/github/shadowsocks/database/DBHelper.scala @@ -50,7 +50,7 @@ object DBHelper { val PROFILE = "profile.db" } -class DBHelper(val context: Context) extends OrmLiteSqliteOpenHelper(context, DBHelper.PROFILE, null, 7) { +class DBHelper(val context: Context) extends OrmLiteSqliteOpenHelper(context, DBHelper.PROFILE, null, 8) { lazy val profileDao:Dao[Profile,Int] = getDao(classOf[Profile]) @@ -59,7 +59,11 @@ class DBHelper(val context: Context) extends OrmLiteSqliteOpenHelper(context, DB } def onUpgrade(database: SQLiteDatabase, connectionSource: ConnectionSource, oldVersion: Int, newVersion: Int) { - TableUtils.dropTable(connectionSource, classOf[Profile], true) + if (oldVersion < 8) { + profileDao.executeRaw("ALTER TABLE `profile` ADD COLUMN udpdns INTEGER;") + } else { + TableUtils.dropTable(connectionSource, classOf[Profile], true) + } onCreate(database, connectionSource) } } diff --git a/src/main/scala/com/github/shadowsocks/database/Profile.scala b/src/main/scala/com/github/shadowsocks/database/Profile.scala index 20246ad9..14d3b8ee 100644 --- a/src/main/scala/com/github/shadowsocks/database/Profile.scala +++ b/src/main/scala/com/github/shadowsocks/database/Profile.scala @@ -84,6 +84,9 @@ class Profile { @DatabaseField var traffic: Boolean = false + @DatabaseField + var udpdns: Boolean = false + @DatabaseField(dataType = DataType.LONG_STRING) var individual: String = "" diff --git a/src/main/scala/com/github/shadowsocks/database/ProfileManager.scala b/src/main/scala/com/github/shadowsocks/database/ProfileManager.scala index 1a2df5f3..602a04af 100644 --- a/src/main/scala/com/github/shadowsocks/database/ProfileManager.scala +++ b/src/main/scala/com/github/shadowsocks/database/ProfileManager.scala @@ -121,6 +121,7 @@ class ProfileManager(settings: SharedPreferences, dbHelper: DBHelper) { edit.putBoolean(Key.isGFWList, profile.chnroute) edit.putBoolean(Key.isBypassApps, profile.bypass) edit.putBoolean(Key.isTrafficStat, profile.traffic) + edit.putBoolean(Key.isUdpDns, profile.udpdns) edit.putString(Key.profileName, profile.name) edit.putString(Key.proxy, profile.host) edit.putString(Key.sitekey, profile.password) @@ -143,6 +144,7 @@ class ProfileManager(settings: SharedPreferences, dbHelper: DBHelper) { profile.chnroute = settings.getBoolean(Key.isGFWList, false) profile.bypass = settings.getBoolean(Key.isBypassApps, false) profile.traffic = settings.getBoolean(Key.isTrafficStat, false) + profile.udpdns = settings.getBoolean(Key.isUdpDns, false) profile.name = settings.getString(Key.profileName, "default") profile.host = settings.getString(Key.proxy, "127.0.0.1") profile.password = settings.getString(Key.sitekey, "default") diff --git a/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala b/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala index 5090cd2f..230e3a11 100644 --- a/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala +++ b/src/main/scala/com/github/shadowsocks/utils/ConfigUtils.scala @@ -84,7 +84,8 @@ object ConfigUtils { val method = proxy(3).trim new Config(config.isGlobalProxy, config.isGFWList, config.isBypassApps, config.isTrafficStat, - config.profileName, host, password, method, config.proxiedAppString, port, config.localPort) + config.isUdpDns, config.profileName, host, password, method, config.proxiedAppString, port, + config.localPort) } def load(settings: SharedPreferences): Config = { @@ -92,6 +93,7 @@ object ConfigUtils { val isGFWList = settings.getBoolean(Key.isGFWList, false) val isBypassApps = settings.getBoolean(Key.isBypassApps, false) val isTrafficStat = settings.getBoolean(Key.isTrafficStat, false) + val isUdpDns = settings.getBoolean(Key.isUdpDns, false) val profileName = settings.getString(Key.profileName, "default") val proxy = settings.getString(Key.proxy, "127.0.0.1") @@ -111,7 +113,7 @@ object ConfigUtils { } val proxiedAppString = settings.getString(Key.proxied, "") - new Config(isGlobalProxy, isGFWList, isBypassApps, isTrafficStat, profileName, proxy, sitekey, + new Config(isGlobalProxy, isGFWList, isBypassApps, isTrafficStat, isUdpDns, profileName, proxy, sitekey, encMethod, proxiedAppString, remotePort, localPort) } diff --git a/src/main/scala/com/github/shadowsocks/utils/Constants.scala b/src/main/scala/com/github/shadowsocks/utils/Constants.scala index 614ab3d5..11ce486c 100644 --- a/src/main/scala/com/github/shadowsocks/utils/Constants.scala +++ b/src/main/scala/com/github/shadowsocks/utils/Constants.scala @@ -70,6 +70,7 @@ object Key { val isGFWList = "isGFWList" val isBypassApps = "isBypassApps" val isTrafficStat = "isTrafficStat" + val isUdpDns = "isUdpDns" val proxy = "proxy" val sitekey = "sitekey"