From 6bc6aea2d0a73d866092d7cfb318caf5ff351437 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Mon, 27 Nov 2017 04:28:48 +0100 Subject: NotSupported: check if the module exists Signed-off-by: Jason A. Donenfeld --- .../wireguard/android/NotSupportedActivity.java | 26 +++++++++++ .../com/wireguard/android/backends/VpnService.java | 51 +++++++++++++++++----- 2 files changed, 66 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/com/wireguard/android/NotSupportedActivity.java (limited to 'app/src/main/java/com/wireguard/android') diff --git a/app/src/main/java/com/wireguard/android/NotSupportedActivity.java b/app/src/main/java/com/wireguard/android/NotSupportedActivity.java new file mode 100644 index 00000000..65612855 --- /dev/null +++ b/app/src/main/java/com/wireguard/android/NotSupportedActivity.java @@ -0,0 +1,26 @@ +package com.wireguard.android; + +import android.app.Activity; +import android.databinding.DataBindingUtil; +import android.os.Build; +import android.os.Bundle; +import android.text.Html; +import android.text.Spanned; + +import com.wireguard.android.databinding.NotSupportedActivityBinding; + +public class NotSupportedActivity extends Activity { + @Override + protected void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + final NotSupportedActivityBinding binding = + DataBindingUtil.setContentView(this, R.layout.not_supported_activity); + final String messageHtml = getString(R.string.not_supported_message); + final Spanned messageText; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) + messageText = Html.fromHtml(messageHtml, Html.FROM_HTML_MODE_COMPACT); + else + messageText = Html.fromHtml(messageHtml); + binding.notSupportedMessage.setText(messageText); + } +} diff --git a/app/src/main/java/com/wireguard/android/backends/VpnService.java b/app/src/main/java/com/wireguard/android/backends/VpnService.java index 8f4ba5a6..b97f532c 100644 --- a/app/src/main/java/com/wireguard/android/backends/VpnService.java +++ b/app/src/main/java/com/wireguard/android/backends/VpnService.java @@ -17,7 +17,9 @@ import android.service.quicksettings.TileService; import android.util.Log; import android.widget.Toast; +import com.wireguard.android.NotSupportedActivity; import com.wireguard.android.QuickTileService; +import com.wireguard.android.R; import com.wireguard.android.bindings.ObservableSortedMap; import com.wireguard.android.bindings.ObservableTreeMap; import com.wireguard.config.Config; @@ -245,8 +247,11 @@ public class VpnService extends Service @Override protected void onPostExecute(final Boolean result) { config.setIsEnabled(!result); - if (!result) + if (!result) { + Toast.makeText(getApplicationContext(), getString(R.string.error_down), + Toast.LENGTH_SHORT).show(); return; + } enabledConfigs.remove(config.getName()); preferences.edit().putStringSet(KEY_ENABLED_CONFIGS, enabledConfigs).apply(); if (config.getName().equals(primaryName)) @@ -254,7 +259,7 @@ public class VpnService extends Service } } - private class ConfigEnabler extends AsyncTask { + private class ConfigEnabler extends AsyncTask { private final Config config; private ConfigEnabler(final Config config) { @@ -262,17 +267,43 @@ public class VpnService extends Service } @Override - protected Boolean doInBackground(final Void... voids) { + protected Integer doInBackground(final Void... voids) { + if (!new File("/sys/module/wireguard").exists()) + return -0xfff0001; + if (!existsInUsualSuspects("wg") || !existsInUsualSuspects("wg-quick")) + return -0xfff0002; Log.i(TAG, "Running wg-quick up for " + config.getName()); final File configFile = new File(getFilesDir(), config.getName() + ".conf"); - return rootShell.run(null, "wg-quick up '" + configFile.getPath() + "'") == 0; + return rootShell.run(null, "wg-quick up '" + configFile.getPath() + "'"); + } + + private boolean existsInUsualSuspects(final String file) { + return new File("/system/bin/" + file).exists() || + new File("/system/xbin/" + file).exists() || + new File("/system/sbin/" + file).exists() || + new File("/bin/" + file).exists() || + new File("/xbin/" + file).exists() || + new File("/sbin/" + file).exists() || + new File("/usr/bin/" + file).exists() || + new File("/usr/xbin/" + file).exists() || + new File("/usr/sbin/" + file).exists(); } @Override - protected void onPostExecute(final Boolean result) { - config.setIsEnabled(result); - if (!result) + protected void onPostExecute(final Integer ret) { + config.setIsEnabled(ret == 0); + if (ret != 0) { + if (ret == -0xfff0001) { + startActivity(new Intent(getApplicationContext(), NotSupportedActivity.class)); + } else if (ret == -0xfff0002) { + Toast.makeText(getApplicationContext(), getString(R.string.error_missing), + Toast.LENGTH_LONG).show(); + } else { + Toast.makeText(getApplicationContext(), getString(R.string.error_up), + Toast.LENGTH_SHORT).show(); + } return; + } enabledConfigs.add(config.getName()); preferences.edit().putStringSet(KEY_ENABLED_CONFIGS, enabledConfigs).apply(); if (config.getName().equals(primaryName)) @@ -378,10 +409,8 @@ public class VpnService extends Service config.setName(configName); configs.add(config); } catch (IllegalArgumentException | IOException e) { - try { - file.delete(); - } catch (Exception e2) { - Log.w(TAG, "Could not remove " + fileName, e2); + if (!file.delete()) { + Log.e(TAG, "Could not delete configuration for config " + configName); } Log.w(TAG, "Failed to load config from " + fileName, e); publishProgress(fileName + ": " + e.getMessage()); -- cgit v1.2.3