diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-04-23 16:37:42 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-04-23 17:04:17 +0200 |
commit | 88cf839c90e59823c4fee1e70e5525b943287a10 (patch) | |
tree | 2cb5400b7cd61944d7c7a3f843dd1c7e1502dc8c | |
parent | a1c6f4b3b74aec0224045d9cd5f3345c4773919d (diff) |
Update application state based on wg-quick
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r-- | app/src/main/AndroidManifest.xml | 7 | ||||
-rw-r--r-- | app/src/main/java/com/wireguard/android/backend/WgQuickBackend.java | 11 | ||||
-rw-r--r-- | app/src/main/java/com/wireguard/android/model/TunnelManager.java | 9 | ||||
-rw-r--r-- | app/src/main/java/com/wireguard/android/util/RootShell.java | 2 | ||||
-rw-r--r-- | app/tools/wg-quick.c | 10 | ||||
m--------- | app/tools/wireguard-go | 0 |
6 files changed, 37 insertions, 2 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d42eabdc..096ec08b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -43,13 +43,18 @@ android:parentActivityName=".activity.MainActivity" /> <receiver android:name=".BootShutdownReceiver"> - <intent-filter> <action android:name="android.intent.action.ACTION_SHUTDOWN" /> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> + <receiver android:name=".backend.WgQuickBackend$WgQuickChangeReceiver"> + <intent-filter> + <action android:name="com.wireguard.android.WGQUICK_CHANGE" /> + </intent-filter> + </receiver> + <service android:name=".backend.GoBackend$VpnService" android:permission="android.permission.BIND_VPN_SERVICE" > diff --git a/app/src/main/java/com/wireguard/android/backend/WgQuickBackend.java b/app/src/main/java/com/wireguard/android/backend/WgQuickBackend.java index 760aac85..a0371842 100644 --- a/app/src/main/java/com/wireguard/android/backend/WgQuickBackend.java +++ b/app/src/main/java/com/wireguard/android/backend/WgQuickBackend.java @@ -1,8 +1,11 @@ package com.wireguard.android.backend; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; import android.util.Log; +import com.wireguard.android.Application; import com.wireguard.android.model.Tunnel; import com.wireguard.android.model.Tunnel.State; import com.wireguard.android.model.Tunnel.Statistics; @@ -111,4 +114,12 @@ public final class WgQuickBackend implements Backend { if (result != 0) throw new Exception("Unable to configure tunnel (wg-quick returned " + result + ')'); } + + public final static class WgQuickChangeReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + Log.d(TAG, "Refreshing tunnel states"); + Application.getComponent().getTunnelManager().refreshTunnelStates(); + } + } } diff --git a/app/src/main/java/com/wireguard/android/model/TunnelManager.java b/app/src/main/java/com/wireguard/android/model/TunnelManager.java index 381e7f77..61468920 100644 --- a/app/src/main/java/com/wireguard/android/model/TunnelManager.java +++ b/app/src/main/java/com/wireguard/android/model/TunnelManager.java @@ -128,6 +128,15 @@ public final class TunnelManager extends BaseObservable { return tunnels; } + public void refreshTunnelStates() { + asyncWorker.supplyAsync(backend::enumerate) + .thenAccept(running -> { + for (final Tunnel tunnel : tunnels) + tunnel.onStateChanged(running.contains(tunnel.getName()) ? State.UP : State.DOWN); + }) + .whenComplete(ExceptionLoggers.E); + } + public void onCreate() { asyncWorker.supplyAsync(configStore::enumerate) .thenAcceptBoth(asyncWorker.supplyAsync(backend::enumerate), this::onTunnelsLoaded) diff --git a/app/src/main/java/com/wireguard/android/util/RootShell.java b/app/src/main/java/com/wireguard/android/util/RootShell.java index 9e487a31..d24f6051 100644 --- a/app/src/main/java/com/wireguard/android/util/RootShell.java +++ b/app/src/main/java/com/wireguard/android/util/RootShell.java @@ -44,7 +44,7 @@ public class RootShell { final File cacheDir = context.getCacheDir(); localBinaryDir = new File(cacheDir, "bin"); localTemporaryDir = new File(cacheDir, "tmp"); - preamble = String.format("export PATH=\"%s:$PATH\" TMPDIR='%s'; id -u\n", + preamble = String.format("export CALLING_PACKAGE=com.wireguard.android; export PATH=\"%s:$PATH\" TMPDIR='%s'; id -u\n", localBinaryDir, localTemporaryDir); } diff --git a/app/tools/wg-quick.c b/app/tools/wg-quick.c index 204c3c0f..0610d12f 100644 --- a/app/tools/wg-quick.c +++ b/app/tools/wg-quick.c @@ -446,6 +446,14 @@ static void set_config(const char *iface, const char *config) exit(WIFEXITED(ret) ? WEXITSTATUS(ret) : EIO); } +static void broadcast_change(void) +{ + const char *pkg = getenv("CALLING_PACKAGE"); + + if (!pkg || strcmp(pkg, "com.wireguard.android")) + cmd("am broadcast -a com.wireguard.android.WGQUICK_CHANGE com.wireguard.android"); +} + static void print_search_paths(FILE *file, const char *prefix) { _cleanup_free_ char *paths = strdup(WG_CONFIG_SEARCH_PATHS); @@ -502,6 +510,7 @@ static void cmd_up(const char *iface, const char *config, unsigned int mtu, cons set_dnses(netid, dnses); set_routes(iface, netid); set_mtu(iface, mtu); + broadcast_change(); free(cleanup_iface); cleanup_iface = NULL; @@ -528,6 +537,7 @@ static void cmd_down(const char *iface) } del_if(iface); + broadcast_change(); exit(EXIT_SUCCESS); } diff --git a/app/tools/wireguard-go b/app/tools/wireguard-go -Subproject 14c6c9a7a4427bd5f07276b501e7f61ed3dbeb6 +Subproject 0715bdf353dd670bf7c3af332a8dabbe30187a1 |