Commit a89ca2d1 authored by Max Lv's avatar Max Lv

add udp dns option

parent c4429633
...@@ -9,6 +9,7 @@ public class Config implements Parcelable { ...@@ -9,6 +9,7 @@ public class Config implements Parcelable {
public boolean isGFWList = true; public boolean isGFWList = true;
public boolean isBypassApps = false; public boolean isBypassApps = false;
public boolean isTrafficStat = false; public boolean isTrafficStat = false;
public boolean isUdpDns = false;
public String profileName = "Untitled"; public String profileName = "Untitled";
public String proxy = "127.0.0.1"; public String proxy = "127.0.0.1";
...@@ -20,8 +21,7 @@ public class Config implements Parcelable { ...@@ -20,8 +21,7 @@ public class Config implements Parcelable {
public int remotePort = 1984; public int remotePort = 1984;
public int localPort = 1080; public int localPort = 1080;
public static final Parcelable.Creator<Config> CREATOR = new public static final Parcelable.Creator<Config> CREATOR = new Parcelable.Creator<Config>() {
Parcelable.Creator<Config>() {
public Config createFromParcel(Parcel in) { public Config createFromParcel(Parcel in) {
return new Config(in); return new Config(in);
} }
...@@ -32,12 +32,13 @@ public class Config implements Parcelable { ...@@ -32,12 +32,13 @@ public class Config implements Parcelable {
}; };
public Config(boolean isGlobalProxy, boolean isGFWList, boolean isBypassApps, public Config(boolean isGlobalProxy, boolean isGFWList, boolean isBypassApps,
boolean isTrafficStat, String profileName, String proxy, String sitekey, String encMethod, boolean isTrafficStat, boolean isUdpDns, String profileName, String proxy, String sitekey,
String proxiedAppString, int remotePort, int localPort) { String encMethod, String proxiedAppString, int remotePort, int localPort) {
this.isGlobalProxy = isGlobalProxy; this.isGlobalProxy = isGlobalProxy;
this.isGFWList = isGFWList; this.isGFWList = isGFWList;
this.isBypassApps = isBypassApps; this.isBypassApps = isBypassApps;
this.isTrafficStat = isTrafficStat; this.isTrafficStat = isTrafficStat;
this.isUdpDns = isUdpDns;
this.profileName = profileName; this.profileName = profileName;
this.proxy = proxy; this.proxy = proxy;
this.sitekey = sitekey; this.sitekey = sitekey;
...@@ -56,6 +57,7 @@ public class Config implements Parcelable { ...@@ -56,6 +57,7 @@ public class Config implements Parcelable {
isGFWList = in.readInt() == 1; isGFWList = in.readInt() == 1;
isBypassApps = in.readInt() == 1; isBypassApps = in.readInt() == 1;
isTrafficStat = in.readInt() == 1; isTrafficStat = in.readInt() == 1;
isUdpDns = in.readInt() == 1;
profileName = in.readString(); profileName = in.readString();
proxy = in.readString(); proxy = in.readString();
sitekey = in.readString(); sitekey = in.readString();
...@@ -70,10 +72,11 @@ public class Config implements Parcelable { ...@@ -70,10 +72,11 @@ public class Config implements Parcelable {
} }
@Override public void writeToParcel(Parcel out, int flags) { @Override public void writeToParcel(Parcel out, int flags) {
out.writeInt(isGlobalProxy ? 1: 0); out.writeInt(isGlobalProxy ? 1 : 0);
out.writeInt(isGFWList ? 1: 0); out.writeInt(isGFWList ? 1 : 0);
out.writeInt(isBypassApps ? 1: 0); out.writeInt(isBypassApps ? 1 : 0);
out.writeInt(isTrafficStat ? 1: 0); out.writeInt(isTrafficStat ? 1 : 0);
out.writeInt(isUdpDns ? 1 : 0);
out.writeString(profileName); out.writeString(profileName);
out.writeString(proxy); out.writeString(proxy);
out.writeString(sitekey); out.writeString(sitekey);
...@@ -81,6 +84,5 @@ public class Config implements Parcelable { ...@@ -81,6 +84,5 @@ public class Config implements Parcelable {
out.writeString(proxiedAppString); out.writeString(proxiedAppString);
out.writeInt(remotePort); out.writeInt(remotePort);
out.writeInt(localPort); out.writeInt(localPort);
} }
} }
...@@ -67,6 +67,9 @@ ...@@ -67,6 +67,9 @@
<string name="flushing">刷新中...</string> <string name="flushing">刷新中...</string>
<string name="add_profile">添加配置文件</string> <string name="add_profile">添加配置文件</string>
<string name="udp_dns">DNS转发</string>
<string name="udp_dns_summary">向远程服务器转发UDP协议的DNS请求</string>
<!-- profile --> <!-- profile -->
<string name="add_profile_dialog">为影梭添加此配置文件?</string> <string name="add_profile_dialog">为影梭添加此配置文件?</string>
<string-array name="add_profile_methods"> <string-array name="add_profile_methods">
......
...@@ -45,6 +45,8 @@ ...@@ -45,6 +45,8 @@
<string name="auto_connect_summary">Enable Shadowsocks on startup</string> <string name="auto_connect_summary">Enable Shadowsocks on startup</string>
<string name="traffic_stat">Traffic Stats</string> <string name="traffic_stat">Traffic Stats</string>
<string name="traffic_stat_summary">Show traffic stats in notification bar</string> <string name="traffic_stat_summary">Show traffic stats in notification bar</string>
<string name="udp_dns">DNS Forwarding</string>
<string name="udp_dns_summary">Forward DNS\'s UDP packets to remote server</string>
<!-- notification category --> <!-- notification category -->
<string name="forward_success">Shadowsocks started.</string> <string name="forward_success">Shadowsocks started.</string>
......
...@@ -26,6 +26,12 @@ ...@@ -26,6 +26,12 @@
android:defaultValue="true" android:defaultValue="true"
android:summary="@string/traffic_stat_summary" android:summary="@string/traffic_stat_summary"
android:title="@string/traffic_stat"> android:title="@string/traffic_stat">
</CheckBoxPreference>
<CheckBoxPreference
android:key="isUdpDns"
android:defaultValue="false"
android:summary="@string/udp_dns_summary"
android:title="@string/udp_dns">
</CheckBoxPreference> </CheckBoxPreference>
<CheckBoxPreference <CheckBoxPreference
android:key="isAutoConnect" android:key="isAutoConnect"
......
...@@ -122,7 +122,7 @@ object Shadowsocks { ...@@ -122,7 +122,7 @@ object Shadowsocks {
val PROXY_PREFS = Array(Key.profileName, Key.proxy, Key.remotePort, Key.localPort, Key.sitekey, val PROXY_PREFS = Array(Key.profileName, Key.proxy, Key.remotePort, Key.localPort, Key.sitekey,
Key.encMethod) Key.encMethod)
val FEATRUE_PREFS = Array(Key.isGFWList, Key.isGlobalProxy, Key.proxyedApps, Key.isTrafficStat, val FEATRUE_PREFS = Array(Key.isGFWList, Key.isGlobalProxy, Key.proxyedApps, Key.isTrafficStat,
Key.isAutoConnect) Key.isUdpDns, Key.isAutoConnect)
val TAG = "Shadowsocks" val TAG = "Shadowsocks"
val REQUEST_CONNECT = 1 val REQUEST_CONNECT = 1
...@@ -162,6 +162,7 @@ object Shadowsocks { ...@@ -162,6 +162,7 @@ object Shadowsocks {
case Key.isGFWList => updateCheckBoxPreference(pref, profile.chnroute) case Key.isGFWList => updateCheckBoxPreference(pref, profile.chnroute)
case Key.isGlobalProxy => updateCheckBoxPreference(pref, profile.global) case Key.isGlobalProxy => updateCheckBoxPreference(pref, profile.global)
case Key.isTrafficStat => updateCheckBoxPreference(pref, profile.traffic) case Key.isTrafficStat => updateCheckBoxPreference(pref, profile.traffic)
case Key.isUdpDns => updateCheckBoxPreference(pref, profile.udpdns)
case _ => case _ =>
} }
} }
......
...@@ -111,15 +111,19 @@ class ShadowsocksNatService extends Service with BaseService { ...@@ -111,15 +111,19 @@ class ShadowsocksNatService extends Service with BaseService {
} }
def startDnsDaemon() { def startDnsDaemon() {
val cmd = (Path.BASE + 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 " + "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") Path.BASE + "ss-local.pid")
.format(config.proxy, config.remotePort, 8153, config.sitekey, config.encMethod) .format(config.proxy, config.remotePort, 8153, config.sitekey, config.encMethod)
// val cmd = Path.BASE + "pdnsd -c " + Path.BASE + "pdnsd.conf" } else {
// val conf = ConfigUtils.PDNSD.format("127.0.0.1") val conf = ConfigUtils.PDNSD.format("127.0.0.1")
// ConfigUtils.printToFile(new File(Path.BASE + "pdnsd.conf"))(p => { ConfigUtils.printToFile(new File(Path.BASE + "pdnsd.conf"))(p => {
// p.println(conf) p.println(conf)
// }) })
Path.BASE + "pdnsd -c " + Path.BASE + "pdnsd.conf"
}
Utils.runCommand(cmd) Utils.runCommand(cmd)
} }
......
...@@ -76,23 +76,26 @@ class ShadowsocksVpnService extends VpnService with BaseService { ...@@ -76,23 +76,26 @@ class ShadowsocksVpnService extends VpnService with BaseService {
def startShadowsocksDaemon() { def startShadowsocksDaemon() {
val cmd: String = (Path.BASE + val cmd: String = (Path.BASE +
"shadowsocks -b 127.0.0.1 -s \"%s\" -p \"%d\" -l \"%d\" -k \"%s\" -m \"%s\" -f " + "ss-local -b 127.0.0.1 -s \"%s\" -p \"%d\" -l \"%d\" -k \"%s\" -m \"%s\" -f " +
Path.BASE + "shadowsocks.pid") Path.BASE + "ss-local.pid")
.format(config.proxy, config.remotePort, config.localPort, config.sitekey, config.encMethod) .format(config.proxy, config.remotePort, config.localPort, config.sitekey, config.encMethod)
if (BuildConfig.DEBUG) Log.d(TAG, cmd) if (BuildConfig.DEBUG) Log.d(TAG, cmd)
System.exec(cmd) System.exec(cmd)
} }
def startDnsDaemon() { def startDnsDaemon() {
val cmd = (Path.BASE + val cmd = if (config.isUdpDns) {
"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 +
Path.BASE + "ss-local.pid") "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) .format(config.proxy, config.remotePort, 8153, config.sitekey, config.encMethod)
// val cmd: String = Path.BASE + "pdnsd -c " + Path.BASE + "pdnsd.conf" } else {
// val conf: String = ConfigUtils.PDNSD.format("0.0.0.0") val conf = ConfigUtils.PDNSD.format("0.0.0.0")
// ConfigUtils.printToFile(new File(Path.BASE + "pdnsd.conf"))(p => { ConfigUtils.printToFile(new File(Path.BASE + "pdnsd.conf"))(p => {
// p.println(conf) p.println(conf)
// }) })
Path.BASE + "pdnsd -c " + Path.BASE + "pdnsd.conf"
}
Utils.runCommand(cmd) Utils.runCommand(cmd)
} }
......
...@@ -50,7 +50,7 @@ object DBHelper { ...@@ -50,7 +50,7 @@ object DBHelper {
val PROFILE = "profile.db" 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]) lazy val profileDao:Dao[Profile,Int] = getDao(classOf[Profile])
...@@ -59,7 +59,11 @@ class DBHelper(val context: Context) extends OrmLiteSqliteOpenHelper(context, DB ...@@ -59,7 +59,11 @@ class DBHelper(val context: Context) extends OrmLiteSqliteOpenHelper(context, DB
} }
def onUpgrade(database: SQLiteDatabase, connectionSource: ConnectionSource, oldVersion: Int, newVersion: Int) { def onUpgrade(database: SQLiteDatabase, connectionSource: ConnectionSource, oldVersion: Int, newVersion: Int) {
if (oldVersion < 8) {
profileDao.executeRaw("ALTER TABLE `profile` ADD COLUMN udpdns INTEGER;")
} else {
TableUtils.dropTable(connectionSource, classOf[Profile], true) TableUtils.dropTable(connectionSource, classOf[Profile], true)
}
onCreate(database, connectionSource) onCreate(database, connectionSource)
} }
} }
...@@ -84,6 +84,9 @@ class Profile { ...@@ -84,6 +84,9 @@ class Profile {
@DatabaseField @DatabaseField
var traffic: Boolean = false var traffic: Boolean = false
@DatabaseField
var udpdns: Boolean = false
@DatabaseField(dataType = DataType.LONG_STRING) @DatabaseField(dataType = DataType.LONG_STRING)
var individual: String = "" var individual: String = ""
......
...@@ -121,6 +121,7 @@ class ProfileManager(settings: SharedPreferences, dbHelper: DBHelper) { ...@@ -121,6 +121,7 @@ class ProfileManager(settings: SharedPreferences, dbHelper: DBHelper) {
edit.putBoolean(Key.isGFWList, profile.chnroute) edit.putBoolean(Key.isGFWList, profile.chnroute)
edit.putBoolean(Key.isBypassApps, profile.bypass) edit.putBoolean(Key.isBypassApps, profile.bypass)
edit.putBoolean(Key.isTrafficStat, profile.traffic) edit.putBoolean(Key.isTrafficStat, profile.traffic)
edit.putBoolean(Key.isUdpDns, profile.udpdns)
edit.putString(Key.profileName, profile.name) edit.putString(Key.profileName, profile.name)
edit.putString(Key.proxy, profile.host) edit.putString(Key.proxy, profile.host)
edit.putString(Key.sitekey, profile.password) edit.putString(Key.sitekey, profile.password)
...@@ -143,6 +144,7 @@ class ProfileManager(settings: SharedPreferences, dbHelper: DBHelper) { ...@@ -143,6 +144,7 @@ class ProfileManager(settings: SharedPreferences, dbHelper: DBHelper) {
profile.chnroute = settings.getBoolean(Key.isGFWList, false) profile.chnroute = settings.getBoolean(Key.isGFWList, false)
profile.bypass = settings.getBoolean(Key.isBypassApps, false) profile.bypass = settings.getBoolean(Key.isBypassApps, false)
profile.traffic = settings.getBoolean(Key.isTrafficStat, false) profile.traffic = settings.getBoolean(Key.isTrafficStat, false)
profile.udpdns = settings.getBoolean(Key.isUdpDns, false)
profile.name = settings.getString(Key.profileName, "default") profile.name = settings.getString(Key.profileName, "default")
profile.host = settings.getString(Key.proxy, "127.0.0.1") profile.host = settings.getString(Key.proxy, "127.0.0.1")
profile.password = settings.getString(Key.sitekey, "default") profile.password = settings.getString(Key.sitekey, "default")
......
...@@ -84,7 +84,8 @@ object ConfigUtils { ...@@ -84,7 +84,8 @@ object ConfigUtils {
val method = proxy(3).trim val method = proxy(3).trim
new Config(config.isGlobalProxy, config.isGFWList, config.isBypassApps, config.isTrafficStat, 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 = { def load(settings: SharedPreferences): Config = {
...@@ -92,6 +93,7 @@ object ConfigUtils { ...@@ -92,6 +93,7 @@ object ConfigUtils {
val isGFWList = settings.getBoolean(Key.isGFWList, false) val isGFWList = settings.getBoolean(Key.isGFWList, false)
val isBypassApps = settings.getBoolean(Key.isBypassApps, false) val isBypassApps = settings.getBoolean(Key.isBypassApps, false)
val isTrafficStat = settings.getBoolean(Key.isTrafficStat, false) val isTrafficStat = settings.getBoolean(Key.isTrafficStat, false)
val isUdpDns = settings.getBoolean(Key.isUdpDns, false)
val profileName = settings.getString(Key.profileName, "default") val profileName = settings.getString(Key.profileName, "default")
val proxy = settings.getString(Key.proxy, "127.0.0.1") val proxy = settings.getString(Key.proxy, "127.0.0.1")
...@@ -111,7 +113,7 @@ object ConfigUtils { ...@@ -111,7 +113,7 @@ object ConfigUtils {
} }
val proxiedAppString = settings.getString(Key.proxied, "") 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) encMethod, proxiedAppString, remotePort, localPort)
} }
......
...@@ -70,6 +70,7 @@ object Key { ...@@ -70,6 +70,7 @@ object Key {
val isGFWList = "isGFWList" val isGFWList = "isGFWList"
val isBypassApps = "isBypassApps" val isBypassApps = "isBypassApps"
val isTrafficStat = "isTrafficStat" val isTrafficStat = "isTrafficStat"
val isUdpDns = "isUdpDns"
val proxy = "proxy" val proxy = "proxy"
val sitekey = "sitekey" val sitekey = "sitekey"
......
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