Commit 74842cba authored by cyberta's avatar cyberta

#8919 update dependencies

parent 6c994f65
......@@ -9,6 +9,11 @@ android {
compileSdkVersion 27
buildToolsVersion '27.0.3'
compileOptions {
targetCompatibility 1.8
sourceCompatibility 1.8
}
defaultConfig {
applicationId "se.leap.bitmaskclient"
versionCode 134
......
// ExternalCertificateProvider.aidl
package de.blinkt.openvpn.api;
/*
* This is very simple interface that is specialised to have only the minimal set of crypto
* operation that are needed for OpenVPN to authenticate with an external certificate
*/
interface ExternalCertificateProvider {
/**
* Requests signing the data with RSA/ECB/PKCS1PADDING
* for RSA certficate and with NONEwithECDSA for EC certificates
* @parm alias the parameter that
*/
byte[] getSignedData(in String alias, in byte[] data);
/**
* Requests the certificate chain for the selected alias
* The first certifcate returned is assumed to be
* the user certificate
*/
byte[] getCertificateChain(in String alias);
/**
* This function is called for the app to get additional meta information from the
* external provider and will be called with the stored alias in the app
*
* For external app provider that do not provide an activity to configure them, this
* is used to get the alias that should be used.
* The format is the same as the activity should return, i.e.
*
* EXTRA_ALIAS = "de.blinkt.openvpn.api.KEY_ALIAS"
* EXTRA_DESCRIPTION = "de.blinkt.openvpn.api.KEY_DESCRIPTION"
*
* as the keys for the bundle.
*
*/
Bundle getCertificateMetaData(in String alias);
}
......@@ -18,7 +18,7 @@ interface IOpenVPNAPIService {
boolean addVPNProfile (String name, String config);
/** start a profile using a config as inline string. Make sure that all needed data is inlined,
* e.g., using <ca>...</ca> or <auth-user-data>...</auth-user-data>
* e.g., using <ca>...</ca> or <auth-user-pass>...</auth-user-pass>
* See the OpenVPN manual page for more on inlining files */
void startVPN (in String inlineconfig);
......
......@@ -22,4 +22,5 @@ interface IOpenVPNServiceInternal {
boolean stopVPN(boolean replaceConnection);
boolean isVpnRunning();
}
......@@ -7,6 +7,8 @@ package de.blinkt.openvpn;
import se.leap.bitmaskclient.R;
import se.leap.bitmaskclient.R;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
......@@ -231,4 +233,4 @@ public class LaunchVPN extends Activity {
VpnStatus.logException("SU command", e);
}
}
}
}
\ No newline at end of file
......@@ -14,6 +14,11 @@ class CIDRIP {
public CIDRIP(String ip, String mask) {
mIp = ip;
len = calculateLenFromMask(mask);
}
public static int calculateLenFromMask(String mask) {
long netmask = getInt(mask);
// Add 33. bit to ensure the loop terminates
......@@ -24,6 +29,7 @@ class CIDRIP {
lenZeros++;
netmask = netmask >> 1;
}
int len;
// Check if rest of netmask is only 1s
if (netmask != (0x1ffffffffl >> lenZeros)) {
// Asume no CIDR, set /32
......@@ -31,7 +37,7 @@ class CIDRIP {
} else {
len = 32 - lenZeros;
}
return len;
}
public CIDRIP(String address, int prefix_length) {
......
......@@ -19,11 +19,25 @@ public class Connection implements Serializable, Cloneable {
public boolean mEnabled = true;
public int mConnectTimeout = 0;
public static final int CONNECTION_DEFAULT_TIMEOUT = 120;
public ProxyType mProxyType = ProxyType.NONE;
public String mProxyName = "proxy.example.com";
public String mProxyPort = "8080";
public boolean mUseProxyAuth;
public String mProxyAuthUser = null;
public String mProxyAuthPassword = null;
public enum ProxyType {
NONE,
HTTP,
SOCKS5,
ORBOT
}
private static final long serialVersionUID = 92031902903829089L;
public String getConnectionBlock() {
public String getConnectionBlock(boolean isOpenVPN3) {
String cfg = "";
// Server Address
......@@ -39,14 +53,31 @@ public class Connection implements Serializable, Cloneable {
if (mConnectTimeout != 0)
cfg += String.format(Locale.US, " connect-timeout %d\n", mConnectTimeout);
// OpenVPN 2.x manages proxy connection via management interface
if ((isOpenVPN3 || usesExtraProxyOptions()) && mProxyType == ProxyType.HTTP)
{
cfg+=String.format(Locale.US,"http-proxy %s %s\n", mProxyName, mProxyPort);
if (mUseProxyAuth)
cfg+=String.format(Locale.US, "<http-proxy-user-pass>\n%s\n%s\n</http-proxy-user-pass>\n", mProxyAuthUser, mProxyAuthPassword);
}
if (usesExtraProxyOptions() && mProxyType == ProxyType.SOCKS5) {
cfg+=String.format(Locale.US,"socks-proxy %s %s\n", mProxyName, mProxyPort);
}
if (!TextUtils.isEmpty(mCustomConfiguration) && mUseCustomConfig) {
cfg += mCustomConfiguration;
cfg += "\n";
}
return cfg;
}
public boolean usesExtraProxyOptions() {
return (mUseCustomConfig && mCustomConfiguration.contains("http-proxy-option "));
}
@Override
public Connection clone() throws CloneNotSupportedException {
return (Connection) super.clone();
......
This diff is collapsed.
......@@ -65,4 +65,4 @@ public class ICSOpenVPNApplication extends Application {
mChannel.setLightColor(Color.BLUE);
mNotificationManager.createNotificationChannel(mChannel);
}
}
}
\ No newline at end of file
......@@ -134,7 +134,9 @@ class LogFileHandler extends Handler {
if (!logfile.exists() || !logfile.canRead())
return;
readCacheContents(new FileInputStream(logfile));
FileInputStream log = new FileInputStream(logfile);
readCacheContents(log);
log.close();
} catch (java.io.IOException | java.lang.RuntimeException e) {
VpnStatus.logError("Reading cached logfile failed");
......
......@@ -16,7 +16,15 @@ public class NativeUtils {
static native void jniclose(int fdint);
public static native String getNativeAPI();
public static String getNativeAPI()
{
if (isRoboUnitTest())
return "ROBO";
else
return getJNIAPI();
}
private static native String getJNIAPI();
public final static int[] openSSLlengths = {
......@@ -26,8 +34,14 @@ public class NativeUtils {
public static native double[] getOpenSSLSpeed(String algorithm, int testnum);
static {
System.loadLibrary("opvpnutil");
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN)
System.loadLibrary("jbcrypto");
if (!isRoboUnitTest()) {
System.loadLibrary("opvpnutil");
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN)
System.loadLibrary("jbcrypto");
}
}
public static boolean isRoboUnitTest() {
return "robolectric".equals(Build.FINGERPRINT);
}
}
/*
* Copyright (c) 2012-2018 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
package de.blinkt.openvpn.core;
import android.content.Context;
import android.net.*;
import android.os.Build;
import android.text.TextUtils;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.util.Vector;
public class NetworkUtils {
public static Vector<String> getLocalNetworks(Context c, boolean ipv6) {
Vector<String> nets = new Vector<>();
ConnectivityManager conn = (ConnectivityManager) c.getSystemService(Context.CONNECTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Network[] networks = conn.getAllNetworks();
for (Network network : networks) {
NetworkInfo ni = conn.getNetworkInfo(network);
LinkProperties li = conn.getLinkProperties(network);
NetworkCapabilities nc = conn.getNetworkCapabilities(network);
// Skip VPN networks like ourselves
if (nc.hasTransport(NetworkCapabilities.TRANSPORT_VPN))
continue;
// Also skip mobile networks
if (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR))
continue;
for (LinkAddress la : li.getLinkAddresses()) {
if ((la.getAddress() instanceof Inet4Address && !ipv6) ||
(la.getAddress() instanceof Inet6Address && ipv6))
nets.add(la.toString());
}
}
} else {
// Old Android Version, use native utils via ifconfig instead
// Add local network interfaces
if (ipv6)
return nets;
String[] localRoutes = NativeUtils.getIfconfig();
// The format of mLocalRoutes is kind of broken because I don't really like JNI
for (int i = 0; i < localRoutes.length; i += 3) {
String intf = localRoutes[i];
String ipAddr = localRoutes[i + 1];
String netMask = localRoutes[i + 2];
if (intf == null || intf.equals("lo") ||
intf.startsWith("tun") || intf.startsWith("rmnet"))
continue;
if (ipAddr == null || netMask == null) {
VpnStatus.logError("Local routes are broken?! (Report to author) " + TextUtils.join("|", localRoutes));
continue;
}
nets.add(ipAddr + "/" + CIDRIP.calculateLenFromMask(netMask));
}
}
return nets;
}
}
\ No newline at end of file
/*
* Copyright (c) 2012-2018 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
/*
* Portions Copyright 2014-2016 Hans-Christoph Steiner
* Portions Copyright 2012-2016 Nathan Freitas
* Portions Copyright (c) 2016 CommonsWare, LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package de.blinkt.openvpn.core;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.text.TextUtils;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static de.blinkt.openvpn.core.OpenVPNService.ORBOT_PACKAGE_NAME;
public class OrbotHelper {
//! Based on the class from NetCipher but stripped down and modified for icsopenvpn
/**
* {@link Intent} send by Orbot with {@code ON/OFF/STARTING/STOPPING} status
* included as an {@link #EXTRA_STATUS} {@code String}. Your app should
* always receive {@code ACTION_STATUS Intent}s since any other app could
* start Orbot. Also, user-triggered starts and stops will also cause
* {@code ACTION_STATUS Intent}s to be broadcast.
*/
public final static String ACTION_STATUS = "org.torproject.android.intent.action.STATUS";
public final static String STATUS_ON = "ON";
public final static String STATUS_STARTS_DISABLED = "STARTS_DISABLED";
public final static String STATUS_STARTING = "STARTING";
public final static String STATUS_STOPPING = "STOPPING";
public final static String EXTRA_STATUS = "org.torproject.android.intent.extra.STATUS";
/**
* A request to Orbot to transparently start Tor services
*/
public final static String ACTION_START = "org.torproject.android.intent.action.START";
public final static String EXTRA_PACKAGE_NAME = "org.torproject.android.intent.extra.PACKAGE_NAME";
public static final int SOCKS_PROXY_PORT_DEFAULT = 9050;
private static OrbotHelper mInstance;
String EXTRA_SOCKS_PROXY_HOST = "org.torproject.android.intent.extra.SOCKS_PROXY_HOST";
String EXTRA_SOCKS_PROXY_PORT = "org.torproject.android.intent.extra.SOCKS_PROXY_PORT";
private Context mContext;
private Set<StatusCallback> statusCallbacks = new HashSet<>();
private BroadcastReceiver orbotStatusReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context c, Intent intent) {
if (TextUtils.equals(intent.getAction(),
OrbotHelper.ACTION_STATUS)) {
for (StatusCallback cb : statusCallbacks) {
cb.onStatus(intent);
}
String status = intent.getStringExtra(EXTRA_STATUS);
if (TextUtils.equals(status, STATUS_ON)) {
int socksPort = intent.getIntExtra(EXTRA_SOCKS_PROXY_PORT, SOCKS_PROXY_PORT_DEFAULT);
String socksHost = intent.getStringExtra(EXTRA_SOCKS_PROXY_HOST);
if (TextUtils.isEmpty(socksHost))
socksHost = "127.0.0.1";
for (StatusCallback cb : statusCallbacks) {
cb.onOrbotReady(intent, socksHost, socksPort);
}
} else if (TextUtils.equals(status, STATUS_STARTS_DISABLED)) {
for (StatusCallback cb : statusCallbacks)
cb.onDisabled(intent);
}
}
}
};
private OrbotHelper() {
}
public static OrbotHelper get(OpenVPNService mOpenVPNService) {
if (mInstance == null)
mInstance = new OrbotHelper();
return mInstance;
}
/**
* Gets an {@link Intent} for starting Orbot. Orbot will reply with the
* current status to the {@code packageName} of the app in the provided
* {@link Context} (i.e. {@link Context#getPackageName()}.
*/
public static Intent getOrbotStartIntent(Context context) {
Intent intent = new Intent(ACTION_START);
intent.setPackage(ORBOT_PACKAGE_NAME);
intent.putExtra(EXTRA_PACKAGE_NAME, context.getPackageName());
return intent;
}
public static boolean checkTorReceier(Context c) {
Intent startOrbot = getOrbotStartIntent(c);
PackageManager pm = c.getPackageManager();
Intent result = null;
List<ResolveInfo> receivers =
pm.queryBroadcastReceivers(startOrbot, 0);
return receivers != null && receivers.size() > 0;
}
/**
* Adds a StatusCallback to be called when we find out that
* Orbot is ready. If Orbot is ready for use, your callback
* will be called with onEnabled() immediately, before this
* method returns.
*
* @param cb a callback
* @return the singleton, for chaining
*/
public synchronized OrbotHelper addStatusCallback(Context c, StatusCallback cb) {
if (statusCallbacks.size() == 0) {
c.getApplicationContext().registerReceiver(orbotStatusReceiver,
new IntentFilter(OrbotHelper.ACTION_STATUS));
mContext = c.getApplicationContext();
}
if (!checkTorReceier(c))
cb.onNotYetInstalled();
statusCallbacks.add(cb);
return (this);
}
/**
* Removes an existing registered StatusCallback.
*
* @param cb the callback to remove
* @return the singleton, for chaining
*/
public synchronized void removeStatusCallback(StatusCallback cb) {
statusCallbacks.remove(cb);
if (statusCallbacks.size() == 0)
mContext.unregisterReceiver(orbotStatusReceiver);
}
public void sendOrbotStartAndStatusBroadcast() {
mContext.sendBroadcast(getOrbotStartIntent(mContext));
}
private void startOrbotService(String action) {
Intent clearVPNMode = new Intent();
clearVPNMode.setComponent(new ComponentName(ORBOT_PACKAGE_NAME, ".service.TorService"));
clearVPNMode.setAction(action);
mContext.startService(clearVPNMode);
}
public interface StatusCallback {
/**
* Called when Orbot is operational
*
* @param statusIntent an Intent containing information about
* Orbot, including proxy ports
*/
void onStatus(Intent statusIntent);
/**
* Called if Orbot is not yet installed. Usually, you handle
* this by checking the return value from init() on OrbotInitializer
* or calling isInstalled() on OrbotInitializer. However, if
* you have need for it, if a callback is registered before
* an init() call determines that Orbot is not installed, your
* callback will be called with onNotYetInstalled().
*/
void onNotYetInstalled();
void onOrbotReady(Intent intent, String socksHost, int socksPort);
/**
* Called if Orbot background control is disabled.
* @param intent the intent delivered
*/
void onDisabled(Intent intent);
}
}
......@@ -128,6 +128,7 @@ public class ProfileManager {
}
public static void setTemporaryProfile(Context c, VpnProfile tmp) {
tmp.mTemporaryProfile = true;
ProfileManager.tmpprofile = tmp;
saveProfile(c, tmp, true, true);
}
......@@ -174,8 +175,9 @@ public class ProfileManager {
vlist.add(TEMPORARY_PROFILE_FILENAME);
for (String vpnentry : vlist) {
ObjectInputStream vpnfile=null;
try {
ObjectInputStream vpnfile = new ObjectInputStream(context.openFileInput(vpnentry + ".vp"));
vpnfile = new ObjectInputStream(context.openFileInput(vpnentry + ".vp"));
VpnProfile vp = ((VpnProfile) vpnfile.readObject());
// Sanity check
......@@ -189,9 +191,18 @@ public class ProfileManager {
profiles.put(vp.getUUID().toString(), vp);
}
} catch (IOException | ClassNotFoundException e) {
if (!vpnentry.equals(TEMPORARY_PROFILE_FILENAME))
VpnStatus.logException("Loading VPN List", e);
} finally {
if (vpnfile!=null) {
try {
vpnfile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
......
......@@ -48,7 +48,7 @@ public class VPNLaunchHelper {
}
}
return null;
throw new RuntimeException("Cannot find any execulte for this device's ABIs " + abis.toString());
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
......
......@@ -300,6 +300,8 @@ public class VpnStatus {
return R.string.state_resolve;
case "TCP_CONNECT":
return R.string.state_tcp_connect;
case "AUTH_PENDING":
return R.string.state_auth_pending;
default:
return R.string.unknown_state;
}
......@@ -323,7 +325,7 @@ public class VpnStatus {
private static ConnectionStatus getLevel(String state) {
String[] noreplyet = {"CONNECTING", "WAIT", "RECONNECTING", "RESOLVE", "TCP_CONNECT"};
String[] reply = {"AUTH", "GET_CONFIG", "ASSIGN_IP", "ADD_ROUTES"};
String[] reply = {"AUTH", "GET_CONFIG", "ASSIGN_IP", "ADD_ROUTES", "AUTH_PENDING"};
String[] connected = {"CONNECTED"};
String[] notconnected = {"DISCONNECTED", "EXITING"};
......@@ -385,7 +387,7 @@ public class VpnStatus {
for (StateListener sl : stateListener) {
sl.updateState(state, msg, resid, level);
}
newLogItem(new LogItem((LogLevel.DEBUG), String.format("New OpenVPN Status (%s->%s): %s",state,level.toString(),msg)));
//newLogItem(new LogItem((LogLevel.DEBUG), String.format("New OpenVPN Status (%s->%s): %s",state,level.toString(),msg)));
}
public static void logInfo(String message) {
......
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources></resources>
This diff is collapsed.
......@@ -105,7 +105,6 @@
<string name="routing">Ruting</string>
<string name="advanced">Avançat</string>
<string name="faq_howto_title">Inici rapid</string>
<string name="using_proxy">Utilitzant el proxy %1$s %2$d</string>
<string name="use_system_proxy">Utiliza el proxy del sistema</string>
<string name="ignore">Ignorar</string>
<string name="restart">Reinicia</string>
......
......@@ -201,7 +201,6 @@
<string name="setting_loadtun">Nahrát tun modul</string>
<string name="importpkcs12fromconfig">Importovat PKCS12 z konfigurace do Andoidího úložiště</string>
<string name="getproxy_error">Chyba při zjišťování nastavení proxy: %s</string>
<string name="using_proxy">Používám proxy %1$s %2$d</string>
<string name="use_system_proxy">Použít systémovou proxy</string>
<string name="use_system_proxy_summary">K připojení použít systémové nastavení pro HTTP/HTTPS.</string>
<string name="onbootrestartsummary">OpenVPN se automaticky připojí k vybrané VPN po startu systému. Prosím věnujte pozornost upozornění ve FAQ pro verzi Android &lt; 5.0.</string>
......@@ -357,6 +356,8 @@
<string name="ab_kitkat_mss">Dřívější KitKat verze nastavovaly špatnou hodnotu MSS na TCP spojení (#61948). OpenVPN automaticky zapne mssfix možnost pro obejití chyby.</string>
<string name="ab_lollipop_reinstall">Aplikace VPN mohou přestat fungovat po odinstalování a reinstalaci. Podrobnosti najdete v #80074</string>
<string name="ab_secondary_users">VPN vůbec nefunguje pro vedlejší uživatele.</string>
<string name="ab_kitkat_reconnect">"Více uživatelů hlasí, že mobilní připojení / mobilní datové připojení má časté výpadky během používání této VPN aplikace, Vypadá, že chování ovlivňuje jen nějaké kombinace mobilních dodavatelů / zařizení a zatím jsme přes žádnou přičinu nemohli identifikovat chybu."</string>
<string name="ab_vpn_reachability_44">Jediná destinace může být dosažena přes VPN které nejsou dosažitelné bez VPN. Sítě IPv6 nefungují vůbec.</string>
<string name="ab_only_cidr_title">Ne-CIDR trasy</string>
<string name="ab_proxy_title">Proxy chování pro VPN</string>
<string name="ab_lollipop_reinstall_title">Přeinstalování VPN aplikací</string>
......@@ -381,6 +382,7 @@
<string name="lastdumpdate">(Poslední výpis je %1$d: %2$dh starý (%3$s))</string>
<string name="clear_log_on_connect">Vymazat log při novém připojení</string>
<string name="connect_timeout">Časový limit připojení</string>
<string name="query_permissions_sdcard">Aplikace OpenVPN pro systém Android se může pokusit automaticky zjistit chybějící soubor(y) na sdcard. Klepnutím na tuto zprávu spusťte žádost o povolení.</string>
<string name="protocol">Protokol</string>
<string name="enabled_connection_entry">Povoleno</string>
<string name="pushpeerinfo">Push Peer info</string>
......@@ -427,4 +429,5 @@
<string name="volume_kbyte">%.1f kB</string>
<string name="volume_mbyte">%.1f MB</string>
<string name="volume_gbyte">%.1f GB</string>
<string name="tor_orbot">Tor (Orbot)</string>
</resources>
......@@ -201,7 +201,7 @@
<string name="setting_loadtun">Tun-Modul laden</string>
<string name="importpkcs12fromconfig">In der Konfiguration angegebene PKCS12-Datei in den Android-Zertifikatsspeicher importieren</string>
<string name="getproxy_error">Fehler beim Ermitteln der Proxy-Einstellungen: %s</string>
<string name="using_proxy">Verwende Proxy %1$s %2$d</string>
<string name="using_proxy">Verwende Proxy %1$s %2$s</string>
<string name="use_system_proxy">System-Proxys verwenden</string>
<string name="use_system_proxy_summary">Systemweite Einstellungen für HTTP- und HTTPS-Proxys beim Verbinden verwenden.</string>
<string name="onbootrestartsummary">Beim Systemstart das angegebene VPN verbinden. Auf Geräten mit Android 5.0 und höher bitte vor der Verwendung dieser Option die FAQ zum Bestätigungsdialog lesen.</string>
......@@ -438,12 +438,18 @@
<string name="kbits_per_second">%.1f kbit/s</string>
<string name="mbits_per_second">%.1f Mbit/s</string>
<string name="gbits_per_second">%.1f Gbit/s</string>
<string name="weakmd">&lt;p&gt;Seit der OpenSSL Version 1.1, verweigert OpenSSL schwache Signaturen - wie MD5 - in Zertifikaten.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;MD5-Signaturen sind komplett unsicher und sollten nicht mehr verwendet werden.
&lt;/b&gt;MD5-Kollisionen können in &lt;a href=\"https://natmchugh.blogspot.de/2015/02/create-your-own-md5-collisions.html\"&gt;wenigen Stunden mit minimalen Kosten&lt;/a&gt; erzeugt werden. Sie sollten die VPN-Zertifikate so schnell wie möglich aktualisieren.&lt;/p&gt;
&lt;p&gt;Leider enthielten ältere easy-rsa Distributionen die config-Option \"default_md md5\". Falls Sie eine alte Version von easy-rsa verwenden, aktualisieren Sie auf die &lt;a href=\"https://github.com/OpenVPN/easy-rsa/releases\"&gt;neueste Version&lt;/a&gt; oder ändern Sie md5 auf sha256 und erzeugen Sie Ihre Zertifikate neu.&lt;/p&gt;
&lt;p&gt;Falls Sie wirklich alte und unsichere Zertifikate verwenden wollen, benutzen Sie die benutzerdefinierte Konfigurationsoption tls-cipher \"DEFAULT:@SECLEVEL=0\" in der erweiterten Profil-Konfiguration oder als zusätzliche Zeile in Ihrer importierten Konfiguration.&lt;/p&gt;
</string>
<string name="volume_byte">%.0f B</string>
<string name="volume_kbyte">%.1f kB</string>
<string name="volume_mbyte">%.1f MB</string>
<string name="volume_gbyte">%.1f GB</string>
<string name="channel_name_background">Verbindungsstatistiken</string>
<string name="channel_description_background">Laufende Statistiken der OpenVPN-Verbindung</string>
<string name="channel_description_background">Laufende Statistik der OpenVPN-Verbindung</string>
<string name="channel_name_status">Verbindungsstatus Änderungen</string>
<string name="channel_description_status">Statusänderungen der OpenVPN-Verbindung (Verbindung, Authentifizierung,...)</string>
<string name="weakmd_title">Schwache (MD5) Hashes in Zertifikatssignatur (SSL_CTX_use_certificate md too weak)</string>
......@@ -455,5 +461,8 @@
<string name="test_algoirhtms">Ausgewählte Algorithmen testen</string>
<string name="all_app_prompt">Eine andere App versucht, %s zu steuern. Die anforderne App kann nicht bestimmt werden. Wenn Sie diesen Zugriff zulassen, erhalten ALLE Apps Zugriff.</string>
<string name="openvpn3_nostatickeys">Die OpenVPN 3 C ++ - Implementierung unterstützt keine statischen Schlüssel. Bitte wechseln Sie zu OpenVPN 2.x unter den allgemeinen Einstellungen.</string>
<string name="openvpn3_pkcs12">Die Benutzung von PKCS12 Dateien mit der OpenVPN 3 C++ Implementierung wird nicht unterstützt. Bitte importieren Sie entweder die PKCS12 Datei in den Android Keystore oder nutzen Sie die Option OpenVPN 2.x in den allgemeinen Einstellungen auszuwählen.</string>
<string name="openvpn3_pkcs12">Die Benutzung von PKCS12 Dateien mit der OpenVPN 3 C++ Implementierung wird nicht unterstützt. Bitte importieren Sie entweder die PKCS12 Datei in den Android Keystore oder wählen Sie die Option OpenVPN 2.x in den allgemeinen Einstellungen aus.</string>
<string name="proxy">Proxy</string>
<string name="Use_no_proxy">Keinen</string>
<string name="tor_orbot">Tor (Orbot)</string>
</resources>