AWG Android support
This commit is contained in:
parent
7f2ef65fe6
commit
bdfa8bfe5b
4 changed files with 309 additions and 10 deletions
|
@ -70,6 +70,15 @@ public class BadConfigException extends Exception {
|
||||||
EXCLUDED_APPLICATIONS("ExcludedApplications"),
|
EXCLUDED_APPLICATIONS("ExcludedApplications"),
|
||||||
INCLUDED_APPLICATIONS("IncludedApplications"),
|
INCLUDED_APPLICATIONS("IncludedApplications"),
|
||||||
LISTEN_PORT("ListenPort"),
|
LISTEN_PORT("ListenPort"),
|
||||||
|
JC("Jc"),
|
||||||
|
JMIN("Jmin"),
|
||||||
|
JMAX("Jmax"),
|
||||||
|
S1("S1"),
|
||||||
|
S2("S2"),
|
||||||
|
H1("H1"),
|
||||||
|
H2("H2"),
|
||||||
|
H3("H3"),
|
||||||
|
H4("H4"),
|
||||||
MTU("MTU"),
|
MTU("MTU"),
|
||||||
PERSISTENT_KEEPALIVE("PersistentKeepalive"),
|
PERSISTENT_KEEPALIVE("PersistentKeepalive"),
|
||||||
PRE_SHARED_KEY("PresharedKey"),
|
PRE_SHARED_KEY("PresharedKey"),
|
||||||
|
|
|
@ -44,6 +44,15 @@ public final class Interface {
|
||||||
private final KeyPair keyPair;
|
private final KeyPair keyPair;
|
||||||
private final Optional<Integer> listenPort;
|
private final Optional<Integer> listenPort;
|
||||||
private final Optional<Integer> mtu;
|
private final Optional<Integer> mtu;
|
||||||
|
private final Optional<Integer> jc;
|
||||||
|
private final Optional<Integer> jmin;
|
||||||
|
private final Optional<Integer> jmax;
|
||||||
|
private final Optional<Integer> s1;
|
||||||
|
private final Optional<Integer> s2;
|
||||||
|
private final Optional<Long> h1;
|
||||||
|
private final Optional<Long> h2;
|
||||||
|
private final Optional<Long> h3;
|
||||||
|
private final Optional<Long> h4;
|
||||||
|
|
||||||
private Interface(final Builder builder) {
|
private Interface(final Builder builder) {
|
||||||
// Defensively copy to ensure immutability even if the Builder is reused.
|
// Defensively copy to ensure immutability even if the Builder is reused.
|
||||||
|
@ -56,6 +65,15 @@ public final class Interface {
|
||||||
keyPair = Objects.requireNonNull(builder.keyPair, "Interfaces must have a private key");
|
keyPair = Objects.requireNonNull(builder.keyPair, "Interfaces must have a private key");
|
||||||
listenPort = builder.listenPort;
|
listenPort = builder.listenPort;
|
||||||
mtu = builder.mtu;
|
mtu = builder.mtu;
|
||||||
|
jc = builder.jc;
|
||||||
|
jmax = builder.jmax;
|
||||||
|
jmin = builder.jmin;
|
||||||
|
s1 = builder.s1;
|
||||||
|
s2 = builder.s2;
|
||||||
|
h1 = builder.h1;
|
||||||
|
h2 = builder.h2;
|
||||||
|
h3 = builder.h3;
|
||||||
|
h4 = builder.h4;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -95,6 +113,33 @@ public final class Interface {
|
||||||
case "privatekey":
|
case "privatekey":
|
||||||
builder.parsePrivateKey(attribute.getValue());
|
builder.parsePrivateKey(attribute.getValue());
|
||||||
break;
|
break;
|
||||||
|
case "jc":
|
||||||
|
builder.parseJc(attribute.getValue());
|
||||||
|
break;
|
||||||
|
case "jmin":
|
||||||
|
builder.parseJmin(attribute.getValue());
|
||||||
|
break;
|
||||||
|
case "jmax":
|
||||||
|
builder.parseJmax(attribute.getValue());
|
||||||
|
break;
|
||||||
|
case "s1":
|
||||||
|
builder.parseS1(attribute.getValue());
|
||||||
|
break;
|
||||||
|
case "s2":
|
||||||
|
builder.parseS2(attribute.getValue());
|
||||||
|
break;
|
||||||
|
case "h1":
|
||||||
|
builder.parseH1(attribute.getValue());
|
||||||
|
break;
|
||||||
|
case "h2":
|
||||||
|
builder.parseH2(attribute.getValue());
|
||||||
|
break;
|
||||||
|
case "h3":
|
||||||
|
builder.parseH3(attribute.getValue());
|
||||||
|
break;
|
||||||
|
case "h4":
|
||||||
|
builder.parseH4(attribute.getValue());
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
throw new BadConfigException(
|
throw new BadConfigException(
|
||||||
Section.INTERFACE, Location.TOP_LEVEL, Reason.UNKNOWN_ATTRIBUTE, attribute.getKey());
|
Section.INTERFACE, Location.TOP_LEVEL, Reason.UNKNOWN_ATTRIBUTE, attribute.getKey());
|
||||||
|
@ -111,7 +156,9 @@ public final class Interface {
|
||||||
return addresses.equals(other.addresses) && dnsServers.equals(other.dnsServers)
|
return addresses.equals(other.addresses) && dnsServers.equals(other.dnsServers)
|
||||||
&& excludedApplications.equals(other.excludedApplications)
|
&& excludedApplications.equals(other.excludedApplications)
|
||||||
&& includedApplications.equals(other.includedApplications) && keyPair.equals(other.keyPair)
|
&& includedApplications.equals(other.includedApplications) && keyPair.equals(other.keyPair)
|
||||||
&& listenPort.equals(other.listenPort) && mtu.equals(other.mtu);
|
&& listenPort.equals(other.listenPort) && mtu.equals(other.mtu) && jc.equals(other.jc) && jmin.equals(other.jmin)
|
||||||
|
&& jmax.equals(other.jmax) && s1.equals(other.s1) && s2.equals(other.s2) && h1.equals(other.h1) && h2.equals(other.h2)
|
||||||
|
&& h3.equals(other.h3) && h4.equals(other.h4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -181,6 +228,42 @@ public final class Interface {
|
||||||
return mtu;
|
return mtu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Optional<Integer> getJc() {
|
||||||
|
return jc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Integer> getJmin() {
|
||||||
|
return jmin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Integer> getJmax() {
|
||||||
|
return jmax;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Integer> getS1() {
|
||||||
|
return s1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Integer> getS2() {
|
||||||
|
return s2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Long> getH1() {
|
||||||
|
return h1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Long> getH2() {
|
||||||
|
return h2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Long> getH3() {
|
||||||
|
return h3;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Long> getH4() {
|
||||||
|
return h4;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
int hash = 1;
|
int hash = 1;
|
||||||
|
@ -191,6 +274,15 @@ public final class Interface {
|
||||||
hash = 31 * hash + keyPair.hashCode();
|
hash = 31 * hash + keyPair.hashCode();
|
||||||
hash = 31 * hash + listenPort.hashCode();
|
hash = 31 * hash + listenPort.hashCode();
|
||||||
hash = 31 * hash + mtu.hashCode();
|
hash = 31 * hash + mtu.hashCode();
|
||||||
|
hash = 31 * hash + jc.hashCode();
|
||||||
|
hash = 31 * hash + jmin.hashCode();
|
||||||
|
hash = 31 * hash + jmax.hashCode();
|
||||||
|
hash = 31 * hash + s1.hashCode();
|
||||||
|
hash = 31 * hash + s2.hashCode();
|
||||||
|
hash = 31 * hash + h1.hashCode();
|
||||||
|
hash = 31 * hash + h2.hashCode();
|
||||||
|
hash = 31 * hash + h3.hashCode();
|
||||||
|
hash = 31 * hash + h4.hashCode();
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -234,6 +326,19 @@ public final class Interface {
|
||||||
.append('\n');
|
.append('\n');
|
||||||
listenPort.ifPresent(lp -> sb.append("ListenPort = ").append(lp).append('\n'));
|
listenPort.ifPresent(lp -> sb.append("ListenPort = ").append(lp).append('\n'));
|
||||||
mtu.ifPresent(m -> sb.append("MTU = ").append(m).append('\n'));
|
mtu.ifPresent(m -> sb.append("MTU = ").append(m).append('\n'));
|
||||||
|
|
||||||
|
jc.ifPresent(t_jc -> sb.append("Jc = ").append(t_jc).append('\n'));
|
||||||
|
jmin.ifPresent(t_jmin -> sb.append("Jmin = ").append(t_jmin).append('\n'));
|
||||||
|
jmax.ifPresent(t_jmax -> sb.append("Jmax = ").append(t_jmax).append('\n'));
|
||||||
|
|
||||||
|
s1.ifPresent(t_s1 -> sb.append("S1 = ").append(t_s1).append('\n'));
|
||||||
|
s2.ifPresent(t_s2 -> sb.append("S2 = ").append(t_s2).append('\n'));
|
||||||
|
|
||||||
|
h1.ifPresent(t_h1 -> sb.append("H1 = ").append(t_h1).append('\n'));
|
||||||
|
h2.ifPresent(t_h2 -> sb.append("H2 = ").append(t_h2).append('\n'));
|
||||||
|
h3.ifPresent(t_h3 -> sb.append("H3 = ").append(t_h3).append('\n'));
|
||||||
|
h4.ifPresent(t_h4 -> sb.append("H4 = ").append(t_h4).append('\n'));
|
||||||
|
|
||||||
sb.append("PrivateKey = ").append(keyPair.getPrivateKey().toBase64()).append('\n');
|
sb.append("PrivateKey = ").append(keyPair.getPrivateKey().toBase64()).append('\n');
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
@ -248,6 +353,18 @@ public final class Interface {
|
||||||
final StringBuilder sb = new StringBuilder();
|
final StringBuilder sb = new StringBuilder();
|
||||||
sb.append("private_key=").append(keyPair.getPrivateKey().toHex()).append('\n');
|
sb.append("private_key=").append(keyPair.getPrivateKey().toHex()).append('\n');
|
||||||
listenPort.ifPresent(lp -> sb.append("listen_port=").append(lp).append('\n'));
|
listenPort.ifPresent(lp -> sb.append("listen_port=").append(lp).append('\n'));
|
||||||
|
|
||||||
|
jc.ifPresent(t_jc -> sb.append("jc=").append(t_jc).append('\n'));
|
||||||
|
jmin.ifPresent(t_jmin -> sb.append("jmin=").append(t_jmin).append('\n'));
|
||||||
|
jmax.ifPresent(t_jmax -> sb.append("jmax=").append(t_jmax).append('\n'));
|
||||||
|
|
||||||
|
s1.ifPresent(t_s1 -> sb.append("s1=").append(t_s1).append('\n'));
|
||||||
|
s2.ifPresent(t_s2 -> sb.append("s2=").append(t_s2).append('\n'));
|
||||||
|
|
||||||
|
h1.ifPresent(t_h1 -> sb.append("h1=").append(t_h1).append('\n'));
|
||||||
|
h2.ifPresent(t_h2 -> sb.append("h2=").append(t_h2).append('\n'));
|
||||||
|
h3.ifPresent(t_h3 -> sb.append("h3=").append(t_h3).append('\n'));
|
||||||
|
h4.ifPresent(t_h4 -> sb.append("h4=").append(t_h4).append('\n'));
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -267,6 +384,17 @@ public final class Interface {
|
||||||
private Optional<Integer> listenPort = Optional.empty();
|
private Optional<Integer> listenPort = Optional.empty();
|
||||||
// Defaults to not present.
|
// Defaults to not present.
|
||||||
private Optional<Integer> mtu = Optional.empty();
|
private Optional<Integer> mtu = Optional.empty();
|
||||||
|
private Optional<Integer> jc = Optional.empty();
|
||||||
|
private Optional<Integer> jmin = Optional.empty();
|
||||||
|
private Optional<Integer> jmax = Optional.empty();
|
||||||
|
|
||||||
|
private Optional<Integer> s1 = Optional.empty();
|
||||||
|
private Optional<Integer> s2 = Optional.empty();
|
||||||
|
|
||||||
|
private Optional<Long> h1 = Optional.empty();
|
||||||
|
private Optional<Long> h2 = Optional.empty();
|
||||||
|
private Optional<Long> h3 = Optional.empty();
|
||||||
|
private Optional<Long> h4 = Optional.empty();
|
||||||
|
|
||||||
public Builder addAddress(final InetNetwork address) {
|
public Builder addAddress(final InetNetwork address) {
|
||||||
addresses.add(address);
|
addresses.add(address);
|
||||||
|
@ -362,6 +490,78 @@ public final class Interface {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder parseJc(final String jc) throws BadConfigException {
|
||||||
|
try {
|
||||||
|
return setJc(Integer.parseInt(jc));
|
||||||
|
} catch (final NumberFormatException e) {
|
||||||
|
throw new BadConfigException(Section.INTERFACE, Location.JC, jc, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder parseJmax(final String jmax) throws BadConfigException {
|
||||||
|
try {
|
||||||
|
return setJmax(Integer.parseInt(jmax));
|
||||||
|
} catch (final NumberFormatException e) {
|
||||||
|
throw new BadConfigException(Section.INTERFACE, Location.JMAX, jmax, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder parseJmin(final String jmin) throws BadConfigException {
|
||||||
|
try {
|
||||||
|
return setJmin(Integer.parseInt(jmin));
|
||||||
|
} catch (final NumberFormatException e) {
|
||||||
|
throw new BadConfigException(Section.INTERFACE, Location.JMIN, jmin, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder parseS1(final String s1) throws BadConfigException {
|
||||||
|
try {
|
||||||
|
return setS1(Integer.parseInt(s1));
|
||||||
|
} catch (final NumberFormatException e) {
|
||||||
|
throw new BadConfigException(Section.INTERFACE, Location.S1, s1, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder parseS2(final String s2) throws BadConfigException {
|
||||||
|
try {
|
||||||
|
return setS2(Integer.parseInt(s2));
|
||||||
|
} catch (final NumberFormatException e) {
|
||||||
|
throw new BadConfigException(Section.INTERFACE, Location.S2, s2, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder parseH1(final String h1) throws BadConfigException {
|
||||||
|
try {
|
||||||
|
return setH1(Long.parseLong(h1));
|
||||||
|
} catch (final NumberFormatException e) {
|
||||||
|
throw new BadConfigException(Section.INTERFACE, Location.H1, h1, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder parseH2(final String h2) throws BadConfigException {
|
||||||
|
try {
|
||||||
|
return setH2(Long.parseLong(h2));
|
||||||
|
} catch (final NumberFormatException e) {
|
||||||
|
throw new BadConfigException(Section.INTERFACE, Location.H2, h2, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder parseH3(final String h3) throws BadConfigException {
|
||||||
|
try {
|
||||||
|
return setH3(Long.parseLong(h3));
|
||||||
|
} catch (final NumberFormatException e) {
|
||||||
|
throw new BadConfigException(Section.INTERFACE, Location.H3, h3, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder parseH4(final String h4) throws BadConfigException {
|
||||||
|
try {
|
||||||
|
return setH4(Long.parseLong(h4));
|
||||||
|
} catch (final NumberFormatException e) {
|
||||||
|
throw new BadConfigException(Section.INTERFACE, Location.H4, h4, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Builder parsePrivateKey(final String privateKey) throws BadConfigException {
|
public Builder parsePrivateKey(final String privateKey) throws BadConfigException {
|
||||||
try {
|
try {
|
||||||
return setKeyPair(new KeyPair(Key.fromBase64(privateKey)));
|
return setKeyPair(new KeyPair(Key.fromBase64(privateKey)));
|
||||||
|
@ -386,9 +586,81 @@ public final class Interface {
|
||||||
public Builder setMtu(final int mtu) throws BadConfigException {
|
public Builder setMtu(final int mtu) throws BadConfigException {
|
||||||
if (mtu < 0)
|
if (mtu < 0)
|
||||||
throw new BadConfigException(
|
throw new BadConfigException(
|
||||||
Section.INTERFACE, Location.LISTEN_PORT, Reason.INVALID_VALUE, String.valueOf(mtu));
|
Section.INTERFACE, Location.MTU, Reason.INVALID_VALUE, String.valueOf(mtu));
|
||||||
this.mtu = mtu == 0 ? Optional.empty() : Optional.of(mtu);
|
this.mtu = mtu == 0 ? Optional.empty() : Optional.of(mtu);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder setJc(final int jc) throws BadConfigException {
|
||||||
|
if (jc < 0)
|
||||||
|
throw new BadConfigException(
|
||||||
|
Section.INTERFACE, Location.JC, Reason.INVALID_VALUE, String.valueOf(jc));
|
||||||
|
this.jc = jc == 0 ? Optional.empty() : Optional.of(jc);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setJmin(final int jmin) throws BadConfigException {
|
||||||
|
if (jmin < 0)
|
||||||
|
throw new BadConfigException(
|
||||||
|
Section.INTERFACE, Location.JMIN, Reason.INVALID_VALUE, String.valueOf(jmin));
|
||||||
|
this.jmin = jmin == 0 ? Optional.empty() : Optional.of(jmin);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setJmax(final int jmax) throws BadConfigException {
|
||||||
|
if (jmax < 0)
|
||||||
|
throw new BadConfigException(
|
||||||
|
Section.INTERFACE, Location.JMAX, Reason.INVALID_VALUE, String.valueOf(jmax));
|
||||||
|
this.jmax = jmax == 0 ? Optional.empty() : Optional.of(jmax);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setS1(final int s1) throws BadConfigException {
|
||||||
|
if (s1 < 0)
|
||||||
|
throw new BadConfigException(
|
||||||
|
Section.INTERFACE, Location.S1, Reason.INVALID_VALUE, String.valueOf(s1));
|
||||||
|
this.s1 = s1 == 0 ? Optional.empty() : Optional.of(s1);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setS2(final int s2) throws BadConfigException {
|
||||||
|
if (s2 < 0)
|
||||||
|
throw new BadConfigException(
|
||||||
|
Section.INTERFACE, Location.S2, Reason.INVALID_VALUE, String.valueOf(s2));
|
||||||
|
this.s2 = s2 == 0 ? Optional.empty() : Optional.of(s2);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setH1(final long h1) throws BadConfigException {
|
||||||
|
if (h1 < 0)
|
||||||
|
throw new BadConfigException(
|
||||||
|
Section.INTERFACE, Location.H1, Reason.INVALID_VALUE, String.valueOf(h1));
|
||||||
|
this.h1 = h1 == 0 ? Optional.empty() : Optional.of(h1);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setH2(final long h2) throws BadConfigException {
|
||||||
|
if (h2 < 0)
|
||||||
|
throw new BadConfigException(
|
||||||
|
Section.INTERFACE, Location.H2, Reason.INVALID_VALUE, String.valueOf(h2));
|
||||||
|
this.h2 = h2 == 0 ? Optional.empty() : Optional.of(h2);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setH3(final long h3) throws BadConfigException {
|
||||||
|
if (h3 < 0)
|
||||||
|
throw new BadConfigException(
|
||||||
|
Section.INTERFACE, Location.H3, Reason.INVALID_VALUE, String.valueOf(h3));
|
||||||
|
this.h3 = h3 == 0 ? Optional.empty() : Optional.of(h3);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setH4(final long h4) throws BadConfigException {
|
||||||
|
if (h4 < 0)
|
||||||
|
throw new BadConfigException(
|
||||||
|
Section.INTERFACE, Location.H4, Reason.INVALID_VALUE, String.valueOf(h4));
|
||||||
|
this.h4 = h4 == 0 ? Optional.empty() : Optional.of(h4);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -380,7 +380,10 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface {
|
||||||
mNetworkState.bindNetworkListener()
|
mNetworkState.bindNetworkListener()
|
||||||
}
|
}
|
||||||
"wireguard" -> {
|
"wireguard" -> {
|
||||||
startWireGuard()
|
startWireGuard("wireguard")
|
||||||
|
}
|
||||||
|
"awg" -> {
|
||||||
|
startWireGuard("awg")
|
||||||
}
|
}
|
||||||
"shadowsocks" -> {
|
"shadowsocks" -> {
|
||||||
startShadowsocks()
|
startShadowsocks()
|
||||||
|
@ -457,7 +460,8 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface {
|
||||||
fun turnOff() {
|
fun turnOff() {
|
||||||
Log.v(tag, "Aman: turnOff....................")
|
Log.v(tag, "Aman: turnOff....................")
|
||||||
when (mProtocol) {
|
when (mProtocol) {
|
||||||
"wireguard" -> {
|
"wireguard",
|
||||||
|
"awg" -> {
|
||||||
GoBackend.wgTurnOff(currentTunnelHandle)
|
GoBackend.wgTurnOff(currentTunnelHandle)
|
||||||
}
|
}
|
||||||
"cloak",
|
"cloak",
|
||||||
|
@ -564,9 +568,9 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface {
|
||||||
* Create a Wireguard [Config] from a [json] string -
|
* Create a Wireguard [Config] from a [json] string -
|
||||||
* The [json] will be created in AndroidVpnProtocol.cpp
|
* The [json] will be created in AndroidVpnProtocol.cpp
|
||||||
*/
|
*/
|
||||||
private fun buildWireguardConfig(obj: JSONObject): Config {
|
private fun buildWireguardConfig(obj: JSONObject, type: String): Config {
|
||||||
val confBuilder = Config.Builder()
|
val confBuilder = Config.Builder()
|
||||||
val wireguardConfigData = obj.getJSONObject("wireguard_config_data")
|
val wireguardConfigData = obj.getJSONObject(type)
|
||||||
val config = parseConfigData(wireguardConfigData.getString("config"))
|
val config = parseConfigData(wireguardConfigData.getString("config"))
|
||||||
val peerBuilder = Peer.Builder()
|
val peerBuilder = Peer.Builder()
|
||||||
val peerConfig = config["Peer"]!!
|
val peerConfig = config["Peer"]!!
|
||||||
|
@ -599,6 +603,19 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface {
|
||||||
ifaceConfig["DNS"]!!.split(",").forEach {
|
ifaceConfig["DNS"]!!.split(",").forEach {
|
||||||
ifaceBuilder.addDnsServer(InetNetwork.parse(it.trim()).address)
|
ifaceBuilder.addDnsServer(InetNetwork.parse(it.trim()).address)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ifaceBuilder.parsePrivateKey(ifaceConfig["PrivateKey"])
|
||||||
|
if (type == "awg_config_data") {
|
||||||
|
ifaceBuilder.parseJc(ifaceConfig["Jc"])
|
||||||
|
ifaceBuilder.parseJmin(ifaceConfig["Jmin"])
|
||||||
|
ifaceBuilder.parseJmax(ifaceConfig["Jmax"])
|
||||||
|
ifaceBuilder.parseS1(ifaceConfig["S1"])
|
||||||
|
ifaceBuilder.parseS2(ifaceConfig["S2"])
|
||||||
|
ifaceBuilder.parseH1(ifaceConfig["H1"])
|
||||||
|
ifaceBuilder.parseH2(ifaceConfig["H2"])
|
||||||
|
ifaceBuilder.parseH3(ifaceConfig["H3"])
|
||||||
|
ifaceBuilder.parseH4(ifaceConfig["H4"])
|
||||||
|
}
|
||||||
/*val jExcludedApplication = obj.getJSONArray("excludedApps")
|
/*val jExcludedApplication = obj.getJSONArray("excludedApps")
|
||||||
(0 until jExcludedApplication.length()).toList().forEach {
|
(0 until jExcludedApplication.length()).toList().forEach {
|
||||||
val appName = jExcludedApplication.get(it).toString()
|
val appName = jExcludedApplication.get(it).toString()
|
||||||
|
@ -716,8 +733,8 @@ class VPNService : BaseVpnService(), LocalDnsService.Interface {
|
||||||
}).start()
|
}).start()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun startWireGuard() {
|
private fun startWireGuard(type: String) {
|
||||||
val wireguard_conf = buildWireguardConfig(mConfig!!)
|
val wireguard_conf = buildWireguardConfig(mConfig!!, type + "_config_data")
|
||||||
Log.i(tag, "startWireGuard: wireguard_conf : $wireguard_conf")
|
Log.i(tag, "startWireGuard: wireguard_conf : $wireguard_conf")
|
||||||
if (currentTunnelHandle != -1) {
|
if (currentTunnelHandle != -1) {
|
||||||
Log.e(tag, "Tunnel already up")
|
Log.e(tag, "Tunnel already up")
|
||||||
|
|
|
@ -204,6 +204,7 @@ bool ContainerProps::isSupportedByCurrentPlatform(DockerContainer c)
|
||||||
case DockerContainer::WireGuard: return true;
|
case DockerContainer::WireGuard: return true;
|
||||||
case DockerContainer::OpenVpn: return true;
|
case DockerContainer::OpenVpn: return true;
|
||||||
case DockerContainer::ShadowSocks: return true;
|
case DockerContainer::ShadowSocks: return true;
|
||||||
|
case DockerContainer::Awg: return true;
|
||||||
case DockerContainer::Cloak: return true;
|
case DockerContainer::Cloak: return true;
|
||||||
default: return false;
|
default: return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue