Merge changes from topic "sp20-stats-provider-permission"
* changes: [SP20] Check signature permission when accessing network stats provider Add permission check functions to NetworkStatsService
This commit is contained in:
@@ -29,6 +29,7 @@ import android.net.ConnectivityManager;
|
|||||||
import android.net.DataUsageRequest;
|
import android.net.DataUsageRequest;
|
||||||
import android.net.INetworkStatsService;
|
import android.net.INetworkStatsService;
|
||||||
import android.net.NetworkIdentity;
|
import android.net.NetworkIdentity;
|
||||||
|
import android.net.NetworkStack;
|
||||||
import android.net.NetworkTemplate;
|
import android.net.NetworkTemplate;
|
||||||
import android.net.netstats.provider.AbstractNetworkStatsProvider;
|
import android.net.netstats.provider.AbstractNetworkStatsProvider;
|
||||||
import android.net.netstats.provider.NetworkStatsProviderCallback;
|
import android.net.netstats.provider.NetworkStatsProviderCallback;
|
||||||
@@ -540,7 +541,9 @@ public class NetworkStatsManager {
|
|||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
@SystemApi
|
@SystemApi
|
||||||
@RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS)
|
@RequiresPermission(anyOf = {
|
||||||
|
android.Manifest.permission.NETWORK_STATS_PROVIDER,
|
||||||
|
NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK})
|
||||||
@NonNull public NetworkStatsProviderCallback registerNetworkStatsProvider(
|
@NonNull public NetworkStatsProviderCallback registerNetworkStatsProvider(
|
||||||
@NonNull String tag,
|
@NonNull String tag,
|
||||||
@NonNull AbstractNetworkStatsProvider provider) {
|
@NonNull AbstractNetworkStatsProvider provider) {
|
||||||
|
|||||||
@@ -17,12 +17,14 @@
|
|||||||
package com.android.server.net;
|
package com.android.server.net;
|
||||||
|
|
||||||
import static android.Manifest.permission.ACCESS_NETWORK_STATE;
|
import static android.Manifest.permission.ACCESS_NETWORK_STATE;
|
||||||
|
import static android.Manifest.permission.NETWORK_STATS_PROVIDER;
|
||||||
import static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY;
|
import static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY;
|
||||||
import static android.Manifest.permission.UPDATE_DEVICE_STATS;
|
import static android.Manifest.permission.UPDATE_DEVICE_STATS;
|
||||||
import static android.content.Intent.ACTION_SHUTDOWN;
|
import static android.content.Intent.ACTION_SHUTDOWN;
|
||||||
import static android.content.Intent.ACTION_UID_REMOVED;
|
import static android.content.Intent.ACTION_UID_REMOVED;
|
||||||
import static android.content.Intent.ACTION_USER_REMOVED;
|
import static android.content.Intent.ACTION_USER_REMOVED;
|
||||||
import static android.content.Intent.EXTRA_UID;
|
import static android.content.Intent.EXTRA_UID;
|
||||||
|
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
||||||
import static android.net.ConnectivityManager.ACTION_TETHER_STATE_CHANGED;
|
import static android.net.ConnectivityManager.ACTION_TETHER_STATE_CHANGED;
|
||||||
import static android.net.ConnectivityManager.isNetworkTypeMobile;
|
import static android.net.ConnectivityManager.isNetworkTypeMobile;
|
||||||
import static android.net.NetworkStack.checkNetworkStackPermission;
|
import static android.net.NetworkStack.checkNetworkStackPermission;
|
||||||
@@ -1793,6 +1795,24 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: It is copied from ConnectivitySerivce, consider refactor these check permission
|
||||||
|
// functions to a proper util.
|
||||||
|
private boolean checkAnyPermissionOf(String... permissions) {
|
||||||
|
for (String permission : permissions) {
|
||||||
|
if (mContext.checkCallingOrSelfPermission(permission) == PERMISSION_GRANTED) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void enforceAnyPermissionOf(String... permissions) {
|
||||||
|
if (!checkAnyPermissionOf(permissions)) {
|
||||||
|
throw new SecurityException("Requires one of the following permissions: "
|
||||||
|
+ String.join(", ", permissions) + ".");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers a custom provider of {@link android.net.NetworkStats} to combine the network
|
* Registers a custom provider of {@link android.net.NetworkStats} to combine the network
|
||||||
* statistics that cannot be seen by the kernel to system. To unregister, invoke the
|
* statistics that cannot be seen by the kernel to system. To unregister, invoke the
|
||||||
@@ -1809,7 +1829,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
*/
|
*/
|
||||||
public @NonNull INetworkStatsProviderCallback registerNetworkStatsProvider(
|
public @NonNull INetworkStatsProviderCallback registerNetworkStatsProvider(
|
||||||
@NonNull String tag, @NonNull INetworkStatsProvider provider) {
|
@NonNull String tag, @NonNull INetworkStatsProvider provider) {
|
||||||
mContext.enforceCallingOrSelfPermission(UPDATE_DEVICE_STATS, TAG);
|
enforceAnyPermissionOf(NETWORK_STATS_PROVIDER,
|
||||||
|
NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK);
|
||||||
Objects.requireNonNull(provider, "provider is null");
|
Objects.requireNonNull(provider, "provider is null");
|
||||||
Objects.requireNonNull(tag, "tag is null");
|
Objects.requireNonNull(tag, "tag is null");
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user