Compare commits

...
4 Commits
Author SHA1 Message Date
Max Lv 3db8e9d775 refine #171 2014-12-09 21:04:54 +08:00
Max Lv e708e117be fix #171 2014-12-09 20:59:04 +08:00
Max Lv 836088534b bump version 2014-12-09 17:37:58 +08:00
Max Lv 6ae97e630e fix #170 2014-12-09 17:20:29 +08:00
5 changed files with 43 additions and 40 deletions
+1 -1
View File
@@ -22,7 +22,7 @@ libraryDependencies ++= Seq(
"dnsjava" % "dnsjava" % "2.1.5", "dnsjava" % "dnsjava" % "2.1.5",
"com.github.kevinsawicki" % "http-request" % "5.6", "com.github.kevinsawicki" % "http-request" % "5.6",
"commons-net" % "commons-net" % "3.3", "commons-net" % "commons-net" % "3.3",
"com.google.zxing" % "android-integration" % "2.2" "com.google.zxing" % "android-integration" % "3.1.0"
) )
libraryDependencies ++= Seq( libraryDependencies ++= Seq(
+2 -2
View File
@@ -1,7 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.github.shadowsocks" package="com.github.shadowsocks"
android:versionCode="90" android:versionCode="91"
android:versionName="2.5.2"> android:versionName="2.5.3">
<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"/>
@@ -40,6 +40,7 @@ package com.github.shadowsocks
import java.util import java.util
import java.io.{OutputStream, InputStream, ByteArrayInputStream, ByteArrayOutputStream, IOException, FileOutputStream} import java.io.{OutputStream, InputStream, ByteArrayInputStream, ByteArrayOutputStream, IOException, FileOutputStream}
import java.util.Locale
import android.app.backup.BackupManager import android.app.backup.BackupManager
import android.app.{Activity, AlertDialog, ProgressDialog} import android.app.{Activity, AlertDialog, ProgressDialog}
@@ -68,7 +69,6 @@ import net.simonvt.menudrawer.MenuDrawer
import scala.collection.mutable.{ArrayBuffer, ListBuffer} import scala.collection.mutable.{ArrayBuffer, ListBuffer}
import scala.concurrent.ops._ import scala.concurrent.ops._
import scala.ref.WeakReference
class ProfileIconDownloader(context: Context, connectTimeout: Int, readTimeout: Int) class ProfileIconDownloader(context: Context, connectTimeout: Int, readTimeout: Int)
extends BaseImageDownloader(context, connectTimeout, readTimeout) { extends BaseImageDownloader(context, connectTimeout, readTimeout) {
@@ -326,8 +326,8 @@ class Shadowsocks
val cmd = new ArrayBuffer[String]() val cmd = new ArrayBuffer[String]()
for (task <- Array("ss-local", "ss-tunnel", "pdnsd", "redsocks", "tun2socks")) { for (task <- Array("ss-local", "ss-tunnel", "pdnsd", "redsocks", "tun2socks")) {
cmd.append("chmod 666 %s%s-nat.pid".format(Path.BASE, task)) cmd.append("chmod 666 %s%s-nat.pid".formatLocal(Locale.ENGLISH, Path.BASE, task))
cmd.append("chmod 666 %s%s-vpn.pid".format(Path.BASE, task)) cmd.append("chmod 666 %s%s-vpn.pid".formatLocal(Locale.ENGLISH, Path.BASE, task))
} }
Console.runRootCommand(cmd.toArray) Console.runRootCommand(cmd.toArray)
cmd.clear() cmd.clear()
@@ -336,17 +336,17 @@ class Shadowsocks
try { try {
val pid_nat = scala.io.Source.fromFile(Path.BASE + task + "-nat.pid").mkString.trim.toInt val pid_nat = scala.io.Source.fromFile(Path.BASE + task + "-nat.pid").mkString.trim.toInt
val pid_vpn = scala.io.Source.fromFile(Path.BASE + task + "-vpn.pid").mkString.trim.toInt val pid_vpn = scala.io.Source.fromFile(Path.BASE + task + "-vpn.pid").mkString.trim.toInt
cmd.append("kill -9 %d".format(pid_nat)) cmd.append("kill -9 %d".formatLocal(Locale.ENGLISH, pid_nat))
cmd.append("kill -9 %d".format(pid_vpn)) cmd.append("kill -9 %d".formatLocal(Locale.ENGLISH, pid_vpn))
Process.killProcess(pid_nat) Process.killProcess(pid_nat)
Process.killProcess(pid_vpn) Process.killProcess(pid_vpn)
} catch { } catch {
case e: Throwable => Log.e(Shadowsocks.TAG, "unable to kill " + task) case e: Throwable => Log.e(Shadowsocks.TAG, "unable to kill " + task)
} }
cmd.append("rm -f %s%s-nat.pid".format(Path.BASE, task)) cmd.append("rm -f %s%s-nat.pid".formatLocal(Locale.ENGLISH, Path.BASE, task))
cmd.append("rm -f %s%s-nat.conf".format(Path.BASE, task)) cmd.append("rm -f %s%s-nat.conf".formatLocal(Locale.ENGLISH, Path.BASE, task))
cmd.append("rm -f %s%s-vpn.pid".format(Path.BASE, task)) cmd.append("rm -f %s%s-vpn.pid".formatLocal(Locale.ENGLISH, Path.BASE, task))
cmd.append("rm -f %s%s-vpn.conf".format(Path.BASE, task)) cmd.append("rm -f %s%s-vpn.conf".formatLocal(Locale.ENGLISH, Path.BASE, task))
} }
Console.runCommand(cmd.toArray) Console.runCommand(cmd.toArray)
Console.runRootCommand(cmd.toArray) Console.runRootCommand(cmd.toArray)
@@ -593,6 +593,9 @@ class Shadowsocks
h.postDelayed(new Runnable() { h.postDelayed(new Runnable() {
def run() { def run() {
val integrator = new IntentIntegrator(Shadowsocks.this) val integrator = new IntentIntegrator(Shadowsocks.this)
val list = new java.util.ArrayList(IntentIntegrator.TARGET_ALL_KNOWN)
list.add("tw.com.quickmark")
integrator.setTargetApplications(list)
integrator.initiateScan() integrator.initiateScan()
h.sendEmptyMessage(0) h.sendEmptyMessage(0)
} }
@@ -670,7 +673,7 @@ class Shadowsocks
if (!profile.isDefined) return false if (!profile.isDefined) return false
new AlertDialog.Builder(this) new AlertDialog.Builder(this)
.setMessage(String.format(getString(R.string.remove_profile), profile.get.name)) .setMessage(String.format(Locale.ENGLISH, getString(R.string.remove_profile), profile.get.name))
.setCancelable(false) .setCancelable(false)
.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() { .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
override def onClick(dialog: DialogInterface, i: Int) = dialog.cancel() override def onClick(dialog: DialogInterface, i: Int) = dialog.cancel()
@@ -838,7 +841,7 @@ class Shadowsocks
val ab = new ArrayBuffer[String] val ab = new ArrayBuffer[String]
ab.append("mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system") ab.append("mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system")
for (executable <- Shadowsocks.EXECUTABLES) { for (executable <- Shadowsocks.EXECUTABLES) {
ab.append("cp %s%s /system/bin/".format(Path.BASE, executable)) ab.append("cp %s%s /system/bin/".formatLocal(Locale.ENGLISH, Path.BASE, executable))
ab.append("chmod 755 /system/bin/" + executable) ab.append("chmod 755 /system/bin/" + executable)
ab.append("chown root:shell /system/bin/" + executable) ab.append("chown root:shell /system/bin/" + executable)
} }
@@ -974,7 +977,7 @@ class Shadowsocks
} }
new AlertDialog.Builder(this) new AlertDialog.Builder(this)
.setTitle(getString(R.string.about_title).format(versionName)) .setTitle(getString(R.string.about_title).formatLocal(Locale.ENGLISH, versionName))
.setCancelable(false) .setCancelable(false)
.setNegativeButton(getString(R.string.ok_iknow), new DialogInterface.OnClickListener() { .setNegativeButton(getString(R.string.ok_iknow), new DialogInterface.OnClickListener() {
override def onClick(dialog: DialogInterface, id: Int) { override def onClick(dialog: DialogInterface, id: Int) {
@@ -1019,7 +1022,7 @@ class Shadowsocks
.setDuration(Configuration.DURATION_LONG) .setDuration(Configuration.DURATION_LONG)
.build() .build()
Crouton Crouton
.makeText(Shadowsocks.this, getString(R.string.vpn_error).format(m), style) .makeText(Shadowsocks.this, getString(R.string.vpn_error).formatLocal(Locale.ENGLISH, m), style)
.setConfiguration(config) .setConfiguration(config)
.show() .show()
} }
@@ -41,8 +41,7 @@ package com.github.shadowsocks
import java.io.File import java.io.File
import java.lang.reflect.{InvocationTargetException, Method} import java.lang.reflect.{InvocationTargetException, Method}
import java.net.InetAddress import java.util.Locale
import java.util
import android.app.{Notification, NotificationManager, PendingIntent, Service} import android.app.{Notification, NotificationManager, PendingIntent, Service}
import android.content._ import android.content._
@@ -104,7 +103,7 @@ class ShadowsocksNatService extends Service with BaseService {
val netId = getNetId(network) val netId = getNetId(network)
val oldDns = dnsAddressCache.get(netId) val oldDns = dnsAddressCache.get(netId)
if (oldDns != null) { if (oldDns != null) {
cmdBuf.append("ndc resolver setnetdns %d \"\" %s".format(netId, oldDns)) cmdBuf.append("ndc resolver setnetdns %d \"\" %s".formatLocal(Locale.ENGLISH, netId, oldDns))
dnsAddressCache.remove(netId) dnsAddressCache.remove(netId)
} }
}) })
@@ -128,7 +127,7 @@ class ShadowsocksNatService extends Service with BaseService {
val curDns = curDnsList.asScala.map(ip => ip.getHostAddress).mkString(" ") val curDns = curDnsList.asScala.map(ip => ip.getHostAddress).mkString(" ")
if (curDns != dns) { if (curDns != dns) {
dnsAddressCache.put(netId, curDns) dnsAddressCache.put(netId, curDns)
cmdBuf.append("ndc resolver setnetdns %d \"\" %s".format(netId, dns)) cmdBuf.append("ndc resolver setnetdns %d \"\" %s".formatLocal(Locale.ENGLISH, netId, dns))
} }
} }
} }
@@ -153,7 +152,7 @@ class ShadowsocksNatService extends Service with BaseService {
val networkInfo = manager.getNetworkInfo(network) val networkInfo = manager.getNetworkInfo(network)
if (networkInfo.isAvailable) { if (networkInfo.isAvailable) {
val netId = network.getClass.getDeclaredField("netId").get(network).asInstanceOf[Int] val netId = network.getClass.getDeclaredField("netId").get(network).asInstanceOf[Int]
cmdBuf.append("ndc resolver flushnet %d".format(netId)) cmdBuf.append("ndc resolver flushnet %d".formatLocal(Locale.ENGLISH, netId))
} }
}) })
Console.runRootCommand(cmdBuf.toArray) Console.runRootCommand(cmdBuf.toArray)
@@ -193,7 +192,7 @@ class ShadowsocksNatService extends Service with BaseService {
} }
val conf = ConfigUtils val conf = ConfigUtils
.SHADOWSOCKS.format(config.proxy, config.remotePort, config.localPort, .SHADOWSOCKS.formatLocal(Locale.ENGLISH, config.proxy, config.remotePort, config.localPort,
config.sitekey, config.encMethod, 10) config.sitekey, config.encMethod, 10)
ConfigUtils.printToFile(new File(Path.BASE + "ss-local-nat.conf"))(p => { ConfigUtils.printToFile(new File(Path.BASE + "ss-local-nat.conf"))(p => {
p.println(conf) p.println(conf)
@@ -217,7 +216,7 @@ class ShadowsocksNatService extends Service with BaseService {
def startTunnel() { def startTunnel() {
if (config.isUdpDns) { if (config.isUdpDns) {
val conf = ConfigUtils val conf = ConfigUtils
.SHADOWSOCKS.format(config.proxy, config.remotePort, 8153, .SHADOWSOCKS.formatLocal(Locale.ENGLISH, config.proxy, config.remotePort, 8153,
config.sitekey, config.encMethod, 10) config.sitekey, config.encMethod, 10)
ConfigUtils.printToFile(new File(Path.BASE + "ss-tunnel-nat.conf"))(p => { ConfigUtils.printToFile(new File(Path.BASE + "ss-tunnel-nat.conf"))(p => {
p.println(conf) p.println(conf)
@@ -245,7 +244,7 @@ class ShadowsocksNatService extends Service with BaseService {
} else { } else {
val conf = ConfigUtils val conf = ConfigUtils
.SHADOWSOCKS.format(config.proxy, config.remotePort, 8163, .SHADOWSOCKS.formatLocal(Locale.ENGLISH, config.proxy, config.remotePort, 8163,
config.sitekey, config.encMethod, 10) config.sitekey, config.encMethod, 10)
ConfigUtils.printToFile(new File(Path.BASE + "ss-tunnel-nat.conf"))(p => { ConfigUtils.printToFile(new File(Path.BASE + "ss-tunnel-nat.conf"))(p => {
p.println(conf) p.println(conf)
@@ -266,10 +265,10 @@ class ShadowsocksNatService extends Service with BaseService {
def startDnsDaemon() { def startDnsDaemon() {
val conf = if (Utils.isLollipopOrAbove) { val conf = if (Utils.isLollipopOrAbove) {
ConfigUtils ConfigUtils
.PDNSD_BYPASS.format("127.0.0.1", 53, Path.BASE + "pdnsd-nat.pid", getString(R.string.exclude), 8163) .PDNSD_BYPASS.formatLocal(Locale.ENGLISH, "127.0.0.1", 53, Path.BASE + "pdnsd-nat.pid", getString(R.string.exclude), 8163)
} else { } else {
ConfigUtils ConfigUtils
.PDNSD_BYPASS.format("127.0.0.1", 8153, Path.BASE + "pdnsd-nat.pid", getString(R.string.exclude), 8163) .PDNSD_BYPASS.formatLocal(Locale.ENGLISH, "127.0.0.1", 8153, Path.BASE + "pdnsd-nat.pid", getString(R.string.exclude), 8163)
} }
ConfigUtils.printToFile(new File(Path.BASE + "pdnsd-nat.conf"))(p => { ConfigUtils.printToFile(new File(Path.BASE + "pdnsd-nat.conf"))(p => {
p.println(conf) p.println(conf)
@@ -299,9 +298,9 @@ class ShadowsocksNatService extends Service with BaseService {
} }
def startRedsocksDaemon() { def startRedsocksDaemon() {
val conf = ConfigUtils.REDSOCKS.format(config.localPort) val conf = ConfigUtils.REDSOCKS.formatLocal(Locale.ENGLISH, config.localPort)
val cmd = Path.BASE + "redsocks -p %sredsocks-nat.pid -c %sredsocks-nat.conf" val cmd = Path.BASE + "redsocks -p %sredsocks-nat.pid -c %sredsocks-nat.conf"
.format(Path.BASE, Path.BASE) .formatLocal(Locale.ENGLISH, Path.BASE, Path.BASE)
ConfigUtils.printToFile(new File(Path.BASE + "redsocks-nat.conf"))(p => { ConfigUtils.printToFile(new File(Path.BASE + "redsocks-nat.conf"))(p => {
p.println(conf) p.println(conf)
}) })
@@ -394,7 +393,7 @@ class ShadowsocksNatService extends Service with BaseService {
val cmd = new ArrayBuffer[String]() val cmd = new ArrayBuffer[String]()
for (task <- Array("ss-local", "ss-tunnel", "pdnsd", "redsocks")) { for (task <- Array("ss-local", "ss-tunnel", "pdnsd", "redsocks")) {
cmd.append("chmod 666 %s%s-nat.pid".format(Path.BASE, task)) cmd.append("chmod 666 %s%s-nat.pid".formatLocal(Locale.ENGLISH, Path.BASE, task))
} }
Console.runRootCommand(cmd.toArray) Console.runRootCommand(cmd.toArray)
cmd.clear() cmd.clear()
@@ -402,13 +401,13 @@ class ShadowsocksNatService extends Service with BaseService {
for (task <- Array("ss-local", "ss-tunnel", "pdnsd", "redsocks")) { for (task <- Array("ss-local", "ss-tunnel", "pdnsd", "redsocks")) {
try { try {
val pid = scala.io.Source.fromFile(Path.BASE + task + "-nat.pid").mkString.trim.toInt val pid = scala.io.Source.fromFile(Path.BASE + task + "-nat.pid").mkString.trim.toInt
cmd.append("kill -9 %d".format(pid)) cmd.append("kill -9 %d".formatLocal(Locale.ENGLISH, pid))
Process.killProcess(pid) Process.killProcess(pid)
} catch { } catch {
case e: Throwable => Log.e(TAG, "unable to kill " + task) case e: Throwable => Log.e(TAG, "unable to kill " + task)
} }
cmd.append("rm -f %s%s-nat.pid".format(Path.BASE, task)) cmd.append("rm -f %s%s-nat.pid".formatLocal(Locale.ENGLISH, Path.BASE, task))
cmd.append("rm -f %s%s-nat.conf".format(Path.BASE, task)) cmd.append("rm -f %s%s-nat.conf".formatLocal(Locale.ENGLISH, Path.BASE, task))
} }
Console.runRootCommand(cmd.toArray) Console.runRootCommand(cmd.toArray)
@@ -564,7 +563,7 @@ class ShadowsocksNatService extends Service with BaseService {
flushDns() flushDns()
notifyForegroundAlert(getString(R.string.forward_success), notifyForegroundAlert(getString(R.string.forward_success),
getString(R.string.service_running).format(config.profileName)) getString(R.string.service_running).formatLocal(Locale.ENGLISH, config.profileName))
changeState(State.CONNECTED) changeState(State.CONNECTED)
} else { } else {
changeState(State.STOPPED, getString(R.string.service_failed)) changeState(State.STOPPED, getString(R.string.service_failed))
@@ -40,6 +40,7 @@
package com.github.shadowsocks package com.github.shadowsocks
import java.io.File import java.io.File
import java.util.Locale
import android.app._ import android.app._
import android.content._ import android.content._
@@ -107,7 +108,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
} }
val conf = ConfigUtils val conf = ConfigUtils
.SHADOWSOCKS.format(config.proxy, config.remotePort, config.localPort, .SHADOWSOCKS.formatLocal(Locale.ENGLISH, config.proxy, config.remotePort, config.localPort,
config.sitekey, config.encMethod, 10) config.sitekey, config.encMethod, 10)
ConfigUtils.printToFile(new File(Path.BASE + "ss-local-vpn.conf"))(p => { ConfigUtils.printToFile(new File(Path.BASE + "ss-local-vpn.conf"))(p => {
p.println(conf) p.println(conf)
@@ -130,7 +131,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
def startDnsTunnel() = { def startDnsTunnel() = {
val conf = ConfigUtils val conf = ConfigUtils
.SHADOWSOCKS.format(config.proxy, config.remotePort, 8163, .SHADOWSOCKS.formatLocal(Locale.ENGLISH, config.proxy, config.remotePort, 8163,
config.sitekey, config.encMethod, 10) config.sitekey, config.encMethod, 10)
ConfigUtils.printToFile(new File(Path.BASE + "ss-tunnel-vpn.conf"))(p => { ConfigUtils.printToFile(new File(Path.BASE + "ss-tunnel-vpn.conf"))(p => {
p.println(conf) p.println(conf)
@@ -150,9 +151,9 @@ class ShadowsocksVpnService extends VpnService with BaseService {
def startDnsDaemon() { def startDnsDaemon() {
val conf = { val conf = {
if (Utils.isLollipopOrAbove) { if (Utils.isLollipopOrAbove) {
ConfigUtils.PDNSD_BYPASS.format("0.0.0.0", 8153, Path.BASE + "pdnsd-vpn.pid", getString(R.string.exclude), 8163) ConfigUtils.PDNSD_BYPASS.formatLocal(Locale.ENGLISH, "0.0.0.0", 8153, Path.BASE + "pdnsd-vpn.pid", getString(R.string.exclude), 8163)
} else { } else {
ConfigUtils.PDNSD_LOCAL.format("0.0.0.0", 8163) ConfigUtils.PDNSD_LOCAL.formatLocal(Locale.ENGLISH, "0.0.0.0", 8163)
} }
} }
ConfigUtils.printToFile(new File(Path.BASE + "pdnsd-vpn.conf"))(p => { ConfigUtils.printToFile(new File(Path.BASE + "pdnsd-vpn.conf"))(p => {
@@ -182,7 +183,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
builder builder
.setSession(config.profileName) .setSession(config.profileName)
.setMtu(VPN_MTU) .setMtu(VPN_MTU)
.addAddress(PRIVATE_VLAN.format("1"), 24) .addAddress(PRIVATE_VLAN.formatLocal(Locale.ENGLISH, "1"), 24)
.addDnsServer("8.8.8.8") .addDnsServer("8.8.8.8")
if (Utils.isLollipopOrAbove) { if (Utils.isLollipopOrAbove) {
@@ -312,12 +313,12 @@ class ShadowsocksVpnService extends VpnService with BaseService {
+ "--tunmtu %d " + "--tunmtu %d "
+ "--loglevel 3 " + "--loglevel 3 "
+ "--pid %stun2socks-vpn.pid") + "--pid %stun2socks-vpn.pid")
.format(PRIVATE_VLAN.format("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.isUdpDns) if (config.isUdpDns)
cmd += " --enable-udprelay" cmd += " --enable-udprelay"
else else
cmd += " --dnsgw %s:8153".format(PRIVATE_VLAN.format("1")) cmd += " --dnsgw %s:8153".formatLocal(Locale.ENGLISH, PRIVATE_VLAN.formatLocal(Locale.ENGLISH, "1"))
if (Utils.isLollipopOrAbove) { if (Utils.isLollipopOrAbove) {
cmd += " --fake-proc" cmd += " --fake-proc"