From 195b0a10d96ad358d956381d8a0e423a8dd913c7 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Sun, 7 Apr 2013 14:05:05 +0200 Subject: Allow clearing of external apps --- res/menu/logmenu.xml | 2 +- res/values/strings.xml | 4 + res/xml/general_settings.xml | 12 ++- src/de/blinkt/openvpn/api/ConfirmDialog.java | 1 + src/de/blinkt/openvpn/api/ExternalAppDatabase.java | 6 +- .../blinkt/openvpn/api/ExternalOpenVPNService.java | 4 +- .../blinkt/openvpn/fragments/GeneralSettings.java | 110 +++++++++++++++++---- 7 files changed, 114 insertions(+), 25 deletions(-) diff --git a/res/menu/logmenu.xml b/res/menu/logmenu.xml index 9e79702c..12b54c67 100644 --- a/res/menu/logmenu.xml +++ b/res/menu/logmenu.xml @@ -11,7 +11,7 @@ android:id="@+id/cancel" android:icon="@android:drawable/ic_menu_close_clear_cancel" android:showAsAction="ifRoom|withText" - android:title="@string/cancel_connection" + android:title="@string/disconnect" android:titleCondensed="@string/cancel"/> Specify custom options. Use with care! Route rejected by Android Disconnect + Disconnect clear log Cancel Confirmation Disconnect the connected VPN/cancel the connection attempt? @@ -281,5 +282,8 @@ %1$s attempts to control %2$s By proceeding, you are giving the application permission to completely control OpenVPN for Android and to intercept all network traffic. Do NOT accept unless you trust the application. Otherwise, you run the risk of having your data compromised by malicious software." I trust this application. + No app allowed to use external API + Allowed apps: %s + Clear list of allowed external apps?\nCurrent list of allowed apps:\n\n%s \ No newline at end of file diff --git a/res/xml/general_settings.xml b/res/xml/general_settings.xml index 5b4726d3..6dbf58bf 100644 --- a/res/xml/general_settings.xml +++ b/res/xml/general_settings.xml @@ -11,11 +11,13 @@ android:key="showlogwindow" android:summary="@string/show_log_summary" android:title="@string/show_log_window" /> - + android:title="@string/keepstatus" /> + --> + + - \ No newline at end of file diff --git a/src/de/blinkt/openvpn/api/ConfirmDialog.java b/src/de/blinkt/openvpn/api/ConfirmDialog.java index f72f4921..dfd01884 100644 --- a/src/de/blinkt/openvpn/api/ConfirmDialog.java +++ b/src/de/blinkt/openvpn/api/ConfirmDialog.java @@ -73,6 +73,7 @@ CompoundButton.OnCheckedChangeListener, DialogInterface.OnClickListener { builder.setNegativeButton(android.R.string.cancel,this); mAlert = builder.create(); + mAlert.setCanceledOnTouchOutside(false); mAlert.setOnShowListener (new OnShowListener() { diff --git a/src/de/blinkt/openvpn/api/ExternalAppDatabase.java b/src/de/blinkt/openvpn/api/ExternalAppDatabase.java index ca348152..e640a13a 100644 --- a/src/de/blinkt/openvpn/api/ExternalAppDatabase.java +++ b/src/de/blinkt/openvpn/api/ExternalAppDatabase.java @@ -25,12 +25,12 @@ public class ExternalAppDatabase { } - Set getExtAppList() { + public Set getExtAppList() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); Set allowedapps = prefs.getStringSet(PREFERENCES_KEY, new HashSet()); return allowedapps; } - + void addApp(String packagename) { Set allowedapps = getExtAppList(); @@ -45,7 +45,7 @@ public class ExternalAppDatabase { prefedit.apply(); } - void clearAllApiApps() { + public void clearAllApiApps() { saveExtAppList(new HashSet()); } diff --git a/src/de/blinkt/openvpn/api/ExternalOpenVPNService.java b/src/de/blinkt/openvpn/api/ExternalOpenVPNService.java index fff6c34f..9e6ac9f3 100644 --- a/src/de/blinkt/openvpn/api/ExternalOpenVPNService.java +++ b/src/de/blinkt/openvpn/api/ExternalOpenVPNService.java @@ -244,7 +244,9 @@ public class ExternalOpenVPNService extends Service implements StateListener { @Override public void updateState (String state, String logmessage, int resid, ConnectionStatus level) { mMostRecentState = new UpdateMessage(state, logmessage, level); - mHandler.obtainMessage(SEND_TOALL, mMostRecentState); + Message msg = mHandler.obtainMessage(SEND_TOALL, mMostRecentState); + msg.sendToTarget(); + } private static final Handler mHandler = new Handler() { diff --git a/src/de/blinkt/openvpn/fragments/GeneralSettings.java b/src/de/blinkt/openvpn/fragments/GeneralSettings.java index 4ac0a8ac..bf391d29 100644 --- a/src/de/blinkt/openvpn/fragments/GeneralSettings.java +++ b/src/de/blinkt/openvpn/fragments/GeneralSettings.java @@ -1,31 +1,107 @@ package de.blinkt.openvpn.fragments; import java.io.File; +import android.app.AlertDialog; +import android.app.AlertDialog.Builder; +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.preference.Preference; +import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceFragment; import de.blinkt.openvpn.R; +import de.blinkt.openvpn.api.ExternalAppDatabase; -public class GeneralSettings extends PreferenceFragment { +public class GeneralSettings extends PreferenceFragment implements OnPreferenceClickListener, OnClickListener { - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - + private ExternalAppDatabase mExtapp; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + + // Load the preferences from an XML resource + addPreferencesFromResource(R.xml.general_settings); + + Preference loadtun = findPreference("loadTunModule"); + if(!isTunModuleAvailable()) + loadtun.setEnabled(false); - // Load the preferences from an XML resource - addPreferencesFromResource(R.xml.general_settings); - Preference loadtun = findPreference("loadTunModule"); - if(!isTunModuleAvailable()) - loadtun.setEnabled(false); + mExtapp = new ExternalAppDatabase(getActivity()); + Preference clearapi = findPreference("clearapi"); + clearapi.setOnPreferenceClickListener(this); + + setClearApiSummary(); + } + + private void setClearApiSummary() { + Preference clearapi = findPreference("clearapi"); + + if(mExtapp.getExtAppList().isEmpty()) { + clearapi.setEnabled(false); + clearapi.setSummary(R.string.no_external_app_allowed); + } else { + clearapi.setEnabled(true); + clearapi.setSummary(getString(R.string.allowed_apps,getExtAppList(", "))); } + } + + private String getExtAppList(String delim) { + ApplicationInfo app; + PackageManager pm = getActivity().getPackageManager(); + + String applist=null; + for (String packagename : mExtapp.getExtAppList()) { + try { + app = pm.getApplicationInfo(packagename, 0); + if (applist==null) + applist = ""; + else + applist += delim; + applist+=app.loadLabel(pm); - private boolean isTunModuleAvailable() { - // Check if the tun module exists on the file system - if(new File("/system/lib/modules/tun.ko").length() > 10) - return true; - return false; + } catch (NameNotFoundException e) { + // App not found. Remove it from the list + mExtapp.removeApp(packagename); + } } - - } \ No newline at end of file + return applist; + } + + private boolean isTunModuleAvailable() { + // Check if the tun module exists on the file system + if(new File("/system/lib/modules/tun.ko").length() > 10) + return true; + return false; + } + + @Override + public boolean onPreferenceClick(Preference preference) { + if(preference.getKey().equals("clearapi")){ + Builder builder = new AlertDialog.Builder(getActivity()); + builder.setPositiveButton(R.string.clear, this); + builder.setNegativeButton(android.R.string.cancel, null); + builder.setMessage(getString(R.string.clearappsdialog,getExtAppList("\n"))); + builder.show(); + } + + return true; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + if( which == Dialog.BUTTON_POSITIVE){ + mExtapp.clearAllApiApps(); + setClearApiSummary(); + } + } + + + +} \ No newline at end of file -- cgit v1.2.3