Loading src/java/com/android/internal/telephony/dataconnection/DataConnection.java +50 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading @@ -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. * Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java +36 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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( Loading Loading
src/java/com/android/internal/telephony/dataconnection/DataConnection.java +50 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 Loading @@ -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. * Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java +36 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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; Loading Loading @@ -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( Loading