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

Commit 4cab12d9 authored by Shirish Kalele's avatar Shirish Kalele
Browse files

Fix check for caller being the active network scorer

Compare caller and scorer uids to decide if caller is the
active scorer instead of calling AppOps.checkPackage().

Bug: 23000690
Change-Id: I64285f965716f3aceb24f193d86ab9d6be7202c5
parent 4988378c
Loading
Loading
Loading
Loading
+9 −7
Original line number Original line Diff line number Diff line
@@ -23,6 +23,7 @@ import android.app.AppOpsManager;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ResolveInfo;
import android.os.UserHandle;
import android.os.UserHandle;
@@ -54,6 +55,9 @@ public final class NetworkScorerAppManager {
        /** Package name of this scorer app. */
        /** Package name of this scorer app. */
        public final String mPackageName;
        public final String mPackageName;


        /** UID of the scorer app. */
        public final int mPackageUid;

        /** Name of this scorer app for display. */
        /** Name of this scorer app for display. */
        public final CharSequence mScorerName;
        public final CharSequence mScorerName;


@@ -64,10 +68,11 @@ public final class NetworkScorerAppManager {
         */
         */
        public final String mConfigurationActivityClassName;
        public final String mConfigurationActivityClassName;


        public NetworkScorerAppData(String packageName, CharSequence scorerName,
        public NetworkScorerAppData(String packageName, int packageUid, CharSequence scorerName,
                @Nullable String configurationActivityClassName) {
                @Nullable String configurationActivityClassName) {
            mScorerName = scorerName;
            mScorerName = scorerName;
            mPackageName = packageName;
            mPackageName = packageName;
            mPackageUid = packageUid;
            mConfigurationActivityClassName = configurationActivityClassName;
            mConfigurationActivityClassName = configurationActivityClassName;
        }
        }
    }
    }
@@ -125,7 +130,8 @@ public final class NetworkScorerAppManager {
            // NOTE: loadLabel will attempt to load the receiver's label and fall back to the app
            // NOTE: loadLabel will attempt to load the receiver's label and fall back to the app
            // label if none is present.
            // label if none is present.
            scorers.add(new NetworkScorerAppData(receiverInfo.packageName,
            scorers.add(new NetworkScorerAppData(receiverInfo.packageName,
                    receiverInfo.loadLabel(pm), configurationActivityClassName));
                    receiverInfo.applicationInfo.uid, receiverInfo.loadLabel(pm),
                    configurationActivityClassName));
        }
        }


        return scorers;
        return scorers;
@@ -187,13 +193,9 @@ public final class NetworkScorerAppManager {
        if (defaultApp == null) {
        if (defaultApp == null) {
            return false;
            return false;
        }
        }
        AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
        if (callingUid != defaultApp.mPackageUid) {
        try {
            appOpsMgr.checkPackage(callingUid, defaultApp.mPackageName);
        } catch (SecurityException e) {
            return false;
            return false;
        }
        }

        // To be extra safe, ensure the caller holds the SCORE_NETWORKS permission. It always
        // To be extra safe, ensure the caller holds the SCORE_NETWORKS permission. It always
        // should, since it couldn't become the active scorer otherwise, but this can't hurt.
        // should, since it couldn't become the active scorer otherwise, but this can't hurt.
        return context.checkCallingPermission(Manifest.permission.SCORE_NETWORKS) ==
        return context.checkCallingPermission(Manifest.permission.SCORE_NETWORKS) ==
+11 −5
Original line number Original line Diff line number Diff line
@@ -57,16 +57,19 @@ public class NetworkScorerAppManagerTest extends InstrumentationTestCase {


    public void testGetAllValidScorers() throws Exception {
    public void testGetAllValidScorers() throws Exception {
        // Package 1 - Valid scorer.
        // Package 1 - Valid scorer.
        Pair<ResolveInfo, ResolveInfo> package1 = buildResolveInfo("package1", true, true, false);
        Pair<ResolveInfo, ResolveInfo> package1 = buildResolveInfo("package1", 1, true, true,
                false);


        // Package 2 - Receiver does not have BROADCAST_NETWORK_PRIVILEGED permission.
        // Package 2 - Receiver does not have BROADCAST_NETWORK_PRIVILEGED permission.
        Pair<ResolveInfo, ResolveInfo> package2 = buildResolveInfo("package2", false, true, false);
        Pair<ResolveInfo, ResolveInfo> package2 = buildResolveInfo("package2", 2, false, true,
                false);


        // Package 3 - App does not have SCORE_NETWORKS permission.
        // Package 3 - App does not have SCORE_NETWORKS permission.
        Pair<ResolveInfo, ResolveInfo> package3 = buildResolveInfo("package3", true, false, false);
        Pair<ResolveInfo, ResolveInfo> package3 = buildResolveInfo("package3", 3, true, false,
                false);


        // Package 4 - Valid scorer w/ optional config activity.
        // Package 4 - Valid scorer w/ optional config activity.
        Pair<ResolveInfo, ResolveInfo> package4 = buildResolveInfo("package4", true, true, true);
        Pair<ResolveInfo, ResolveInfo> package4 = buildResolveInfo("package4", 4, true, true, true);


        List<Pair<ResolveInfo, ResolveInfo>> scorers = new ArrayList<>();
        List<Pair<ResolveInfo, ResolveInfo>> scorers = new ArrayList<>();
        scorers.add(package1);
        scorers.add(package1);
@@ -81,11 +84,13 @@ public class NetworkScorerAppManagerTest extends InstrumentationTestCase {
        assertTrue(result.hasNext());
        assertTrue(result.hasNext());
        NetworkScorerAppData next = result.next();
        NetworkScorerAppData next = result.next();
        assertEquals("package1", next.mPackageName);
        assertEquals("package1", next.mPackageName);
        assertEquals(1, next.mPackageUid);
        assertNull(next.mConfigurationActivityClassName);
        assertNull(next.mConfigurationActivityClassName);


        assertTrue(result.hasNext());
        assertTrue(result.hasNext());
        next = result.next();
        next = result.next();
        assertEquals("package4", next.mPackageName);
        assertEquals("package4", next.mPackageName);
        assertEquals(4, next.mPackageUid);
        assertEquals(".ConfigActivity", next.mConfigurationActivityClassName);
        assertEquals(".ConfigActivity", next.mConfigurationActivityClassName);


        assertFalse(result.hasNext());
        assertFalse(result.hasNext());
@@ -122,7 +127,7 @@ public class NetworkScorerAppManagerTest extends InstrumentationTestCase {
                .thenReturn(receivers);
                .thenReturn(receivers);
    }
    }


    private Pair<ResolveInfo, ResolveInfo> buildResolveInfo(String packageName,
    private Pair<ResolveInfo, ResolveInfo> buildResolveInfo(String packageName, int packageUid,
            boolean hasReceiverPermission, boolean hasScorePermission, boolean hasConfigActivity)
            boolean hasReceiverPermission, boolean hasScorePermission, boolean hasConfigActivity)
            throws Exception {
            throws Exception {
        Mockito.when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
        Mockito.when(mMockPm.checkPermission(permission.SCORE_NETWORKS, packageName))
@@ -133,6 +138,7 @@ public class NetworkScorerAppManagerTest extends InstrumentationTestCase {
        resolveInfo.activityInfo = new ActivityInfo();
        resolveInfo.activityInfo = new ActivityInfo();
        resolveInfo.activityInfo.packageName = packageName;
        resolveInfo.activityInfo.packageName = packageName;
        resolveInfo.activityInfo.applicationInfo = new ApplicationInfo();
        resolveInfo.activityInfo.applicationInfo = new ApplicationInfo();
        resolveInfo.activityInfo.applicationInfo.uid = packageUid;
        if (hasReceiverPermission) {
        if (hasReceiverPermission) {
            resolveInfo.activityInfo.permission = permission.BROADCAST_NETWORK_PRIVILEGED;
            resolveInfo.activityInfo.permission = permission.BROADCAST_NETWORK_PRIVILEGED;
        }
        }