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

Commit ef439d39 authored by Benedict Wong's avatar Benedict Wong Committed by Gerrit Code Review
Browse files

Merge "Add Carrier Config Package as OwnerUid"

parents 5aa636d3 667c7878
Loading
Loading
Loading
Loading
+50 −0
Original line number Diff line number Diff line
@@ -25,6 +25,9 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.PendingIntent;
import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.UserInfo;
import android.net.ConnectivityManager;
import android.net.InetAddresses;
import android.net.KeepalivePacketData;
@@ -46,8 +49,10 @@ import android.os.AsyncResult;
import android.os.HandlerExecutor;
import android.os.Message;
import android.os.PersistableBundle;
import android.os.Process;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserManager;
import android.provider.Telephony;
import android.telephony.AccessNetworkConstants;
import android.telephony.AccessNetworkConstants.TransportType;
@@ -95,6 +100,7 @@ import com.android.internal.telephony.metrics.DataCallSessionStats;
import com.android.internal.telephony.metrics.TelephonyMetrics;
import com.android.internal.telephony.nano.TelephonyProto.RilDataCall;
import com.android.internal.telephony.uicc.IccUtils;
import com.android.internal.telephony.util.ArrayUtils;
import com.android.internal.util.AsyncChannel;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Protocol;
@@ -1954,6 +1960,15 @@ public class DataConnection extends StateMachine {
            builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED);
        }

        final int carrierServicePackageUid = getCarrierServicePackageUid();

        // TODO(b/205736323): Owner and Admin UIDs currently come from separate data sources. Unify
        //                    them, and remove ArrayUtils.contains() check.
        if (carrierServicePackageUid != Process.INVALID_UID
                && ArrayUtils.contains(mAdministratorUids, carrierServicePackageUid)) {
            builder.setOwnerUid(carrierServicePackageUid);
            // TODO: If carrier-restricted, add appropriate INTERNAL_NETWORK and AccessUids
        }
        builder.setAdministratorUids(mAdministratorUids);

        // Always start with NOT_VCN_MANAGED, then remove if VcnManager indicates this is part of a
@@ -1966,6 +1981,41 @@ public class DataConnection extends StateMachine {
        return builder.build();
    }

    // TODO(b/205736323): Once TelephonyManager#getCarrierServicePackageNameForLogicalSlot() is
    //                    plumbed to CarrierPrivilegesTracker's cache, query the cached UIDs.
    private int getFirstUidForPackage(String pkgName) {
        if (pkgName == null) {
            return Process.INVALID_UID;
        }

        List<UserInfo> users = mPhone.getContext().getSystemService(UserManager.class).getUsers();
        for (UserInfo user : users) {
            int userId = user.getUserHandle().getIdentifier();
            try {
                PackageManager pm = mPhone.getContext().getPackageManager();

                if (pm != null) {
                    return pm.getPackageUidAsUser(pkgName, userId);
                }
            } catch (NameNotFoundException exception) {
                // Didn't find package. Try other users
                Rlog.i(
                        "DataConnection",
                        "Unable to find uid for package " + pkgName + " and user " + userId);
            }
        }
        return Process.INVALID_UID;
    }

    private int getCarrierServicePackageUid() {
        String pkgName =
                mPhone.getContext()
                        .getSystemService(TelephonyManager.class)
                        .getCarrierServicePackageNameForLogicalSlot(mPhone.getPhoneId());

        return getFirstUidForPackage(pkgName);
    }

    /**
     * Returns whether the Network represented by this DataConnection is VCN-managed.
     *
+36 −0
Original line number Diff line number Diff line
@@ -43,6 +43,9 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import android.content.Context;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.net.InetAddresses;
import android.net.KeepalivePacketData;
import android.net.LinkAddress;
@@ -54,6 +57,7 @@ import android.os.AsyncResult;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.os.UserManager;
import android.provider.Telephony;
import android.telephony.AccessNetworkConstants;
import android.telephony.AccessNetworkConstants.AccessNetworkType;
@@ -61,6 +65,7 @@ import android.telephony.CarrierConfigManager;
import android.telephony.ServiceState;
import android.telephony.ServiceState.RegState;
import android.telephony.ServiceState.RilRadioTechnology;
import android.telephony.TelephonyManager;
import android.telephony.data.ApnSetting;
import android.telephony.data.DataCallResponse;
import android.telephony.data.DataProfile;
@@ -864,6 +869,37 @@ public class DataConnectionTest extends TelephonyTest {
        assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_CONGESTED));
    }

    @Test
    public void testOwnerUid() throws Exception {
        Context mockContext = mContextFixture.getTestDouble();
        doReturn(mockContext).when(mPhone).getContext();

        String testPkg = "com.android.telephony.test";
        TelephonyManager telMgr = mockContext.getSystemService(TelephonyManager.class);
        doReturn(testPkg).when(telMgr).getCarrierServicePackageNameForLogicalSlot(anyInt());

        UserInfo info = new UserInfo(0 /* id */, "TEST_USER", 0 /* flags */);
        UserManager userMgr = mockContext.getSystemService(UserManager.class);
        doReturn(Collections.singletonList(info)).when(userMgr).getUsers();

        int carrierConfigPkgUid = 12345;
        PackageManager pkgMgr = mockContext.getPackageManager();
        doReturn(carrierConfigPkgUid).when(pkgMgr).getPackageUidAsUser(eq(testPkg), anyInt());

        mContextFixture
                .getCarrierConfigBundle()
                .putStringArray(
                        CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
                        new String[] {"default"});
        testConnectEvent();
        AsyncResult adminUidsResult = new AsyncResult(null, new int[] {carrierConfigPkgUid}, null);
        mDc.sendMessage(DataConnection.EVENT_CARRIER_PRIVILEGED_UIDS_CHANGED, adminUidsResult);
        // Wait for carirer privilege UIDs to be updated
        waitForMs(100);

        assertEquals(carrierConfigPkgUid, getNetworkCapabilities().getOwnerUid());
    }

    @Test
    public void testSubscriptionIds() throws Exception {
        mContextFixture.getCarrierConfigBundle().putStringArray(