Compare commits

...
43 Commits
Author SHA1 Message Date
Max Lv b272d7ab71 fix #368 2015-09-28 13:07:47 +08:00
Max Lv 09d53033cb update shadowsocks-libev 2015-09-28 10:41:44 +08:00
Max Lv 496c809186 update sdk 2015-09-25 12:32:56 +08:00
Max Lv b58ffb7a95 refine strings 2015-09-25 12:06:10 +08:00
Max Lv 3512542043 fix #366 2015-09-25 09:43:09 +08:00
Max Lv 0c940c8860 update shadowsocks-libev 2015-09-24 18:51:45 +08:00
Max Lv 00253ea3f6 update shadowsocks-libev 2015-09-24 13:08:08 +08:00
Max Lv d836aafe40 refine strings 2015-09-23 16:13:39 +08:00
Max Lv 60360e6a19 update shadowsocks-libev 2015-09-23 13:30:56 +08:00
Max Lv 5939f2776c fix a buffer corruption 2015-09-22 20:36:56 +08:00
Max Lv 0cecc62035 update shadowsocks-libev 2015-09-22 18:34:44 +08:00
Max Lv 7a6fbaca15 bump version 2015-09-21 19:09:16 +08:00
Max Lv 2a3ffd768c update shadowsocks-libev 2015-09-21 14:03:02 +08:00
Max Lv 33b775ea5e update plugin 2015-09-18 16:58:03 +08:00
Max Lv 0be4d39606 update shadowsocks-libev 2015-09-18 12:05:20 +08:00
Max Lv ee7e4c9711 update shadowsocks-libev 2015-09-13 14:30:32 +08:00
Max Lv c1c8ff309c update shadowsocks-libev 2015-09-09 09:12:33 +08:00
Max Lv 8724bf325f update shadowsocks-libev 2015-09-05 19:17:28 +08:00
Max Lv 20395ede5f update shadowsocks-libev 2015-09-04 07:13:59 +08:00
Max Lv 336fa3b775 fix a UI bug 2015-08-31 13:05:45 +08:00
Max Lv 11bfef423a update shadowsocks-libev 2015-08-30 12:09:37 +08:00
Max Lv 6e0534b00f bump version 2015-08-20 15:29:04 +08:00
Max Lv bf960f1a64 fix #350 2015-08-20 15:28:36 +08:00
Max Lv b1e01d2158 fix a typo 2015-08-20 13:08:20 +08:00
Max Lv f344eb783c update chnroute 2015-08-20 13:06:52 +08:00
Max Lv 5f6effba09 Merge pull request #346 from clowwindy/nodelay
add tcp_nagle_disable in tun2socks
2015-08-18 17:34:47 +08:00
clowwindy 97cfd1f869 add tcp_nagle_disable in tun2socks 2015-08-18 17:27:49 +08:00
Max Lv 97bd714beb drop abstract domain socket 2015-08-07 22:30:09 +08:00
Max Lv 9a841e901c refine the exception handling 2015-08-05 12:22:49 +08:00
Max Lv de7e516204 fix MTU 2015-08-05 10:22:45 +08:00
Max Lv c31a5c1951 use abstract namespace 2015-08-04 09:23:36 +08:00
Max Lv 6c47c361f7 update reject list 2015-08-03 14:00:59 +08:00
Max Lv ddd37a3219 update dns 2015-08-03 13:03:30 +08:00
Max Lv 01125d53b3 update shadowsocks-libev 2015-08-03 11:02:40 +08:00
Max Lv 9613d65303 fix a issue of progress dialog 2015-08-02 08:22:20 +08:00
Max Lv a510b11187 update shadowsocks-libev 2015-07-31 16:40:33 +08:00
Max Lv 051e600e59 bump version 2015-07-31 16:30:54 +08:00
Max Lv fea9a6f919 refine the binary update 2015-07-31 16:05:03 +08:00
Max Lv c2c7cabbaf refine dns resolve 2015-07-30 13:35:04 +08:00
Max Lv 092d880c7d refine binary install 2015-07-29 13:49:08 +08:00
Max Lv c208c4bf50 refine profile initilizing 2015-07-28 15:49:05 +08:00
Max Lv 34af6aeef5 refine the IPC to tun2socks 2015-07-28 14:48:21 +08:00
Max Lv d9af2f93e0 fix plugin 2015-07-27 11:09:52 +08:00
22 changed files with 535 additions and 107 deletions
+5 -3
View File
@@ -31,9 +31,10 @@ libraryDependencies ++= Seq(
"com.joanzapata.android" % "android-iconify" % "1.0.9",
"net.glxn.qrgen" % "android" % "2.0",
"net.simonvt.menudrawer" % "menudrawer" % "3.0.6",
"com.google.android.gms" % "play-services-base" % "6.5.87",
"com.google.android.gms" % "play-services-ads" % "6.5.87",
"com.android.support" % "support-v4" % "21.0.3"
"com.google.android.gms" % "play-services-base" % "8.1.0",
"com.google.android.gms" % "play-services-ads" % "8.1.0",
"com.google.android.gms" % "play-services-analytics" % "8.1.0",
"com.android.support" % "support-v4" % "23.0.1"
)
libraryDependencies ++= Seq(
@@ -52,5 +53,6 @@ proguardOptions in Android ++= Seq("-keep class android.support.v4.app.** { *; }
"-keep class * extends com.j256.ormlite.** { *; }",
"-keep class com.joanzapata.** { *; }",
"-keepattributes *Annotation*",
"-dontwarn com.google.android.gms.internal.zzhu",
"-dontwarn org.xbill.**",
"-dontwarn com.actionbarsherlock.**")
+13 -9
View File
@@ -24,6 +24,8 @@ def main():
"0.0.0.0/8",
"10.0.0.0/8",
"100.64.0.0/10",
"112.124.47.0/24",
"114.114.114.0/24",
"127.0.0.0/8",
"169.254.0.0/16",
"172.16.0.0/12",
@@ -39,16 +41,18 @@ def main():
]))
china_list_set += internal_list
# 取反
all = IPy.IPSet([IPy.IP("0.0.0.0/0")])
# 剔除所有孤立的C段
for ip in china_list_set:
all.discard(ip)
all = china_list_set
filter = itertools.ifilter(lambda x: len(x) <= 65536, all)
for ip in filter:
all.discard(ip)
all.add(IPy.IP(ip.strNormal(0)).make_net('255.255.0.0'))
# 取反
# all = IPy.IPSet([IPy.IP("0.0.0.0/0")])
# 剔除所有孤立的C段
# for ip in china_list_set:
# all.discard(ip)
# filter = itertools.ifilter(lambda x: len(x) <= 65536, all)
# for ip in filter:
# all.discard(ip)
# all.add(IPy.IP(ip.strNormal(0)).make_net('255.255.0.0'))
# 输出结果
for ip in all:
+3 -3
View File
@@ -1,7 +1,7 @@
resolvers += Resolver.url("scalasbt releases", new URL("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-snapshots"))(Resolver.ivyStylePatterns)
addSbtPlugin("com.hanhuy.sbt" % "android-sdk-plugin" % "1.4.6")
addSbtPlugin("com.hanhuy.sbt" % "android-sdk-plugin" % "1.5.0")
resolvers += Resolver.sbtPluginRepo("snapshots")
resolvers += "Sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/"
addSbtPlugin("com.hanhuy.sbt" % "sbt-idea" % "1.7.0-SNAPSHOT")
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.7.0-SNAPSHOT")
+2 -2
View File
@@ -1,7 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.github.shadowsocks"
android:versionCode="110"
android:versionName="2.7.2">
android:versionCode="117"
android:versionName="2.8.0">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
@@ -10,6 +10,8 @@ public class Config implements Parcelable {
public boolean isBypassApps = false;
public boolean isTrafficStat = false;
public boolean isUdpDns = false;
public boolean isAuth = false;
public boolean isIpv6 = false;
public String profileName = "Untitled";
public String proxy = "127.0.0.1";
@@ -33,13 +35,15 @@ public class Config implements Parcelable {
};
public Config(boolean isGlobalProxy, boolean isGFWList, boolean isBypassApps,
boolean isTrafficStat, boolean isUdpDns, String profileName, String proxy, String sitekey,
boolean isTrafficStat, boolean isUdpDns, boolean isAuth, boolean isIpv6, String profileName, String proxy, String sitekey,
String encMethod, String proxiedAppString, String route, int remotePort, int localPort) {
this.isGlobalProxy = isGlobalProxy;
this.isGFWList = isGFWList;
this.isBypassApps = isBypassApps;
this.isTrafficStat = isTrafficStat;
this.isUdpDns = isUdpDns;
this.isAuth = isAuth;
this.isIpv6 = isIpv6;
this.profileName = profileName;
this.proxy = proxy;
this.sitekey = sitekey;
@@ -60,6 +64,8 @@ public class Config implements Parcelable {
isBypassApps = in.readInt() == 1;
isTrafficStat = in.readInt() == 1;
isUdpDns = in.readInt() == 1;
isAuth = in.readInt() == 1;
isIpv6 = in.readInt() == 1;
profileName = in.readString();
proxy = in.readString();
sitekey = in.readString();
@@ -80,6 +86,8 @@ public class Config implements Parcelable {
out.writeInt(isBypassApps ? 1 : 0);
out.writeInt(isTrafficStat ? 1 : 0);
out.writeInt(isUdpDns ? 1 : 0);
out.writeInt(isAuth ? 1 : 0);
out.writeInt(isIpv6 ? 1 : 0);
out.writeString(profileName);
out.writeString(proxy);
out.writeString(sitekey);
@@ -1772,6 +1772,9 @@ err_t listener_accept_func (void *arg, struct tcp_pcb *newpcb, err_t err)
// set client not closed
client->client_closed = 0;
// enable TCP_NODELAY
tcp_nagle_disable(client->pcb);
// setup handler argument
tcp_arg(client->pcb, client);
+6
View File
@@ -77,6 +77,12 @@
<string name="udp_dns">UDP 转发</string>
<string name="udp_dns_summary">由远程服务器转发 UDP 协议的数据包</string>
<string name="onetime_auth">一次性认证</string>
<string name="onetime_auth_summary">启用一次性认证(实验性)</string>
<string name="ipv6">IPv6 路由</string>
<string name="ipv6_summary">向远程服务器转发 IPv6 流量</string>
<!-- profile -->
<string name="add_profile_dialog">为影梭添加此配置文件?</string>
<string-array name="add_profile_methods">
+35 -1
View File
@@ -85,7 +85,41 @@
<item>101.0.0.0/8</item>
<item>102.0.0.0/7</item>
<item>104.0.0.0/5</item>
<item>112.0.0.0/5</item>
<item>112.0.0.0/10</item>
<item>112.64.0.0/11</item>
<item>112.96.0.0/12</item>
<item>112.112.0.0/13</item>
<item>112.120.0.0/14</item>
<item>112.124.0.0/19</item>
<item>112.124.32.0/21</item>
<item>112.124.40.0/22</item>
<item>112.124.44.0/23</item>
<item>112.124.46.0/24</item>
<item>112.124.48.0/20</item>
<item>112.124.64.0/18</item>
<item>112.124.128.0/17</item>
<item>112.125.0.0/16</item>
<item>112.126.0.0/15</item>
<item>112.128.0.0/9</item>
<item>113.0.0.0/8</item>
<item>114.0.0.0/10</item>
<item>114.64.0.0/11</item>
<item>114.96.0.0/12</item>
<item>114.112.0.0/15</item>
<item>114.114.0.0/18</item>
<item>114.114.64.0/19</item>
<item>114.114.96.0/20</item>
<item>114.114.112.0/23</item>
<item>114.114.115.0/24</item>
<item>114.114.116.0/22</item>
<item>114.114.120.0/21</item>
<item>114.114.128.0/17</item>
<item>114.115.0.0/16</item>
<item>114.116.0.0/14</item>
<item>114.120.0.0/13</item>
<item>114.128.0.0/9</item>
<item>115.0.0.0/8</item>
<item>116.0.0.0/6</item>
<item>120.0.0.0/6</item>
<item>124.0.0.0/7</item>
<item>126.0.0.0/8</item>
+292 -2
View File
@@ -321,6 +321,10 @@
<item>43.239.0.0/19</item>
<item>43.239.32.0/20</item>
<item>43.239.48.0/22</item>
<item>43.239.116.0/22</item>
<item>43.239.120.0/22</item>
<item>43.239.172.0/22</item>
<item>43.239.176.0/22</item>
<item>43.240.0.0/22</item>
<item>43.240.48.0/22</item>
<item>43.240.56.0/21</item>
@@ -505,6 +509,154 @@
<item>43.255.232.0/22</item>
<item>43.255.244.0/22</item>
<item>45.64.112.0/23</item>
<item>45.112.132.0/22</item>
<item>45.112.188.0/22</item>
<item>45.112.208.0/20</item>
<item>45.112.228.0/22</item>
<item>45.112.232.0/21</item>
<item>45.113.12.0/22</item>
<item>45.113.16.0/20</item>
<item>45.113.40.0/22</item>
<item>45.113.52.0/22</item>
<item>45.113.56.0/22</item>
<item>45.113.72.0/22</item>
<item>45.113.108.0/22</item>
<item>45.113.144.0/21</item>
<item>45.113.168.0/22</item>
<item>45.113.176.0/22</item>
<item>45.113.184.0/22</item>
<item>45.113.200.0/21</item>
<item>45.113.208.0/20</item>
<item>45.113.228.0/22</item>
<item>45.113.240.0/22</item>
<item>45.113.252.0/22</item>
<item>45.114.0.0/22</item>
<item>45.114.12.0/22</item>
<item>45.114.32.0/22</item>
<item>45.114.40.0/22</item>
<item>45.114.52.0/22</item>
<item>45.114.96.0/22</item>
<item>45.114.104.0/22</item>
<item>45.114.136.0/22</item>
<item>45.114.196.0/22</item>
<item>45.114.200.0/22</item>
<item>45.114.228.0/22</item>
<item>45.114.236.0/22</item>
<item>45.114.252.0/22</item>
<item>45.115.44.0/22</item>
<item>45.115.100.0/22</item>
<item>45.115.120.0/22</item>
<item>45.115.132.0/22</item>
<item>45.115.144.0/22</item>
<item>45.115.156.0/22</item>
<item>45.115.164.0/22</item>
<item>45.115.200.0/22</item>
<item>45.115.212.0/22</item>
<item>45.115.216.0/22</item>
<item>45.115.228.0/22</item>
<item>45.115.236.0/22</item>
<item>45.115.244.0/22</item>
<item>45.115.248.0/22</item>
<item>45.116.12.0/22</item>
<item>45.116.16.0/21</item>
<item>45.116.24.0/22</item>
<item>45.116.32.0/21</item>
<item>45.116.52.0/22</item>
<item>45.116.60.0/22</item>
<item>45.116.64.0/22</item>
<item>45.116.96.0/21</item>
<item>45.116.140.0/22</item>
<item>45.116.152.0/22</item>
<item>45.116.208.0/22</item>
<item>45.117.8.0/22</item>
<item>45.117.20.0/22</item>
<item>45.117.40.0/22</item>
<item>45.117.68.0/22</item>
<item>45.117.124.0/22</item>
<item>45.117.252.0/22</item>
<item>45.119.52.0/22</item>
<item>45.119.60.0/22</item>
<item>45.119.64.0/21</item>
<item>45.119.72.0/22</item>
<item>45.119.104.0/22</item>
<item>45.119.116.0/22</item>
<item>45.119.160.0/22</item>
<item>45.119.232.0/22</item>
<item>45.120.100.0/22</item>
<item>45.120.140.0/22</item>
<item>45.120.156.0/22</item>
<item>45.120.164.0/22</item>
<item>45.120.220.0/22</item>
<item>45.120.240.0/22</item>
<item>45.121.20.0/22</item>
<item>45.121.52.0/22</item>
<item>45.121.64.0/21</item>
<item>45.121.72.0/22</item>
<item>45.121.92.0/22</item>
<item>45.121.96.0/22</item>
<item>45.121.104.0/22</item>
<item>45.121.172.0/22</item>
<item>45.121.176.0/22</item>
<item>45.121.212.0/22</item>
<item>45.121.240.0/20</item>
<item>45.122.0.0/19</item>
<item>45.122.32.0/21</item>
<item>45.122.40.0/22</item>
<item>45.122.60.0/22</item>
<item>45.122.64.0/19</item>
<item>45.122.96.0/20</item>
<item>45.122.112.0/21</item>
<item>45.122.160.0/19</item>
<item>45.122.192.0/20</item>
<item>45.122.208.0/21</item>
<item>45.122.216.0/22</item>
<item>45.123.28.0/22</item>
<item>45.123.32.0/21</item>
<item>45.123.44.0/22</item>
<item>45.123.48.0/20</item>
<item>45.123.64.0/20</item>
<item>45.123.80.0/21</item>
<item>45.123.88.0/22</item>
<item>45.123.120.0/22</item>
<item>45.123.128.0/21</item>
<item>45.123.136.0/22</item>
<item>45.123.148.0/22</item>
<item>45.123.152.0/21</item>
<item>45.123.164.0/22</item>
<item>45.123.168.0/21</item>
<item>45.123.176.0/21</item>
<item>45.123.184.0/22</item>
<item>45.123.204.0/22</item>
<item>45.123.212.0/22</item>
<item>45.123.224.0/19</item>
<item>45.124.0.0/22</item>
<item>45.124.20.0/22</item>
<item>45.124.28.0/22</item>
<item>45.124.32.0/21</item>
<item>45.124.44.0/22</item>
<item>45.124.68.0/22</item>
<item>45.124.76.0/22</item>
<item>45.124.80.0/22</item>
<item>45.124.100.0/22</item>
<item>45.124.124.0/22</item>
<item>45.124.172.0/22</item>
<item>45.124.176.0/22</item>
<item>45.124.208.0/22</item>
<item>45.124.248.0/21</item>
<item>45.125.12.0/22</item>
<item>45.125.16.0/22</item>
<item>45.125.24.0/21</item>
<item>45.125.32.0/22</item>
<item>45.125.44.0/22</item>
<item>45.125.52.0/22</item>
<item>45.125.56.0/22</item>
<item>45.125.76.0/22</item>
<item>45.125.80.0/20</item>
<item>45.125.96.0/21</item>
<item>45.125.104.0/22</item>
<item>45.125.136.0/22</item>
<item>47.92.0.0/14</item>
<item>47.96.0.0/11</item>
<item>49.4.0.0/14</item>
<item>49.51.0.0/16</item>
<item>49.52.0.0/14</item>
@@ -803,7 +955,6 @@
<item>103.30.96.0/22</item>
<item>103.30.148.0/22</item>
<item>103.30.200.0/22</item>
<item>103.30.216.0/22</item>
<item>103.30.228.0/22</item>
<item>103.30.236.0/22</item>
<item>103.31.0.0/22</item>
@@ -818,6 +969,8 @@
<item>103.35.0.0/19</item>
<item>103.35.32.0/20</item>
<item>103.35.48.0/22</item>
<item>103.35.104.0/22</item>
<item>103.35.116.0/22</item>
<item>103.36.20.0/22</item>
<item>103.36.28.0/22</item>
<item>103.36.36.0/22</item>
@@ -1004,6 +1157,142 @@
<item>103.50.224.0/20</item>
<item>103.50.240.0/21</item>
<item>103.50.248.0/22</item>
<item>103.52.40.0/22</item>
<item>103.52.72.0/21</item>
<item>103.52.80.0/21</item>
<item>103.52.96.0/21</item>
<item>103.52.104.0/22</item>
<item>103.52.160.0/21</item>
<item>103.52.172.0/22</item>
<item>103.52.176.0/22</item>
<item>103.52.184.0/22</item>
<item>103.52.196.0/22</item>
<item>103.53.4.0/22</item>
<item>103.53.64.0/21</item>
<item>103.53.92.0/22</item>
<item>103.53.100.0/22</item>
<item>103.53.124.0/22</item>
<item>103.53.128.0/20</item>
<item>103.53.144.0/22</item>
<item>103.53.160.0/22</item>
<item>103.53.180.0/22</item>
<item>103.53.204.0/22</item>
<item>103.53.208.0/22</item>
<item>103.53.216.0/22</item>
<item>103.53.236.0/22</item>
<item>103.53.248.0/22</item>
<item>103.54.8.0/22</item>
<item>103.54.48.0/22</item>
<item>103.54.60.0/22</item>
<item>103.54.160.0/21</item>
<item>103.54.212.0/22</item>
<item>103.54.228.0/22</item>
<item>103.54.240.0/22</item>
<item>103.55.24.0/22</item>
<item>103.55.80.0/22</item>
<item>103.55.120.0/22</item>
<item>103.55.152.0/22</item>
<item>103.55.172.0/22</item>
<item>103.55.204.0/22</item>
<item>103.55.208.0/22</item>
<item>103.55.228.0/22</item>
<item>103.55.236.0/22</item>
<item>103.55.240.0/22</item>
<item>103.56.8.0/22</item>
<item>103.56.16.0/21</item>
<item>103.56.32.0/22</item>
<item>103.56.52.0/22</item>
<item>103.56.56.0/21</item>
<item>103.56.72.0/21</item>
<item>103.56.100.0/22</item>
<item>103.56.104.0/22</item>
<item>103.56.140.0/22</item>
<item>103.56.152.0/22</item>
<item>103.56.184.0/22</item>
<item>103.56.200.0/22</item>
<item>103.56.216.0/22</item>
<item>103.57.12.0/22</item>
<item>103.57.52.0/22</item>
<item>103.57.56.0/22</item>
<item>103.57.76.0/22</item>
<item>103.57.108.0/22</item>
<item>103.57.136.0/22</item>
<item>103.57.196.0/22</item>
<item>103.58.24.0/22</item>
<item>103.58.182.0/23</item>
<item>103.59.76.0/22</item>
<item>103.59.100.0/22</item>
<item>103.59.112.0/20</item>
<item>103.59.128.0/22</item>
<item>103.59.148.0/22</item>
<item>103.59.164.0/22</item>
<item>103.59.216.0/22</item>
<item>103.60.32.0/22</item>
<item>103.60.44.0/22</item>
<item>103.60.164.0/22</item>
<item>103.60.228.0/22</item>
<item>103.60.236.0/22</item>
<item>103.61.60.0/22</item>
<item>103.61.104.0/22</item>
<item>103.61.140.0/22</item>
<item>103.61.152.0/21</item>
<item>103.61.160.0/22</item>
<item>103.61.172.0/22</item>
<item>103.61.176.0/22</item>
<item>103.61.184.0/21</item>
<item>103.62.24.0/22</item>
<item>103.62.52.0/22</item>
<item>103.62.72.0/21</item>
<item>103.62.80.0/21</item>
<item>103.62.88.0/22</item>
<item>103.62.96.0/19</item>
<item>103.62.128.0/21</item>
<item>103.62.156.0/22</item>
<item>103.62.160.0/19</item>
<item>103.62.192.0/22</item>
<item>103.62.204.0/22</item>
<item>103.62.208.0/20</item>
<item>103.62.224.0/22</item>
<item>103.63.32.0/19</item>
<item>103.63.64.0/20</item>
<item>103.63.80.0/21</item>
<item>103.63.88.0/22</item>
<item>103.63.140.0/22</item>
<item>103.63.144.0/22</item>
<item>103.63.152.0/22</item>
<item>103.63.160.0/20</item>
<item>103.63.176.0/21</item>
<item>103.63.184.0/22</item>
<item>103.63.192.0/20</item>
<item>103.63.208.0/22</item>
<item>103.63.240.0/20</item>
<item>103.192.0.0/19</item>
<item>103.192.48.0/21</item>
<item>103.192.56.0/22</item>
<item>103.192.84.0/22</item>
<item>103.192.88.0/21</item>
<item>103.192.96.0/20</item>
<item>103.192.112.0/22</item>
<item>103.192.128.0/20</item>
<item>103.192.144.0/22</item>
<item>103.192.164.0/22</item>
<item>103.192.188.0/22</item>
<item>103.192.208.0/21</item>
<item>103.192.216.0/22</item>
<item>103.192.252.0/22</item>
<item>103.193.40.0/21</item>
<item>103.193.120.0/21</item>
<item>103.193.140.0/22</item>
<item>103.193.144.0/21</item>
<item>103.193.160.0/22</item>
<item>103.193.188.0/22</item>
<item>103.193.192.0/22</item>
<item>103.193.212.0/22</item>
<item>103.193.216.0/21</item>
<item>103.193.224.0/20</item>
<item>103.193.240.0/22</item>
<item>103.194.16.0/22</item>
<item>103.194.230.0/23</item>
<item>103.224.40.0/21</item>
<item>103.224.60.0/22</item>
<item>103.224.80.0/22</item>
@@ -1096,6 +1385,7 @@
<item>103.236.0.0/18</item>
<item>103.236.64.0/19</item>
<item>103.236.96.0/22</item>
<item>103.236.120.0/22</item>
<item>103.237.0.0/20</item>
<item>103.237.24.0/21</item>
<item>103.237.68.0/22</item>
@@ -1936,6 +2226,7 @@
<item>166.111.0.0/16</item>
<item>167.139.0.0/16</item>
<item>167.189.0.0/16</item>
<item>167.220.244.0/22</item>
<item>168.160.0.0/16</item>
<item>169.254.0.0/16</item>
<item>171.8.0.0/13</item>
@@ -3363,7 +3654,6 @@
<item>210.26.0.0/15</item>
<item>210.28.0.0/14</item>
<item>210.32.0.0/12</item>
<item>210.48.136.0/21</item>
<item>210.51.0.0/16</item>
<item>210.52.0.0/15</item>
<item>210.56.192.0/19</item>
File diff suppressed because one or more lines are too long
+6 -2
View File
@@ -25,10 +25,14 @@
<!-- feature category -->
<string name="feature_cat">Feature Settings</string>
<string name="ipv6">IPv6 Route</string>
<string name="ipv6_summary">Redirect IPv6 traffic to remote</string>
<string name="onetime_auth">One-time Authentication</string>
<string name="onetime_auth_summary">Enable one-time authentication (Experimental)</string>
<string name="http_proxy">HTTP Proxy</string>
<string name="http_proxy_summary">Local HTTP Proxy</string>
<string name="dns_proxy">DNS Proxy</string>
<string name="dns_proxy_summary">Redirect DNS queries to remote server</string>
<string name="dns_proxy_summary">Redirect DNS queries to remote</string>
<string name="auto_set_gfwlist">CHN Route</string>
<string name="auto_set_gfwlist_summary">Bypass all sites located in China
</string>
@@ -46,7 +50,7 @@
<string name="traffic_stat">Traffic Stats</string>
<string name="traffic_stat_summary">Show traffic stats in notification bar</string>
<string name="udp_dns">UDP Forwarding</string>
<string name="udp_dns_summary">Forward UDP packets to remote server</string>
<string name="udp_dns_summary">Forward UDP packets to remote</string>
<!-- notification category -->
<string name="forward_success">Shadowsocks started.</string>
+12
View File
@@ -58,6 +58,12 @@
android:summary="@string/route_list_summary"
android:title="@string/route_list">
</com.github.shadowsocks.preferences.SummaryListPreference>
<CheckBoxPreference
android:key="isIpv6"
android:defaultValue="false"
android:summary="@string/ipv6_summary"
android:title="@string/ipv6">
</CheckBoxPreference>
<CheckBoxPreference
android:defaultValue="true"
android:key="isGlobalProxy"
@@ -78,6 +84,12 @@
android:summary="@string/udp_dns_summary"
android:title="@string/udp_dns">
</CheckBoxPreference>
<CheckBoxPreference
android:key="isAuth"
android:defaultValue="false"
android:summary="@string/onetime_auth_summary"
android:title="@string/onetime_auth">
</CheckBoxPreference>
<CheckBoxPreference
android:key="isAutoConnect"
android:summary="@string/auto_connect_summary"
@@ -127,7 +127,7 @@ object Shadowsocks {
val PROXY_PREFS = Array(Key.profileName, Key.proxy, Key.remotePort, Key.localPort, Key.sitekey,
Key.encMethod)
val FEATRUE_PREFS = Array(Key.route, Key.isGlobalProxy, Key.proxyedApps,
Key.isUdpDns, Key.isAutoConnect)
Key.isUdpDns, Key.isAuth, Key.isIpv6, Key.isAutoConnect)
val EXECUTABLES = Array(Executable.PDNSD, Executable.REDSOCKS, Executable.SS_TUNNEL, Executable.SS_LOCAL, Executable.TUN2SOCKS)
@@ -166,6 +166,8 @@ object Shadowsocks {
case Key.route => updateListPreference(pref, profile.route)
case Key.isGlobalProxy => updateCheckBoxPreference(pref, profile.global)
case Key.isUdpDns => updateCheckBoxPreference(pref, profile.udpdns)
case Key.isAuth => updateCheckBoxPreference(pref, profile.auth)
case Key.isIpv6 => updateCheckBoxPreference(pref, profile.ipv6)
case _ =>
}
}
@@ -185,6 +187,7 @@ class Shadowsocks
// Variables
var switchButton: Switch = null
var progressDialog: ProgressDialog = null
var progressTag = -1
var state = State.INIT
var prepared = false
var currentProfile = new Profile
@@ -218,6 +221,11 @@ class Shadowsocks
state = bgService.getState
// set the listener
switchButton.setOnCheckedChangeListener(Shadowsocks.this)
if (!status.getBoolean(getVersionName, false)) {
status.edit.putBoolean(getVersionName, true).commit()
recovery();
}
}
override def onServiceDisconnected(name: ComponentName) {
@@ -271,9 +279,10 @@ class Shadowsocks
switchButton.setOnCheckedChangeListener(this)
}
private def showProgress(msg: String): Handler = {
private def showProgress(msg: Int): Handler = {
clearDialog()
progressDialog = ProgressDialog.show(this, "", msg, true, false)
progressDialog = ProgressDialog.show(this, "", getString(msg), true, false)
progressTag = msg
new Handler {
override def handleMessage(msg: Message) {
clearDialog()
@@ -397,7 +406,7 @@ class Shadowsocks
}
def prepareStartService() {
showProgress(getString(R.string.connecting))
showProgress(R.string.connecting)
spawn {
if (isVpnEnabled) {
val intent = VpnService.prepare(this)
@@ -474,22 +483,16 @@ class Shadowsocks
addPreferencesFromResource(R.xml.pref_all)
// Update the profile
if (!status.getBoolean(getVersionName, false)) {
currentProfile = profileManager.create()
}
// Initialize the profile
currentProfile = {
profileManager.getProfile(settings.getInt(Key.profileId, -1)) getOrElse currentProfile
}
// Update the profile
if (!status.getBoolean(getVersionName, false)) {
val h = showProgress(getString(R.string.initializing))
status.edit.putBoolean(getVersionName, true).apply()
spawn {
reset()
currentProfile = profileManager.create()
h.sendEmptyMessage(0)
}
}
// Initialize drawer
menuAdapter.setActiveId(settings.getInt(Key.profileId, -1))
menuAdapter.setListener(this)
@@ -617,7 +620,7 @@ class Shadowsocks
which match {
case 0 =>
dialog.dismiss()
val h = showProgress(getString(R.string.loading))
val h = showProgress(R.string.loading)
h.postDelayed(new Runnable() {
def run() {
val integrator = new IntentIntegrator(Shadowsocks.this)
@@ -641,7 +644,7 @@ class Shadowsocks
def reloadProfile() {
drawer.closeMenu(true)
val h = showProgress(getString(R.string.loading))
val h = showProgress(R.string.loading)
handler.postDelayed(new Runnable {
def run() {
@@ -660,7 +663,7 @@ class Shadowsocks
def addProfile(profile: Profile) {
drawer.closeMenu(true)
val h = showProgress(getString(R.string.loading))
val h = showProgress(R.string.loading)
handler.postDelayed(new Runnable {
def run() {
@@ -679,7 +682,7 @@ class Shadowsocks
def addProfile(id: Int) {
drawer.closeMenu(true)
val h = showProgress(getString(R.string.loading))
val h = showProgress(R.string.loading)
handler.postDelayed(new Runnable {
def run() {
@@ -697,7 +700,7 @@ class Shadowsocks
def updateProfile(id: Int) {
drawer.closeMenu(true)
val h = showProgress(getString(R.string.loading))
val h = showProgress(R.string.loading)
handler.postDelayed(new Runnable {
def run() {
@@ -916,10 +919,7 @@ class Shadowsocks
Console.runRootCommand(ab.toArray)
}
def reset() {
crashRecovery()
def install() {
copyAssets(System.getABI)
val ab = new ArrayBuffer[String]
@@ -927,19 +927,21 @@ class Shadowsocks
ab.append("chmod 755 " + Path.BASE + executable)
}
Console.runCommand(ab.toArray)
}
def reset() {
crashRecovery()
install()
}
private def recovery() {
val h = showProgress(getString(R.string.recovering))
serviceStop()
val h = showProgress(R.string.recovering)
spawn {
reset()
handler.post(new Runnable {
override def run() {
serviceStop
h.sendEmptyMessage(0)
}
})
h.sendEmptyMessage(0)
}
}
@@ -969,7 +971,7 @@ class Shadowsocks
}
private def flushDnsCache() {
val h = showProgress(getString(R.string.flushing))
val h = showProgress(R.string.flushing)
spawn {
Utils.toggleAirplaneMode(getBaseContext)
h.sendEmptyMessage(0)
@@ -1087,6 +1089,7 @@ class Shadowsocks
if (progressDialog != null) {
progressDialog.dismiss()
progressDialog = null
progressTag = -1
}
}
@@ -1100,14 +1103,19 @@ class Shadowsocks
if (progressDialog == null) {
progressDialog = ProgressDialog
.show(Shadowsocks.this, "", getString(R.string.connecting), true, true)
progressTag = R.string.connecting
}
setPreferenceEnabled(enabled = false)
case State.CONNECTED =>
clearDialog()
if (progressTag == R.string.connecting) {
clearDialog()
}
changeSwitch(checked = true)
setPreferenceEnabled(enabled = false)
case State.STOPPED =>
clearDialog()
if (progressTag == R.string.stopping || progressTag == R.string.connecting) {
clearDialog()
}
changeSwitch(checked = false)
if (m != null) {
new SnackBar.Builder(Shadowsocks.this)
@@ -1122,6 +1130,7 @@ class Shadowsocks
if (progressDialog == null) {
progressDialog = ProgressDialog
.show(Shadowsocks.this, "", getString(R.string.stopping), true, true)
progressTag = R.string.stopping
}
}
}
@@ -205,6 +205,8 @@ class ShadowsocksNatService extends Service with BaseService {
, "-c" , Path.BASE + "ss-local-nat.conf"
, "-f" , Path.BASE + "ss-local-nat.pid")
if (config.isAuth) cmd += "-A"
if (config.route != Route.ALL) {
cmd += "--acl"
cmd += (Path.BASE + "acl.list")
@@ -233,6 +235,8 @@ class ShadowsocksNatService extends Service with BaseService {
cmd += ("-l" , "8153")
if (config.isAuth) cmd += "-A"
if (BuildConfig.DEBUG) Log.d(TAG, cmd.mkString(" "))
Console.runCommand(cmd.mkString(" "))
@@ -254,6 +258,8 @@ class ShadowsocksNatService extends Service with BaseService {
, "-c" , Path.BASE + "ss-tunnel-nat.conf"
, "-f" , Path.BASE + "ss-tunnel-nat.pid")
if (config.isAuth) cmdBuf += "-A"
if (BuildConfig.DEBUG) Log.d(TAG, cmdBuf.mkString(" "))
Console.runCommand(cmdBuf.mkString(" "))
}
@@ -265,10 +271,10 @@ class ShadowsocksNatService extends Service with BaseService {
val reject = ConfigUtils.getRejectList(getContext, application)
val blackList = ConfigUtils.getBlackList(getContext, application)
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, "127.0.0.1", 8153,
Path.BASE + "pdnsd-nat.pid", reject, blackList, 8163)
Path.BASE + "pdnsd-nat.pid", reject, blackList, 8163, "")
} else {
ConfigUtils.PDNSD_LOCAL.formatLocal(Locale.ENGLISH, "127.0.0.1", 8153,
Path.BASE + "pdnsd-nat.pid", 8163)
Path.BASE + "pdnsd-nat.pid", 8163, "")
}
ConfigUtils.printToFile(new File(Path.BASE + "pdnsd-nat.conf"))(p => {
@@ -65,6 +65,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
val TAG = "ShadowsocksVpnService"
val VPN_MTU = 1500
val PRIVATE_VLAN = "26.26.26.%s"
val PRIVATE_VLAN6 = "fdfe:dcba:9876::%s"
var conn: ParcelFileDescriptor = null
var notificationManager: NotificationManager = null
var receiver: BroadcastReceiver = null
@@ -103,12 +104,8 @@ class ShadowsocksVpnService extends VpnService with BaseService {
null
}
override def onDestroy() {
super.onDestroy()
if (vpnThread != null) vpnThread.stopThread()
}
override def onCreate() {
super.onCreate()
ConfigUtils.refresh(this)
@@ -116,8 +113,6 @@ class ShadowsocksVpnService extends VpnService with BaseService {
notificationManager = getSystemService(Context.NOTIFICATION_SERVICE)
.asInstanceOf[NotificationManager]
vpnThread = new ShadowsocksVpnThread(this)
vpnThread.start()
}
override def onRevoke() {
@@ -126,6 +121,11 @@ class ShadowsocksVpnService extends VpnService with BaseService {
override def stopRunner() {
if (vpnThread != null) {
vpnThread.stopThread()
vpnThread = null
}
// channge the state
changeState(State.STOPPING)
@@ -185,6 +185,9 @@ class ShadowsocksVpnService extends VpnService with BaseService {
override def startRunner(c: Config) {
vpnThread = new ShadowsocksVpnThread(this)
vpnThread.start()
config = c
// ensure the VPNService is prepared
@@ -266,17 +269,18 @@ class ShadowsocksVpnService extends VpnService with BaseService {
}
val fd = startVpn()
if (fd == -1) {
false
} else {
Thread.sleep(1000)
if (System.sendfd(fd) == -1) {
false
} else {
true
if (fd != -1) {
var tries = 1
while (tries < 5) {
Thread.sleep(1000 * tries)
if (System.sendfd(fd) != -1) {
return true
}
tries += 1
}
}
false
}
def startShadowsocksDaemon() {
@@ -299,12 +303,14 @@ class ShadowsocksVpnService extends VpnService with BaseService {
})
val cmd = new ArrayBuffer[String]
cmd +=(Path.BASE + "ss-local", "-V", "-u"
cmd += (Path.BASE + "ss-local", "-V", "-u"
, "-b", "127.0.0.1"
, "-t", "600"
, "-c", Path.BASE + "ss-local-vpn.conf"
, "-f", Path.BASE + "ss-local-vpn.pid")
if (config.isAuth) cmd += "-A"
if (config.route != Route.ALL) {
cmd += "--acl"
cmd += (Path.BASE + "acl.list")
@@ -322,7 +328,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
p.println(conf)
})
val cmd = new ArrayBuffer[String]
cmd +=(Path.BASE + "ss-tunnel"
cmd += (Path.BASE + "ss-tunnel"
, "-V"
, "-u"
, "-t", "10"
@@ -332,20 +338,23 @@ class ShadowsocksVpnService extends VpnService with BaseService {
, "-c", Path.BASE + "ss-tunnel-vpn.conf"
, "-f", Path.BASE + "ss-tunnel-vpn.pid")
if (config.isAuth) cmd += "-A"
if (BuildConfig.DEBUG) Log.d(TAG, cmd.mkString(" "))
Console.runCommand(cmd.mkString(" "))
}
def startDnsDaemon() {
val ipv6 = if (config.isIpv6) "" else "reject = ::/0;"
val conf = {
if (config.route == Route.BYPASS_CHN) {
val reject = ConfigUtils.getRejectList(getContext, application)
val blackList = ConfigUtils.getBlackList(getContext, application)
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, "0.0.0.0", 8153,
Path.BASE + "pdnsd-vpn.pid", reject, blackList, 8163)
Path.BASE + "pdnsd-vpn.pid", reject, blackList, 8163, ipv6)
} else {
ConfigUtils.PDNSD_LOCAL.formatLocal(Locale.ENGLISH, "0.0.0.0", 8153,
Path.BASE + "pdnsd-vpn.pid", 8163)
Path.BASE + "pdnsd-vpn.pid", 8163, ipv6)
}
}
ConfigUtils.printToFile(new File(Path.BASE + "pdnsd-vpn.conf"))(p => {
@@ -368,9 +377,12 @@ class ShadowsocksVpnService extends VpnService with BaseService {
.addAddress(PRIVATE_VLAN.formatLocal(Locale.ENGLISH, "1"), 24)
.addDnsServer("8.8.8.8")
if (Utils.isLollipopOrAbove) {
if (config.isIpv6) {
builder.addAddress(PRIVATE_VLAN6.formatLocal(Locale.ENGLISH, "1"), 126)
builder.addRoute("::", 0)
}
builder.allowFamily(android.system.OsConstants.AF_INET6)
if (Utils.isLollipopOrAbove) {
if (!config.isGlobalProxy) {
val apps = AppManager.getProxiedApps(this, config.proxiedAppString)
@@ -426,7 +438,12 @@ class ShadowsocksVpnService extends VpnService with BaseService {
+ "--tunmtu %d "
+ "--loglevel 3 "
+ "--pid %stun2socks-vpn.pid")
.formatLocal(Locale.ENGLISH, PRIVATE_VLAN.formatLocal(Locale.ENGLISH, "2"), config.localPort, fd, VPN_MTU, Path.BASE)
.formatLocal(Locale.ENGLISH,
PRIVATE_VLAN.formatLocal(Locale.ENGLISH, "2"),
config.localPort, fd, VPN_MTU, Path.BASE)
if (config.isIpv6)
cmd += " --netif-ip6addr " + PRIVATE_VLAN6.formatLocal(Locale.ENGLISH, "2")
if (config.isUdpDns)
cmd += " --enable-udprelay"
@@ -50,15 +50,23 @@ class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread {
val TAG = "ShadowsocksVpnService"
val PATH = "/data/data/com.github.shadowsocks/protect_path"
var isRunning: Boolean = true
var serverSocket: LocalServerSocket = null
@volatile var isRunning: Boolean = true
@volatile var serverSocket: LocalServerSocket = null
def closeServerSocket() {
if (serverSocket != null) {
try {
serverSocket.close()
} catch {
case _: Exception => // ignore
}
serverSocket = null
}
}
def stopThread() {
isRunning = false
if (serverSocket != null) {
serverSocket.close()
serverSocket = null
}
closeServerSocket()
}
override def run(): Unit = {
@@ -71,20 +79,17 @@ class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread {
try {
val localSocket = new LocalSocket
localSocket.bind(new LocalSocketAddress(PATH, LocalSocketAddress.Namespace.FILESYSTEM))
serverSocket = new LocalServerSocket(localSocket.getFileDescriptor)
} catch {
case e: IOException =>
Log.e(TAG, "unable to bind", e)
vpnService.stopBackgroundService()
return
}
val pool = Executors.newFixedThreadPool(4)
while (isRunning) {
try {
val socket = serverSocket.accept()
@@ -131,7 +136,10 @@ class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread {
}})
} catch {
case e: IOException => Log.e(TAG, "Error when accept socket", e)
case e: IOException => {
Log.e(TAG, "Error when accept socket", e)
return
}
}
}
}
@@ -51,7 +51,7 @@ object DBHelper {
}
class DBHelper(val context: Context)
extends OrmLiteSqliteOpenHelper(context, DBHelper.PROFILE, null, 9) {
extends OrmLiteSqliteOpenHelper(context, DBHelper.PROFILE, null, 11) {
lazy val profileDao: Dao[Profile, Int] = getDao(classOf[Profile])
@@ -62,14 +62,23 @@ class DBHelper(val context: Context)
def onUpgrade(database: SQLiteDatabase, connectionSource: ConnectionSource, oldVersion: Int,
newVersion: Int) {
if (oldVersion != newVersion) {
if (oldVersion < 8) {
profileDao.executeRaw("ALTER TABLE `profile` ADD COLUMN udpdns SMALLINT;")
profileDao.executeRaw("ALTER TABLE `profile` ADD COLUMN route VARCHAR;")
} else if (oldVersion < 9) {
profileDao.executeRaw("ALTER TABLE `profile` ADD COLUMN route VARCHAR;")
} else {
if (oldVersion < 7) {
profileDao.executeRaw("DROP TABLE IF EXISTS 'profile';")
onCreate(database, connectionSource)
} else {
if (oldVersion < 8) {
profileDao.executeRaw("ALTER TABLE `profile` ADD COLUMN udpdns SMALLINT;")
profileDao.executeRaw("ALTER TABLE `profile` ADD COLUMN route VARCHAR;")
}
if (oldVersion < 9) {
profileDao.executeRaw("ALTER TABLE `profile` ADD COLUMN route VARCHAR;")
}
if (oldVersion < 10) {
profileDao.executeRaw("ALTER TABLE `profile` ADD COLUMN auth SMALLINT;")
}
if (oldVersion < 11) {
profileDao.executeRaw("ALTER TABLE `profile` ADD COLUMN ipv6 SMALLINT;")
}
}
}
}
@@ -90,6 +90,12 @@ class Profile {
@DatabaseField
var udpdns: Boolean = false
@DatabaseField
var auth: Boolean = false
@DatabaseField
var ipv6: Boolean = false
@DatabaseField(dataType = DataType.LONG_STRING)
var individual: String = ""
@@ -122,6 +122,8 @@ class ProfileManager(settings: SharedPreferences, dbHelper: DBHelper) {
edit.putBoolean(Key.isBypassApps, profile.bypass)
edit.putBoolean(Key.isTrafficStat, profile.traffic)
edit.putBoolean(Key.isUdpDns, profile.udpdns)
edit.putBoolean(Key.isAuth, profile.auth)
edit.putBoolean(Key.isIpv6, profile.ipv6)
edit.putString(Key.profileName, profile.name)
edit.putString(Key.proxy, profile.host)
edit.putString(Key.sitekey, profile.password)
@@ -146,6 +148,8 @@ class ProfileManager(settings: SharedPreferences, dbHelper: DBHelper) {
profile.bypass = settings.getBoolean(Key.isBypassApps, false)
profile.traffic = settings.getBoolean(Key.isTrafficStat, false)
profile.udpdns = settings.getBoolean(Key.isUdpDns, false)
profile.auth = settings.getBoolean(Key.isAuth, false)
profile.ipv6 = settings.getBoolean(Key.isIpv6, 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")
@@ -82,7 +82,7 @@ object ConfigUtils {
| label = "local";
| ip = 127.0.0.1;
| port = %d;
| reject = ::/0;
| %s
| reject_policy = negate;
| reject_recursively = on;
| timeout = 5;
@@ -159,8 +159,8 @@ object ConfigUtils {
|
|server {
| label = "china-servers";
| ip = 223.5.5.5, 114.114.114.114;
| timeout = 2;
| ip = 114.114.114.114, 112.124.47.27;
| timeout = 4;
| reject = %s;
| reject_policy = fail;
| reject_recursively = on;
@@ -174,7 +174,9 @@ object ConfigUtils {
| label = "local-server";
| ip = 127.0.0.1;
| port = %d;
| timeout = 3;
| %s
| reject_policy = negate;
| reject_recursively = on;
|}
|
|rr {
@@ -240,7 +242,7 @@ object ConfigUtils {
val method = proxy(3).trim
new Config(config.isGlobalProxy, config.isGFWList, config.isBypassApps, config.isTrafficStat,
config.isUdpDns, config.profileName, host, password, method, config.proxiedAppString, config.route, port,
config.isUdpDns, config.isAuth, config.isIpv6, config.profileName, host, password, method, config.proxiedAppString, config.route, port,
config.localPort)
}
@@ -250,6 +252,8 @@ object ConfigUtils {
val isBypassApps = settings.getBoolean(Key.isBypassApps, false)
val isTrafficStat = settings.getBoolean(Key.isTrafficStat, false)
val isUdpDns = settings.getBoolean(Key.isUdpDns, false)
val isAuth = settings.getBoolean(Key.isAuth, false)
val isIpv6 = settings.getBoolean(Key.isIpv6, false)
val profileName = settings.getString(Key.profileName, "default")
val proxy = settings.getString(Key.proxy, "127.0.0.1")
@@ -271,7 +275,7 @@ object ConfigUtils {
}
val proxiedAppString = settings.getString(Key.proxied, "")
new Config(isGlobalProxy, isGFWList, isBypassApps, isTrafficStat, isUdpDns, profileName, proxy,
new Config(isGlobalProxy, isGFWList, isBypassApps, isTrafficStat, isUdpDns, isAuth, isIpv6, profileName, proxy,
sitekey, encMethod, proxiedAppString, route, remotePort, localPort)
}
}
@@ -79,6 +79,8 @@ object Key {
val isBypassApps = "isBypassApps"
val isTrafficStat = "isTrafficStat"
val isUdpDns = "isUdpDns"
val isAuth= "isAuth"
val isIpv6= "isIpv6"
val proxy = "proxy"
val sitekey = "sitekey"