diff options
author | Arne Schwabe <arne@rfc2549.org> | 2013-04-07 14:05:05 +0200 |
---|---|---|
committer | Arne Schwabe <arne@rfc2549.org> | 2013-04-07 14:05:05 +0200 |
commit | 195b0a10d96ad358d956381d8a0e423a8dd913c7 (patch) | |
tree | 5f62da8410bc08b50e8784ff94231cccbfcb8fb1 | |
parent | 3b68ac89cd679f134681204e0d1bb40d6dbf7879 (diff) |
Allow clearing of external apps
-rw-r--r-- | res/menu/logmenu.xml | 2 | ||||
-rwxr-xr-x | res/values/strings.xml | 4 | ||||
-rw-r--r-- | res/xml/general_settings.xml | 12 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/api/ConfirmDialog.java | 1 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/api/ExternalAppDatabase.java | 6 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/api/ExternalOpenVPNService.java | 4 | ||||
-rw-r--r-- | src/de/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"/>
<item
android:id="@+id/info"
diff --git a/res/values/strings.xml b/res/values/strings.xml index 3e969f18..abdf1779 100755 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -57,6 +57,7 @@ <string name="custom_config_summary">Specify custom options. Use with care!</string> <string name="route_rejected">Route rejected by Android</string> <string name="cancel_connection">Disconnect</string> + <string name="disconnect">Disconnect</string> <string name="clear_log">clear log</string> <string name="title_cancel">Cancel Confirmation</string> <string name="cancel_connection_query">Disconnect the connected VPN/cancel the connection attempt?</string> @@ -281,5 +282,8 @@ <string name="prompt">%1$s attempts to control %2$s</string> <string name="remote_warning">By proceeding, you are giving the application permission to completely control OpenVPN for Android and to intercept all network traffic. <b> Do NOT accept unless you trust the application. </b> Otherwise, you run the risk of having your data compromised by malicious software."</string> <string name="remote_trust">I trust this application.</string> + <string name="no_external_app_allowed">No app allowed to use external API</string> + <string name="allowed_apps">Allowed apps: %s</string> + <string name="clearappsdialog">Clear list of allowed external apps?\nCurrent list of allowed apps:\n\n%s</string> </resources>
\ 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" /> - <!-- <CheckBoxPreference + <!-- + <CheckBoxPreference android:defaultValue="false" android:key="statusafterconnect" android:summary="@string/keppstatus_summary" - android:title="@string/keepstatus" /> --> + android:title="@string/keepstatus" /> + --> <CheckBoxPreference android:defaultValue="true" android:key="usesystemproxy" @@ -27,6 +29,11 @@ android:summary="@string/onbootrestartsummary" android:title="@string/onbootrestart" /> + <Preference + android:key="clearapi" + android:title="Clear allowed external apps" + android:persistent="false" /> + <PreferenceCategory android:title="Device specifics Hacks" > <CheckBoxPreference android:defaultValue="false" @@ -40,5 +47,4 @@ android:title="@string/setting_loadtun" /> </PreferenceCategory> - </PreferenceScreen>
\ 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<String> getExtAppList() { + public Set<String> getExtAppList() { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); Set<String> allowedapps = prefs.getStringSet(PREFERENCES_KEY, new HashSet<String>()); return allowedapps; } - + void addApp(String packagename) { Set<String> allowedapps = getExtAppList(); @@ -45,7 +45,7 @@ public class ExternalAppDatabase { prefedit.apply(); } - void clearAllApiApps() { + public void clearAllApiApps() { saveExtAppList(new HashSet<String>()); } 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 |