Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 199cf64e authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Check DPC package validity during package updates" into udc-dev

parents c3e0c5b4 2b60a030
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -378,6 +378,8 @@ public final class DeviceAdminInfo implements Parcelable {
        } catch (NameNotFoundException e) {
            throw new XmlPullParserException(
                    "Unable to create context for: " + mActivityInfo.packageName);
        } catch (OutOfMemoryError e) {
            throw new XmlPullParserException("Out of memory when parsing", null, e);
        } finally {
            if (parser != null) parser.close();
        }
+32 −9
Original line number Diff line number Diff line
@@ -1385,6 +1385,33 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
        }
    }
    /**
     * Check if the package hosting the given ActiveAdmin is still installed and well-formed.
     */
    @GuardedBy("getLockObject()")
    private boolean isActiveAdminPackageValid(ActiveAdmin admin) throws RemoteException {
        final String adminPackage = admin.info.getPackageName();
        int userHandle = admin.getUserHandle().getIdentifier();
        if (mIPackageManager.getPackageInfo(adminPackage, 0, userHandle) == null) {
            Slogf.e(LOG_TAG, adminPackage + " no longer installed");
            return false;
        }
        ActivityInfo ai = mIPackageManager.getReceiverInfo(admin.info.getComponent(),
                GET_META_DATA | MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE,
                userHandle);
        if (ai == null) {
            Slogf.e(LOG_TAG, adminPackage + " no longer has the receiver");
            return false;
        }
        try {
            new DeviceAdminInfo(mContext, ai);
        } catch (Exception e) {
            Slogf.e(LOG_TAG, adminPackage + " contains malformed metadata", e);
            return false;
        }
        return true;
    }
    private void handlePackagesChanged(@Nullable String packageName, int userHandle) {
        boolean removedAdmin = false;
        String removedAdminPackage = null;
@@ -1398,17 +1425,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
                ActiveAdmin aa = policy.mAdminList.get(i);
                try {
                    // If we're checking all packages or if the specific one we're checking matches,
                    // then check if the package and receiver still exist.
                    // then check if the package is still valid.
                    final String adminPackage = aa.info.getPackageName();
                    if (packageName == null || packageName.equals(adminPackage)) {
                        if (mIPackageManager.getPackageInfo(adminPackage, 0, userHandle) == null
                                || mIPackageManager.getReceiverInfo(aa.info.getComponent(),
                                PackageManager.MATCH_DIRECT_BOOT_AWARE
                                        | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
                                userHandle) == null) {
                            Slogf.e(LOG_TAG, String.format(
                                    "Admin package %s not found for user %d, removing active admin",
                                    packageName, userHandle));
                        if (!isActiveAdminPackageValid(aa)) {
                            Slogf.e(LOG_TAG, "Admin package %s not found or invalid for user %d,"
                                            + " removing active admin",
                                    packageName, userHandle);
                            removedAdmin = true;
                            removedAdminPackage = adminPackage;
                            policy.mAdminList.remove(i);