Merge branch 'android-http-proxy'
Adds support for HTTP proxy server. Closes strongswan/strongswan#2789
This commit is contained in:
@@ -9,8 +9,8 @@ android {
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 34
|
||||
|
||||
versionCode 89
|
||||
versionName "2.5.5"
|
||||
versionCode 91
|
||||
versionName "2.5.6"
|
||||
|
||||
externalNativeBuild {
|
||||
ndkBuild {
|
||||
@@ -45,8 +45,8 @@ android {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'androidx.appcompat:appcompat:1.7.0'
|
||||
implementation 'androidx.lifecycle:lifecycle-process:2.8.3'
|
||||
implementation 'androidx.appcompat:appcompat:1.7.1'
|
||||
implementation 'androidx.lifecycle:lifecycle-process:2.9.1'
|
||||
implementation 'androidx.preference:preference:1.2.1'
|
||||
implementation 'com.google.android.material:material:1.12.0'
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
|
||||
+5
-2
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Relution GmbH
|
||||
* Copyright (C) 2012-2024 Tobias Brunner
|
||||
* Copyright (C) 2012-2025 Tobias Brunner
|
||||
* Copyright (C) 2012 Giuliano Grassi
|
||||
* Copyright (C) 2012 Ralf Sager
|
||||
*
|
||||
@@ -67,6 +67,9 @@ public class DatabaseHelper extends SQLiteOpenHelper
|
||||
new DbColumn(VpnProfileDataSource.KEY_IKE_PROPOSAL, "TEXT", 15),
|
||||
new DbColumn(VpnProfileDataSource.KEY_ESP_PROPOSAL, "TEXT", 15),
|
||||
new DbColumn(VpnProfileDataSource.KEY_DNS_SERVERS, "TEXT", 17),
|
||||
new DbColumn(VpnProfileDataSource.KEY_PROXY_HOST, "TEXT", 19),
|
||||
new DbColumn(VpnProfileDataSource.KEY_PROXY_PORT, "INTEGER", 19),
|
||||
new DbColumn(VpnProfileDataSource.KEY_PROXY_EXCLUSIONS, "TEXT", 19),
|
||||
});
|
||||
|
||||
public static final DbTable TABLE_TRUSTED_CERTIFICATE = new DbTable(TABLE_NAME_TRUSTED_CERTIFICATE, 18, new DbColumn[]{
|
||||
@@ -84,7 +87,7 @@ public class DatabaseHelper extends SQLiteOpenHelper
|
||||
new DbColumn(ManagedUserCertificate.KEY_PASSWORD, "TEXT", 18),
|
||||
});
|
||||
|
||||
private static final int DATABASE_VERSION = 18;
|
||||
private static final int DATABASE_VERSION = 19;
|
||||
|
||||
private static final Set<DbTable> TABLES;
|
||||
|
||||
|
||||
+8
@@ -83,6 +83,14 @@ public class ManagedVpnProfile extends VpnProfile
|
||||
setIncludedSubnets(getString(splitTunneling, VpnProfileDataSource.KEY_INCLUDED_SUBNETS));
|
||||
}
|
||||
|
||||
final Bundle proxyServer = bundle.getBundle(VpnProfileDataSource.KEY_PROXY_SERVER);
|
||||
if (proxyServer != null)
|
||||
{
|
||||
setProxyHost(getString(proxyServer, VpnProfileDataSource.KEY_PROXY_HOST));
|
||||
setProxyPort(getInt(proxyServer, VpnProfileDataSource.KEY_PROXY_PORT, 1, 65_535));
|
||||
setProxyExclusions(getString(proxyServer, VpnProfileDataSource.KEY_PROXY_EXCLUSIONS));
|
||||
}
|
||||
|
||||
setSplitTunneling(splitFlags);
|
||||
setFlags(flags);
|
||||
}
|
||||
|
||||
+33
-3
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2019 Tobias Brunner
|
||||
* Copyright (C) 2012-2025 Tobias Brunner
|
||||
* Copyright (C) 2012 Giuliano Grassi
|
||||
* Copyright (C) 2012 Ralf Sager
|
||||
*
|
||||
@@ -42,8 +42,8 @@ public class VpnProfile implements Cloneable
|
||||
|
||||
private String mName, mGateway, mUsername, mPassword, mCertificate, mUserCertificate;
|
||||
private String mRemoteId, mLocalId, mExcludedSubnets, mIncludedSubnets, mSelectedApps;
|
||||
private String mIkeProposal, mEspProposal, mDnsServers;
|
||||
private Integer mMTU, mPort, mSplitTunneling, mNATKeepAlive, mFlags;
|
||||
private String mIkeProposal, mEspProposal, mDnsServers, mProxyHost, mProxyExclusions;
|
||||
private Integer mMTU, mPort, mProxyPort, mSplitTunneling, mNATKeepAlive, mFlags;
|
||||
private SelectedAppsHandling mSelectedAppsHandling = SelectedAppsHandling.SELECTED_APPS_DISABLE;
|
||||
private VpnType mVpnType;
|
||||
private UUID mUUID;
|
||||
@@ -313,6 +313,36 @@ public class VpnProfile implements Cloneable
|
||||
return mSelectedAppsHandling;
|
||||
}
|
||||
|
||||
public String getProxyHost()
|
||||
{
|
||||
return mProxyHost;
|
||||
}
|
||||
|
||||
public void setProxyHost(String proxy)
|
||||
{
|
||||
this.mProxyHost = proxy;
|
||||
}
|
||||
|
||||
public Integer getProxyPort()
|
||||
{
|
||||
return mProxyPort;
|
||||
}
|
||||
|
||||
public void setProxyPort(Integer port)
|
||||
{
|
||||
this.mProxyPort = port;
|
||||
}
|
||||
|
||||
public String getProxyExclusions()
|
||||
{
|
||||
return mProxyExclusions;
|
||||
}
|
||||
|
||||
public void setProxyExclusions(String exclusions)
|
||||
{
|
||||
this.mProxyExclusions = exclusions;
|
||||
}
|
||||
|
||||
public Integer getSplitTunneling()
|
||||
{
|
||||
return mSplitTunneling;
|
||||
|
||||
+4
@@ -50,6 +50,10 @@ public interface VpnProfileDataSource
|
||||
String KEY_IKE_PROPOSAL = "ike_proposal";
|
||||
String KEY_ESP_PROPOSAL = "esp_proposal";
|
||||
String KEY_DNS_SERVERS = "dns_servers";
|
||||
String KEY_PROXY_SERVER = "proxy_server";
|
||||
String KEY_PROXY_HOST = "proxy_host";
|
||||
String KEY_PROXY_PORT = "proxy_port";
|
||||
String KEY_PROXY_EXCLUSIONS = "proxy_exclusions";
|
||||
String KEY_READ_ONLY = "read_only";
|
||||
|
||||
/**
|
||||
|
||||
+6
@@ -151,6 +151,9 @@ public class VpnProfileSqlDataSource implements VpnProfileDataSource
|
||||
profile.setIkeProposal(cursor.getString(cursor.getColumnIndexOrThrow(KEY_IKE_PROPOSAL)));
|
||||
profile.setEspProposal(cursor.getString(cursor.getColumnIndexOrThrow(KEY_ESP_PROPOSAL)));
|
||||
profile.setDnsServers(cursor.getString(cursor.getColumnIndexOrThrow(KEY_DNS_SERVERS)));
|
||||
profile.setProxyHost(cursor.getString(cursor.getColumnIndexOrThrow(KEY_PROXY_HOST)));
|
||||
profile.setProxyPort(getInt(cursor, cursor.getColumnIndexOrThrow(KEY_PROXY_PORT)));
|
||||
profile.setProxyExclusions(cursor.getString(cursor.getColumnIndexOrThrow(KEY_PROXY_EXCLUSIONS)));
|
||||
return profile;
|
||||
}
|
||||
|
||||
@@ -179,6 +182,9 @@ public class VpnProfileSqlDataSource implements VpnProfileDataSource
|
||||
values.put(KEY_IKE_PROPOSAL, profile.getIkeProposal());
|
||||
values.put(KEY_ESP_PROPOSAL, profile.getEspProposal());
|
||||
values.put(KEY_DNS_SERVERS, profile.getDnsServers());
|
||||
values.put(KEY_PROXY_HOST, profile.getProxyHost());
|
||||
values.put(KEY_PROXY_PORT, profile.getProxyPort());
|
||||
values.put(KEY_PROXY_EXCLUSIONS, profile.getProxyExclusions());
|
||||
return values;
|
||||
}
|
||||
|
||||
|
||||
+21
-2
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2018 Tobias Brunner
|
||||
* Copyright (C) 2012-2025 Tobias Brunner
|
||||
* Copyright (C) 2012 Giuliano Grassi
|
||||
* Copyright (C) 2012 Ralf Sager
|
||||
*
|
||||
@@ -30,6 +30,7 @@ import android.content.Intent;
|
||||
import android.content.ServiceConnection;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.ProxyInfo;
|
||||
import android.net.VpnService;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
@@ -72,6 +73,8 @@ import java.security.PrivateKey;
|
||||
import java.security.cert.CertificateEncodingException;
|
||||
import java.security.cert.X509Certificate;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.SortedSet;
|
||||
@@ -1116,6 +1119,7 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe
|
||||
private final List<InetAddress> mDnsServers = new ArrayList<>();
|
||||
private int mMtu;
|
||||
private boolean mIPv4Seen, mIPv6Seen, mDnsServersConfigured;
|
||||
private ProxyInfo mProxyServer;
|
||||
|
||||
public BuilderCache(VpnProfile profile)
|
||||
{
|
||||
@@ -1169,6 +1173,17 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe
|
||||
}
|
||||
}
|
||||
|
||||
if (profile.getProxyHost() != null)
|
||||
{
|
||||
int port = profile.getProxyPort() != null ? profile.getProxyPort() : Constants.PROXY_PORT_DEFAULT;
|
||||
List<String> exclusions = new ArrayList<>();
|
||||
if (profile.getProxyExclusions() != null)
|
||||
{
|
||||
Collections.addAll(exclusions, profile.getProxyExclusions().split("\\s+"));
|
||||
}
|
||||
mProxyServer = ProxyInfo.buildDirectProxy(profile.getProxyHost(), port, exclusions);
|
||||
}
|
||||
|
||||
/* set a default MTU, will be set by the daemon for regular interfaces */
|
||||
Integer mtu = profile.getMTU();
|
||||
mMtu = mtu == null ? Constants.MTU_MAX : mtu;
|
||||
@@ -1249,7 +1264,7 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe
|
||||
}
|
||||
}
|
||||
|
||||
public void applyData(VpnService.Builder builder)
|
||||
public void applyData(Builder builder)
|
||||
{
|
||||
for (IPRange address : mAddresses)
|
||||
{
|
||||
@@ -1375,6 +1390,10 @@ public class CharonVpnService extends VpnService implements Runnable, VpnStateSe
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && mProxyServer != null)
|
||||
{
|
||||
builder.setHttpProxy(mProxyServer);
|
||||
}
|
||||
builder.setMtu(mMtu);
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -22,6 +22,7 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.Proxy;
|
||||
import java.net.SocketTimeoutException;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
@@ -55,7 +56,7 @@ public class SimpleFetcher
|
||||
}
|
||||
future = mExecutor.submit(() -> {
|
||||
URL url = new URL(uri);
|
||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);
|
||||
conn.setConnectTimeout(10000);
|
||||
conn.setReadTimeout(10000);
|
||||
conn.setRequestProperty("Connection", "close");
|
||||
|
||||
+27
-2
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (C) 2023 Relution GmbH
|
||||
* Copyright (C) 2012-2020 Tobias Brunner
|
||||
* Copyright (C) 2012-2025 Tobias Brunner
|
||||
* Copyright (C) 2012 Giuliano Grassi
|
||||
* Copyright (C) 2012 Ralf Sager
|
||||
*
|
||||
@@ -147,6 +147,10 @@ public class VpnProfileDetailActivity extends AppCompatActivity
|
||||
private TextView mProfileId;
|
||||
private EditText mDnsServers;
|
||||
private TextInputLayoutHelper mDnsServersWrap;
|
||||
private EditText mProxyHost;
|
||||
private EditText mProxyPort;
|
||||
private TextInputLayoutHelper mProxyPortWrap;
|
||||
private EditText mProxyExclusions;
|
||||
|
||||
private final ActivityResultLauncher<Intent> mInstallPKCS12 = registerForActivityResult(
|
||||
new ActivityResultContracts.StartActivityForResult(),
|
||||
@@ -254,6 +258,11 @@ public class VpnProfileDetailActivity extends AppCompatActivity
|
||||
/* make the link clickable */
|
||||
((TextView)findViewById(R.id.proposal_intro)).setMovementMethod(LinkMovementMethod.getInstance());
|
||||
|
||||
mProxyHost = findViewById(R.id.proxy_host);
|
||||
mProxyPort = findViewById(R.id.proxy_port);
|
||||
mProxyPortWrap = findViewById(R.id.proxy_port_wrap);
|
||||
mProxyExclusions = findViewById(R.id.proxy_exclusions);
|
||||
|
||||
mProfileIdLabel = findViewById(R.id.profile_id_label);
|
||||
mProfileId = findViewById(R.id.profile_id);
|
||||
|
||||
@@ -584,7 +593,9 @@ public class VpnProfileDetailActivity extends AppCompatActivity
|
||||
mProfile.getIncludedSubnets() != null || mProfile.getExcludedSubnets() != null ||
|
||||
mProfile.getSelectedAppsHandling() != SelectedAppsHandling.SELECTED_APPS_DISABLE ||
|
||||
mProfile.getIkeProposal() != null || mProfile.getEspProposal() != null ||
|
||||
mProfile.getDnsServers() != null || mProfile.getLocalId() != null;
|
||||
mProfile.getDnsServers() != null || mProfile.getLocalId() != null ||
|
||||
mProfile.getProxyHost() != null || mProfile.getProxyPort() != null ||
|
||||
mProfile.getProxyExclusions() != null;
|
||||
}
|
||||
mShowAdvanced.setVisibility(!show ? View.VISIBLE : View.GONE);
|
||||
mAdvancedSettings.setVisibility(show ? View.VISIBLE : View.GONE);
|
||||
@@ -700,6 +711,11 @@ public class VpnProfileDetailActivity extends AppCompatActivity
|
||||
mDnsServersWrap.setError(getString(R.string.alert_text_no_ips));
|
||||
valid = false;
|
||||
}
|
||||
if (!validateInteger(mProxyPort, 1, 65535))
|
||||
{
|
||||
mProxyPortWrap.setError(String.format(getString(R.string.alert_text_out_of_range), 1, 65535));
|
||||
valid = false;
|
||||
}
|
||||
return valid;
|
||||
}
|
||||
|
||||
@@ -749,6 +765,9 @@ public class VpnProfileDetailActivity extends AppCompatActivity
|
||||
mProfile.setIkeProposal(getString(mIkeProposal));
|
||||
mProfile.setEspProposal(getString(mEspProposal));
|
||||
mProfile.setDnsServers(getString(mDnsServers));
|
||||
mProfile.setProxyHost(getString(mProxyHost));
|
||||
mProfile.setProxyPort(getInteger(mProxyPort));
|
||||
mProfile.setProxyExclusions(getString(mProxyExclusions));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -786,6 +805,9 @@ public class VpnProfileDetailActivity extends AppCompatActivity
|
||||
mIkeProposal.setText(mProfile.getIkeProposal());
|
||||
mEspProposal.setText(mProfile.getEspProposal());
|
||||
mDnsServers.setText(mProfile.getDnsServers());
|
||||
mProxyHost.setText(mProfile.getProxyHost());
|
||||
mProxyPort.setText(mProfile.getProxyPort() != null ? mProfile.getProxyPort().toString() : null);
|
||||
mProxyExclusions.setText(mProfile.getProxyExclusions());
|
||||
mProfileId.setText(mProfile.getUUID().toString());
|
||||
flags = mProfile.getFlags();
|
||||
useralias = mProfile.getUserCertificateAlias();
|
||||
@@ -877,6 +899,9 @@ public class VpnProfileDetailActivity extends AppCompatActivity
|
||||
mIkeProposal.setEnabled(!readOnly);
|
||||
mEspProposal.setEnabled(!readOnly);
|
||||
mDnsServers.setEnabled(!readOnly);
|
||||
mProxyHost.setEnabled(!readOnly);
|
||||
mProxyPort.setEnabled(!readOnly);
|
||||
mProxyExclusions.setEnabled(!readOnly);
|
||||
|
||||
mSelectVpnType.setEnabled(!readOnly);
|
||||
mCertReq.setEnabled(!readOnly);
|
||||
|
||||
+42
-45
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2020 Tobias Brunner
|
||||
* Copyright (C) 2016-2025 Tobias Brunner
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
@@ -556,6 +556,14 @@ public class VpnProfileImportActivity extends AppCompatActivity
|
||||
flags |= VpnProfile.FLAGS_IPv6_TRANSPORT;
|
||||
}
|
||||
|
||||
JSONObject proxy = obj.optJSONObject("proxy");
|
||||
if (proxy != null)
|
||||
{
|
||||
profile.setProxyHost(proxy.optString("host"));
|
||||
profile.setProxyPort(getInteger(proxy, "port", 1, 65535));
|
||||
profile.setProxyExclusions(getFlatStringList(proxy, "exclusions"));
|
||||
}
|
||||
|
||||
JSONObject split = obj.optJSONObject("split-tunneling");
|
||||
if (split != null)
|
||||
{
|
||||
@@ -569,8 +577,8 @@ public class VpnProfileImportActivity extends AppCompatActivity
|
||||
profile.setSplitTunneling(st == 0 ? null : st);
|
||||
}
|
||||
/* only one of these can be set, prefer specific apps */
|
||||
String selectedApps = getApps(obj.optJSONArray("apps"));
|
||||
String excludedApps = getApps(obj.optJSONArray("excluded-apps"));
|
||||
String selectedApps = getFlatStringList(obj, "apps");
|
||||
String excludedApps = getFlatStringList(obj, "excluded-apps");
|
||||
if (!TextUtils.isEmpty(selectedApps))
|
||||
{
|
||||
profile.setSelectedApps(selectedApps);
|
||||
@@ -606,24 +614,8 @@ public class VpnProfileImportActivity extends AppCompatActivity
|
||||
|
||||
private String getSubnets(JSONObject split, String key) throws JSONException
|
||||
{
|
||||
ArrayList<String> subnets = new ArrayList<>();
|
||||
JSONArray arr = split.optJSONArray(key);
|
||||
if (arr != null)
|
||||
{
|
||||
for (int i = 0; i < arr.length(); i++)
|
||||
{ /* replace all spaces, e.g. in "192.168.1.1 - 192.168.1.10" */
|
||||
subnets.add(arr.getString(i).replace(" ", ""));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
String value = split.optString(key, null);
|
||||
if (!TextUtils.isEmpty(value))
|
||||
{
|
||||
subnets.add(value);
|
||||
}
|
||||
}
|
||||
if (subnets.size() > 0)
|
||||
ArrayList<String> subnets = getStringList(split, key);
|
||||
if (!subnets.isEmpty())
|
||||
{
|
||||
String joined = TextUtils.join(" ", subnets);
|
||||
IPRangeSet ranges = IPRangeSet.fromString(joined);
|
||||
@@ -639,25 +631,8 @@ public class VpnProfileImportActivity extends AppCompatActivity
|
||||
|
||||
private String getAddressList(JSONObject obj, String key) throws JSONException
|
||||
{
|
||||
ArrayList<String> addrs = new ArrayList<>();
|
||||
JSONArray arr = obj.optJSONArray(key);
|
||||
if (arr != null)
|
||||
{
|
||||
for (int i = 0; i < arr.length(); i++)
|
||||
{
|
||||
String addr = arr.getString(i).replace(" ", "");
|
||||
addrs.add(addr);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
String value = obj.optString(key, null);
|
||||
if (!TextUtils.isEmpty(value))
|
||||
{
|
||||
Collections.addAll(addrs, value.split("\\s+"));
|
||||
}
|
||||
}
|
||||
if (addrs.size() > 0)
|
||||
ArrayList<String> addrs = getStringList(obj, key);
|
||||
if (!addrs.isEmpty())
|
||||
{
|
||||
for (String addr : addrs)
|
||||
{
|
||||
@@ -675,17 +650,39 @@ public class VpnProfileImportActivity extends AppCompatActivity
|
||||
return null;
|
||||
}
|
||||
|
||||
private String getApps(JSONArray arr) throws JSONException
|
||||
private String getFlatStringList(JSONObject obj, String key) throws JSONException
|
||||
{
|
||||
ArrayList<String> apps = new ArrayList<>();
|
||||
ArrayList<String> list = getStringList(obj, key);
|
||||
if (!list.isEmpty())
|
||||
{
|
||||
return TextUtils.join(" ", list);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a list of strings, either retrieved from an array or from a space-separated string.
|
||||
*/
|
||||
private ArrayList<String> getStringList(JSONObject obj, String key) throws JSONException
|
||||
{
|
||||
ArrayList<String> list = new ArrayList<>();
|
||||
JSONArray arr = obj.optJSONArray(key);
|
||||
if (arr != null)
|
||||
{
|
||||
for (int i = 0; i < arr.length(); i++)
|
||||
{
|
||||
apps.add(arr.getString(i));
|
||||
{ /* replace all spaces, including e.g. in "192.168.1.1 - 192.168.1.10" */
|
||||
list.add(arr.getString(i).replace(" ", ""));
|
||||
}
|
||||
}
|
||||
return TextUtils.join(" ", apps);
|
||||
else
|
||||
{
|
||||
String value = obj.optString(key, null);
|
||||
if (!TextUtils.isEmpty(value))
|
||||
{
|
||||
Collections.addAll(list, value.split("\\s+"));
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2016-2020 Tobias Brunner
|
||||
* Copyright (C) 2016-2025 Tobias Brunner
|
||||
*
|
||||
* Copyright (C) secunet Security Networks AG
|
||||
*
|
||||
@@ -45,6 +45,11 @@ public final class Constants
|
||||
public static final int NAT_KEEPALIVE_MAX = 120;
|
||||
public static final int NAT_KEEPALIVE_MIN = 10;
|
||||
|
||||
/**
|
||||
* Default port for proxy servers
|
||||
*/
|
||||
public static final int PROXY_PORT_DEFAULT = 8080;
|
||||
|
||||
/**
|
||||
* Preference key for default VPN profile
|
||||
*/
|
||||
|
||||
@@ -4,8 +4,8 @@ Dies ist die offizielle Android-Portierung der populären strongSwan VPN-Lösung
|
||||
|
||||
<ul>
|
||||
<li>Verwendet die VpnService API von Android 4+. Geräte von einigen Herstellern scheinen diese nicht zu unterstützen - strongSwan wird auf diesen Geräten nicht funktionieren!</li>
|
||||
<li>Verwendet das IKEv2 Schlüsselaustausch-Protokoll (IKEv1 wird nicht unterstützt)</li>
|
||||
<li>Verwendet IPsec für den Datenkanal (L2TP wird nicht unterstützt)</li>
|
||||
<li>Verwendet das IKEv2 Schlüsselaustausch-Protokoll</li>
|
||||
<li>Verwendet IPsec für den Datenkanal</li>
|
||||
<li>Volle Unterstützung für Konnektivitätsänderungen und Mobilität via MOBIKE (oder Re-Authentisierung)</li>
|
||||
<li>Zur Authentisierung der Nutzer wird sowohl einfache auf Benutzername und Passwort basierende EAP-Authentisierung (namentlich EAP-MSCHAPv2, EAP-MD5 und EAP-GTC), sowie zertifikatsbasierte RSA/ECSA-Authentisierung unterstützt, EAP-TLS mit Benutzer-Zertifikaten wird ebenfalls unterstützt</li>
|
||||
<li>Kombinierte Authentisierung mit RSA/ECDSA und EAP wird über zwei Authentisierungsrunden nach RFC 4739 unterstützt</li>
|
||||
|
||||
@@ -4,8 +4,8 @@ Official Android port of the popular strongSwan VPN solution.
|
||||
|
||||
<ul>
|
||||
<li>Uses the VpnService API featured by Android 4+. Devices by some manufacturers seem to lack support for this - strongSwan VPN Client won't work on these devices!</li>
|
||||
<li>Uses the IKEv2 key exchange protocol (IKEv1 is not supported)</li>
|
||||
<li>Uses IPsec for data traffic (L2TP is not supported)</li>
|
||||
<li>Uses the IKEv2 key exchange protocol</li>
|
||||
<li>Uses IPsec for data traffic</li>
|
||||
<li>Full support for changed connectivity and mobility through MOBIKE (or reauthentication)</li>
|
||||
<li>Supports username/password EAP authentication (namely EAP-MSCHAPv2, EAP-MD5 and EAP-GTC) as well as RSA/ECDSA private key/certificate authentication to authenticate users, EAP-TLS with client certificates is also supported</li>
|
||||
<li>Combined RSA/ECDSA and EAP authentication is supported by using two authentication rounds as defined in RFC 4739</li>
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# 2.5.6 #
|
||||
|
||||
- Unterstützt benutzerdefinierte HTTP Proxy-Server (Android 10+)
|
||||
|
||||
# 2.5.5 #
|
||||
|
||||
- Fixt den Start von verwalteten Profilen als Always-on VPN
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
# 2.5.6 #
|
||||
|
||||
- Add support for custom HTTP proxy server (Android 10+)
|
||||
|
||||
# 2.5.5 #
|
||||
|
||||
- Fix initiating managed profiles as Always-on VPN
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2012-2019 Tobias Brunner
|
||||
Copyright (C) 2012-2025 Tobias Brunner
|
||||
Copyright (C) 2012 Giuliano Grassi
|
||||
Copyright (C) 2012 Ralf Sager
|
||||
|
||||
@@ -538,6 +538,72 @@
|
||||
|
||||
</org.strongswan.android.ui.widget.TextInputLayoutHelper>
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="4dp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:text="@string/profile_proxy_server_label"
|
||||
android:textSize="20sp" />
|
||||
|
||||
<TextView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="4dp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_marginBottom="10dp"
|
||||
android:text="@string/profile_proxy_server_intro"
|
||||
android:textSize="12sp" />
|
||||
|
||||
<org.strongswan.android.ui.widget.TextInputLayoutHelper
|
||||
android:id="@+id/proxy_host_wrap"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="@string/profile_proxy_host_label"
|
||||
app:helper_text="@string/profile_proxy_host_hint">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/proxy_host"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textNoSuggestions"
|
||||
android:singleLine="true" />
|
||||
|
||||
</org.strongswan.android.ui.widget.TextInputLayoutHelper>
|
||||
|
||||
<org.strongswan.android.ui.widget.TextInputLayoutHelper
|
||||
android:id="@+id/proxy_port_wrap"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="@string/profile_proxy_port_label"
|
||||
app:helper_text="@string/profile_proxy_port_hint">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/proxy_port"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="number|textNoSuggestions"
|
||||
android:singleLine="true" />
|
||||
|
||||
</org.strongswan.android.ui.widget.TextInputLayoutHelper>
|
||||
|
||||
<org.strongswan.android.ui.widget.TextInputLayoutHelper
|
||||
android:id="@+id/proxy_exclusions_wrap"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:hint="@string/profile_proxy_exclusions_label"
|
||||
app:helper_text="@string/profile_proxy_exclusions_hint">
|
||||
|
||||
<com.google.android.material.textfield.TextInputEditText
|
||||
android:id="@+id/proxy_exclusions"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:inputType="textNoSuggestions"
|
||||
android:singleLine="true" />
|
||||
|
||||
</org.strongswan.android.ui.widget.TextInputLayoutHelper>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/profile_id_label"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -128,6 +128,14 @@
|
||||
<string name="profile_proposals_ike_hint">Für non-AEAD/klassische Verschlüsselungsalgorithmen wird ein Integritätsalgorithmus, eine pseudozufällige Funktion (PRF, optional, ansonsten wird eine auf dem Integritätsalgorithmus basierende verwendet) und eine Diffie-Hellman Gruppe benötigt (z.B. aes256-sha256-ecp256). Für kombinierte/AEAD Algorithmen wird der Integritätsalgorithmus weggelassen aber eine PRF wird benötigt (z.B. aes256gcm16-prfsha256-ecp256).</string>
|
||||
<string name="profile_proposals_esp_label">IPsec/ESP Algorithmen</string>
|
||||
<string name="profile_proposals_esp_hint">Für non-AEAD/klassische Verschlüsselungsalgorithmen wird ein Integritätsalgorithmus benötigt, eine Diffie-Hellman Gruppe ist optional (z.B. aes256-sha256 oder aes256-sha256-ecp256). Für kombinierte/AEAD Algorithmen wird der Integritätsalgorithmus weggelassen (z.B. aes256gcm16 oder aes256gcm16-ecp256). Falls eine DH Gruppe angegeben wird, kommt während dem IPsec SA Rekeying ein DH Schlüsselaustausch zur Anwendung. Beim initialen Verbindungsaufbau hat eine DH Gruppe hier keinen Einfluss, weil die Schlüssel dort von der IKE SA abgeleitet werden. Deshalb wird eine Fehlkonfiguration mit dem Server erst später während dem Rekeying zu einem Fehler führen.</string>
|
||||
<string name="profile_proxy_server_label">HTTP Proxy-Server</string>
|
||||
<string name="profile_proxy_server_intro">Optionaler HTTP Proxy-Server bei Verbindung zum VPN. Dies ist nur eine Empfehlung und kann von Apps ignoriert werden. Bitte beachten, dass Apps, die den Proxy verwenden, unabhängig vom Ziel alle HTTP-Ressourcen darüber abrufen, so dass Split-Tunneling-Einstellungen möglicherweise keine Auswirkungen haben. Um die Verwendung des Proxys für bestimmte Hosts zu vermeiden, kann die Ausschlussliste unten verwendet werden.</string>
|
||||
<string name="profile_proxy_host_label">Proxy-Host</string>
|
||||
<string name="profile_proxy_host_hint">IP-Adresse oder Hostname des HTTP Proxy-Servers, der bei Verbindung zum VPN verwendet werden soll</string>
|
||||
<string name="profile_proxy_port_label">Proxy-Port</string>
|
||||
<string name="profile_proxy_port_hint">Port um auf den HTTP Proxy-Server zuzugreifen, Standardwert ist 8080</string>
|
||||
<string name="profile_proxy_exclusions_label">Proxy-Ausschlussliste</string>
|
||||
<string name="profile_proxy_exclusions_hint">Optionale Liste von Hosts für die der HTTP Proxy-Server nicht verwendet werden soll (mit Leerzeichen getrennt und Platzhalter können verwendet werden, z.B. \"direct.example.net *.example.com\")</string>
|
||||
<string name="profile_import">VPN Profil importieren</string>
|
||||
<string name="profile_import_failed">VPN Profil-Import fehlgeschlagen</string>
|
||||
<string name="profile_import_failed_detail">VPN Profil-Import fehlgeschlagen: %1$s</string>
|
||||
|
||||
@@ -108,4 +108,13 @@
|
||||
<string name="managed_config_split_tunneling_block_ipv6_title">@string/profile_split_tunnelingv6_title</string>
|
||||
<string name="managed_config_split_tunneling_block_ipv6_description">Specifies whether to block IPv6 traffic that\'s not destined for the VPN. Forces all IPv6 traffic via VPN (traffic that does not match the negotiated traffic selector is then just dropped). Thus this is basically equivalent to including ::/0 in subnets</string>
|
||||
|
||||
<!-- Managed configuration, VPN profile, proxy server -->
|
||||
<string name="managed_config_proxy_server_bundle_title">@string/profile_proxy_server_label</string>
|
||||
<string name="managed_config_proxy_server_bundle_description">@string/profile_proxy_server_intro</string>
|
||||
<string name="managed_config_proxy_host_title">@string/profile_proxy_host_label</string>
|
||||
<string name="managed_config_proxy_host_description">@string/profile_proxy_host_hint</string>
|
||||
<string name="managed_config_proxy_port_title">@string/profile_proxy_port_label</string>
|
||||
<string name="managed_config_proxy_port_description">@string/profile_proxy_port_hint</string>
|
||||
<string name="managed_config_proxy_exclusions_title">@string/profile_proxy_exclusions_label</string>
|
||||
<string name="managed_config_proxy_exclusions_description">@string/profile_proxy_exclusions_hint</string>
|
||||
</resources>
|
||||
|
||||
@@ -130,6 +130,14 @@
|
||||
<string name="profile_proposals_ike_hint">For non-AEAD/classic encryption algorithms, an integrity algorithm, a pseudo random function (optional, defaults to one based on the integrity algorithm) and a Diffie-Hellman group are required (e.g. aes256-sha256-ecp256). For combined-mode/AEAD algorithms, the integrity algorithm is omitted but a PRF is required (e.g. aes256gcm16-prfsha256-ecp256).</string>
|
||||
<string name="profile_proposals_esp_label">IPsec/ESP Algorithms</string>
|
||||
<string name="profile_proposals_esp_hint">For non-AEAD/classic encryption algorithms, an integrity algorithm is required, a Diffie-Hellman group is optional (e.g. aes256-sha256 or aes256-sha256-ecp256). For combined-mode/AEAD algorithms, the integrity algorithm is omitted (e.g. aes256gcm16 or aes256gcm16-ecp256). If a DH group is specified IPsec SA rekeying will use a DH key exchange. However, DH groups specified here are not used when the connection is established initially because the keys there are derived from the IKE SA key material. Therefore, any configuration mismatch with the server will only cause errors later during rekeying.</string>
|
||||
<string name="profile_proxy_server_label">HTTP proxy server</string>
|
||||
<string name="profile_proxy_server_intro">Optional HTTP proxy server to use when connected to the VPN. This is only a recommendation and may be ignored by apps. Note that apps using the proxy will access all HTTP resources through it regardless of the destination, so split-tunneling settings might not have any effect. To avoid using the proxy server for specific hosts, use the exclusion list below.</string>
|
||||
<string name="profile_proxy_host_label">Proxy host</string>
|
||||
<string name="profile_proxy_host_hint">IP address or hostname of the HTTP proxy server to use when connected to the VPN</string>
|
||||
<string name="profile_proxy_port_label">Proxy port</string>
|
||||
<string name="profile_proxy_port_hint">Port to access the HTTP proxy server, defaults to 8080</string>
|
||||
<string name="profile_proxy_exclusions_label">Proxy exclusion list</string>
|
||||
<string name="profile_proxy_exclusions_hint">Optional list of hosts for which the HTTP proxy server is not used (separated by spaces, and wildcards are possible, e.g. \"direct.example.net *.example.com\")</string>
|
||||
<string name="profile_import">Import VPN profile</string>
|
||||
<string name="profile_import_failed">Failed to import VPN profile</string>
|
||||
<string name="profile_import_failed_detail">Failed to import VPN profile: %1$s</string>
|
||||
|
||||
@@ -108,4 +108,13 @@
|
||||
<string name="managed_config_split_tunneling_block_ipv6_title">@string/profile_split_tunnelingv6_title</string>
|
||||
<string name="managed_config_split_tunneling_block_ipv6_description">Specifies whether to block IPv6 traffic that\'s not destined for the VPN. Forces all IPv6 traffic via VPN (traffic that does not match the negotiated traffic selector is then just dropped). Thus this is basically equivalent to including ::/0 in subnets</string>
|
||||
|
||||
<!-- Managed configuration, VPN profile, proxy server -->
|
||||
<string name="managed_config_proxy_server_bundle_title">@string/profile_proxy_server_label</string>
|
||||
<string name="managed_config_proxy_server_bundle_description">@string/profile_proxy_server_intro</string>
|
||||
<string name="managed_config_proxy_host_title">@string/profile_proxy_host_label</string>
|
||||
<string name="managed_config_proxy_host_description">@string/profile_proxy_host_hint</string>
|
||||
<string name="managed_config_proxy_port_title">@string/profile_proxy_port_label</string>
|
||||
<string name="managed_config_proxy_port_description">@string/profile_proxy_port_hint</string>
|
||||
<string name="managed_config_proxy_exclusions_title">@string/profile_proxy_exclusions_label</string>
|
||||
<string name="managed_config_proxy_exclusions_description">@string/profile_proxy_exclusions_hint</string>
|
||||
</resources>
|
||||
|
||||
@@ -124,6 +124,14 @@
|
||||
<string name="profile_proposals_ike_hint">For non-AEAD/classic encryption algorithms, an integrity algorithm, a pseudo random function (optional, defaults to one based on the integrity algorithm) and a Diffie-Hellman group are required (e.g. aes256-sha256-ecp256). For combined-mode/AEAD algorithms, the integrity algorithm is omitted but a PRF is required (e.g. aes256gcm16-prfsha256-ecp256).</string>
|
||||
<string name="profile_proposals_esp_label">IPsec/ESP Algorithms</string>
|
||||
<string name="profile_proposals_esp_hint">For non-AEAD/classic encryption algorithms, an integrity algorithm is required, a Diffie-Hellman group is optional (e.g. aes256-sha256 or aes256-sha256-ecp256). For combined-mode/AEAD algorithms, the integrity algorithm is omitted (e.g. aes256gcm16 or aes256gcm16-ecp256). If a DH group is specified IPsec SA rekeying will use a DH key exchange. However, DH groups specified here are not used when the connection is established initially because the keys there are derived from the IKE SA key material. Therefore, any configuration mismatch with the server will only cause errors later during rekeying.</string>
|
||||
<string name="profile_proxy_server_label">HTTP proxy server</string>
|
||||
<string name="profile_proxy_server_intro">Optional HTTP proxy server to use when connected to the VPN. This is only a recommendation and may be ignored by apps. Note that apps using the proxy will access all HTTP resources through it regardless of the destination, so split-tunneling settings might not have any effect. To avoid using the proxy server for specific hosts, use the exclusion list below.</string>
|
||||
<string name="profile_proxy_host_label">Proxy host</string>
|
||||
<string name="profile_proxy_host_hint">IP address or hostname of the HTTP proxy server to use when connected to the VPN</string>
|
||||
<string name="profile_proxy_port_label">Proxy port</string>
|
||||
<string name="profile_proxy_port_hint">Port to access the HTTP proxy server, defaults to 8080</string>
|
||||
<string name="profile_proxy_exclusions_label">Proxy exclusion list</string>
|
||||
<string name="profile_proxy_exclusions_hint">Optional list of hosts for which the HTTP proxy server is not used (separated by spaces, and wildcards are possible, e.g. \"direct.example.net *.example.com\")</string>
|
||||
<string name="profile_import">Import VPN profile</string>
|
||||
<string name="profile_import_failed">Failed to import VPN profile</string>
|
||||
<string name="profile_import_failed_detail">Failed to import VPN profile: %1$s</string>
|
||||
|
||||
@@ -108,4 +108,13 @@
|
||||
<string name="managed_config_split_tunneling_block_ipv6_title">@string/profile_split_tunnelingv6_title</string>
|
||||
<string name="managed_config_split_tunneling_block_ipv6_description">Specifies whether to block IPv6 traffic that\'s not destined for the VPN. Forces all IPv6 traffic via VPN (traffic that does not match the negotiated traffic selector is then just dropped). Thus this is basically equivalent to including ::/0 in subnets</string>
|
||||
|
||||
<!-- Managed configuration, VPN profile, proxy server -->
|
||||
<string name="managed_config_proxy_server_bundle_title">@string/profile_proxy_server_label</string>
|
||||
<string name="managed_config_proxy_server_bundle_description">@string/profile_proxy_server_intro</string>
|
||||
<string name="managed_config_proxy_host_title">@string/profile_proxy_host_label</string>
|
||||
<string name="managed_config_proxy_host_description">@string/profile_proxy_host_hint</string>
|
||||
<string name="managed_config_proxy_port_title">@string/profile_proxy_port_label</string>
|
||||
<string name="managed_config_proxy_port_description">@string/profile_proxy_port_hint</string>
|
||||
<string name="managed_config_proxy_exclusions_title">@string/profile_proxy_exclusions_label</string>
|
||||
<string name="managed_config_proxy_exclusions_description">@string/profile_proxy_exclusions_hint</string>
|
||||
</resources>
|
||||
|
||||
@@ -125,6 +125,14 @@
|
||||
<string name="profile_proposals_ike_hint">For non-AEAD/classic encryption algorithms, an integrity algorithm, a pseudo random function (optional, defaults to one based on the integrity algorithm) and a Diffie-Hellman group are required (e.g. aes256-sha256-ecp256). For combined-mode/AEAD algorithms, the integrity algorithm is omitted but a PRF is required (e.g. aes256gcm16-prfsha256-ecp256).</string>
|
||||
<string name="profile_proposals_esp_label">IPsec/ESP Algorithms</string>
|
||||
<string name="profile_proposals_esp_hint">For non-AEAD/classic encryption algorithms, an integrity algorithm is required, a Diffie-Hellman group is optional (e.g. aes256-sha256 or aes256-sha256-ecp256). For combined-mode/AEAD algorithms, the integrity algorithm is omitted (e.g. aes256gcm16 or aes256gcm16-ecp256). If a DH group is specified IPsec SA rekeying will use a DH key exchange. However, DH groups specified here are not used when the connection is established initially because the keys there are derived from the IKE SA key material. Therefore, any configuration mismatch with the server will only cause errors later during rekeying.</string>
|
||||
<string name="profile_proxy_server_label">HTTP proxy server</string>
|
||||
<string name="profile_proxy_server_intro">Optional HTTP proxy server to use when connected to the VPN. This is only a recommendation and may be ignored by apps. Note that apps using the proxy will access all HTTP resources through it regardless of the destination, so split-tunneling settings might not have any effect. To avoid using the proxy server for specific hosts, use the exclusion list below.</string>
|
||||
<string name="profile_proxy_host_label">Proxy host</string>
|
||||
<string name="profile_proxy_host_hint">IP address or hostname of the HTTP proxy server to use when connected to the VPN</string>
|
||||
<string name="profile_proxy_port_label">Proxy port</string>
|
||||
<string name="profile_proxy_port_hint">Port to access the HTTP proxy server, defaults to 8080</string>
|
||||
<string name="profile_proxy_exclusions_label">Proxy exclusion list</string>
|
||||
<string name="profile_proxy_exclusions_hint">Optional list of hosts for which the HTTP proxy server is not used (separated by spaces, and wildcards are possible, e.g. \"direct.example.net *.example.com\")</string>
|
||||
<string name="profile_import">Import VPN profile</string>
|
||||
<string name="profile_import_failed">Failed to import VPN profile</string>
|
||||
<string name="profile_import_failed_detail">Failed to import VPN profile: %1$s</string>
|
||||
|
||||
@@ -108,4 +108,13 @@
|
||||
<string name="managed_config_split_tunneling_block_ipv6_title">@string/profile_split_tunnelingv6_title</string>
|
||||
<string name="managed_config_split_tunneling_block_ipv6_description">Specifies whether to block IPv6 traffic that\'s not destined for the VPN. Forces all IPv6 traffic via VPN (traffic that does not match the negotiated traffic selector is then just dropped). Thus this is basically equivalent to including ::/0 in subnets</string>
|
||||
|
||||
<!-- Managed configuration, VPN profile, proxy server -->
|
||||
<string name="managed_config_proxy_server_bundle_title">@string/profile_proxy_server_label</string>
|
||||
<string name="managed_config_proxy_server_bundle_description">@string/profile_proxy_server_intro</string>
|
||||
<string name="managed_config_proxy_host_title">@string/profile_proxy_host_label</string>
|
||||
<string name="managed_config_proxy_host_description">@string/profile_proxy_host_hint</string>
|
||||
<string name="managed_config_proxy_port_title">@string/profile_proxy_port_label</string>
|
||||
<string name="managed_config_proxy_port_description">@string/profile_proxy_port_hint</string>
|
||||
<string name="managed_config_proxy_exclusions_title">@string/profile_proxy_exclusions_label</string>
|
||||
<string name="managed_config_proxy_exclusions_description">@string/profile_proxy_exclusions_hint</string>
|
||||
</resources>
|
||||
|
||||
@@ -124,6 +124,14 @@
|
||||
<string name="profile_proposals_ike_hint">对于非AEAD/经典加密算法,需要完整性算法、伪随机函数(可选,默认为基于完整性算法的函数)和Diffie-Hellman组(例如aes256-sha256-ecp256)。对于组合模式/AEAD算法,省略完整性算法,但需要PRF(例如aes256gcm16-prfsha256-ecp256)。</string>
|
||||
<string name="profile_proposals_esp_label">IPsec/ESP 算法</string>
|
||||
<string name="profile_proposals_esp_hint">对于非AEAD/经典加密算法,需要完整性算法,Diffie-Hellman组是可选的(例如aes256-sha256或aes256-sha256-ecp256)。对于组合模式/AEAD算法,省略完整性算法(例如aes256gcm16或aes256gcm16-ecp256)。如果指定了DH组,IPsec SA密钥更新将使用DH密钥交换。但是,在最初建立连接时,不使用此处指定的DH组,因为其中的密钥来自IKE SA密钥材料。因此,与服务器的任何配置不匹配只会在稍后重新设置密钥时导致错误。</string>
|
||||
<string name="profile_proxy_server_label">HTTP proxy server</string>
|
||||
<string name="profile_proxy_server_intro">Optional HTTP proxy server to use when connected to the VPN. This is only a recommendation and may be ignored by apps. Note that apps using the proxy will access all HTTP resources through it regardless of the destination, so split-tunneling settings might not have any effect. To avoid using the proxy server for specific hosts, use the exclusion list below.</string>
|
||||
<string name="profile_proxy_host_label">Proxy host</string>
|
||||
<string name="profile_proxy_host_hint">IP address or hostname of the HTTP proxy server to use when connected to the VPN</string>
|
||||
<string name="profile_proxy_port_label">Proxy port</string>
|
||||
<string name="profile_proxy_port_hint">Port to access the HTTP proxy server, defaults to 8080</string>
|
||||
<string name="profile_proxy_exclusions_label">Proxy exclusion list</string>
|
||||
<string name="profile_proxy_exclusions_hint">Optional list of hosts for which the HTTP proxy server is not used (separated by spaces, and wildcards are possible, e.g. \"direct.example.net *.example.com\")</string>
|
||||
<string name="profile_import">导入VPN配置</string>
|
||||
<string name="profile_import_failed">导入VPN配置失败</string>
|
||||
<string name="profile_import_failed_detail">导入VPN配置失败: %1$s</string>
|
||||
|
||||
@@ -108,4 +108,13 @@
|
||||
<string name="managed_config_split_tunneling_block_ipv6_title">@string/profile_split_tunnelingv6_title</string>
|
||||
<string name="managed_config_split_tunneling_block_ipv6_description">Specifies whether to block IPv6 traffic that\'s not destined for the VPN. Forces all IPv6 traffic via VPN (traffic that does not match the negotiated traffic selector is then just dropped). Thus this is basically equivalent to including ::/0 in subnets</string>
|
||||
|
||||
<!-- Managed configuration, VPN profile, proxy server -->
|
||||
<string name="managed_config_proxy_server_bundle_title">@string/profile_proxy_server_label</string>
|
||||
<string name="managed_config_proxy_server_bundle_description">@string/profile_proxy_server_intro</string>
|
||||
<string name="managed_config_proxy_host_title">@string/profile_proxy_host_label</string>
|
||||
<string name="managed_config_proxy_host_description">@string/profile_proxy_host_hint</string>
|
||||
<string name="managed_config_proxy_port_title">@string/profile_proxy_port_label</string>
|
||||
<string name="managed_config_proxy_port_description">@string/profile_proxy_port_hint</string>
|
||||
<string name="managed_config_proxy_exclusions_title">@string/profile_proxy_exclusions_label</string>
|
||||
<string name="managed_config_proxy_exclusions_description">@string/profile_proxy_exclusions_hint</string>
|
||||
</resources>
|
||||
|
||||
@@ -124,6 +124,14 @@
|
||||
<string name="profile_proposals_ike_hint">For non-AEAD/classic encryption algorithms, an integrity algorithm, a pseudo random function (optional, defaults to one based on the integrity algorithm) and a Diffie-Hellman group are required (e.g. aes256-sha256-ecp256). For combined-mode/AEAD algorithms, the integrity algorithm is omitted but a PRF is required (e.g. aes256gcm16-prfsha256-ecp256).</string>
|
||||
<string name="profile_proposals_esp_label">IPsec/ESP Algorithms</string>
|
||||
<string name="profile_proposals_esp_hint">For non-AEAD/classic encryption algorithms, an integrity algorithm is required, a Diffie-Hellman group is optional (e.g. aes256-sha256 or aes256-sha256-ecp256). For combined-mode/AEAD algorithms, the integrity algorithm is omitted (e.g. aes256gcm16 or aes256gcm16-ecp256). If a DH group is specified IPsec SA rekeying will use a DH key exchange. However, DH groups specified here are not used when the connection is established initially because the keys there are derived from the IKE SA key material. Therefore, any configuration mismatch with the server will only cause errors later during rekeying.</string>
|
||||
<string name="profile_proxy_server_label">HTTP proxy server</string>
|
||||
<string name="profile_proxy_server_intro">Optional HTTP proxy server to use when connected to the VPN. This is only a recommendation and may be ignored by apps. Note that apps using the proxy will access all HTTP resources through it regardless of the destination, so split-tunneling settings might not have any effect. To avoid using the proxy server for specific hosts, use the exclusion list below.</string>
|
||||
<string name="profile_proxy_host_label">Proxy host</string>
|
||||
<string name="profile_proxy_host_hint">IP address or hostname of the HTTP proxy server to use when connected to the VPN</string>
|
||||
<string name="profile_proxy_port_label">Proxy port</string>
|
||||
<string name="profile_proxy_port_hint">Port to access the HTTP proxy server, defaults to 8080</string>
|
||||
<string name="profile_proxy_exclusions_label">Proxy exclusion list</string>
|
||||
<string name="profile_proxy_exclusions_hint">Optional list of hosts for which the HTTP proxy server is not used (separated by spaces, and wildcards are possible, e.g. \"direct.example.net *.example.com\")</string>
|
||||
<string name="profile_import">匯入VPN設定檔</string>
|
||||
<string name="profile_import_failed">匯入VPN設定檔失敗</string>
|
||||
<string name="profile_import_failed_detail">匯入VPN設定檔失敗: %1$s</string>
|
||||
|
||||
@@ -108,4 +108,13 @@
|
||||
<string name="managed_config_split_tunneling_block_ipv6_title">@string/profile_split_tunnelingv6_title</string>
|
||||
<string name="managed_config_split_tunneling_block_ipv6_description">Specifies whether to block IPv6 traffic that\'s not destined for the VPN. Forces all IPv6 traffic via VPN (traffic that does not match the negotiated traffic selector is then just dropped). Thus this is basically equivalent to including ::/0 in subnets</string>
|
||||
|
||||
<!-- Managed configuration, VPN profile, proxy server -->
|
||||
<string name="managed_config_proxy_server_bundle_title">@string/profile_proxy_server_label</string>
|
||||
<string name="managed_config_proxy_server_bundle_description">@string/profile_proxy_server_intro</string>
|
||||
<string name="managed_config_proxy_host_title">@string/profile_proxy_host_label</string>
|
||||
<string name="managed_config_proxy_host_description">@string/profile_proxy_host_hint</string>
|
||||
<string name="managed_config_proxy_port_title">@string/profile_proxy_port_label</string>
|
||||
<string name="managed_config_proxy_port_description">@string/profile_proxy_port_hint</string>
|
||||
<string name="managed_config_proxy_exclusions_title">@string/profile_proxy_exclusions_label</string>
|
||||
<string name="managed_config_proxy_exclusions_description">@string/profile_proxy_exclusions_hint</string>
|
||||
</resources>
|
||||
|
||||
@@ -128,6 +128,14 @@
|
||||
<string name="profile_proposals_ike_hint">For non-AEAD/classic encryption algorithms, an integrity algorithm, a pseudo random function (optional, defaults to one based on the integrity algorithm) and a Diffie-Hellman group are required (e.g. aes256-sha256-ecp256). For combined-mode/AEAD algorithms, the integrity algorithm is omitted but a PRF is required (e.g. aes256gcm16-prfsha256-ecp256).</string>
|
||||
<string name="profile_proposals_esp_label">IPsec/ESP Algorithms</string>
|
||||
<string name="profile_proposals_esp_hint">For non-AEAD/classic encryption algorithms, an integrity algorithm is required, a Diffie-Hellman group is optional (e.g. aes256-sha256 or aes256-sha256-ecp256). For combined-mode/AEAD algorithms, the integrity algorithm is omitted (e.g. aes256gcm16 or aes256gcm16-ecp256). If a DH group is specified IPsec SA rekeying will use a DH key exchange. However, DH groups specified here are not used when the connection is established initially because the keys there are derived from the IKE SA key material. Therefore, any configuration mismatch with the server will only cause errors later during rekeying.</string>
|
||||
<string name="profile_proxy_server_label">HTTP proxy server</string>
|
||||
<string name="profile_proxy_server_intro">Optional HTTP proxy server to use when connected to the VPN. This is only a recommendation and may be ignored by apps. Note that apps using the proxy will access all HTTP resources through it regardless of the destination, so split-tunneling settings might not have any effect. To avoid using the proxy server for specific hosts, use the exclusion list below.</string>
|
||||
<string name="profile_proxy_host_label">Proxy host</string>
|
||||
<string name="profile_proxy_host_hint">IP address or hostname of the HTTP proxy server to use when connected to the VPN</string>
|
||||
<string name="profile_proxy_port_label">Proxy port</string>
|
||||
<string name="profile_proxy_port_hint">Port to access the HTTP proxy server, defaults to 8080</string>
|
||||
<string name="profile_proxy_exclusions_label">Proxy exclusion list</string>
|
||||
<string name="profile_proxy_exclusions_hint">Optional list of hosts for which the HTTP proxy server is not used (separated by spaces, and wildcards are possible, e.g. \"direct.example.net *.example.com\")</string>
|
||||
<string name="profile_import">Import VPN profile</string>
|
||||
<string name="profile_import_failed">Failed to import VPN profile</string>
|
||||
<string name="profile_import_failed_detail">Failed to import VPN profile: %1$s</string>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2025 Tobias Brunner
|
||||
Copyright (C) 2023 Relution GmbH
|
||||
|
||||
Copyright (C) secunet Security Networks AG
|
||||
@@ -108,4 +109,13 @@
|
||||
<string name="managed_config_split_tunneling_block_ipv6_title">@string/profile_split_tunnelingv6_title</string>
|
||||
<string name="managed_config_split_tunneling_block_ipv6_description">Specifies whether to block IPv6 traffic that\'s not destined for the VPN. Forces all IPv6 traffic via VPN (traffic that does not match the negotiated traffic selector is then just dropped). Thus this is basically equivalent to including ::/0 in subnets</string>
|
||||
|
||||
<!-- Managed configuration, VPN profile, proxy server -->
|
||||
<string name="managed_config_proxy_server_bundle_title">@string/profile_proxy_server_label</string>
|
||||
<string name="managed_config_proxy_server_bundle_description">@string/profile_proxy_server_intro</string>
|
||||
<string name="managed_config_proxy_host_title">@string/profile_proxy_host_label</string>
|
||||
<string name="managed_config_proxy_host_description">@string/profile_proxy_host_hint</string>
|
||||
<string name="managed_config_proxy_port_title">@string/profile_proxy_port_label</string>
|
||||
<string name="managed_config_proxy_port_description">@string/profile_proxy_port_hint</string>
|
||||
<string name="managed_config_proxy_exclusions_title">@string/profile_proxy_exclusions_label</string>
|
||||
<string name="managed_config_proxy_exclusions_description">@string/profile_proxy_exclusions_hint</string>
|
||||
</resources>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Copyright (C) 2025 Tobias Brunner
|
||||
Copyright (C) 2023 Relution GmbH
|
||||
|
||||
Copyright (C) secunet Security Networks AG
|
||||
@@ -305,6 +306,35 @@
|
||||
|
||||
</restriction>
|
||||
|
||||
<restriction
|
||||
android:description="@string/managed_config_proxy_server_bundle_description"
|
||||
android:key="proxy_server"
|
||||
android:restrictionType="bundle"
|
||||
android:title="@string/managed_config_proxy_server_bundle_title">
|
||||
|
||||
<restriction
|
||||
android:defaultValue=""
|
||||
android:description="@string/managed_config_proxy_host_description"
|
||||
android:key="proxy_host"
|
||||
android:restrictionType="string"
|
||||
android:title="@string/managed_config_proxy_host_title" />
|
||||
|
||||
<restriction
|
||||
android:defaultValue="-1"
|
||||
android:description="@string/managed_config_proxy_port_description"
|
||||
android:key="proxy_port"
|
||||
android:restrictionType="integer"
|
||||
android:title="@string/managed_config_proxy_port_description" />
|
||||
|
||||
<restriction
|
||||
android:defaultValue=""
|
||||
android:description="@string/managed_config_proxy_exclusions_description"
|
||||
android:key="proxy_exclusions"
|
||||
android:restrictionType="string"
|
||||
android:title="@string/managed_config_proxy_exclusions_title" />
|
||||
|
||||
</restriction>
|
||||
|
||||
</restriction>
|
||||
</restriction>
|
||||
</restrictions>
|
||||
|
||||
Reference in New Issue
Block a user