Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fb960d0664 | ||
|
|
9ed320d33b | ||
|
|
2599e88a81 | ||
|
|
ac0a8c7600 |
+1
-1
Submodule kcptun/kcptun updated: 46dd8eab14...ced94f7820
@@ -1,7 +1,7 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools" package="com.github.shadowsocks"
|
xmlns:tools="http://schemas.android.com/tools" package="com.github.shadowsocks"
|
||||||
android:versionCode="158"
|
android:versionCode="159"
|
||||||
android:versionName="3.1.6">
|
android:versionName="3.1.7">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,14 @@
|
|||||||
|
0.0.0.0/8
|
||||||
|
10.0.0.0/8
|
||||||
|
100.64.0.0/10
|
||||||
|
127.0.0.0/8
|
||||||
|
169.254.0.0/16
|
||||||
|
172.16.0.0/12
|
||||||
|
192.0.0.0/29
|
||||||
|
192.0.2.0/24
|
||||||
|
192.88.99.0/24
|
||||||
|
192.168.0.0/16
|
||||||
|
198.18.0.0/15
|
||||||
|
198.51.100.0/24
|
||||||
|
203.0.113.0/24
|
||||||
|
224.0.0.0/3
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -298,15 +298,4 @@ trait BaseService extends Service {
|
|||||||
state = s
|
state = s
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
def getBlackList = {
|
|
||||||
val default = getString(R.string.black_list)
|
|
||||||
try {
|
|
||||||
val container = app.containerHolder.getContainer
|
|
||||||
val update = container.getString("black_list")
|
|
||||||
if (update == null || update.isEmpty) default else update
|
|
||||||
} catch {
|
|
||||||
case ex: Exception => default
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,7 +41,8 @@ package com.github.shadowsocks
|
|||||||
import java.io.{FileOutputStream, IOException, InputStream, OutputStream}
|
import java.io.{FileOutputStream, IOException, InputStream, OutputStream}
|
||||||
import java.lang.System.currentTimeMillis
|
import java.lang.System.currentTimeMillis
|
||||||
import java.net.{HttpURLConnection, URL}
|
import java.net.{HttpURLConnection, URL}
|
||||||
import java.util
|
import java.util.Date
|
||||||
|
import java.util.Hashtable
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
import android.app.backup.BackupManager
|
import android.app.backup.BackupManager
|
||||||
@@ -68,6 +69,7 @@ import com.google.android.gms.ads.{AdRequest, AdSize, AdView}
|
|||||||
import eu.chainfire.libsuperuser.Shell
|
import eu.chainfire.libsuperuser.Shell
|
||||||
|
|
||||||
import scala.collection.mutable.ArrayBuffer
|
import scala.collection.mutable.ArrayBuffer
|
||||||
|
import scala.util.Random
|
||||||
|
|
||||||
object Typefaces {
|
object Typefaces {
|
||||||
def get(c: Context, assetPath: String): Typeface = {
|
def get(c: Context, assetPath: String): Typeface = {
|
||||||
@@ -87,7 +89,7 @@ object Typefaces {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private final val TAG = "Typefaces"
|
private final val TAG = "Typefaces"
|
||||||
private final val cache = new util.Hashtable[String, Typeface]
|
private final val cache = new Hashtable[String, Typeface]
|
||||||
}
|
}
|
||||||
|
|
||||||
object Shadowsocks {
|
object Shadowsocks {
|
||||||
@@ -487,7 +489,18 @@ class Shadowsocks extends AppCompatActivity with ServiceBoundContext {
|
|||||||
adView.setAdUnitId("ca-app-pub-9097031975646651/7760346322")
|
adView.setAdUnitId("ca-app-pub-9097031975646651/7760346322")
|
||||||
adView.setAdSize(AdSize.SMART_BANNER)
|
adView.setAdSize(AdSize.SMART_BANNER)
|
||||||
preferences.getView.asInstanceOf[ViewGroup].addView(adView, 1)
|
preferences.getView.asInstanceOf[ViewGroup].addView(adView, 1)
|
||||||
adView.loadAd(new AdRequest.Builder().build())
|
|
||||||
|
// Demographics
|
||||||
|
val random = new Random()
|
||||||
|
val adBuilder = new AdRequest.Builder()
|
||||||
|
adBuilder.setGender(AdRequest.GENDER_MALE)
|
||||||
|
val year = 1975 + random.nextInt(40)
|
||||||
|
val month = 1 + random.nextInt(12)
|
||||||
|
val day = random.nextInt(28)
|
||||||
|
adBuilder.setBirthday(new Date(year, month, day))
|
||||||
|
|
||||||
|
// Load Ad
|
||||||
|
adView.loadAd(adBuilder.build())
|
||||||
} else adView.setVisibility(View.VISIBLE) else if (adView != null) adView.setVisibility(View.GONE)
|
} else adView.setVisibility(View.VISIBLE) else if (adView != null) adView.setVisibility(View.GONE)
|
||||||
|
|
||||||
preferences.setProfile(profile)
|
preferences.setProfile(profile)
|
||||||
|
|||||||
@@ -71,20 +71,6 @@ class ShadowsocksNatService extends BaseService {
|
|||||||
var su: Shell.Interactive = _
|
var su: Shell.Interactive = _
|
||||||
|
|
||||||
def startShadowsocksDaemon() {
|
def startShadowsocksDaemon() {
|
||||||
if (profile.route != Route.ALL && profile.route != Route.GFWLIST) {
|
|
||||||
val acl: Array[String] = profile.route match {
|
|
||||||
case Route.BYPASS_LAN => getResources.getStringArray(R.array.private_route)
|
|
||||||
case Route.BYPASS_CHN => getResources.getStringArray(R.array.chn_route)
|
|
||||||
case Route.BYPASS_LAN_CHN =>
|
|
||||||
getResources.getStringArray(R.array.private_route) ++ getResources.getStringArray(R.array.chn_route)
|
|
||||||
case Route.CHINALIST =>
|
|
||||||
Array("[bypass_all]", "[white_list]") ++ getResources.getStringArray(R.array.chn_route)
|
|
||||||
}
|
|
||||||
Utils.printToFile(new File(getApplicationInfo.dataDir + "/acl.list"))(p => {
|
|
||||||
acl.foreach(p.println)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
val conf = if (profile.kcp) {
|
val conf = if (profile.kcp) {
|
||||||
ConfigUtils
|
ConfigUtils
|
||||||
.SHADOWSOCKS.formatLocal(Locale.ENGLISH, "127.0.0.1", profile.localPort + 90, profile.localPort,
|
.SHADOWSOCKS.formatLocal(Locale.ENGLISH, "127.0.0.1", profile.localPort + 90, profile.localPort,
|
||||||
@@ -110,10 +96,13 @@ class ShadowsocksNatService extends BaseService {
|
|||||||
|
|
||||||
if (profile.route != Route.ALL) {
|
if (profile.route != Route.ALL) {
|
||||||
cmd += "--acl"
|
cmd += "--acl"
|
||||||
if (profile.route == Route.GFWLIST)
|
profile.route match {
|
||||||
cmd += (getApplicationInfo.dataDir + "/gfwlist.acl")
|
case Route.BYPASS_LAN => cmd += (getApplicationInfo.dataDir + "/bypass_lan.acl")
|
||||||
else
|
case Route.BYPASS_CHN => cmd += (getApplicationInfo.dataDir + "/bypass_chn.acl")
|
||||||
cmd += (getApplicationInfo.dataDir + "/acl.list")
|
case Route.BYPASS_LAN_CHN => cmd += (getApplicationInfo.dataDir + "/bypass_lan_chn.acl")
|
||||||
|
case Route.GFWLIST => cmd += (getApplicationInfo.dataDir + "/gfwlist.acl")
|
||||||
|
case Route.CHINALIST => cmd += (getApplicationInfo.dataDir + "/chinalist.acl")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BuildConfig.DEBUG) Log.d(TAG, cmd.mkString(" "))
|
if (BuildConfig.DEBUG) Log.d(TAG, cmd.mkString(" "))
|
||||||
@@ -190,16 +179,12 @@ class ShadowsocksNatService extends BaseService {
|
|||||||
def startDnsDaemon() {
|
def startDnsDaemon() {
|
||||||
|
|
||||||
val conf = profile.route match {
|
val conf = profile.route match {
|
||||||
case Route.BYPASS_CHN | Route.BYPASS_LAN_CHN => {
|
case Route.BYPASS_CHN | Route.BYPASS_LAN_CHN | Route.GFWLIST => {
|
||||||
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir,
|
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir,
|
||||||
"127.0.0.1", profile.localPort + 53, getBlackList, "", profile.localPort + 63, "")
|
"127.0.0.1", profile.localPort + 53, "1.2.4.8, 114.114.114.114, 208.67.222.222", "", profile.localPort + 63, "")
|
||||||
}
|
|
||||||
case Route.GFWLIST => {
|
|
||||||
ConfigUtils.PDNSD_UDP.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir,
|
|
||||||
"127.0.0.1", profile.localPort + 53, "1.2.4.8, 208.67.222.222", "", profile.localPort + 63, "")
|
|
||||||
}
|
}
|
||||||
case Route.CHINALIST => {
|
case Route.CHINALIST => {
|
||||||
ConfigUtils.PDNSD_UDP.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir,
|
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir,
|
||||||
"127.0.0.1", profile.localPort + 53, "8.8.8.8, 208.67.222.222", "", profile.localPort + 63, "")
|
"127.0.0.1", profile.localPort + 53, "8.8.8.8, 208.67.222.222", "", profile.localPort + 63, "")
|
||||||
}
|
}
|
||||||
case _ => {
|
case _ => {
|
||||||
|
|||||||
@@ -54,11 +54,11 @@ class ShadowsocksRunnerService extends Service with ServiceBoundContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override def onServiceConnected() {
|
override def onServiceConnected() {
|
||||||
handler.postDelayed(() => if (bgService != null) {
|
if (bgService != null) {
|
||||||
if (app.isNatEnabled) startBackgroundService()
|
if (app.isNatEnabled) startBackgroundService()
|
||||||
else if (VpnService.prepare(ShadowsocksRunnerService.this) == null) startBackgroundService()
|
else if (VpnService.prepare(ShadowsocksRunnerService.this) == null) startBackgroundService()
|
||||||
stopSelf()
|
handler.postDelayed(() => stopSelf(), 10000)
|
||||||
}, 1000)
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def startBackgroundService() = bgService.useSync(app.profileId)
|
def startBackgroundService() = bgService.useSync(app.profileId)
|
||||||
|
|||||||
@@ -226,20 +226,6 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def startShadowsocksDaemon() {
|
def startShadowsocksDaemon() {
|
||||||
if (profile.route != Route.ALL && profile.route != Route.GFWLIST) {
|
|
||||||
val acl: Array[String] = profile.route match {
|
|
||||||
case Route.BYPASS_LAN => getResources.getStringArray(R.array.private_route)
|
|
||||||
case Route.BYPASS_CHN => getResources.getStringArray(R.array.chn_route)
|
|
||||||
case Route.BYPASS_LAN_CHN =>
|
|
||||||
getResources.getStringArray(R.array.private_route) ++ getResources.getStringArray(R.array.chn_route)
|
|
||||||
case Route.CHINALIST =>
|
|
||||||
Array("[bypass_all]", "[white_list]") ++ getResources.getStringArray(R.array.chn_route)
|
|
||||||
}
|
|
||||||
Utils.printToFile(new File(getApplicationInfo.dataDir + "/acl.list"))(p => {
|
|
||||||
acl.foreach(p.println)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
val conf = if (profile.kcp) {
|
val conf = if (profile.kcp) {
|
||||||
ConfigUtils
|
ConfigUtils
|
||||||
.SHADOWSOCKS.formatLocal(Locale.ENGLISH, "127.0.0.1", profile.localPort + 90, profile.localPort,
|
.SHADOWSOCKS.formatLocal(Locale.ENGLISH, "127.0.0.1", profile.localPort + 90, profile.localPort,
|
||||||
@@ -265,10 +251,13 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
|
|
||||||
if (profile.route != Route.ALL) {
|
if (profile.route != Route.ALL) {
|
||||||
cmd += "--acl"
|
cmd += "--acl"
|
||||||
if (profile.route == Route.GFWLIST)
|
profile.route match {
|
||||||
cmd += (getApplicationInfo.dataDir + "/gfwlist.acl")
|
case Route.BYPASS_LAN => cmd += (getApplicationInfo.dataDir + "/bypass_lan.acl")
|
||||||
else
|
case Route.BYPASS_CHN => cmd += (getApplicationInfo.dataDir + "/bypass_chn.acl")
|
||||||
cmd += (getApplicationInfo.dataDir + "/acl.list")
|
case Route.BYPASS_LAN_CHN => cmd += (getApplicationInfo.dataDir + "/bypass_lan_chn.acl")
|
||||||
|
case Route.GFWLIST => cmd += (getApplicationInfo.dataDir + "/gfwlist.acl")
|
||||||
|
case Route.CHINALIST => cmd += (getApplicationInfo.dataDir + "/chinalist.acl")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TcpFastOpen.sendEnabled) cmd += "--fast-open"
|
if (TcpFastOpen.sendEnabled) cmd += "--fast-open"
|
||||||
@@ -310,16 +299,12 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
def startDnsDaemon() {
|
def startDnsDaemon() {
|
||||||
val ipv6 = if (profile.ipv6) "" else "reject = ::/0;"
|
val ipv6 = if (profile.ipv6) "" else "reject = ::/0;"
|
||||||
val conf = profile.route match {
|
val conf = profile.route match {
|
||||||
case Route.BYPASS_CHN | Route.BYPASS_LAN_CHN => {
|
case Route.BYPASS_CHN | Route.BYPASS_LAN_CHN | Route.GFWLIST => {
|
||||||
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir,
|
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir,
|
||||||
"0.0.0.0", profile.localPort + 53, getBlackList, ipv6, profile.localPort + 63, ipv6)
|
"0.0.0.0", profile.localPort + 53, "1.2.4.8, 114.114.114.114, 208.67.222.222", ipv6, profile.localPort + 63, ipv6)
|
||||||
}
|
|
||||||
case Route.GFWLIST => {
|
|
||||||
ConfigUtils.PDNSD_UDP.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir,
|
|
||||||
"0.0.0.0", profile.localPort + 53, "1.2.4.8, 208.67.222.222", ipv6, profile.localPort + 63, ipv6)
|
|
||||||
}
|
}
|
||||||
case Route.CHINALIST => {
|
case Route.CHINALIST => {
|
||||||
ConfigUtils.PDNSD_UDP.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir,
|
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir,
|
||||||
"0.0.0.0", profile.localPort + 53, "8.8.8.8, 208.67.222.222", ipv6, profile.localPort + 63, ipv6)
|
"0.0.0.0", profile.localPort + 53, "8.8.8.8, 208.67.222.222", ipv6, profile.localPort + 63, ipv6)
|
||||||
}
|
}
|
||||||
case _ => {
|
case _ => {
|
||||||
|
|||||||
@@ -115,60 +115,12 @@ object ConfigUtils {
|
|||||||
|}
|
|}
|
||||||
|
|
|
|
||||||
|server {
|
|server {
|
||||||
| label = "china-servers";
|
|
||||||
| ip = 1.2.4.8, 208.67.222.222, 114.114.114.114;
|
|
||||||
| timeout = 4;
|
|
||||||
| exclude = %s;
|
|
||||||
| policy = included;
|
|
||||||
| uptest = none;
|
|
||||||
| preset = on;
|
|
||||||
| %s
|
|
||||||
| reject_policy = negate;
|
|
||||||
| reject_recursively = on;
|
|
||||||
|}
|
|
||||||
|
|
|
||||||
|server {
|
|
||||||
| label = "local-server";
|
|
||||||
| ip = 127.0.0.1;
|
|
||||||
| port = %d;
|
|
||||||
| %s
|
|
||||||
| reject_policy = negate;
|
|
||||||
| reject_recursively = on;
|
|
||||||
|}
|
|
||||||
|
|
|
||||||
|rr {
|
|
||||||
| name=localhost;
|
|
||||||
| reverse=on;
|
|
||||||
| a=127.0.0.1;
|
|
||||||
| owner=localhost;
|
|
||||||
| soa=localhost,root.localhost,42,86400,900,86400,86400;
|
|
||||||
|}
|
|
||||||
""".stripMargin
|
|
||||||
|
|
||||||
val PDNSD_UDP =
|
|
||||||
"""
|
|
||||||
|global {
|
|
||||||
| perm_cache = 2048;
|
|
||||||
| cache_dir = "%s";
|
|
||||||
| server_ip = %s;
|
|
||||||
| server_port = %d;
|
|
||||||
| query_method = udp_tcp;
|
|
||||||
| run_ipv4 = on;
|
|
||||||
| min_ttl = 15m;
|
|
||||||
| max_ttl = 1w;
|
|
||||||
| timeout = 10;
|
|
||||||
| daemon = off;
|
|
||||||
|}
|
|
||||||
|
|
|
||||||
|server {
|
|
||||||
| label = "remote-servers";
|
| label = "remote-servers";
|
||||||
| ip = %s;
|
| ip = %s;
|
||||||
| timeout = 5;
|
| timeout = 5;
|
||||||
| uptest = none;
|
| uptest = none;
|
||||||
| preset = on;
|
| preset = on;
|
||||||
| %s
|
| %s
|
||||||
| reject_policy = negate;
|
|
||||||
| reject_recursively = on;
|
|
||||||
|}
|
|}
|
||||||
|
|
|
|
||||||
|server {
|
|server {
|
||||||
@@ -176,8 +128,6 @@ object ConfigUtils {
|
|||||||
| ip = 127.0.0.1;
|
| ip = 127.0.0.1;
|
||||||
| port = %d;
|
| port = %d;
|
||||||
| %s
|
| %s
|
||||||
| reject_policy = negate;
|
|
||||||
| reject_recursively = on;
|
|
||||||
|}
|
|}
|
||||||
|
|
|
|
||||||
|rr {
|
|rr {
|
||||||
|
|||||||
Reference in New Issue
Block a user