Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de7e516204 | ||
|
|
c31a5c1951 | ||
|
|
6c47c361f7 | ||
|
|
ddd37a3219 | ||
|
|
01125d53b3 | ||
|
|
9613d65303 | ||
|
|
a510b11187 | ||
|
|
051e600e59 | ||
|
|
fea9a6f919 |
+1
-1
@@ -24,6 +24,7 @@ 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",
|
||||
@@ -35,7 +36,6 @@ def main():
|
||||
"198.18.0.0/15",
|
||||
"198.51.100.0/24",
|
||||
"203.0.113.0/24",
|
||||
"223.5.5.0/24",
|
||||
"224.0.0.0/4",
|
||||
"240.0.0.0/4",
|
||||
]))
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
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.7")
|
||||
addSbtPlugin("com.hanhuy.sbt" % "android-sdk-plugin" % "1.4.8")
|
||||
|
||||
resolvers += "Sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/"
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.github.shadowsocks"
|
||||
android:versionCode="112"
|
||||
android:versionName="2.7.4">
|
||||
android:versionCode="114"
|
||||
android:versionName="2.7.6">
|
||||
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||
|
||||
@@ -502,11 +502,11 @@ int main (int argc, char **argv)
|
||||
goto fail2;
|
||||
}
|
||||
|
||||
char *path = "/data/data/com.github.shadowsocks/sock_path";
|
||||
unlink(path);
|
||||
char *path = "#shadowsocks_tunfd";
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.sun_family = AF_UNIX;
|
||||
strncpy(addr.sun_path, path, sizeof(addr.sun_path)-1);
|
||||
addr.sun_path[0] = 0;
|
||||
|
||||
if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
|
||||
BLog(BLOG_ERROR, "bind() failed: %s (sock = %d)\n", strerror(errno), sock);
|
||||
|
||||
Submodule src/main/jni/shadowsocks-libev updated: 23ff3bf96a...5d4db4f093
@@ -58,7 +58,8 @@ jint Java_com_github_shadowsocks_system_sendfd(JNIEnv *env, jobject thiz, jint t
|
||||
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.sun_family = AF_UNIX;
|
||||
strncpy(addr.sun_path, "/data/data/com.github.shadowsocks/sock_path", sizeof(addr.sun_path)-1);
|
||||
strncpy(addr.sun_path, "#shadowsocks_tunfd", sizeof(addr.sun_path)-1);
|
||||
addr.sun_path[0] = 0;
|
||||
|
||||
if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
|
||||
LOGE("connect() failed: %s (fd = %d)\n", strerror(errno), fd);
|
||||
|
||||
@@ -85,7 +85,23 @@
|
||||
<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/7</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>
|
||||
@@ -208,25 +224,6 @@
|
||||
<item>203.64.0.0/10</item>
|
||||
<item>203.128.0.0/9</item>
|
||||
<item>204.0.0.0/6</item>
|
||||
<item>208.0.0.0/5</item>
|
||||
<item>216.0.0.0/6</item>
|
||||
<item>220.0.0.0/7</item>
|
||||
<item>222.0.0.0/8</item>
|
||||
<item>223.0.0.0/14</item>
|
||||
<item>223.4.0.0/16</item>
|
||||
<item>223.5.0.0/22</item>
|
||||
<item>223.5.4.0/24</item>
|
||||
<item>223.5.6.0/23</item>
|
||||
<item>223.5.8.0/21</item>
|
||||
<item>223.5.16.0/20</item>
|
||||
<item>223.5.32.0/19</item>
|
||||
<item>223.5.64.0/18</item>
|
||||
<item>223.5.128.0/17</item>
|
||||
<item>223.6.0.0/15</item>
|
||||
<item>223.8.0.0/13</item>
|
||||
<item>223.16.0.0/12</item>
|
||||
<item>223.32.0.0/11</item>
|
||||
<item>223.64.0.0/10</item>
|
||||
<item>223.128.0.0/9</item>
|
||||
<item>208.0.0.0/4</item>
|
||||
</string-array>
|
||||
</resources>
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -185,6 +185,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
|
||||
@@ -271,9 +272,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,8 +399,13 @@ class Shadowsocks
|
||||
}
|
||||
|
||||
def prepareStartService() {
|
||||
showProgress(getString(R.string.connecting))
|
||||
showProgress(R.string.connecting)
|
||||
spawn {
|
||||
if (!status.getBoolean(getVersionName, false)) {
|
||||
status.edit.putBoolean(getVersionName, true).commit()
|
||||
install()
|
||||
}
|
||||
|
||||
if (isVpnEnabled) {
|
||||
val intent = VpnService.prepare(this)
|
||||
if (intent != null) {
|
||||
@@ -476,13 +483,7 @@ class Shadowsocks
|
||||
|
||||
// Update the profile
|
||||
if (!status.getBoolean(getVersionName, false)) {
|
||||
val h = showProgress(getString(R.string.initializing))
|
||||
status.edit.putBoolean(getVersionName, true).apply()
|
||||
currentProfile = profileManager.create()
|
||||
spawn {
|
||||
install()
|
||||
h.sendEmptyMessage(0)
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize the profile
|
||||
@@ -617,7 +618,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 +642,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 +661,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 +680,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 +698,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() {
|
||||
@@ -934,15 +935,11 @@ class Shadowsocks
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -972,7 +969,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)
|
||||
@@ -1090,6 +1087,7 @@ class Shadowsocks
|
||||
if (progressDialog != null) {
|
||||
progressDialog.dismiss()
|
||||
progressDialog = null
|
||||
progressTag = -1
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1103,14 +1101,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) {
|
||||
clearDialog()
|
||||
}
|
||||
changeSwitch(checked = false)
|
||||
if (m != null) {
|
||||
new SnackBar.Builder(Shadowsocks.this)
|
||||
@@ -1125,6 +1128,7 @@ class Shadowsocks
|
||||
if (progressDialog == null) {
|
||||
progressDialog = ProgressDialog
|
||||
.show(Shadowsocks.this, "", getString(R.string.stopping), true, true)
|
||||
progressTag = R.string.stopping
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,11 +103,6 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
null
|
||||
}
|
||||
|
||||
override def onDestroy() {
|
||||
super.onDestroy()
|
||||
if (vpnThread != null) vpnThread.stopThread()
|
||||
}
|
||||
|
||||
override def onCreate() {
|
||||
super.onCreate()
|
||||
|
||||
@@ -115,9 +110,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 +118,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 +182,14 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
|
||||
override def startRunner(c: Config) {
|
||||
|
||||
if (vpnThread != null) {
|
||||
vpnThread.stopThread()
|
||||
vpnThread = null
|
||||
}
|
||||
|
||||
vpnThread = new ShadowsocksVpnThread(this)
|
||||
vpnThread.start()
|
||||
|
||||
config = c
|
||||
|
||||
// ensure the VPNService is prepared
|
||||
|
||||
@@ -45,48 +45,38 @@ import java.util.concurrent.Executors
|
||||
import android.net.{LocalServerSocket, LocalSocket, LocalSocketAddress}
|
||||
import android.util.Log
|
||||
|
||||
object ShadowsocksVpn {
|
||||
@volatile var serverSocket: LocalServerSocket = null
|
||||
}
|
||||
|
||||
class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread {
|
||||
|
||||
val TAG = "ShadowsocksVpnService"
|
||||
val PATH = "/data/data/com.github.shadowsocks/protect_path"
|
||||
val PATH = "shadowsocks_protect"
|
||||
|
||||
var isRunning: Boolean = true
|
||||
var serverSocket: LocalServerSocket = null
|
||||
|
||||
def stopThread() {
|
||||
isRunning = false
|
||||
if (serverSocket != null) {
|
||||
serverSocket.close()
|
||||
serverSocket = null
|
||||
}
|
||||
}
|
||||
|
||||
override def run(): Unit = {
|
||||
|
||||
try {
|
||||
new File(PATH).delete()
|
||||
} catch {
|
||||
case _: Exception => // ignore
|
||||
}
|
||||
|
||||
try {
|
||||
val localSocket = new LocalSocket
|
||||
|
||||
localSocket.bind(new LocalSocketAddress(PATH, LocalSocketAddress.Namespace.FILESYSTEM))
|
||||
serverSocket = new LocalServerSocket(localSocket.getFileDescriptor)
|
||||
if (ShadowsocksVpn.serverSocket == null) {
|
||||
ShadowsocksVpn.serverSocket = new LocalServerSocket(PATH)
|
||||
}
|
||||
} 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()
|
||||
val socket = ShadowsocksVpn.serverSocket.accept()
|
||||
|
||||
pool.execute(new Runnable {
|
||||
override def run() {
|
||||
@@ -131,7 +121,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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user