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 | 49 |
1 files changed, 25 insertions, 24 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 index d94d64d..22edff9 100644 --- a/app/src/main/java/org/pacien/tincapp/service/VpnServiceBuilderExtensions.kt +++ b/app/src/main/java/org/pacien/tincapp/service/VpnServiceBuilderExtensions.kt | |||
@@ -1,45 +1,46 @@ | |||
1 | package org.pacien.tincapp.service | 1 | package org.pacien.tincapp.service |
2 | 2 | ||
3 | import android.net.VpnService | ||
4 | |||
5 | /** | 3 | /** |
6 | * @author pacien | 4 | * @author pacien |
7 | */ | 5 | */ |
8 | 6 | ||
9 | data class CidrAddress(val address: String, val prefix: Int) { | 7 | import android.net.VpnService |
10 | constructor(slashSeparated: String) : | 8 | import org.pacien.tincapp.utils.applyIgnoringException |
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 | 9 | ||
21 | fun VpnService.Builder.addAddress(cidr: CidrAddress) = addAddress(cidr.address, cidr.prefix) | 10 | fun VpnService.Builder.addAddress(cidr: CidrAddress): VpnService.Builder = addAddress(cidr.address, cidr.prefix) |
22 | fun VpnService.Builder.addRoute(cidr: CidrAddress) = addRoute(cidr.address, cidr.prefix) | 11 | fun VpnService.Builder.addRoute(cidr: CidrAddress): VpnService.Builder = addRoute(cidr.address, cidr.prefix) |
23 | fun VpnService.Builder.allowBypass(allow: Boolean) = if (allow) allowBypass() else this | 12 | fun VpnService.Builder.allowBypass(allow: Boolean): VpnService.Builder = if (allow) allowBypass() else this |
24 | fun VpnService.Builder.overrideMtu(mtu: Int?) = if (mtu != null) setMtu(mtu) else this | 13 | fun VpnService.Builder.overrideMtu(mtu: Int?): VpnService.Builder = if (mtu != null) setMtu(mtu) else this |
25 | 14 | ||
26 | fun VpnService.Builder.addAddresses(cidrList: List<CidrAddress>) = | 15 | fun VpnService.Builder.addAddresses(cidrList: List<CidrAddress>): VpnService.Builder = |
27 | cidrList.fold(this, { net, cidr -> net.addAddress(cidr) }) | 16 | cidrList.fold(this, { net, cidr -> net.addAddress(cidr) }) |
28 | 17 | ||
29 | fun VpnService.Builder.addRoutes(cidrList: List<CidrAddress>) = | 18 | fun VpnService.Builder.addRoutes(cidrList: List<CidrAddress>): VpnService.Builder = |
30 | cidrList.fold(this, { net, cidr -> net.addRoute(cidr) }) | 19 | cidrList.fold(this, { net, cidr -> net.addRoute(cidr) }) |
31 | 20 | ||
32 | fun VpnService.Builder.addDnsServers(dnsList: List<String>) = | 21 | fun VpnService.Builder.addDnsServers(dnsList: List<String>): VpnService.Builder = |
33 | dnsList.fold(this, { net, dns -> net.addDnsServer(dns) }) | 22 | dnsList.fold(this, { net, dns -> net.addDnsServer(dns) }) |
34 | 23 | ||
35 | fun VpnService.Builder.addSearchDomains(domainList: List<String>) = | 24 | fun VpnService.Builder.addSearchDomains(domainList: List<String>): VpnService.Builder = |
36 | domainList.fold(this, { net, domain -> net.addSearchDomain(domain) }) | 25 | domainList.fold(this, { net, domain -> net.addSearchDomain(domain) }) |
37 | 26 | ||
38 | fun VpnService.Builder.allowFamilies(familyList: List<Int>) = | 27 | fun VpnService.Builder.allowFamilies(familyList: List<Int>): VpnService.Builder = |
39 | familyList.fold(this, { net, family -> net.allowFamily(family) }) | 28 | familyList.fold(this, { net, family -> net.allowFamily(family) }) |
40 | 29 | ||
41 | fun VpnService.Builder.addAllowedApplications(apps: List<String>) = | 30 | fun VpnService.Builder.addAllowedApplications(apps: List<String>): VpnService.Builder = |
42 | apps.fold(this, { net, app -> applyIgnoringException(net::addAllowedApplication, app, net)!! }) | 31 | apps.fold(this, { net, app -> applyIgnoringException(net::addAllowedApplication, app, net)!! }) |
43 | 32 | ||
44 | fun VpnService.Builder.addDisallowedApplications(apps: List<String>) = | 33 | fun VpnService.Builder.addDisallowedApplications(apps: List<String>): VpnService.Builder = |
45 | apps.fold(this, { net, app -> applyIgnoringException(net::addDisallowedApplication, app, net)!! }) | 34 | apps.fold(this, { net, app -> applyIgnoringException(net::addDisallowedApplication, app, net)!! }) |
35 | |||
36 | fun VpnService.Builder.apply(cfg: VpnInterfaceConfiguration): VpnService.Builder = this | ||
37 | .addAddresses(cfg.addresses) | ||
38 | .addRoutes(cfg.routes) | ||
39 | .addDnsServers(cfg.dnsServers) | ||
40 | .addSearchDomains(cfg.searchDomains) | ||
41 | .addAllowedApplications(cfg.allowedApplications) | ||
42 | .addDisallowedApplications(cfg.disallowedApplications) | ||
43 | .allowFamilies(cfg.allowedFamilies) | ||
44 | .allowBypass(cfg.allowBypass) | ||
45 | .setBlocking(cfg.blocking) | ||
46 | .overrideMtu(cfg.mtu) | ||