am 6d80d477: am 0bccd7e7: am 5f28c77b: am d6086125: Fix issue #9074296: Device Admins can activate in a way...
* commit '6d80d477391c6ad14a6bcdb044c3351de4e20481':
Fix issue #9074296: Device Admins can activate in a way...
diff --git a/src/com/android/settings/DeviceAdminAdd.java b/src/com/android/settings/DeviceAdminAdd.java
index b2145b0..c0d615c 100644
--- a/src/com/android/settings/DeviceAdminAdd.java
+++ b/src/com/android/settings/DeviceAdminAdd.java
@@ -50,6 +50,8 @@
import java.io.IOException;
import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
public class DeviceAdminAdd extends Activity {
static final String TAG = "DeviceAdminAdd";
@@ -104,7 +106,7 @@
finish();
return;
}
-
+
ActivityInfo ai;
try {
ai = getPackageManager().getReceiverInfo(cn, PackageManager.GET_META_DATA);
@@ -113,7 +115,37 @@
finish();
return;
}
-
+
+ // Make sure the given component name is actually a valid device admin.
+ List<ResolveInfo> avail = getPackageManager().queryBroadcastReceivers(
+ new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
+ 0);
+ int count = avail == null ? 0 : avail.size();
+ boolean found = false;
+ for (int i=0; i<count; i++) {
+ ResolveInfo ri = avail.get(i);
+ if (ai.packageName.equals(ri.activityInfo.packageName)
+ && ai.name.equals(ri.activityInfo.name)) {
+ try {
+ // We didn't retrieve the meta data for all possible matches, so
+ // need to use the activity info of this specific one that was retrieved.
+ ri.activityInfo = ai;
+ DeviceAdminInfo dpi = new DeviceAdminInfo(this, ri);
+ found = true;
+ } catch (XmlPullParserException e) {
+ Log.w(TAG, "Bad " + ri.activityInfo, e);
+ } catch (IOException e) {
+ Log.w(TAG, "Bad " + ri.activityInfo, e);
+ }
+ break;
+ }
+ }
+ if (!found) {
+ Log.w(TAG, "Request to add invalid device admin: " + cn);
+ finish();
+ return;
+ }
+
ResolveInfo ri = new ResolveInfo();
ri.activityInfo = ai;
try {