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

Commit b26cbbd5 authored by Hunter Knepshield's avatar Hunter Knepshield
Browse files

Check Carrier Privilege on Hidden Subs

When calling CheckCarrierPrivilegeForAnySubId the
hidden subscriptions were not being taken into account
due to getAllActiveSubscriptionIds being a public method
that intentionally ignores hidden subscriptions.

NOTE: This is identical to ag/8193293, except that the
SubscriptionManager modifications don't make
getActiveSubscriptionIdList() static (it was causing test failures). A
further bug can be pursued to make everything static all at once.

Bug: 135684437
Test: manual
Change-Id: Iad6a3c2635e5eac2d33a16aa460b98394fd817f4
parent 68178f85
Loading
Loading
Loading
Loading
+15 −8
Original line number Diff line number Diff line
@@ -2116,29 +2116,36 @@ public class SubscriptionManager {
    }

    /**
     * TODO(b/137102918) Make this static, tests use this as an instance method currently.
     *
     * @return the list of subId's that are active,
     *         is never null but the length maybe 0.
     * @hide
     */
    @UnsupportedAppUsage
    public @NonNull int[] getActiveSubscriptionIdList() {
        int[] subId = null;
        return getActiveSubscriptionIdList(/* visibleOnly */ true);
    }

    /**
     * TODO(b/137102918) Make this static, tests use this as an instance method currently.
     *
     * @return a non-null list of subId's that are active.
     *
     * @hide
     */
    public @NonNull int[] getActiveSubscriptionIdList(boolean visibleOnly) {
        try {
            ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
            if (iSub != null) {
                subId = iSub.getActiveSubIdList(/*visibleOnly*/true);
                int[] subId = iSub.getActiveSubIdList(visibleOnly);
                if (subId != null) return subId;
            }
        } catch (RemoteException ex) {
            // ignore it
        }

        if (subId == null) {
            subId = new int[0];
        }

        return subId;

        return new int[0];
    }

    /**
+8 −13
Original line number Diff line number Diff line
@@ -600,26 +600,21 @@ public final class TelephonyPermissions {
        }
    }

    /**
     * Returns whether the provided uid has carrier privileges for any active subscription ID.
     */
    private static boolean checkCarrierPrivilegeForAnySubId(Context context,
            Supplier<ITelephony> telephonySupplier, int uid) {
    /** Returns whether the provided uid has carrier privileges for any active subscription ID. */
    private static boolean checkCarrierPrivilegeForAnySubId(
            Context context, Supplier<ITelephony> telephonySupplier, int uid) {
        SubscriptionManager sm = (SubscriptionManager) context.getSystemService(
                Context.TELEPHONY_SUBSCRIPTION_SERVICE);
        int[] activeSubIds = sm.getActiveSubscriptionIdList();
        if (activeSubIds != null) {
        int[] activeSubIds = sm.getActiveSubscriptionIdList(/* visibleOnly */ false);
        for (int activeSubId : activeSubIds) {
            if (getCarrierPrivilegeStatus(telephonySupplier, activeSubId, uid)
                    == TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
                return true;
            }
        }
        }
        return false;
    }


    private static int getCarrierPrivilegeStatus(
            Supplier<ITelephony> telephonySupplier, int subId, int uid) {
        ITelephony telephony = telephonySupplier.get();