diff options
Diffstat (limited to 'app/src/main/java/org/pacien/tincapp/service/VpnInterfaceConfigurator.kt')
-rw-r--r-- | app/src/main/java/org/pacien/tincapp/service/VpnInterfaceConfigurator.kt | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/app/src/main/java/org/pacien/tincapp/service/VpnInterfaceConfigurator.kt b/app/src/main/java/org/pacien/tincapp/service/VpnInterfaceConfigurator.kt new file mode 100644 index 0000000..8104940 --- /dev/null +++ b/app/src/main/java/org/pacien/tincapp/service/VpnInterfaceConfigurator.kt | |||
@@ -0,0 +1,52 @@ | |||
1 | package org.pacien.tincapp.service | ||
2 | |||
3 | import android.net.VpnService | ||
4 | import org.apache.commons.configuration2.Configuration | ||
5 | import org.apache.commons.configuration2.builder.fluent.Configurations | ||
6 | import org.apache.commons.configuration2.ex.ConfigurationException | ||
7 | import java.io.File | ||
8 | |||
9 | /** | ||
10 | * @author pacien | ||
11 | */ | ||
12 | object VpnInterfaceConfigurator { | ||
13 | |||
14 | val KEY_ADDRESSES = "Address" | ||
15 | val KEY_ROUTES = "Route" | ||
16 | val KEY_DNS_SERVERS = "DNSServer" | ||
17 | val KEY_SEARCH_DOMAINS = "SearchDomain" | ||
18 | val KEY_ALLOWED_APPLICATIONS = "AllowApplication" | ||
19 | val KEY_DISALLOWED_APPLICATIONS = "DisallowApplication" | ||
20 | val KEY_ALLOWED_FAMILIES = "AllowFamily" | ||
21 | val KEY_ALLOW_BYPASS = "AllowBypass" | ||
22 | val KEY_BLOCKING = "Blocking" | ||
23 | val KEY_MTU = "MTU" | ||
24 | |||
25 | private fun Configuration.getStringList(key: String): List<String> = | ||
26 | getList(String::class.java, key, emptyList()) | ||
27 | |||
28 | private fun Configuration.getCidrList(key: String): List<CidrAddress> = | ||
29 | getStringList(key).map { CidrAddress(it) } | ||
30 | |||
31 | private fun Configuration.getIntList(key: String): List<Int> = | ||
32 | getList(Int::class.java, key, emptyList()) | ||
33 | |||
34 | fun applyConfiguration(net: VpnService.Builder, cfg: Configuration): VpnService.Builder = net | ||
35 | .addAddresses(cfg.getCidrList(KEY_ADDRESSES)) | ||
36 | .addRoutes(cfg.getCidrList(KEY_ROUTES)) | ||
37 | .addDnsServers(cfg.getStringList(KEY_DNS_SERVERS)) | ||
38 | .addSearchDomains(cfg.getStringList(KEY_SEARCH_DOMAINS)) | ||
39 | .addAllowedApplications(cfg.getStringList(KEY_ALLOWED_APPLICATIONS)) | ||
40 | .addDisallowedApplications(cfg.getStringList(KEY_DISALLOWED_APPLICATIONS)) | ||
41 | .allowFamilies(cfg.getIntList(KEY_ALLOWED_FAMILIES)) | ||
42 | .allowBypass(cfg.getBoolean(KEY_ALLOW_BYPASS, false)) | ||
43 | .setBlocking(cfg.getBoolean(KEY_BLOCKING, false)) | ||
44 | .overrideMtu(cfg.getInteger(KEY_MTU, null)) | ||
45 | |||
46 | fun applyConfiguration(net: VpnService.Builder, cfg: File): VpnService.Builder = try { | ||
47 | applyConfiguration(net, Configurations().properties(cfg)) | ||
48 | } catch (e: ConfigurationException) { | ||
49 | throw IllegalArgumentException(e.message) | ||
50 | } | ||
51 | |||
52 | } | ||