diff options
Diffstat (limited to 'app/src/main/java/org/pacien/tincapp/service/VpnServiceBuilderExtensions.kt')
-rw-r--r-- | app/src/main/java/org/pacien/tincapp/service/VpnServiceBuilderExtensions.kt | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/app/src/main/java/org/pacien/tincapp/service/VpnServiceBuilderExtensions.kt b/app/src/main/java/org/pacien/tincapp/service/VpnServiceBuilderExtensions.kt new file mode 100644 index 0000000..d94d64d --- /dev/null +++ b/app/src/main/java/org/pacien/tincapp/service/VpnServiceBuilderExtensions.kt | |||
@@ -0,0 +1,45 @@ | |||
1 | package org.pacien.tincapp.service | ||
2 | |||
3 | import android.net.VpnService | ||
4 | |||
5 | /** | ||
6 | * @author pacien | ||
7 | */ | ||
8 | |||
9 | data class CidrAddress(val address: String, val prefix: Int) { | ||
10 | constructor(slashSeparated: String) : | ||
11 | this(slashSeparated.substringBefore("/"), Integer.parseInt(slashSeparated.substringAfter("/"))) | ||
12 | } | ||
13 | |||
14 | |||
15 | fun <A, R> applyIgnoringException(f: (A) -> R, x: A, alt: R? = null) = try { | ||
16 | f(x) | ||
17 | } catch (_: Exception) { | ||
18 | alt | ||
19 | } | ||
20 | |||
21 | fun VpnService.Builder.addAddress(cidr: CidrAddress) = addAddress(cidr.address, cidr.prefix) | ||
22 | fun VpnService.Builder.addRoute(cidr: CidrAddress) = addRoute(cidr.address, cidr.prefix) | ||
23 | fun VpnService.Builder.allowBypass(allow: Boolean) = if (allow) allowBypass() else this | ||
24 | fun VpnService.Builder.overrideMtu(mtu: Int?) = if (mtu != null) setMtu(mtu) else this | ||
25 | |||
26 | fun VpnService.Builder.addAddresses(cidrList: List<CidrAddress>) = | ||
27 | cidrList.fold(this, { net, cidr -> net.addAddress(cidr) }) | ||
28 | |||
29 | fun VpnService.Builder.addRoutes(cidrList: List<CidrAddress>) = | ||
30 | cidrList.fold(this, { net, cidr -> net.addRoute(cidr) }) | ||
31 | |||
32 | fun VpnService.Builder.addDnsServers(dnsList: List<String>) = | ||
33 | dnsList.fold(this, { net, dns -> net.addDnsServer(dns) }) | ||
34 | |||
35 | fun VpnService.Builder.addSearchDomains(domainList: List<String>) = | ||
36 | domainList.fold(this, { net, domain -> net.addSearchDomain(domain) }) | ||
37 | |||
38 | fun VpnService.Builder.allowFamilies(familyList: List<Int>) = | ||
39 | familyList.fold(this, { net, family -> net.allowFamily(family) }) | ||
40 | |||
41 | fun VpnService.Builder.addAllowedApplications(apps: List<String>) = | ||
42 | apps.fold(this, { net, app -> applyIgnoringException(net::addAllowedApplication, app, net)!! }) | ||
43 | |||
44 | fun VpnService.Builder.addDisallowedApplications(apps: List<String>) = | ||
45 | apps.fold(this, { net, app -> applyIgnoringException(net::addDisallowedApplication, app, net)!! }) | ||