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
This commit is contained in:
Hunter Knepshield
2019-07-03 14:22:32 -07:00
parent 68178f853b
commit b26cbbd53d
2 changed files with 23 additions and 21 deletions

View File

@@ -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];
}
/**

View File

@@ -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) {
for (int activeSubId : activeSubIds) {
if (getCarrierPrivilegeStatus(telephonySupplier, activeSubId, uid)
== TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
return true;
}
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();