Set attributionTag for noteOp(WRITE_SETTINGS) calls

Test: atest FrameworksNetTests TetheringTests:TetheringServiceTest
Bug: 136595429
Merged-In: I33f787644c44d7b0e5ce17a433820cfcd985cdfb
Change-Id: Ic3d937e7bb5141798234ed5b2852c1f768e97495
This commit is contained in:
Philip P. Moltmann
2020-03-26 11:50:35 -07:00
parent c44ca579ad
commit 7bc33dfb89
5 changed files with 84 additions and 28 deletions

View File

@@ -2044,12 +2044,21 @@ public class ConnectivityManager {
public boolean requestRouteToHostAddress(int networkType, InetAddress hostAddress) {
checkLegacyRoutingApiAccess();
try {
return mService.requestRouteToHostAddress(networkType, hostAddress.getAddress());
return mService.requestRouteToHostAddress(networkType, hostAddress.getAddress(),
mContext.getOpPackageName(), getAttributionTag());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
* @return the context's attribution tag
*/
// TODO: Remove method and replace with direct call once R code is pushed to AOSP
private @Nullable String getAttributionTag() {
return null;
}
/**
* Returns the value of the setting for background data usage. If false,
* applications should not use the network if the application is not in the
@@ -2240,14 +2249,30 @@ public class ConnectivityManager {
* services.jar, possibly in com.android.server.net. */
/** {@hide} */
public static final void enforceChangePermission(Context context) {
public static final void enforceChangePermission(Context context,
String callingPkg, String callingAttributionTag) {
int uid = Binder.getCallingUid();
Settings.checkAndNoteChangeNetworkStateOperation(context, uid, Settings
.getPackageNameForUid(context, uid), true /* throwException */);
checkAndNoteChangeNetworkStateOperation(context, uid, callingPkg,
callingAttributionTag, true /* throwException */);
}
/**
* Check if the package is a allowed to change the network state. This also accounts that such
* an access happened.
*
* @return {@code true} iff the package is allowed to change the network state.
*/
// TODO: Remove method and replace with direct call once R code is pushed to AOSP
private static boolean checkAndNoteChangeNetworkStateOperation(@NonNull Context context,
int uid, @NonNull String callingPackage, @Nullable String callingAttributionTag,
boolean throwException) {
return Settings.checkAndNoteChangeNetworkStateOperation(context, uid, callingPackage,
throwException);
}
/** {@hide} */
public static final void enforceTetherChangePermission(Context context, String callingPkg) {
public static final void enforceTetherChangePermission(Context context, String callingPkg,
String callingAttributionTag) {
Preconditions.checkNotNull(context, "Context cannot be null");
Preconditions.checkNotNull(callingPkg, "callingPkg cannot be null");
@@ -2261,11 +2286,25 @@ public class ConnectivityManager {
int uid = Binder.getCallingUid();
// If callingPkg's uid is not same as Binder.getCallingUid(),
// AppOpsService throws SecurityException.
Settings.checkAndNoteWriteSettingsOperation(context, uid, callingPkg,
true /* throwException */);
checkAndNoteWriteSettingsOperation(context, uid, callingPkg,
callingAttributionTag, true /* throwException */);
}
}
/**
* Check if the package is a allowed to write settings. This also accounts that such an access
* happened.
*
* @return {@code true} iff the package is allowed to write settings.
*/
// TODO: Remove method and replace with direct call once R code is pushed to AOSP
private static boolean checkAndNoteWriteSettingsOperation(@NonNull Context context, int uid,
@NonNull String callingPackage, @Nullable String callingAttributionTag,
boolean throwException) {
return Settings.checkAndNoteWriteSettingsOperation(context, uid, callingPackage,
throwException);
}
/**
* @deprecated - use getSystemService. This is a kludge to support static access in certain
* situations where a Context pointer is unavailable.
@@ -3706,7 +3745,8 @@ public class ConnectivityManager {
need, messenger, binder, callingPackageName);
} else {
request = mService.requestNetwork(
need, messenger, timeoutMs, binder, legacyType, callingPackageName);
need, messenger, timeoutMs, binder, legacyType, callingPackageName,
getAttributionTag());
}
if (request != null) {
sCallbacks.put(request, callback);
@@ -3982,7 +4022,8 @@ public class ConnectivityManager {
checkPendingIntentNotNull(operation);
try {
mService.pendingRequestForNetwork(
request.networkCapabilities, operation, mContext.getOpPackageName());
request.networkCapabilities, operation, mContext.getOpPackageName(),
getAttributionTag());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (ServiceSpecificException e) {

View File

@@ -77,7 +77,8 @@ interface IConnectivityManager
NetworkQuotaInfo getActiveNetworkQuotaInfo();
boolean isActiveNetworkMetered();
boolean requestRouteToHostAddress(int networkType, in byte[] hostAddress);
boolean requestRouteToHostAddress(int networkType, in byte[] hostAddress,
String callingPackageName, String callingAttributionTag);
@UnsupportedAppUsage(maxTargetSdk = 29,
publicAlternatives = "Use {@code TetheringManager#getLastTetherError} as alternative")
@@ -168,10 +169,10 @@ interface IConnectivityManager
NetworkRequest requestNetwork(in NetworkCapabilities networkCapabilities,
in Messenger messenger, int timeoutSec, in IBinder binder, int legacy,
String callingPackageName);
String callingPackageName, String callingAttributionTag);
NetworkRequest pendingRequestForNetwork(in NetworkCapabilities networkCapabilities,
in PendingIntent operation, String callingPackageName);
in PendingIntent operation, String callingPackageName, String callingAttributionTag);
void releasePendingNetworkRequest(in PendingIntent operation);