From 2a711c010c721cfa477da6bb6dfed3f508359ad5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Parm=C3=A9nides=20GV?= Date: Mon, 16 Jun 2014 14:13:06 +0200 Subject: Succesfully updated. --- app/misc/build-native.bat | 22 ++++ app/misc/build-native.sh | 54 +++++++++ app/misc/fetchtranslations.sh | 38 ++++++ app/misc/genFAQ.py | 118 ++++++++++++++++++ app/misc/prepareovpn3.sh | 3 + app/ovpnlibs/assets/minivpn.armeabi | Bin 5216 -> 0 bytes app/ovpnlibs/assets/minivpn.armeabi-v7a | Bin 5228 -> 0 bytes app/ovpnlibs/assets/minivpn.mips | Bin 5164 -> 0 bytes app/ovpnlibs/assets/minivpn.x86 | Bin 5268 -> 0 bytes app/ovpnlibs/assets/nopievpn.armeabi | Bin 0 -> 5248 bytes app/ovpnlibs/assets/nopievpn.armeabi-v7a | Bin 0 -> 5256 bytes app/ovpnlibs/assets/nopievpn.mips | Bin 0 -> 5244 bytes app/ovpnlibs/assets/nopievpn.x86 | Bin 0 -> 5264 bytes app/ovpnlibs/assets/pievpn.armeabi | Bin 0 -> 5248 bytes app/ovpnlibs/assets/pievpn.armeabi-v7a | Bin 0 -> 5256 bytes app/ovpnlibs/assets/pievpn.mips | Bin 0 -> 5180 bytes app/ovpnlibs/assets/pievpn.x86 | Bin 0 -> 5264 bytes .../main/java/de/blinkt/openvpn/VpnProfile.java | 62 ++++++---- .../java/de/blinkt/openvpn/core/ConfigParser.java | 2 +- .../java/de/blinkt/openvpn/core/OpenVPNThread.java | 28 +++-- .../de/blinkt/openvpn/core/OpenVpnService.java | 16 ++- .../de/blinkt/openvpn/core/VPNLaunchHelper.java | 15 +-- app/src/main/res/values-et/strings-icsopenvpn.xml | 5 + app/src/main/res/values-fr/strings-icsopenvpn.xml | 4 + app/src/main/res/values-it/strings-icsopenvpn.xml | 1 + app/src/main/res/values-ru/strings-icsopenvpn.xml | 56 ++++++--- app/src/main/res/values-tr/strings-icsopenvpn.xml | 4 +- app/src/main/res/values-uk/strings-icsopenvpn.xml | 18 +++ .../main/res/values-zh-rCN/strings-icsopenvpn.xml | 57 +++++++-- app/src/main/res/values/untranslatable.xml | 133 +++++++++++++++++++++ .../main/java/de/blinkt/openvpn/VpnProfile.java | 62 ++++++---- .../java/de/blinkt/openvpn/core/ConfigParser.java | 2 +- .../java/de/blinkt/openvpn/core/OpenVPNThread.java | 28 +++-- .../de/blinkt/openvpn/core/OpenVpnService.java | 18 +-- .../de/blinkt/openvpn/core/VPNLaunchHelper.java | 15 +-- .../main/src/main/res/menu/logmenu.xml | 74 ++++++------ .../main/src/main/res/values-et/strings.xml | 5 + .../main/src/main/res/values-fr/strings.xml | 4 + .../main/src/main/res/values-it/strings.xml | 1 + .../main/src/main/res/values-ru/strings.xml | 56 ++++++--- .../main/src/main/res/values-tr/strings.xml | 4 +- .../main/src/main/res/values-uk/strings.xml | 18 +++ .../main/src/main/res/values-zh-rCN/strings.xml | 57 +++++++-- 43 files changed, 792 insertions(+), 188 deletions(-) create mode 100644 app/misc/build-native.bat create mode 100755 app/misc/build-native.sh create mode 100755 app/misc/fetchtranslations.sh create mode 100755 app/misc/genFAQ.py create mode 100755 app/misc/prepareovpn3.sh delete mode 100755 app/ovpnlibs/assets/minivpn.armeabi delete mode 100755 app/ovpnlibs/assets/minivpn.armeabi-v7a delete mode 100755 app/ovpnlibs/assets/minivpn.mips delete mode 100755 app/ovpnlibs/assets/minivpn.x86 create mode 100755 app/ovpnlibs/assets/nopievpn.armeabi create mode 100755 app/ovpnlibs/assets/nopievpn.armeabi-v7a create mode 100755 app/ovpnlibs/assets/nopievpn.mips create mode 100755 app/ovpnlibs/assets/nopievpn.x86 create mode 100755 app/ovpnlibs/assets/pievpn.armeabi create mode 100755 app/ovpnlibs/assets/pievpn.armeabi-v7a create mode 100755 app/ovpnlibs/assets/pievpn.mips create mode 100755 app/ovpnlibs/assets/pievpn.x86 diff --git a/app/misc/build-native.bat b/app/misc/build-native.bat new file mode 100644 index 00000000..73a19a00 --- /dev/null +++ b/app/misc/build-native.bat @@ -0,0 +1,22 @@ + +@echo on +echo Currently broken, feel free to fix and send me a patch, see .sh file +exit 1 + +call ndk-build APP_API=all -j 8 + + +cd libs +mkdir ..\assets +mkdir ..\build\ + +for /D %%f in (*) do ( + copy %%f\minivpn ..\assets\minivpn.%%f + del %%f\libcrypto.so + del %%f\libssl.so + + mkdir ..\build\native-libs\%%f\ + copy %%f\*.so ..\build\native-libs\%%f\ +) + +cd .. diff --git a/app/misc/build-native.sh b/app/misc/build-native.sh new file mode 100755 index 00000000..f27384cd --- /dev/null +++ b/app/misc/build-native.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +# Exit on errors +set -e + +# Generate git config if the openvpn directory is checked out from git +if [ -d openvpn/.git ]; then + GIT=git + cd openvpn + CONFIGURE_GIT_CHFILES=$($GIT diff-files --name-status -r --ignore-submodules --quiet -- || echo "+") + CONFIGURE_GIT_UNCOMMITTED=$($GIT diff-index --cached --quiet --ignore-submodules HEAD || echo "*") + CONFIGURE_GIT_REVISION=$($GIT rev-parse --symbolic-full-name HEAD | cut -d/ -f3)-$($GIT rev-parse --short=16 HEAD) + echo "#define CONFIGURE_GIT_REVISION \"${CONFIGURE_GIT_REVISION}\"" > config-version.h.tmp; \ + echo "#define CONFIGURE_GIT_FLAGS \"${CONFIGURE_GIT_CHFILES}${CONFIGURE_GIT_UNCOMMITTED}\"" >> config-version.h.tmp + + if ! [ -f config-version.h ] || ! cmp -s config-version.h.tmp config-version.h; then \ + echo "replacing config-version.h" + mv config-version.h.tmp config-version.h + else + rm -f config-version.h.tmp + fi + cd .. +fi + +if [ "x$1" = "x" ]; then + ndk-build APP_API=all -j 8 +else + ndk-build $@ +fi + +if [ $? = 0 ]; then + rm -rf ovpnlibs/ + + cd libs + mkdir -p ../ovpnlibs/assets + for i in * + do + cp -v $i/nopievpn ../ovpnlibs/assets/nopievpn.$i + cp -v $i/pievpn ../ovpnlibs/assets/pievpn.$i + done + # Removed compiled openssl libs, will use platform so libs + # Reduces size of apk + # + rm -v */libcrypto.so */libssl.so + + for arch in * + do + builddir=../ovpnlibs/jniLibs/$arch + mkdir -p $builddir + cp -v $arch/*.so $builddir + done +else + exit $? +fi diff --git a/app/misc/fetchtranslations.sh b/app/misc/fetchtranslations.sh new file mode 100755 index 00000000..d92c24b5 --- /dev/null +++ b/app/misc/fetchtranslations.sh @@ -0,0 +1,38 @@ +#! /bin/sh + + +if [ "$ICSCROWDAPIKEY" != "" ] +then + echo "Generating new translation archives" + fetch -q -1 -o - http://api.crowdin.net/api/project/ics-openvpn/export?key=$ICSCROWDAPIKEY +fi + +echo "Fetch translation archive" +fetch -q http://crowdin.net/download/project/ics-openvpn.zip + +langtoinclude="ca cs de es et fr id it ja ko no nl pl ro ru sv tr uk" + +for lang in $langtoinclude +do + tar -xvf ics-openvpn.zip -C src/main res/values-$lang/ +done + +# Chinese language require zh-CN and zh-TW + +for lang in zh-CN zh-TW id +do + if [ $lang = "zh-CN" ] ; then + rlang="zh-rCN" + elif [ $lang = "zh-TW" ] ; then + rlang="zh-rTW" + elif [ $lang = "id" ] ; then + rlang="id" + fi + + echo "Fetch archive for $lang" + fetch http://crowdin.net/download/project/ics-openvpn/$lang.zip + tar -xv -C src/main/res/values-$rlang/ --strip-components 3 -f $lang.zip + rm $lang.zip +done + +rm -v ics-openvpn.zip diff --git a/app/misc/genFAQ.py b/app/misc/genFAQ.py new file mode 100755 index 00000000..b1506420 --- /dev/null +++ b/app/misc/genFAQ.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python +# Quick and dirty script to generate googlecode wiki pages + +import codecs +import xml.dom.minidom as dom +import os.path + +faqpath = "/Users/arne/oss/ics-openvpn.wiki" + +header=""" + +This page is autogenerated. Do not edit + + += Frequently aksed questions = +""" + +def getString(strid,lang): + ostr="" + if strid in strres[lang]: + ostr=strres[lang][strid] + else: + ostr=strres["default"][strid] + + ostr = ostr.replace("<","<") + ostr = ostr.replace(">",">") + ostr = ostr.replace("\\\"","\"") + ostr = ostr.replace("\\'","'") + ostr = ostr.replace("\\n","

") + return ostr + +def genPage(faqdom,lang): + out ="" + + #out+="#summary %s\n" % getString("faq_summary",lang) + out+= header + + for xmld in faqdom.firstChild.childNodes: + for xmle in xmld.childNodes: + if xmle.nodeName == "TextView": + style = xmle.getAttribute("style") + + textstyle = None + if style == "@style/faqhead": + textstyle = "== %s ==\n" + elif style == "@style/faqitem": + textstyle = "%s\n" + + atext = xmle.getAttribute("android:text") + aid = xmle.getAttribute("android:id") + if atext: + atextid = atext.replace("@string/","") + else: + atextid = aid.replace("@+id/","") + + out += textstyle % getString(atextid,lang) + + return out + + +strres={} + +def loadstrres(filename,lang): + xmlstr = dom.parse(filename) + strres[lang]={} + for xmld in xmlstr.childNodes: + for xmle in xmld.childNodes: + if xmle.nodeName == "string": + strname= xmle.getAttribute("name") + strdata = xmle.firstChild.data + strres[lang][strname]=strdata + + +def main(): + + loadstrres("src/main/res/values/strings.xml","default") + + faqdom = dom.parse("src/main/res/layout/faq.xml") + faq= genPage(faqdom,"default") + + open(faqpath + "/FAQ.wiki","w").write(faq) + + for directory in os.listdir("src/main/res"): + if directory.startswith("values-") and directory.find("-sw")==-1: + lang = directory.split("-",1)[1] + print lang + loadstrres("src/main/res/values-%s/strings.xml" % lang,lang) + + langdir= "%s/%s" %(faqpath,lang) + if lang=="zh-rCN": + langdir= "%s/%s" %(faqpath,"zh-Hans") + elif lang=="zh-rTW": + langdir= "%s/%s" %(faqpath,"zh-Hant") + + + if not os.path.exists(langdir): + os.mkdir(langdir) + + faq= genPage(faqdom,lang) + open("%s/FAQ.wiki" % langdir,"w").write(faq.encode("utf-8")) + + checkFormatString(lang) + +def checkFormatString(lang): + for strid in strres["default"]: + ostr = getString(strid,"default") + tstr = getString(strid,lang) + + + for f in ["%s", "%d", "%f"] + ["%%%d$s" % d for d in range(0,10)] + ["%%%d$d" % d for d in range(0,10)]: + ino = ostr.find(f)==-1 + int = tstr.find(f)==-1 + + if ino != int: + print "Mismatch",strid,f,ostr,tstr + +if __name__=="__main__": + main() diff --git a/app/misc/prepareovpn3.sh b/app/misc/prepareovpn3.sh new file mode 100755 index 00000000..15982727 --- /dev/null +++ b/app/misc/prepareovpn3.sh @@ -0,0 +1,3 @@ +export O3=$PWD/openvpn3 +mkdir -p src/ovpn3/java/net/openvpn/ovpn3 +swig -outdir src/ovpn3/java/net/openvpn/ovpn3/ -c++ -java -package net.openvpn.ovpn3 -I$O3/client -I$O3 $O3/javacli/ovpncli.i \ No newline at end of file diff --git a/app/ovpnlibs/assets/minivpn.armeabi b/app/ovpnlibs/assets/minivpn.armeabi deleted file mode 100755 index 5c1865b1..00000000 Binary files a/app/ovpnlibs/assets/minivpn.armeabi and /dev/null differ diff --git a/app/ovpnlibs/assets/minivpn.armeabi-v7a b/app/ovpnlibs/assets/minivpn.armeabi-v7a deleted file mode 100755 index cb506b63..00000000 Binary files a/app/ovpnlibs/assets/minivpn.armeabi-v7a and /dev/null differ diff --git a/app/ovpnlibs/assets/minivpn.mips b/app/ovpnlibs/assets/minivpn.mips deleted file mode 100755 index 7f2ae3c6..00000000 Binary files a/app/ovpnlibs/assets/minivpn.mips and /dev/null differ diff --git a/app/ovpnlibs/assets/minivpn.x86 b/app/ovpnlibs/assets/minivpn.x86 deleted file mode 100755 index a80bb27a..00000000 Binary files a/app/ovpnlibs/assets/minivpn.x86 and /dev/null differ diff --git a/app/ovpnlibs/assets/nopievpn.armeabi b/app/ovpnlibs/assets/nopievpn.armeabi new file mode 100755 index 00000000..908dceab Binary files /dev/null and b/app/ovpnlibs/assets/nopievpn.armeabi differ diff --git a/app/ovpnlibs/assets/nopievpn.armeabi-v7a b/app/ovpnlibs/assets/nopievpn.armeabi-v7a new file mode 100755 index 00000000..bba1ea22 Binary files /dev/null and b/app/ovpnlibs/assets/nopievpn.armeabi-v7a differ diff --git a/app/ovpnlibs/assets/nopievpn.mips b/app/ovpnlibs/assets/nopievpn.mips new file mode 100755 index 00000000..af510053 Binary files /dev/null and b/app/ovpnlibs/assets/nopievpn.mips differ diff --git a/app/ovpnlibs/assets/nopievpn.x86 b/app/ovpnlibs/assets/nopievpn.x86 new file mode 100755 index 00000000..8a4b7d13 Binary files /dev/null and b/app/ovpnlibs/assets/nopievpn.x86 differ diff --git a/app/ovpnlibs/assets/pievpn.armeabi b/app/ovpnlibs/assets/pievpn.armeabi new file mode 100755 index 00000000..8849f862 Binary files /dev/null and b/app/ovpnlibs/assets/pievpn.armeabi differ diff --git a/app/ovpnlibs/assets/pievpn.armeabi-v7a b/app/ovpnlibs/assets/pievpn.armeabi-v7a new file mode 100755 index 00000000..fce4d077 Binary files /dev/null and b/app/ovpnlibs/assets/pievpn.armeabi-v7a differ diff --git a/app/ovpnlibs/assets/pievpn.mips b/app/ovpnlibs/assets/pievpn.mips new file mode 100755 index 00000000..e7eaf435 Binary files /dev/null and b/app/ovpnlibs/assets/pievpn.mips differ diff --git a/app/ovpnlibs/assets/pievpn.x86 b/app/ovpnlibs/assets/pievpn.x86 new file mode 100755 index 00000000..df9b45eb Binary files /dev/null and b/app/ovpnlibs/assets/pievpn.x86 differ diff --git a/app/src/main/java/de/blinkt/openvpn/VpnProfile.java b/app/src/main/java/de/blinkt/openvpn/VpnProfile.java index 93d0d386..d21a085f 100644 --- a/app/src/main/java/de/blinkt/openvpn/VpnProfile.java +++ b/app/src/main/java/de/blinkt/openvpn/VpnProfile.java @@ -4,8 +4,8 @@ import se.leap.bitmaskclient.R; import se.leap.bitmaskclient.R; -import se.leap.bitmaskclient.Dashboard; import se.leap.bitmaskclient.EIP; +import se.leap.bitmaskclient.Dashboard; import se.leap.bitmaskclient.Provider; import android.content.Context; @@ -20,18 +20,16 @@ import android.security.KeyChain; import android.security.KeyChainException; import android.util.Base64; -import de.blinkt.openvpn.core.NativeUtils; -import de.blinkt.openvpn.core.VpnStatus; -import de.blinkt.openvpn.core.OpenVpnService; -import de.blinkt.openvpn.core.X509Utils; import org.spongycastle.util.io.pem.PemObject; import org.spongycastle.util.io.pem.PemWriter; -import javax.crypto.BadPaddingException; -import javax.crypto.Cipher; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.NoSuchPaddingException; -import java.io.*; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Serializable; +import java.io.StringWriter; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.security.InvalidKeyException; @@ -45,6 +43,16 @@ import java.util.Locale; import java.util.UUID; import java.util.Vector; +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; + +import de.blinkt.openvpn.core.NativeUtils; +import de.blinkt.openvpn.core.OpenVpnService; +import de.blinkt.openvpn.core.VpnStatus; +import de.blinkt.openvpn.core.X509Utils; + public class VpnProfile implements Serializable { // Note that this class cannot be moved to core where it belongs since // the profile loading depends on it being here @@ -56,7 +64,9 @@ public class VpnProfile implements Serializable { public static final String EXTRA_PROFILEUUID = "de.blinkt.openvpn.profileUUID"; public static final String INLINE_TAG = "[[INLINE]]"; public static final String DISPLAYNAME_TAG = "[[NAME]]"; - public static final String MINIVPN = "miniopenvpn"; + private static final String MININONPIEVPN = "nopievpn"; + private static final String MINIPIEVPN = "pievpn"; + private static final long serialVersionUID = 7085688938959334563L; private static final String OVPNCONFIGFILE = "android.conf"; public static final int MAXLOGLEVEL = 4; @@ -146,6 +156,14 @@ public class VpnProfile implements Serializable { mProfileVersion = CURRENT_PROFILE_VERSION; } + public static String getMiniVPNExecutableName() + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) + return VpnProfile.MINIPIEVPN; + else + return VpnProfile.MININONPIEVPN; + } + public static String openVpnEscape(String unescaped) { if (unescaped == null) return null; @@ -260,22 +278,16 @@ public class VpnProfile implements Serializable { cfg += " tcp-client\n"; - android.util.Log.d("vpnprofile", Integer.toString(mAuthenticationType)); switch (mAuthenticationType) { case VpnProfile.TYPE_USERPASS_CERTIFICATES: cfg += "auth-user-pass\n"; - case VpnProfile.TYPE_CERTIFICATES: - // Ca - // cfg += insertFileData("ca", mCaFilename); - - // // Client Cert + Key - // cfg += insertFileData("key", mClientKeyFilename); - // cfg += insertFileData("cert", mClientCertFilename); + case VpnProfile.TYPE_CERTIFICATES: // FIXME This is all we need...The whole switch statement can go... SharedPreferences preferences = context.getSharedPreferences(Dashboard.SHARED_PREFERENCES, context.MODE_PRIVATE); cfg+="\n"+preferences.getString(Provider.CA_CERT, "")+"\n\n"; cfg+="\n"+preferences.getString(EIP.PRIVATE_KEY, "")+"\n\n"; cfg+="\n"+preferences.getString(EIP.CERTIFICATE, "")+"\n\n"; + break; case VpnProfile.TYPE_USERPASS_PKCS12: cfg += "auth-user-pass\n"; @@ -551,7 +563,7 @@ public class VpnProfile implements Serializable { // Add fixed paramenters //args.add("/data/data/de.blinkt.openvpn/lib/openvpn"); - args.add(cacheDir.getAbsolutePath() + "/" + VpnProfile.MINIVPN); + args.add(cacheDir.getAbsolutePath() + "/" + getMiniVPNExecutableName()); args.add("--config"); args.add(cacheDir.getAbsolutePath() + "/" + OVPNCONFIGFILE); @@ -560,14 +572,16 @@ public class VpnProfile implements Serializable { return args.toArray(new String[args.size()]); } + + public Intent prepareIntent(Context context) { String prefix = context.getPackageName(); Intent intent = new Intent(context, OpenVpnService.class); if (mAuthenticationType == VpnProfile.TYPE_KEYSTORE || mAuthenticationType == VpnProfile.TYPE_USERPASS_KEYSTORE) { - // if (getKeyStoreCertificates(context) == null) - // return null; + if (getKeyStoreCertificates(context) == null) + return null; } intent.putExtra(prefix + ".ARGV", buildOpenvpnArgv(context.getCacheDir())); @@ -736,8 +750,8 @@ public class VpnProfile implements Serializable { //! Return an error if somethign is wrong public int checkProfile(Context context) { if (mAuthenticationType == TYPE_KEYSTORE || mAuthenticationType == TYPE_USERPASS_KEYSTORE) { - // if (mAlias == null) - // return R.string.no_keystore_cert_selected; + if (mAlias == null) + return R.string.no_keystore_cert_selected; } if (!mUsePull || mAuthenticationType == TYPE_STATICKEYS) { diff --git a/app/src/main/java/de/blinkt/openvpn/core/ConfigParser.java b/app/src/main/java/de/blinkt/openvpn/core/ConfigParser.java index 32e5cabb..4fbbe165 100644 --- a/app/src/main/java/de/blinkt/openvpn/core/ConfigParser.java +++ b/app/src/main/java/de/blinkt/openvpn/core/ConfigParser.java @@ -33,7 +33,7 @@ public class ConfigParser { public void setDefinition(HashMap>> args) { options = args; } - + public void parseConfig(Reader reader) throws IOException, ConfigParseError { diff --git a/app/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java b/app/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java index 67c24884..0de54ed7 100644 --- a/app/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java +++ b/app/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java @@ -1,18 +1,28 @@ package de.blinkt.openvpn.core; import android.util.Log; -import se.leap.bitmaskclient.R; -import de.blinkt.openvpn.VpnProfile; -import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus; -import de.blinkt.openvpn.core.VpnStatus.LogItem; -import java.io.*; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Collections; +import java.util.Date; +import java.util.LinkedList; +import java.util.Locale; +import java.util.Map; import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; +import se.leap.bitmaskclient.R; +import de.blinkt.openvpn.VpnProfile; +import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus; +import de.blinkt.openvpn.core.VpnStatus.LogItem; + public class OpenVPNThread implements Runnable { private static final String DUMP_PATH_STRING = "Dump path: "; private static final String TAG = "OpenVPN"; @@ -158,16 +168,16 @@ public class OpenVPNThread implements Runnable { private String genLibraryPath(String[] argv, ProcessBuilder pb) { // Hack until I find a good way to get the real library path - String applibpath = argv[0].replace("/cache/" + VpnProfile.MINIVPN , "/lib"); + String applibpath = argv[0].replace("/cache/" + VpnProfile.getMiniVPNExecutableName() , "/lib"); String lbpath = pb.environment().get("LD_LIBRARY_PATH"); if(lbpath==null) lbpath = applibpath; else - lbpath = lbpath + ":" + applibpath; + lbpath = applibpath + ":" + lbpath; if (!applibpath.equals(mNativeDir)) { - lbpath = lbpath + ":" + mNativeDir; + lbpath = mNativeDir + ":" + lbpath; } return lbpath; } diff --git a/app/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java b/app/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java index 010cc4f0..b5bba5d4 100644 --- a/app/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java +++ b/app/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java @@ -79,7 +79,6 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac else return false; } - // From: http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-readable-format-in-java public static String humanReadableByteCount(long bytes, boolean mbit) { if (mbit) @@ -748,12 +747,17 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac public String getTunReopenStatus() { String currentConfiguration = getTunConfigString(); - if (currentConfiguration.equals(mLastTunCfg)) + if (currentConfiguration.equals(mLastTunCfg)) { return "NOACTION"; - else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) - return "OPEN_AFTER_CLOSE"; - else - return "OPEN_BEFORE_CLOSE"; + } else { + String release = Build.VERSION.RELEASE; + if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT && !release.startsWith("4.4.3") + && !release.startsWith("4.4.4") && !release.startsWith("4.4.5")) + // There will be probably no 4.4.4 or 4.4.5 version, so don't waste effort to do parsing here + return "OPEN_AFTER_CLOSE"; + else + return "OPEN_BEFORE_CLOSE"; + } } public class LocalBinder extends Binder { diff --git a/app/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java b/app/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java index 55fcb0ba..57a94ee7 100644 --- a/app/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java +++ b/app/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java @@ -1,19 +1,20 @@ package de.blinkt.openvpn.core; +import android.content.Context; +import android.content.Intent; +import android.os.Build; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import android.content.Context; -import android.content.Intent; -import android.os.Build; import se.leap.bitmaskclient.R; import de.blinkt.openvpn.VpnProfile; public class VPNLaunchHelper { static private boolean writeMiniVPN(Context context) { - File mvpnout = new File(context.getCacheDir(),VpnProfile.MINIVPN); + File mvpnout = new File(context.getCacheDir(),VpnProfile.getMiniVPNExecutableName()); if (mvpnout.exists() && mvpnout.canExecute()) return true; @@ -23,12 +24,12 @@ public class VPNLaunchHelper { InputStream mvpn; try { - mvpn = context.getAssets().open("minivpn." + Build.CPU_ABI); + mvpn = context.getAssets().open(VpnProfile.getMiniVPNExecutableName() + "." + Build.CPU_ABI); } catch (IOException errabi) { VpnStatus.logInfo("Failed getting assets for archicture " + Build.CPU_ABI); e2=errabi; - mvpn = context.getAssets().open("minivpn." + Build.CPU_ABI2); + mvpn = context.getAssets().open(VpnProfile.getMiniVPNExecutableName() + "." + Build.CPU_ABI2); } @@ -45,7 +46,7 @@ public class VPNLaunchHelper { fout.close(); if(!mvpnout.setExecutable(true)) { - VpnStatus.logError("Failed to set minivpn executable"); + VpnStatus.logError("Failed to make OpenVPN executable"); return false; } diff --git a/app/src/main/res/values-et/strings-icsopenvpn.xml b/app/src/main/res/values-et/strings-icsopenvpn.xml index f8e219f3..478483ec 100755 --- a/app/src/main/res/values-et/strings-icsopenvpn.xml +++ b/app/src/main/res/values-et/strings-icsopenvpn.xml @@ -215,6 +215,7 @@ Kasuta olemasoleva (.ovpn või .conf) profiili importimiseks sdcard pealt <img src=\"ic_menu_archive\"/> ikooni. Kindlasti vaata KKK\'d. See sisaldab ka alustamise lühijuhendit. Marsruutimine ja võrguliidese konfigureerimine + Marsruutimine ja liidese konfigureerimine ei toimu traditsiooniliste ifconfig/route käskude abil, vaid kasutades VPNService API\'t. Selle tulemuseks on teistest operatsioonisüsteemidest erinev marsruutimiskonfiguratsioon. VPN tunneli konfiguratsioon koosneb IP aadressist ja selle liidese kaudu suunatavatest võrkudest. Täpsemalt, pole vaja ei VPN partneri ega lüüsi aadressi. Erilised marsruudid VPN serverini jõudmiseks (näiteks redirect-gateway poolt lisatud) pole samuti vajalikud. Selle tulemusena ignoreerib rakendus konfiguratsiooni importimisel neid seadeid. Rakendus tagab VPNService API abil selle, et ühendus VPN serveriga ei toimu läbi VPN tunneli. Toetatud on ainult VPN tunneli kaudu suunatud võrkude määratlemine. Rakendus üritab avastada võrgud mida ei tohiks suunata üle tunneli (näiteks route x.x.x.x y.y.y.y net_gateway) ja arvutab marsruudid mis välistavad eelmainitud marsruudid, jäljendades teiste platvormide toimimist. Logiaknas kuvatakse peale ühenduse loomist kehtivat VPNService konfiguratsiooni. Ära taasta otseühendust kui OpenVPN on taasühendumas. Katkematu tun OpenVPN Logi @@ -314,4 +315,8 @@ Kohaliku liidese külge ühendatud võrkude ühendusi ei suunata üle VPN\'i. Selle valiku keelamisel suunatakse ka kohaliku võrgu andmeliiklus VPN\'i. Keela VPN kohalike võrkude jaoks Kasutajanimede/Paroolide fail + [Imporditud: %s] + Mõningaid faile ei leitud. Palun valige importimiseks profiili failid: + Selle rakenduse kasutamiseks vajate OpenVPN toega VPN teenusepakkujat/VPN lüüsi (mida sageli pakub teie tööandja). Lisainfo saamiseks OpenVPN kohta ja oma isikliku OpenVPN serveri seadistamise kohta tutvuge veebilehega http://community.openvpn.net/ . + Impordi logi: diff --git a/app/src/main/res/values-fr/strings-icsopenvpn.xml b/app/src/main/res/values-fr/strings-icsopenvpn.xml index e84f8cb8..34512801 100755 --- a/app/src/main/res/values-fr/strings-icsopenvpn.xml +++ b/app/src/main/res/values-fr/strings-icsopenvpn.xml @@ -315,4 +315,8 @@ Sur certaines images, cette notification joue un son.\nAndroid à introduit ces Les réseaux directement connectés aux interfaces locales ne seront pas routés via le VPN. Décochez cette option pour rediriger tout le trafic local vers le VPN. Ne pas utilisé le VPN pour les réseaux locaux Fichier Nom d\'utilisateur/Mot de passe + [Importé de : %s] + Certains fichiers sont introuvables. Sélectionner les fichiers pour importer le profil : + Pour utiliser cette application, vous avez besoin d\'un fournisseur/passerelle VPN qui soutient OpenVPN (souvent fourni par votre employeur). Vérifier ici http://community.openvpn.net/ pour plus d\'informations sur OpenVPN et comment configurer votre propre serveur OpenVPN. + Journal d\'importation : diff --git a/app/src/main/res/values-it/strings-icsopenvpn.xml b/app/src/main/res/values-it/strings-icsopenvpn.xml index aaa18afa..61d09818 100755 --- a/app/src/main/res/values-it/strings-icsopenvpn.xml +++ b/app/src/main/res/values-it/strings-icsopenvpn.xml @@ -84,6 +84,7 @@ Reindirizza tutto il traffico sulla VPN Utilizza il Routing di default Inserisci instradamenti personalizzati. Usare il formato CIDR. \"10.0.0.0/8 2002::/16\" reindirizza le reti 10.0.0.0/8 e 2002::/16 sulla VPN. + Itinerari che dovrebbero non essere instradati su VPN. Utilizzare la stessa sintassi per quanto riguarda le rotte incluse. Routing personalizzati Livello di dettaglio del registro Permette pacchetti autenticati da qualsiasi IP (consente che l\'IP del server possa cambiare) diff --git a/app/src/main/res/values-ru/strings-icsopenvpn.xml b/app/src/main/res/values-ru/strings-icsopenvpn.xml index 292ddf46..999df70b 100755 --- a/app/src/main/res/values-ru/strings-icsopenvpn.xml +++ b/app/src/main/res/values-ru/strings-icsopenvpn.xml @@ -6,7 +6,7 @@ Адрес сервера: Порт сервера: Расположение - Не могу прочитать директорию + Не удается прочитать каталог Выбрать Отмена Нет данных @@ -26,7 +26,7 @@ Выбрать… Вы должны выбрать файл Использовать аутентификацию TLS - TLS Direction + Направление проверки TLS Введите адрес/маску подсети IPv6 в формате CIDR (например 2000:dd::23/64) Введите адрес/маску подсети IPv4 в формате CIDR (например 1.2.3.4/24) Адрес IPv4 @@ -37,14 +37,14 @@ Для конфигурации с статичными сертификатами будут использоваться ключи TLS Настройка VPN-туннеля Добавить конфигурацию - Введите имя новой конфигурации - Пожалуйста, введите уникальное имя профиля - Имя конфигурации + Введите название новой конфигурации + Пожалуйста, введите уникальное название конфигурации + Название конфигурации Необходимо выбрать сертификат пользователя Ошибок не найдено Ошибка в конфигурации - Невозможно прочесть IPv4 адрес - Невозможно примениить пользовательские маршруты + Невозможно распознать IPv4 адрес + Невозможно распознать пользовательские маршруты (оставьте пустым для запроса по требованию) Ярлык OpenVPN Подключиться к VPN @@ -61,7 +61,7 @@ Отключение активных VPN/Отмена попыток подключения? Удалить VPN Проверяет, использует ли сервер сертификаты TLS (--remote-cert-tls server) - Ожидать сертификата TLS от сервера + Ожидать TLS сертификат от сервера Проверка DN объекта удаленного сертификата Проверка имени хоста сертификата Переключатель способа проверки DN сертификата (e.g. C=DE, L=Paderborn, OU=Avian IP Carriers, CN=openvpn.blinkt.de)\n\nВозможные значения: полный DN, RDN (для примера openvpn.blinkt.de) или только преффикс RDN для проверки.\n\nПри использовании преффикса RDN, например \"Server\", значения будут \"Server-1\", \"Server-2\" и т.д.\n\nПри пустом текстовом поле проверка будет проводиться по имени хоста.\n\nДля подробностей смотрите руководство для OpenVPN 2.3.1+, раздел —verify-x509-name @@ -73,7 +73,7 @@ Запрашивать параметры DNS Переопределить параметры DNS от сервера - Использовать ваши DNS + Использовать свой DNS сервер Домен поиска DNS-сервер для использования. DNS-сервер @@ -84,20 +84,25 @@ Перенаправляет весь трафик через VPN Использовать маршрут по-умолчанию Введите пользовательские маршруты. Только введите адрес назначения в формате CIDR. \"10.0.0.0/8 2002::/16\" будет использовано для 10.0.0.0/8 и 2002::/16 сетей через VPN. + Маршруты которые не следует направлять через VPN. Используйте тот-же синтаксис как и в случае с другими маршрутами. Пользовательские маршруты + Исключенные сети Уровень детализации лога Разрешить пакеты аутентификации с любого IP-адреса Разрешать \"плавающие\" сервера Пользовательские параметры Редактирование параметров VPN - Удаление профиля VPN %s? - На некторых костомных сборках права на /dev/tun могут быть неверными или tun-модуль может быть не включен. Для прошивки CM9 можете попробовать исправить владельца прямо из настроек программы - Открытие интерфейса tun окончилось неудачей + Удалить VPN профиль %s? + На некоторых кастомных сборках права на /dev/tun могут быть неверными или tun-модуль может быть не включен. Для прошивки CM9 можете попробовать исправить владельца прямо из настроек программы + Не удается открыть tun интерфейс "Ошибка: " Очистить Открытие tun-интерфейса: Адрес IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d DNS-сервер: %1$s, Домен: %2$s + Маршруты: %1$s %2$s + Исключенные маршруты: %1$s %2$s + Подключенные маршруты сервиса VPN: %1$s %2$s Получена информация интерфейса %1$s и %2$s, второй адрес является удалённым адресом канала. Используется сетевая маска /32 для локального IP адреса. Режим, установленный OpenVPN: \"%3$s\". Невозможно использовать выражения %1$s и %2$s как маршрут по стандарту CIDR. используется /32 как маска подсети. Маршрут исправлен с %1$s/%2$s на %3$s/%2$s @@ -105,7 +110,7 @@ %1$s %2$s Отправить файл журнала Отправить - ICS OpenVPN файла лога + ICS OpenVPN лог файл Скопировать лог в буфер обмена Режим TAP Режим TAP невозможен на устройствах без root-а. Поэтому это приложение не поддерживает TAP @@ -120,7 +125,7 @@ Шифрование Укажите метод шифрования Укажите алгоритм шифрования, используемый OpenVPN. Оставьте пустым, чтобы использовать шифрование по-умолчанию. - Введите the authentication digest для OpenVPN. Оставьте пустым для использования значения по-умолчанию. + Введите дайджест аутентификацию используемую в OpenVPN. Оставьте пустым для использования значения по-умолчанию. Авторизация/шифрование Обзор файлов Встроенный файл @@ -136,7 +141,7 @@ Не удалось найти файл %1$s, указанный в файле конфигурации Импорт файла конфигурации из исходного %1$s Ваша конфигурация имел несколько параметров, которые не входят в параметры стандартной конфигурации. Эти параметры были вынесены в пользовательскую конфигурацию. Пользовательская конфигурация отображается ниже: - Файла конфигурации успешно прочитан. + Файл конфигурации успешно прочитан. Не привязываться к локальному адресу и порту Не использовать привязки Импорт файла конфигурации @@ -164,7 +169,7 @@ Показать сгенерированный файл конфигурации OpenVPN Правка \"%s\" Создание конфигурации… - Включение этого параметра заставит переподключиться, если состояние сети изменения (WIFI с мобильного) + Включение этого параметра заставит переподключаться, если состояние интернет соединения (WIFI) изменится Переподключение при изменении сети Статус сети: %s Сертификат CA обычно возвращается из хранилища Android Keystore. Укажите отдельный сертификат, если у вас возникли ошибки при проверке сертификата. @@ -273,23 +278,40 @@ Очистить список авторизованных внешних приложений?\nСписок разрешенных приложений:\n\n%s VPN-соединение приостанавливается, если экран выключен или объем данных меньше 64kb за 60сек. Если включена опция \"Удержание соединения\", VPN-соединение будет постоянно активным. Без этого параметра оно будет приостанавливаться при этих условиях.. Приостановить VPN-соединение при выключенном экране - Приостановка соединения при выключенном экране: меньше, чем %1$s за %2$sс + Приостановка соединения при выключенном экране: меньше, чем %1$s in %2$ss Внимание: постоянный tun не включен для этого VPN. Трафик будет проходить через обычный доступ в Интернет, когда экран выключен. Сохранить пароль Приостановить VPN Продолжить VPN VPN приостановлен по запросу пользователя VPN приостановлен - выкл. экран + Хак для данного устройства Не удается отобразить сведения о сертификате Поведение приложения Поведение VPN Разрешить изменение VPN-профилей Аппаратное хранилище ключей: Окно подтверждения VPN для Android 4.3 и позже + Также Вы можете выразить благодарность в виде пожертвования на Play Store: Спасибо за пожертвование %s! Журнал очищен. Показать пароль + ошибка при доступе к хранилищу ключей: %s + Кратко + ISO + Время + Нет Выгружено Загружено Статус VPN + Посмотреть настройки + Неопознання ошибка: %1$s\n\n%2$s + %3$s: %1$s\n\n%2$s + Если на Вашем устройстве установлены Рут права, Вы можете установить <a href=\"http://xposed.info/\">Xposed framework</a> и <a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\">модуль автоматического подтверждения диалога подключения VPN</a> на свой страх и риск + Сети напрямую доступные через локальный интерфейс не будут маршрутизированы через VPN. Отключите эту опцию чтобы направить трафик через VPN. + Не использовать VPN для локальных адресов + [Импортировано из: %s] + Некоторые файлы не найдены. Выберите файлы для импорта в профиль: + Для использования данного приложения Вам необходим VPN провайдер/шлюз поддерживающий OpenVPN. Для получения информации по настройке собственного OpenVPN сервера: http://community.openvpn.net/ + Лог импорта: diff --git a/app/src/main/res/values-tr/strings-icsopenvpn.xml b/app/src/main/res/values-tr/strings-icsopenvpn.xml index 903c358a..26ac47ad 100755 --- a/app/src/main/res/values-tr/strings-icsopenvpn.xml +++ b/app/src/main/res/values-tr/strings-icsopenvpn.xml @@ -13,7 +13,7 @@ LZO sıkıştırma Sertifika yok İstemci sertifikası - İstemci sertifika anahtarı + İstemci Sertifika Anahtarı PCKCS12 Dosyası CA Sertifikası Bir sertifika seçmelisiniz @@ -307,4 +307,6 @@ Kural dışı durum: %1$s\n\n%2$s %3$s: %1$s\n\n%2$s Lisanslar + Yerel ağlar için Bypass VPN + Kullanıcı adı / Şifre dosyası diff --git a/app/src/main/res/values-uk/strings-icsopenvpn.xml b/app/src/main/res/values-uk/strings-icsopenvpn.xml index 173ae0d4..97a1e9a4 100755 --- a/app/src/main/res/values-uk/strings-icsopenvpn.xml +++ b/app/src/main/res/values-uk/strings-icsopenvpn.xml @@ -85,6 +85,7 @@ Використовувати типовий маршрут Введіть користувацькі маршрути. Тільки введіть адресу призначення в форматі CIDR. \"10.0.0.0/8 2002::/16\" буде використано для 10.0.0.0/8 і 2002::/16 мереж через VPN. Власні маршрути + Виключені Мережі Рівень деталізації журналу Дозволити пакети аутентифікації з будь-якої IP-адреси Дозволити \"плаваючий\" сервер @@ -98,6 +99,9 @@ Відкриття tun інтерфейсу: Адреса IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d DNS-сервер: %1$s, Домен: %2$s + Маршрути: %1$s %2$s + Виключені маршрути : %1$s %2$s + Встановлені маршрути VpnService: %1$s %2$s Отримано інформацію інтерфейсу %1$s і %2$s, друга адреса є віддаленою адресою каналу. Використовується мережева маска /32 для локальної IP-адреси. Режим, встановлений OpenVPN: \"%3$s\". Неможливо використовувати вирази %1$s і %2$s як маршрут за стандартом CIDR. використовується /32 як маска підмережі. Виправлено маршрут з %1$s/%2$s на %3$s/%2$s @@ -273,4 +277,18 @@ Призупинення зв\'язку в екрані вимкненого стану: менше %1$s у %2$sс. Попередження: Постійний тут не увімкнений для цього VPN. Трафік буде використовувати звичайне інтернет-з\'єднання, коли екран вимкнений. Зберегти пароль + Призупинити VPN + Відновити VPN + Неможливо відобразити інформацію про сертифікат + Поведінка VPN + Дозволити зміни в профілі VPN + Іконка додатка намагається використовувати OpenVPN для Android + Дякуємо за пожертвування %s! + Журнал очищено. + Показати пароль + ISO + Часові позначки + Повні ліцензії + [Імпортовано з: %s] + Журнал імпорту : diff --git a/app/src/main/res/values-zh-rCN/strings-icsopenvpn.xml b/app/src/main/res/values-zh-rCN/strings-icsopenvpn.xml index 0ffb5d6b..e49a2240 100755 --- a/app/src/main/res/values-zh-rCN/strings-icsopenvpn.xml +++ b/app/src/main/res/values-zh-rCN/strings-icsopenvpn.xml @@ -1,5 +1,6 @@ + 服务器地址: @@ -59,8 +60,8 @@ 取消确认 断开已连接的 VPN / 取消连接尝试? 删除 VPN - 检查服务器是否使用 TLS 服务器证书 - 除了 TLS 服务器 + 检查服务器是否使用了 TLS服务器端扩展 (--remote-cert-tlsserver server) + 需要 TLS 服务器证书 检查远程服务器证书的 DN 属性 证书主机名检查 勾选此项将验证远程证书的 DN 属性(例:C=DE, L=Paderborn, OU=Avian IP Carriers, CN=openvpn.blinkt.de)\n\n输入完整的 DN 或者 RDN 以便进行验证。\n\nRDN前缀 \"Server\" 可以匹配 \"Server-1\" 以及 \"SERVER-2\"\n\n若留空则将仅验证 RDN 而不验证主机名。\n\n有关更多信息请查看 OpenVPN 2.3.1+ 参考手册的 --verify-x509-name 小节 @@ -84,6 +85,7 @@ 使用默认路由 输入自定义路由。输入 CIDR 格式地址。 自定义路由 + just 日志详细级别 允许来自任何 IP 的认证数据包 允许浮服务器 @@ -97,6 +99,8 @@ 正在打开 tun 设备: 本地 IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d DNS 服务器: %1$s, 域名: %2$s + 排除的路由: %1$s %2$s + China 已获得接口信息 %1$s 以及 %2$s,将第二个地址作为远程地址。使用 /32 作为本地掩码。OpenVPN 给出的模式是 \"%3$s\"。 无法将 %1$s 和 %2$s 作为 CIDR 形式的路由,将使用 /32 的子网掩码。 纠正路由 %1$s/%2$s 为 %3$s/%2$s @@ -114,11 +118,11 @@ 复制日志条目 若要复制单条日志请在相应条目上轻按即可。若要复制/发送全部日志请使用发送日志功能。如果该功能在界面中没有显示,请使用设备原生的菜单按钮。 启动快捷方式 - 您可以在主屏幕上放置一个 OpenVPN 的快捷方式。这取决于您的主屏幕管理程序,可能是快捷方式,也可能是一个小挂件。 + 你可以在桌面上放置一个启动 OpenVPN 的图标。如果你的桌面程序支持,你可以在桌面上放置 OpenVPN 的启动图标,或者是 OpenVPN 的桌面挂件 很遗憾,您目前的系统不支持 VPN 服务接口 加密 输入加密方法 - 请输入 OpenVPN 使用的加密算法。留空为默认。 + 输入 OpenVPN 所使用的加密密码算法。留空以使用默认算法。 输入 OpenVPN 使用的认证摘要。留空则使用默认的摘要。 认证/加密 文件浏览器 @@ -134,7 +138,7 @@ 添加配置文件 无法找到导入配置文件参考的文件: %1$s 从 %1$s 中导入配置文件 - 您的配置中有几个选项无法解析。这些选项是您自定义添加的。如下所示: + 您的配置文件中有几个配置项无法在配置菜单中查看和修改,这些配置项将会当成自定义配置选项。下面是自定义的配置选项: 读取配置文件完成 不关联到本地地址和端口 无本地绑定 @@ -150,7 +154,8 @@ 已导入配置文件 已导入配置文件 %d 图像已损坏 - <p>HTC 的官方固件存在问题,它无法将网络流量转发到隧道接口上(参见(英文网页): <a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=18\">Issue 18</a> )</p><p>SONY 的 Xperia arc S 机型和 Xperia Ray 机型的固件上没有包含完整的 Android VPN 服务,其他 Sony 手机的固件可能也存在此问题。(参见(英文网页): <a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=29\">Issue 29</a>)</p><p>在一些民间爱好者制作的固件上,可能缺少 /dev/tun 设备,或者 /dev/tun 的权限不正确。一些 CM9 固件需要设置 /dev/tun 的文件属主。.</p><p>重点是,如果你的固件存在问题,请向厂商或者固件制作者报告,如果报告问题的人足够多,就能引起厂商或者固件制作者的注意,他们就会去修复这些问题。</p> + <p>HTC官方固件可能存在异常的路由问题并会导致数据流不通过隧道传输(详见BUG追踪<a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=18\">Issue 18</a>)。</p><p>据报导,旧版的SONY Xperia Arc S和Xperia Ray的官方固件完全不包含VPNService(详见BUG追踪<a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=29\">Issue 29</a>)。</p><p>在自制固件中,tun +模块可能会有缺失,或是未被设置正确的权限。部分CM9固件需要启用“特定设备HACKS”项下的“修复/dev/tun的权限”的选项。</p><p>最重要的是:若您的设备的固件存在问题,请直接向您的设备供应商反馈。越多人向供应商反映问题,问题越有可能得到解决。</p> PKCS12 文件加密密钥 私钥密码 密码 @@ -183,8 +188,9 @@ 其他 OpenVPN 设置,一般不需要修改。 高级设置 ICS Openvpn 配置 - 没有正在使用的 DNS 服务器。域名解析可能无法工作。请考虑设置自定义 DNS 服务器 + 没有使用 DNS 服务器,无法解析域名,请考虑设置一个 DNS 服务器。请注意,即使你没有设置 DNS 服务器,你为移动网络以及 Wi-Fi 设置的代理服务器配置也是有效的。 无法添加 DNS 服务器 \"%1$s\",%2$s 拒绝了您的操作。 + 无法配置 IP 地址 %1$s,被系统拒绝:%2$s <p>获取你的 VPN 配置文件,可以是在电脑上正在使用的 OpenVPN 客户端配置文件,也可以向你的 VPN 服务商索取配置文件。</p><p>如果配置文件只有一个,可以把配置文件发到你自己的邮箱然后从手机上下载。如果配置文件有很多个,可以将它们复制到存储卡内。</p><p>从邮件中下载附件,或者在 VPN 列表中点击文件夹图标来导入配置文件。</p><p>如果提示找不到文件,那就将缺失的文件复制到存储卡内。</p><p>点击保存,将配置文件保存到你的 VPN 列表中。</p><p>在 VPN 列表中点击 VPN 的连接的名字,就可以连接到 VPN 了。</p><p>如果发生错误,可以看日志窗口中的日志,然后设法解决问题。</p> 快速入门 尝试在连接之前加载 tun.ko 内核模块。需要 root 权限。 @@ -209,13 +215,11 @@ 使用 <img src=\"ic_menu_archive\"/> 图标导入存储卡中已有的配置文件(.ovpn 或 .conf)。 请确保阅读常见问题解答。这是一个快速向导。 路由/接口配置 - 路由表不是使用传统的 ifconfig 或 route 命令来设置的,而是通过 Android 的 VPN 服务的接口来进行设置的,所以路由的设置方法和在其他系统上的有些不同。设置中只需要包含通过隧道设备的 IP 地址以及网络,节点 IP 地址以及网关地址都不需要,指定通往 VPN 服务器的路由信息也不需要。OpenVPN for Android 会忽略配置文件中的这些设置。Android 的 VPN 服务接口保证了通往 VPN 服务器的流量不会被转发到隧道设备上。VPN 支持将通往特定网络的流量转发到隧道上,但不支持不要将通往指定网络的流量转发到隧道接口上(例:route x.x.x.x y.y.y.y net_gateway)。在日志窗口中的“显示连接信息”菜单内可以查看到当前由 Android 的 VPN 服务提供的网络配置信息。 当 OpenVPN 重连时,也一直使用 VPN 连接。 保持 tun 通道 OpenVPN 日志 导入 OpenVPN 配置文件 电池消耗 - 在我的测试中,发现最能消耗电量的是 OpenVPN 的 keepalive 包。大多数 OpenVPN 服务器都在配置文件中使用了“keepalive 10 60”这样的选项,这会导致 OpenVPN 服务器和客户端每隔 10 秒就相互向对方发送一个数据包。<p>虽然这些包很小,几乎不会消耗多少流量,但是频繁地发送这些包会导致手机的无线模块长时间处于活跃状态,并消耗大量的电能。(请参见(英文网页): <a href=\"http://developer.android.com/training/efficient-downloads/efficient-network-access.html#RadioStateMachine\">)<p> keepalive 选项无法在客户端进行修改,只能在服务器上进行修改。<p>令人郁闷的是,如果发送 keepalive 的频率小于 60 秒,某些 NAT 网关可能会关闭 UDP 连接(我测试得到的结果是 60 秒)。使用 TCP 模式虽然可以将 keepalive 的频率设成很大,但是会造成 TCP over TCP 问题。(请参见(英文网页):<a href=\"http://sites.inka.de/bigred/devel/tcp-tcp.html\">)(TCP over TCP 问题指的是由于 TCP 协议的机制,在 TCP 协议上再次封装一个 TCP 协议时,如果上层 TCP 链路的速度比下层 TCP 协议的链路速度快,就会造成大量 TCP 重传,从而导致网络拥塞,对用户来说就是网络变成龟速 ——译者注) Android 网络分享和便携式热点功能(通过 WiFi, USB 或蓝牙)无法与本程序所使用的 VPN 服务接口一同工作。详情请见 <a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=34\">issue #34</a> VPN 和中继 连接重试次数 @@ -266,9 +270,42 @@ tls-remote(不再使用) 你可以通过访问 http://crowdin.net/project/ics-openvpn/invite 来帮助翻译 %1$s 正在试图控制 %2$s - 如果继续,你将允许该应用完全控制 OpenVPN for Android,并拦截所有网络流量。除非你信任该应用,否则请不要继续。如果该应用是恶意应用,你需要自行承担所有的后果。 我信任此应用。 没有允许使用外部 API 的应用 已授权的应用:%s 清除已授权的应用列表?\n当前已授权的应用:\n\n%s + 当屏幕关闭且 60 秒内传输数据量小于 64kB 时暂停 VPN。当启用“持久性 Tun”选项时,暂停 VPN 将使设备处于无网络连接的状态。未启用“持久性 Tun”时,设备将没有 VPN 连接保护。 + 屏幕关闭后暂停 VPN 连接 + 屏幕关闭时暂停连接:若在%2$s秒内少于%1$s + 警告:该 VPN 没有启用“持久化 tun 设备”,当屏幕关闭时,网络流量将不走 VPN 隧道,而是走 Wi-Fi 或者移动网络。 + 保存密码 + 暂停 VPN + 继续 VPN + 按用户要求暂停 VPN + VPN 暂停 - 屏幕关闭 + 针对特定设备的处理 + 无法显示证书信息 + 应用程序行为 + VPN 行为 + 允许更改 VPN 配置 + 硬件密钥库: + 感谢捐赠 %s! + 日志已清除。 + 显示密码 + 钥匙串访问错误: %s + + ISO + 时间戳 + + 上传 + 下载 + VPN 状态 + 查看选项 + 未处理的异常: %1$s\n\n%2$s + %3$s: %1$s\n\n%2$s + 如果您的 Android 设备已经 root,您可以自担风险安装<a href=\"http://xposed.info/\">Xposed 框架</a> 和 <a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\">VPN 对话框确认模块</a> + 完整授权 + 对本地地址绕过 VPN + 用户名/密码文件 + 导入日志: diff --git a/app/src/main/res/values/untranslatable.xml b/app/src/main/res/values/untranslatable.xml index 40513029..50e598ac 100644 --- a/app/src/main/res/values/untranslatable.xml +++ b/app/src/main/res/values/untranslatable.xml @@ -623,6 +623,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/VpnProfile.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/VpnProfile.java index bdfa51c3..9eed03f1 100644 --- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/VpnProfile.java +++ b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/VpnProfile.java @@ -2,8 +2,8 @@ package de.blinkt.openvpn; import se.leap.bitmaskclient.R; -import se.leap.bitmaskclient.Dashboard; import se.leap.bitmaskclient.EIP; +import se.leap.bitmaskclient.Dashboard; import se.leap.bitmaskclient.Provider; import android.content.Context; @@ -18,18 +18,16 @@ import android.security.KeyChain; import android.security.KeyChainException; import android.util.Base64; -import de.blinkt.openvpn.core.NativeUtils; -import de.blinkt.openvpn.core.VpnStatus; -import de.blinkt.openvpn.core.OpenVpnService; -import de.blinkt.openvpn.core.X509Utils; import org.spongycastle.util.io.pem.PemObject; import org.spongycastle.util.io.pem.PemWriter; -import javax.crypto.BadPaddingException; -import javax.crypto.Cipher; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.NoSuchPaddingException; -import java.io.*; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.Serializable; +import java.io.StringWriter; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.security.InvalidKeyException; @@ -43,6 +41,16 @@ import java.util.Locale; import java.util.UUID; import java.util.Vector; +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; + +import de.blinkt.openvpn.core.NativeUtils; +import de.blinkt.openvpn.core.OpenVpnService; +import de.blinkt.openvpn.core.VpnStatus; +import de.blinkt.openvpn.core.X509Utils; + public class VpnProfile implements Serializable { // Note that this class cannot be moved to core where it belongs since // the profile loading depends on it being here @@ -54,7 +62,9 @@ public class VpnProfile implements Serializable { public static final String EXTRA_PROFILEUUID = "de.blinkt.openvpn.profileUUID"; public static final String INLINE_TAG = "[[INLINE]]"; public static final String DISPLAYNAME_TAG = "[[NAME]]"; - public static final String MINIVPN = "miniopenvpn"; + private static final String MININONPIEVPN = "nopievpn"; + private static final String MINIPIEVPN = "pievpn"; + private static final long serialVersionUID = 7085688938959334563L; private static final String OVPNCONFIGFILE = "android.conf"; public static final int MAXLOGLEVEL = 4; @@ -144,6 +154,14 @@ public class VpnProfile implements Serializable { mProfileVersion = CURRENT_PROFILE_VERSION; } + public static String getMiniVPNExecutableName() + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) + return VpnProfile.MINIPIEVPN; + else + return VpnProfile.MININONPIEVPN; + } + public static String openVpnEscape(String unescaped) { if (unescaped == null) return null; @@ -258,22 +276,16 @@ public class VpnProfile implements Serializable { cfg += " tcp-client\n"; - android.util.Log.d("vpnprofile", Integer.toString(mAuthenticationType)); switch (mAuthenticationType) { case VpnProfile.TYPE_USERPASS_CERTIFICATES: cfg += "auth-user-pass\n"; - case VpnProfile.TYPE_CERTIFICATES: - // Ca - // cfg += insertFileData("ca", mCaFilename); - - // // Client Cert + Key - // cfg += insertFileData("key", mClientKeyFilename); - // cfg += insertFileData("cert", mClientCertFilename); + case VpnProfile.TYPE_CERTIFICATES: // FIXME This is all we need...The whole switch statement can go... SharedPreferences preferences = context.getSharedPreferences(Dashboard.SHARED_PREFERENCES, context.MODE_PRIVATE); cfg+="\n"+preferences.getString(Provider.CA_CERT, "")+"\n\n"; cfg+="\n"+preferences.getString(EIP.PRIVATE_KEY, "")+"\n\n"; cfg+="\n"+preferences.getString(EIP.CERTIFICATE, "")+"\n\n"; + break; case VpnProfile.TYPE_USERPASS_PKCS12: cfg += "auth-user-pass\n"; @@ -549,7 +561,7 @@ public class VpnProfile implements Serializable { // Add fixed paramenters //args.add("/data/data/de.blinkt.openvpn/lib/openvpn"); - args.add(cacheDir.getAbsolutePath() + "/" + VpnProfile.MINIVPN); + args.add(cacheDir.getAbsolutePath() + "/" + getMiniVPNExecutableName()); args.add("--config"); args.add(cacheDir.getAbsolutePath() + "/" + OVPNCONFIGFILE); @@ -558,14 +570,16 @@ public class VpnProfile implements Serializable { return args.toArray(new String[args.size()]); } + + public Intent prepareIntent(Context context) { String prefix = context.getPackageName(); Intent intent = new Intent(context, OpenVpnService.class); if (mAuthenticationType == VpnProfile.TYPE_KEYSTORE || mAuthenticationType == VpnProfile.TYPE_USERPASS_KEYSTORE) { - // if (getKeyStoreCertificates(context) == null) - // return null; + if (getKeyStoreCertificates(context) == null) + return null; } intent.putExtra(prefix + ".ARGV", buildOpenvpnArgv(context.getCacheDir())); @@ -734,8 +748,8 @@ public class VpnProfile implements Serializable { //! Return an error if somethign is wrong public int checkProfile(Context context) { if (mAuthenticationType == TYPE_KEYSTORE || mAuthenticationType == TYPE_USERPASS_KEYSTORE) { - // if (mAlias == null) - // return R.string.no_keystore_cert_selected; + if (mAlias == null) + return R.string.no_keystore_cert_selected; } if (!mUsePull || mAuthenticationType == TYPE_STATICKEYS) { diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/ConfigParser.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/ConfigParser.java index 32e5cabb..4fbbe165 100644 --- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/ConfigParser.java +++ b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/ConfigParser.java @@ -33,7 +33,7 @@ public class ConfigParser { public void setDefinition(HashMap>> args) { options = args; } - + public void parseConfig(Reader reader) throws IOException, ConfigParseError { diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java index 67c24884..0de54ed7 100644 --- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java +++ b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVPNThread.java @@ -1,18 +1,28 @@ package de.blinkt.openvpn.core; import android.util.Log; -import se.leap.bitmaskclient.R; -import de.blinkt.openvpn.VpnProfile; -import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus; -import de.blinkt.openvpn.core.VpnStatus.LogItem; -import java.io.*; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Collections; +import java.util.Date; +import java.util.LinkedList; +import java.util.Locale; +import java.util.Map; import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; +import se.leap.bitmaskclient.R; +import de.blinkt.openvpn.VpnProfile; +import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus; +import de.blinkt.openvpn.core.VpnStatus.LogItem; + public class OpenVPNThread implements Runnable { private static final String DUMP_PATH_STRING = "Dump path: "; private static final String TAG = "OpenVPN"; @@ -158,16 +168,16 @@ public class OpenVPNThread implements Runnable { private String genLibraryPath(String[] argv, ProcessBuilder pb) { // Hack until I find a good way to get the real library path - String applibpath = argv[0].replace("/cache/" + VpnProfile.MINIVPN , "/lib"); + String applibpath = argv[0].replace("/cache/" + VpnProfile.getMiniVPNExecutableName() , "/lib"); String lbpath = pb.environment().get("LD_LIBRARY_PATH"); if(lbpath==null) lbpath = applibpath; else - lbpath = lbpath + ":" + applibpath; + lbpath = applibpath + ":" + lbpath; if (!applibpath.equals(mNativeDir)) { - lbpath = lbpath + ":" + mNativeDir; + lbpath = mNativeDir + ":" + lbpath; } return lbpath; } diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java index d7bb827e..b5bba5d4 100644 --- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java +++ b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java @@ -79,7 +79,6 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac else return false; } - // From: http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-readable-format-in-java public static String humanReadableByteCount(long bytes, boolean mbit) { if (mbit) @@ -244,7 +243,7 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac PendingIntent getLogPendingIntent() { // Let the configure Button show the Log - Intent intent = new Intent(getBaseContext(), LogWindow.class); + Intent intent = new Intent(getBaseContext(), se.leap.bitmaskclient.Dashboard.class); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); PendingIntent startLW = PendingIntent.getActivity(this, 0, intent, 0); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); @@ -748,12 +747,17 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac public String getTunReopenStatus() { String currentConfiguration = getTunConfigString(); - if (currentConfiguration.equals(mLastTunCfg)) + if (currentConfiguration.equals(mLastTunCfg)) { return "NOACTION"; - else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) - return "OPEN_AFTER_CLOSE"; - else - return "OPEN_BEFORE_CLOSE"; + } else { + String release = Build.VERSION.RELEASE; + if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT && !release.startsWith("4.4.3") + && !release.startsWith("4.4.4") && !release.startsWith("4.4.5")) + // There will be probably no 4.4.4 or 4.4.5 version, so don't waste effort to do parsing here + return "OPEN_AFTER_CLOSE"; + else + return "OPEN_BEFORE_CLOSE"; + } } public class LocalBinder extends Binder { diff --git a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java index 55fcb0ba..57a94ee7 100644 --- a/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java +++ b/ics-openvpn-stripped/main/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java @@ -1,19 +1,20 @@ package de.blinkt.openvpn.core; +import android.content.Context; +import android.content.Intent; +import android.os.Build; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import android.content.Context; -import android.content.Intent; -import android.os.Build; import se.leap.bitmaskclient.R; import de.blinkt.openvpn.VpnProfile; public class VPNLaunchHelper { static private boolean writeMiniVPN(Context context) { - File mvpnout = new File(context.getCacheDir(),VpnProfile.MINIVPN); + File mvpnout = new File(context.getCacheDir(),VpnProfile.getMiniVPNExecutableName()); if (mvpnout.exists() && mvpnout.canExecute()) return true; @@ -23,12 +24,12 @@ public class VPNLaunchHelper { InputStream mvpn; try { - mvpn = context.getAssets().open("minivpn." + Build.CPU_ABI); + mvpn = context.getAssets().open(VpnProfile.getMiniVPNExecutableName() + "." + Build.CPU_ABI); } catch (IOException errabi) { VpnStatus.logInfo("Failed getting assets for archicture " + Build.CPU_ABI); e2=errabi; - mvpn = context.getAssets().open("minivpn." + Build.CPU_ABI2); + mvpn = context.getAssets().open(VpnProfile.getMiniVPNExecutableName() + "." + Build.CPU_ABI2); } @@ -45,7 +46,7 @@ public class VPNLaunchHelper { fout.close(); if(!mvpnout.setExecutable(true)) { - VpnStatus.logError("Failed to set minivpn executable"); + VpnStatus.logError("Failed to make OpenVPN executable"); return false; } diff --git a/ics-openvpn-stripped/main/src/main/res/menu/logmenu.xml b/ics-openvpn-stripped/main/src/main/res/menu/logmenu.xml index 04592a26..c498eefc 100644 --- a/ics-openvpn-stripped/main/src/main/res/menu/logmenu.xml +++ b/ics-openvpn-stripped/main/src/main/res/menu/logmenu.xml @@ -1,38 +1,38 @@ - -

- - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/ics-openvpn-stripped/main/src/main/res/values-et/strings.xml b/ics-openvpn-stripped/main/src/main/res/values-et/strings.xml index 61f8556c..45d1c8db 100755 --- a/ics-openvpn-stripped/main/src/main/res/values-et/strings.xml +++ b/ics-openvpn-stripped/main/src/main/res/values-et/strings.xml @@ -215,6 +215,7 @@ Kasuta olemasoleva (.ovpn või .conf) profiili importimiseks sdcard pealt <img src=\"ic_menu_archive\"/> ikooni. Kindlasti vaata KKK\'d. See sisaldab ka alustamise lühijuhendit. Marsruutimine ja võrguliidese konfigureerimine + Marsruutimine ja liidese konfigureerimine ei toimu traditsiooniliste ifconfig/route käskude abil, vaid kasutades VPNService API\'t. Selle tulemuseks on teistest operatsioonisüsteemidest erinev marsruutimiskonfiguratsioon. VPN tunneli konfiguratsioon koosneb IP aadressist ja selle liidese kaudu suunatavatest võrkudest. Täpsemalt, pole vaja ei VPN partneri ega lüüsi aadressi. Erilised marsruudid VPN serverini jõudmiseks (näiteks redirect-gateway poolt lisatud) pole samuti vajalikud. Selle tulemusena ignoreerib rakendus konfiguratsiooni importimisel neid seadeid. Rakendus tagab VPNService API abil selle, et ühendus VPN serveriga ei toimu läbi VPN tunneli. Toetatud on ainult VPN tunneli kaudu suunatud võrkude määratlemine. Rakendus üritab avastada võrgud mida ei tohiks suunata üle tunneli (näiteks route x.x.x.x y.y.y.y net_gateway) ja arvutab marsruudid mis välistavad eelmainitud marsruudid, jäljendades teiste platvormide toimimist. Logiaknas kuvatakse peale ühenduse loomist kehtivat VPNService konfiguratsiooni. Ära taasta otseühendust kui OpenVPN on taasühendumas. Katkematu tun OpenVPN Logi @@ -314,4 +315,8 @@ Kohaliku liidese külge ühendatud võrkude ühendusi ei suunata üle VPN\'i. Selle valiku keelamisel suunatakse ka kohaliku võrgu andmeliiklus VPN\'i. Keela VPN kohalike võrkude jaoks Kasutajanimede/Paroolide fail + [Imporditud: %s] + Mõningaid faile ei leitud. Palun valige importimiseks profiili failid: + Selle rakenduse kasutamiseks vajate OpenVPN toega VPN teenusepakkujat/VPN lüüsi (mida sageli pakub teie tööandja). Lisainfo saamiseks OpenVPN kohta ja oma isikliku OpenVPN serveri seadistamise kohta tutvuge veebilehega http://community.openvpn.net/ . + Impordi logi: diff --git a/ics-openvpn-stripped/main/src/main/res/values-fr/strings.xml b/ics-openvpn-stripped/main/src/main/res/values-fr/strings.xml index 140ac977..8479d591 100755 --- a/ics-openvpn-stripped/main/src/main/res/values-fr/strings.xml +++ b/ics-openvpn-stripped/main/src/main/res/values-fr/strings.xml @@ -315,4 +315,8 @@ Sur certaines images, cette notification joue un son.\nAndroid à introduit ces Les réseaux directement connectés aux interfaces locales ne seront pas routés via le VPN. Décochez cette option pour rediriger tout le trafic local vers le VPN. Ne pas utilisé le VPN pour les réseaux locaux Fichier Nom d\'utilisateur/Mot de passe + [Importé de : %s] + Certains fichiers sont introuvables. Sélectionner les fichiers pour importer le profil : + Pour utiliser cette application, vous avez besoin d\'un fournisseur/passerelle VPN qui soutient OpenVPN (souvent fourni par votre employeur). Vérifier ici http://community.openvpn.net/ pour plus d\'informations sur OpenVPN et comment configurer votre propre serveur OpenVPN. + Journal d\'importation : diff --git a/ics-openvpn-stripped/main/src/main/res/values-it/strings.xml b/ics-openvpn-stripped/main/src/main/res/values-it/strings.xml index b35fa480..e21c10bd 100755 --- a/ics-openvpn-stripped/main/src/main/res/values-it/strings.xml +++ b/ics-openvpn-stripped/main/src/main/res/values-it/strings.xml @@ -84,6 +84,7 @@ Reindirizza tutto il traffico sulla VPN Utilizza il Routing di default Inserisci instradamenti personalizzati. Usare il formato CIDR. \"10.0.0.0/8 2002::/16\" reindirizza le reti 10.0.0.0/8 e 2002::/16 sulla VPN. + Itinerari che dovrebbero non essere instradati su VPN. Utilizzare la stessa sintassi per quanto riguarda le rotte incluse. Routing personalizzati Livello di dettaglio del registro Permette pacchetti autenticati da qualsiasi IP (consente che l\'IP del server possa cambiare) diff --git a/ics-openvpn-stripped/main/src/main/res/values-ru/strings.xml b/ics-openvpn-stripped/main/src/main/res/values-ru/strings.xml index 9cc95a5a..6747bcab 100755 --- a/ics-openvpn-stripped/main/src/main/res/values-ru/strings.xml +++ b/ics-openvpn-stripped/main/src/main/res/values-ru/strings.xml @@ -6,7 +6,7 @@ Адрес сервера: Порт сервера: Расположение - Не могу прочитать директорию + Не удается прочитать каталог Выбрать Отмена Нет данных @@ -26,7 +26,7 @@ Выбрать… Вы должны выбрать файл Использовать аутентификацию TLS - TLS Direction + Направление проверки TLS Введите адрес/маску подсети IPv6 в формате CIDR (например 2000:dd::23/64) Введите адрес/маску подсети IPv4 в формате CIDR (например 1.2.3.4/24) Адрес IPv4 @@ -37,14 +37,14 @@ Для конфигурации с статичными сертификатами будут использоваться ключи TLS Настройка VPN-туннеля Добавить конфигурацию - Введите имя новой конфигурации - Пожалуйста, введите уникальное имя профиля - Имя конфигурации + Введите название новой конфигурации + Пожалуйста, введите уникальное название конфигурации + Название конфигурации Необходимо выбрать сертификат пользователя Ошибок не найдено Ошибка в конфигурации - Невозможно прочесть IPv4 адрес - Невозможно примениить пользовательские маршруты + Невозможно распознать IPv4 адрес + Невозможно распознать пользовательские маршруты (оставьте пустым для запроса по требованию) Ярлык OpenVPN Подключиться к VPN @@ -61,7 +61,7 @@ Отключение активных VPN/Отмена попыток подключения? Удалить VPN Проверяет, использует ли сервер сертификаты TLS (--remote-cert-tls server) - Ожидать сертификата TLS от сервера + Ожидать TLS сертификат от сервера Проверка DN объекта удаленного сертификата Проверка имени хоста сертификата Переключатель способа проверки DN сертификата (e.g. C=DE, L=Paderborn, OU=Avian IP Carriers, CN=openvpn.blinkt.de)\n\nВозможные значения: полный DN, RDN (для примера openvpn.blinkt.de) или только преффикс RDN для проверки.\n\nПри использовании преффикса RDN, например \"Server\", значения будут \"Server-1\", \"Server-2\" и т.д.\n\nПри пустом текстовом поле проверка будет проводиться по имени хоста.\n\nДля подробностей смотрите руководство для OpenVPN 2.3.1+, раздел —verify-x509-name @@ -73,7 +73,7 @@ Запрашивать параметры DNS Переопределить параметры DNS от сервера - Использовать ваши DNS + Использовать свой DNS сервер Домен поиска DNS-сервер для использования. DNS-сервер @@ -84,20 +84,25 @@ Перенаправляет весь трафик через VPN Использовать маршрут по-умолчанию Введите пользовательские маршруты. Только введите адрес назначения в формате CIDR. \"10.0.0.0/8 2002::/16\" будет использовано для 10.0.0.0/8 и 2002::/16 сетей через VPN. + Маршруты которые не следует направлять через VPN. Используйте тот-же синтаксис как и в случае с другими маршрутами. Пользовательские маршруты + Исключенные сети Уровень детализации лога Разрешить пакеты аутентификации с любого IP-адреса Разрешать \"плавающие\" сервера Пользовательские параметры Редактирование параметров VPN - Удаление профиля VPN %s? - На некторых костомных сборках права на /dev/tun могут быть неверными или tun-модуль может быть не включен. Для прошивки CM9 можете попробовать исправить владельца прямо из настроек программы - Открытие интерфейса tun окончилось неудачей + Удалить VPN профиль %s? + На некоторых кастомных сборках права на /dev/tun могут быть неверными или tun-модуль может быть не включен. Для прошивки CM9 можете попробовать исправить владельца прямо из настроек программы + Не удается открыть tun интерфейс "Ошибка: " Очистить Открытие tun-интерфейса: Адрес IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d DNS-сервер: %1$s, Домен: %2$s + Маршруты: %1$s %2$s + Исключенные маршруты: %1$s %2$s + Подключенные маршруты сервиса VPN: %1$s %2$s Получена информация интерфейса %1$s и %2$s, второй адрес является удалённым адресом канала. Используется сетевая маска /32 для локального IP адреса. Режим, установленный OpenVPN: \"%3$s\". Невозможно использовать выражения %1$s и %2$s как маршрут по стандарту CIDR. используется /32 как маска подсети. Маршрут исправлен с %1$s/%2$s на %3$s/%2$s @@ -105,7 +110,7 @@ %1$s %2$s Отправить файл журнала Отправить - ICS OpenVPN файла лога + ICS OpenVPN лог файл Скопировать лог в буфер обмена Режим TAP Режим TAP невозможен на устройствах без root-а. Поэтому это приложение не поддерживает TAP @@ -120,7 +125,7 @@ Шифрование Укажите метод шифрования Укажите алгоритм шифрования, используемый OpenVPN. Оставьте пустым, чтобы использовать шифрование по-умолчанию. - Введите the authentication digest для OpenVPN. Оставьте пустым для использования значения по-умолчанию. + Введите дайджест аутентификацию используемую в OpenVPN. Оставьте пустым для использования значения по-умолчанию. Авторизация/шифрование Обзор файлов Встроенный файл @@ -136,7 +141,7 @@ Не удалось найти файл %1$s, указанный в файле конфигурации Импорт файла конфигурации из исходного %1$s Ваша конфигурация имел несколько параметров, которые не входят в параметры стандартной конфигурации. Эти параметры были вынесены в пользовательскую конфигурацию. Пользовательская конфигурация отображается ниже: - Файла конфигурации успешно прочитан. + Файл конфигурации успешно прочитан. Не привязываться к локальному адресу и порту Не использовать привязки Импорт файла конфигурации @@ -164,7 +169,7 @@ Показать сгенерированный файл конфигурации OpenVPN Правка \"%s\" Создание конфигурации… - Включение этого параметра заставит переподключиться, если состояние сети изменения (WIFI с мобильного) + Включение этого параметра заставит переподключаться, если состояние интернет соединения (WIFI) изменится Переподключение при изменении сети Статус сети: %s Сертификат CA обычно возвращается из хранилища Android Keystore. Укажите отдельный сертификат, если у вас возникли ошибки при проверке сертификата. @@ -273,23 +278,40 @@ Очистить список авторизованных внешних приложений?\nСписок разрешенных приложений:\n\n%s VPN-соединение приостанавливается, если экран выключен или объем данных меньше 64kb за 60сек. Если включена опция \"Удержание соединения\", VPN-соединение будет постоянно активным. Без этого параметра оно будет приостанавливаться при этих условиях.. Приостановить VPN-соединение при выключенном экране - Приостановка соединения при выключенном экране: меньше, чем %1$s за %2$sс + Приостановка соединения при выключенном экране: меньше, чем %1$s in %2$ss Внимание: постоянный tun не включен для этого VPN. Трафик будет проходить через обычный доступ в Интернет, когда экран выключен. Сохранить пароль Приостановить VPN Продолжить VPN VPN приостановлен по запросу пользователя VPN приостановлен - выкл. экран + Хак для данного устройства Не удается отобразить сведения о сертификате Поведение приложения Поведение VPN Разрешить изменение VPN-профилей Аппаратное хранилище ключей: Окно подтверждения VPN для Android 4.3 и позже + Также Вы можете выразить благодарность в виде пожертвования на Play Store: Спасибо за пожертвование %s! Журнал очищен. Показать пароль + ошибка при доступе к хранилищу ключей: %s + Кратко + ISO + Время + Нет Выгружено Загружено Статус VPN + Посмотреть настройки + Неопознання ошибка: %1$s\n\n%2$s + %3$s: %1$s\n\n%2$s + Если на Вашем устройстве установлены Рут права, Вы можете установить <a href=\"http://xposed.info/\">Xposed framework</a> и <a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\">модуль автоматического подтверждения диалога подключения VPN</a> на свой страх и риск + Сети напрямую доступные через локальный интерфейс не будут маршрутизированы через VPN. Отключите эту опцию чтобы направить трафик через VPN. + Не использовать VPN для локальных адресов + [Импортировано из: %s] + Некоторые файлы не найдены. Выберите файлы для импорта в профиль: + Для использования данного приложения Вам необходим VPN провайдер/шлюз поддерживающий OpenVPN. Для получения информации по настройке собственного OpenVPN сервера: http://community.openvpn.net/ + Лог импорта: diff --git a/ics-openvpn-stripped/main/src/main/res/values-tr/strings.xml b/ics-openvpn-stripped/main/src/main/res/values-tr/strings.xml index 85f1740f..aef446d1 100755 --- a/ics-openvpn-stripped/main/src/main/res/values-tr/strings.xml +++ b/ics-openvpn-stripped/main/src/main/res/values-tr/strings.xml @@ -13,7 +13,7 @@ LZO sıkıştırma Sertifika yok İstemci sertifikası - İstemci sertifika anahtarı + İstemci Sertifika Anahtarı PCKCS12 Dosyası CA Sertifikası Bir sertifika seçmelisiniz @@ -307,4 +307,6 @@ Kural dışı durum: %1$s\n\n%2$s %3$s: %1$s\n\n%2$s Lisanslar + Yerel ağlar için Bypass VPN + Kullanıcı adı / Şifre dosyası diff --git a/ics-openvpn-stripped/main/src/main/res/values-uk/strings.xml b/ics-openvpn-stripped/main/src/main/res/values-uk/strings.xml index 3418ece1..b826005e 100755 --- a/ics-openvpn-stripped/main/src/main/res/values-uk/strings.xml +++ b/ics-openvpn-stripped/main/src/main/res/values-uk/strings.xml @@ -85,6 +85,7 @@ Використовувати типовий маршрут Введіть користувацькі маршрути. Тільки введіть адресу призначення в форматі CIDR. \"10.0.0.0/8 2002::/16\" буде використано для 10.0.0.0/8 і 2002::/16 мереж через VPN. Власні маршрути + Виключені Мережі Рівень деталізації журналу Дозволити пакети аутентифікації з будь-якої IP-адреси Дозволити \"плаваючий\" сервер @@ -98,6 +99,9 @@ Відкриття tun інтерфейсу: Адреса IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d DNS-сервер: %1$s, Домен: %2$s + Маршрути: %1$s %2$s + Виключені маршрути : %1$s %2$s + Встановлені маршрути VpnService: %1$s %2$s Отримано інформацію інтерфейсу %1$s і %2$s, друга адреса є віддаленою адресою каналу. Використовується мережева маска /32 для локальної IP-адреси. Режим, встановлений OpenVPN: \"%3$s\". Неможливо використовувати вирази %1$s і %2$s як маршрут за стандартом CIDR. використовується /32 як маска підмережі. Виправлено маршрут з %1$s/%2$s на %3$s/%2$s @@ -273,4 +277,18 @@ Призупинення зв\'язку в екрані вимкненого стану: менше %1$s у %2$sс. Попередження: Постійний тут не увімкнений для цього VPN. Трафік буде використовувати звичайне інтернет-з\'єднання, коли екран вимкнений. Зберегти пароль + Призупинити VPN + Відновити VPN + Неможливо відобразити інформацію про сертифікат + Поведінка VPN + Дозволити зміни в профілі VPN + Іконка додатка намагається використовувати OpenVPN для Android + Дякуємо за пожертвування %s! + Журнал очищено. + Показати пароль + ISO + Часові позначки + Повні ліцензії + [Імпортовано з: %s] + Журнал імпорту : diff --git a/ics-openvpn-stripped/main/src/main/res/values-zh-rCN/strings.xml b/ics-openvpn-stripped/main/src/main/res/values-zh-rCN/strings.xml index a2fb95ce..1126d3b2 100755 --- a/ics-openvpn-stripped/main/src/main/res/values-zh-rCN/strings.xml +++ b/ics-openvpn-stripped/main/src/main/res/values-zh-rCN/strings.xml @@ -1,5 +1,6 @@ + OpenVPN for Android 服务器地址: @@ -59,8 +60,8 @@ 取消确认 断开已连接的 VPN / 取消连接尝试? 删除 VPN - 检查服务器是否使用 TLS 服务器证书 - 除了 TLS 服务器 + 检查服务器是否使用了 TLS服务器端扩展 (--remote-cert-tlsserver server) + 需要 TLS 服务器证书 检查远程服务器证书的 DN 属性 证书主机名检查 勾选此项将验证远程证书的 DN 属性(例:C=DE, L=Paderborn, OU=Avian IP Carriers, CN=openvpn.blinkt.de)\n\n输入完整的 DN 或者 RDN 以便进行验证。\n\nRDN前缀 \"Server\" 可以匹配 \"Server-1\" 以及 \"SERVER-2\"\n\n若留空则将仅验证 RDN 而不验证主机名。\n\n有关更多信息请查看 OpenVPN 2.3.1+ 参考手册的 --verify-x509-name 小节 @@ -84,6 +85,7 @@ 使用默认路由 输入自定义路由。输入 CIDR 格式地址。 自定义路由 + just 日志详细级别 允许来自任何 IP 的认证数据包 允许浮服务器 @@ -97,6 +99,8 @@ 正在打开 tun 设备: 本地 IPv4: %1$s/%2$d IPv6: %3$s MTU: %4$d DNS 服务器: %1$s, 域名: %2$s + 排除的路由: %1$s %2$s + China 已获得接口信息 %1$s 以及 %2$s,将第二个地址作为远程地址。使用 /32 作为本地掩码。OpenVPN 给出的模式是 \"%3$s\"。 无法将 %1$s 和 %2$s 作为 CIDR 形式的路由,将使用 /32 的子网掩码。 纠正路由 %1$s/%2$s 为 %3$s/%2$s @@ -114,11 +118,11 @@ 复制日志条目 若要复制单条日志请在相应条目上轻按即可。若要复制/发送全部日志请使用发送日志功能。如果该功能在界面中没有显示,请使用设备原生的菜单按钮。 启动快捷方式 - 您可以在主屏幕上放置一个 OpenVPN 的快捷方式。这取决于您的主屏幕管理程序,可能是快捷方式,也可能是一个小挂件。 + 你可以在桌面上放置一个启动 OpenVPN 的图标。如果你的桌面程序支持,你可以在桌面上放置 OpenVPN 的启动图标,或者是 OpenVPN 的桌面挂件 很遗憾,您目前的系统不支持 VPN 服务接口 加密 输入加密方法 - 请输入 OpenVPN 使用的加密算法。留空为默认。 + 输入 OpenVPN 所使用的加密密码算法。留空以使用默认算法。 输入 OpenVPN 使用的认证摘要。留空则使用默认的摘要。 认证/加密 文件浏览器 @@ -134,7 +138,7 @@ 添加配置文件 无法找到导入配置文件参考的文件: %1$s 从 %1$s 中导入配置文件 - 您的配置中有几个选项无法解析。这些选项是您自定义添加的。如下所示: + 您的配置文件中有几个配置项无法在配置菜单中查看和修改,这些配置项将会当成自定义配置选项。下面是自定义的配置选项: 读取配置文件完成 不关联到本地地址和端口 无本地绑定 @@ -150,7 +154,8 @@ 已导入配置文件 已导入配置文件 %d 图像已损坏 - <p>HTC 的官方固件存在问题,它无法将网络流量转发到隧道接口上(参见(英文网页): <a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=18\">Issue 18</a> )</p><p>SONY 的 Xperia arc S 机型和 Xperia Ray 机型的固件上没有包含完整的 Android VPN 服务,其他 Sony 手机的固件可能也存在此问题。(参见(英文网页): <a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=29\">Issue 29</a>)</p><p>在一些民间爱好者制作的固件上,可能缺少 /dev/tun 设备,或者 /dev/tun 的权限不正确。一些 CM9 固件需要设置 /dev/tun 的文件属主。.</p><p>重点是,如果你的固件存在问题,请向厂商或者固件制作者报告,如果报告问题的人足够多,就能引起厂商或者固件制作者的注意,他们就会去修复这些问题。</p> + <p>HTC官方固件可能存在异常的路由问题并会导致数据流不通过隧道传输(详见BUG追踪<a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=18\">Issue 18</a>)。</p><p>据报导,旧版的SONY Xperia Arc S和Xperia Ray的官方固件完全不包含VPNService(详见BUG追踪<a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=29\">Issue 29</a>)。</p><p>在自制固件中,tun +模块可能会有缺失,或是未被设置正确的权限。部分CM9固件需要启用“特定设备HACKS”项下的“修复/dev/tun的权限”的选项。</p><p>最重要的是:若您的设备的固件存在问题,请直接向您的设备供应商反馈。越多人向供应商反映问题,问题越有可能得到解决。</p> PKCS12 文件加密密钥 私钥密码 密码 @@ -183,8 +188,9 @@ 其他 OpenVPN 设置,一般不需要修改。 高级设置 ICS Openvpn 配置 - 没有正在使用的 DNS 服务器。域名解析可能无法工作。请考虑设置自定义 DNS 服务器 + 没有使用 DNS 服务器,无法解析域名,请考虑设置一个 DNS 服务器。请注意,即使你没有设置 DNS 服务器,你为移动网络以及 Wi-Fi 设置的代理服务器配置也是有效的。 无法添加 DNS 服务器 \"%1$s\",%2$s 拒绝了您的操作。 + 无法配置 IP 地址 %1$s,被系统拒绝:%2$s <p>获取你的 VPN 配置文件,可以是在电脑上正在使用的 OpenVPN 客户端配置文件,也可以向你的 VPN 服务商索取配置文件。</p><p>如果配置文件只有一个,可以把配置文件发到你自己的邮箱然后从手机上下载。如果配置文件有很多个,可以将它们复制到存储卡内。</p><p>从邮件中下载附件,或者在 VPN 列表中点击文件夹图标来导入配置文件。</p><p>如果提示找不到文件,那就将缺失的文件复制到存储卡内。</p><p>点击保存,将配置文件保存到你的 VPN 列表中。</p><p>在 VPN 列表中点击 VPN 的连接的名字,就可以连接到 VPN 了。</p><p>如果发生错误,可以看日志窗口中的日志,然后设法解决问题。</p> 快速入门 尝试在连接之前加载 tun.ko 内核模块。需要 root 权限。 @@ -209,13 +215,11 @@ 使用 <img src=\"ic_menu_archive\"/> 图标导入存储卡中已有的配置文件(.ovpn 或 .conf)。 请确保阅读常见问题解答。这是一个快速向导。 路由/接口配置 - 路由表不是使用传统的 ifconfig 或 route 命令来设置的,而是通过 Android 的 VPN 服务的接口来进行设置的,所以路由的设置方法和在其他系统上的有些不同。设置中只需要包含通过隧道设备的 IP 地址以及网络,节点 IP 地址以及网关地址都不需要,指定通往 VPN 服务器的路由信息也不需要。OpenVPN for Android 会忽略配置文件中的这些设置。Android 的 VPN 服务接口保证了通往 VPN 服务器的流量不会被转发到隧道设备上。VPN 支持将通往特定网络的流量转发到隧道上,但不支持不要将通往指定网络的流量转发到隧道接口上(例:route x.x.x.x y.y.y.y net_gateway)。在日志窗口中的“显示连接信息”菜单内可以查看到当前由 Android 的 VPN 服务提供的网络配置信息。 当 OpenVPN 重连时,也一直使用 VPN 连接。 保持 tun 通道 OpenVPN 日志 导入 OpenVPN 配置文件 电池消耗 - 在我的测试中,发现最能消耗电量的是 OpenVPN 的 keepalive 包。大多数 OpenVPN 服务器都在配置文件中使用了“keepalive 10 60”这样的选项,这会导致 OpenVPN 服务器和客户端每隔 10 秒就相互向对方发送一个数据包。<p>虽然这些包很小,几乎不会消耗多少流量,但是频繁地发送这些包会导致手机的无线模块长时间处于活跃状态,并消耗大量的电能。(请参见(英文网页): <a href=\"http://developer.android.com/training/efficient-downloads/efficient-network-access.html#RadioStateMachine\">)<p> keepalive 选项无法在客户端进行修改,只能在服务器上进行修改。<p>令人郁闷的是,如果发送 keepalive 的频率小于 60 秒,某些 NAT 网关可能会关闭 UDP 连接(我测试得到的结果是 60 秒)。使用 TCP 模式虽然可以将 keepalive 的频率设成很大,但是会造成 TCP over TCP 问题。(请参见(英文网页):<a href=\"http://sites.inka.de/bigred/devel/tcp-tcp.html\">)(TCP over TCP 问题指的是由于 TCP 协议的机制,在 TCP 协议上再次封装一个 TCP 协议时,如果上层 TCP 链路的速度比下层 TCP 协议的链路速度快,就会造成大量 TCP 重传,从而导致网络拥塞,对用户来说就是网络变成龟速 ——译者注) Android 网络分享和便携式热点功能(通过 WiFi, USB 或蓝牙)无法与本程序所使用的 VPN 服务接口一同工作。详情请见 <a href=\"http://code.google.com/p/ics-openvpn/issues/detail?id=34\">issue #34</a> VPN 和中继 连接重试次数 @@ -266,9 +270,42 @@ tls-remote(不再使用) 你可以通过访问 http://crowdin.net/project/ics-openvpn/invite 来帮助翻译 %1$s 正在试图控制 %2$s - 如果继续,你将允许该应用完全控制 OpenVPN for Android,并拦截所有网络流量。除非你信任该应用,否则请不要继续。如果该应用是恶意应用,你需要自行承担所有的后果。 我信任此应用。 没有允许使用外部 API 的应用 已授权的应用:%s 清除已授权的应用列表?\n当前已授权的应用:\n\n%s + 当屏幕关闭且 60 秒内传输数据量小于 64kB 时暂停 VPN。当启用“持久性 Tun”选项时,暂停 VPN 将使设备处于无网络连接的状态。未启用“持久性 Tun”时,设备将没有 VPN 连接保护。 + 屏幕关闭后暂停 VPN 连接 + 屏幕关闭时暂停连接:若在%2$s秒内少于%1$s + 警告:该 VPN 没有启用“持久化 tun 设备”,当屏幕关闭时,网络流量将不走 VPN 隧道,而是走 Wi-Fi 或者移动网络。 + 保存密码 + 暂停 VPN + 继续 VPN + 按用户要求暂停 VPN + VPN 暂停 - 屏幕关闭 + 针对特定设备的处理 + 无法显示证书信息 + 应用程序行为 + VPN 行为 + 允许更改 VPN 配置 + 硬件密钥库: + 感谢捐赠 %s! + 日志已清除。 + 显示密码 + 钥匙串访问错误: %s + + ISO + 时间戳 + + 上传 + 下载 + VPN 状态 + 查看选项 + 未处理的异常: %1$s\n\n%2$s + %3$s: %1$s\n\n%2$s + 如果您的 Android 设备已经 root,您可以自担风险安装<a href=\"http://xposed.info/\">Xposed 框架</a> 和 <a href=\"http://repo.xposed.info/module/de.blinkt.vpndialogxposed\">VPN 对话框确认模块</a> + 完整授权 + 对本地地址绕过 VPN + 用户名/密码文件 + 导入日志: -- cgit v1.2.3