Merge "Use PermissionUtils"

This commit is contained in:
Paul Hu
2021-02-23 01:48:58 +00:00
committed by Gerrit Code Review
3 changed files with 20 additions and 76 deletions

View File

@@ -15,9 +15,6 @@
*/ */
package android.net; package android.net;
import static android.Manifest.permission.NETWORK_STACK;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.SystemApi; import android.annotation.SystemApi;
@@ -26,8 +23,7 @@ import android.content.Context;
import android.os.IBinder; import android.os.IBinder;
import android.os.ServiceManager; import android.os.ServiceManager;
import java.util.ArrayList; import com.android.net.module.util.PermissionUtils;
import java.util.Arrays;
/** /**
* Constants and utilities for client code communicating with the network stack service. * Constants and utilities for client code communicating with the network stack service.
* @hide * @hide
@@ -79,9 +75,14 @@ public class NetworkStack {
* @param context {@link android.content.Context} for the process. * @param context {@link android.content.Context} for the process.
* *
* @hide * @hide
*
* @deprecated Use {@link PermissionUtils#enforceNetworkStackPermission} instead.
*
* TODO: remove this method and let the users call to PermissionUtils directly.
*/ */
@Deprecated
public static void checkNetworkStackPermission(final @NonNull Context context) { public static void checkNetworkStackPermission(final @NonNull Context context) {
checkNetworkStackPermissionOr(context); PermissionUtils.enforceNetworkStackPermission(context);
} }
/** /**
@@ -92,31 +93,14 @@ public class NetworkStack {
* @param otherPermissions The set of permissions that could be the candidate permissions , or * @param otherPermissions The set of permissions that could be the candidate permissions , or
* empty string if none of other permissions needed. * empty string if none of other permissions needed.
* @hide * @hide
*
* @deprecated Use {@link PermissionUtils#enforceNetworkStackPermissionOr} instead.
*
* TODO: remove this method and let the users call to PermissionUtils directly.
*/ */
@Deprecated
public static void checkNetworkStackPermissionOr(final @NonNull Context context, public static void checkNetworkStackPermissionOr(final @NonNull Context context,
final @NonNull String... otherPermissions) { final @NonNull String... otherPermissions) {
ArrayList<String> permissions = new ArrayList<String>(Arrays.asList(otherPermissions)); PermissionUtils.enforceNetworkStackPermissionOr(context, otherPermissions);
permissions.add(NETWORK_STACK);
permissions.add(PERMISSION_MAINLINE_NETWORK_STACK);
enforceAnyPermissionOf(context, permissions.toArray(new String[0]));
} }
private static void enforceAnyPermissionOf(final @NonNull Context context,
final @NonNull String... permissions) {
if (!checkAnyPermissionOf(context, permissions)) {
throw new SecurityException("Requires one of the following permissions: "
+ String.join(", ", permissions) + ".");
}
}
private static boolean checkAnyPermissionOf(final @NonNull Context context,
final @NonNull String... permissions) {
for (String permission : permissions) {
if (context.checkCallingOrSelfPermission(permission) == PERMISSION_GRANTED) {
return true;
}
}
return false;
}
} }

View File

@@ -197,6 +197,7 @@ import com.android.modules.utils.BasicShellCommandHandler;
import com.android.net.module.util.CollectionUtils; import com.android.net.module.util.CollectionUtils;
import com.android.net.module.util.LinkPropertiesUtils.CompareOrUpdateResult; import com.android.net.module.util.LinkPropertiesUtils.CompareOrUpdateResult;
import com.android.net.module.util.LinkPropertiesUtils.CompareResult; import com.android.net.module.util.LinkPropertiesUtils.CompareResult;
import com.android.net.module.util.PermissionUtils;
import com.android.server.am.BatteryStatsService; import com.android.server.am.BatteryStatsService;
import com.android.server.connectivity.AutodestructReference; import com.android.server.connectivity.AutodestructReference;
import com.android.server.connectivity.DataConnectionStats; import com.android.server.connectivity.DataConnectionStats;
@@ -1511,7 +1512,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public Network getActiveNetworkForUid(int uid, boolean ignoreBlocked) { public Network getActiveNetworkForUid(int uid, boolean ignoreBlocked) {
NetworkStack.checkNetworkStackPermission(mContext); PermissionUtils.enforceNetworkStackPermission(mContext);
return getActiveNetworkForUidInternal(uid, ignoreBlocked); return getActiveNetworkForUidInternal(uid, ignoreBlocked);
} }
@@ -1534,7 +1535,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked) { public NetworkInfo getActiveNetworkInfoForUid(int uid, boolean ignoreBlocked) {
NetworkStack.checkNetworkStackPermission(mContext); PermissionUtils.enforceNetworkStackPermission(mContext);
final NetworkState state = getUnfilteredActiveNetworkState(uid); final NetworkState state = getUnfilteredActiveNetworkState(uid);
filterNetworkStateForUid(state, uid, ignoreBlocked); filterNetworkStateForUid(state, uid, ignoreBlocked);
return state.networkInfo; return state.networkInfo;
@@ -1878,7 +1879,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public NetworkState[] getAllNetworkState() { public NetworkState[] getAllNetworkState() {
// This contains IMSI details, so make sure the caller is privileged. // This contains IMSI details, so make sure the caller is privileged.
NetworkStack.checkNetworkStackPermission(mContext); PermissionUtils.enforceNetworkStackPermission(mContext);
final ArrayList<NetworkState> result = new ArrayList<>(); final ArrayList<NetworkState> result = new ArrayList<>();
for (Network network : getAllNetworks()) { for (Network network : getAllNetworks()) {
@@ -2302,7 +2303,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// Public because it's used by mLockdownTracker. // Public because it's used by mLockdownTracker.
public void sendConnectedBroadcast(NetworkInfo info) { public void sendConnectedBroadcast(NetworkInfo info) {
NetworkStack.checkNetworkStackPermission(mContext); PermissionUtils.enforceNetworkStackPermission(mContext);
sendGeneralBroadcast(info, CONNECTIVITY_ACTION); sendGeneralBroadcast(info, CONNECTIVITY_ACTION);
} }
@@ -4685,7 +4686,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public void setGlobalProxy(final ProxyInfo proxyProperties) { public void setGlobalProxy(final ProxyInfo proxyProperties) {
NetworkStack.checkNetworkStackPermission(mContext); PermissionUtils.enforceNetworkStackPermission(mContext);
mProxyTracker.setGlobalProxy(proxyProperties); mProxyTracker.setGlobalProxy(proxyProperties);
} }
@@ -4887,7 +4888,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override @Override
public void setRequireVpnForUids(boolean requireVpn, UidRange[] ranges) { public void setRequireVpnForUids(boolean requireVpn, UidRange[] ranges) {
NetworkStack.checkNetworkStackPermission(mContext); PermissionUtils.enforceNetworkStackPermission(mContext);
mHandler.sendMessage(mHandler.obtainMessage(EVENT_SET_REQUIRE_VPN_FOR_UIDS, mHandler.sendMessage(mHandler.obtainMessage(EVENT_SET_REQUIRE_VPN_FOR_UIDS,
encodeBool(requireVpn), 0 /* arg2 */, ranges)); encodeBool(requireVpn), 0 /* arg2 */, ranges));
} }

View File

@@ -15,20 +15,8 @@
*/ */
package android.net; package android.net;
import static android.Manifest.permission.NETWORK_STACK;
import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK;
import static android.net.NetworkStack.checkNetworkStackPermission;
import static android.net.NetworkStack.checkNetworkStackPermissionOr;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.Build; import android.os.Build;
import android.os.IBinder; import android.os.IBinder;
@@ -46,44 +34,15 @@ import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public class NetworkStackTest { public class NetworkStackTest {
private static final String [] OTHER_PERMISSION = {"otherpermission1", "otherpermission2"};
@Rule @Rule
public DevSdkIgnoreRule mDevSdkIgnoreRule = new DevSdkIgnoreRule(); public DevSdkIgnoreRule mDevSdkIgnoreRule = new DevSdkIgnoreRule();
@Mock Context mCtx;
@Mock private IBinder mConnectorBinder; @Mock private IBinder mConnectorBinder;
@Before public void setUp() throws Exception { @Before public void setUp() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
} }
@Test
public void testCheckNetworkStackPermission() throws Exception {
when(mCtx.checkCallingOrSelfPermission(eq(NETWORK_STACK))).thenReturn(PERMISSION_GRANTED);
when(mCtx.checkCallingOrSelfPermission(eq(PERMISSION_MAINLINE_NETWORK_STACK)))
.thenReturn(PERMISSION_DENIED);
checkNetworkStackPermission(mCtx);
checkNetworkStackPermissionOr(mCtx, OTHER_PERMISSION);
when(mCtx.checkCallingOrSelfPermission(eq(NETWORK_STACK))).thenReturn(PERMISSION_DENIED);
when(mCtx.checkCallingOrSelfPermission(eq(PERMISSION_MAINLINE_NETWORK_STACK)))
.thenReturn(PERMISSION_GRANTED);
checkNetworkStackPermission(mCtx);
checkNetworkStackPermissionOr(mCtx, OTHER_PERMISSION);
when(mCtx.checkCallingOrSelfPermission(any())).thenReturn(PERMISSION_DENIED);
try {
checkNetworkStackPermissionOr(mCtx, OTHER_PERMISSION);
} catch (SecurityException e) {
// Expect to get a SecurityException
return;
}
fail("Expect fail but permission granted.");
}
@Test @IgnoreUpTo(Build.VERSION_CODES.Q) @Test @IgnoreUpTo(Build.VERSION_CODES.Q)
public void testGetService() { public void testGetService() {
NetworkStack.setServiceForTest(mConnectorBinder); NetworkStack.setServiceForTest(mConnectorBinder);