Merge "Ensure only microphone attribution chains are recorded" into sc-v2-dev am: 5a1d0103e4

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16562077

Change-Id: I9ee7979039e38a3b63c9d9a835542a7a291797eb
This commit is contained in:
Nate Myren
2022-01-05 00:03:17 +00:00
committed by Automerger Merge Worker

View File

@@ -199,6 +199,7 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis
// if any link in the chain is finished, remove the chain. Then, find any other chains that // if any link in the chain is finished, remove the chain. Then, find any other chains that
// contain this op/package/uid/tag combination, and remove them, as well. // contain this op/package/uid/tag combination, and remove them, as well.
// TODO ntmyren: be smarter about this // TODO ntmyren: be smarter about this
synchronized(mAttributionChains) {
mAttributionChains.remove(attributionChainId); mAttributionChains.remove(attributionChainId);
int numChains = mAttributionChains.size(); int numChains = mAttributionChains.size();
ArrayList<Integer> toRemove = new ArrayList<>(); ArrayList<Integer> toRemove = new ArrayList<>();
@@ -216,6 +217,7 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis
} }
mAttributionChains.removeAll(toRemove); mAttributionChains.removeAll(toRemove);
} }
}
@Override @Override
public void onOpStarted(int op, int uid, String packageName, String attributionTag, public void onOpStarted(int op, int uid, String packageName, String attributionTag,
@@ -234,9 +236,11 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis
// If this is not a successful start, or it is not a chain, or it is untrusted, return // If this is not a successful start, or it is not a chain, or it is untrusted, return
return; return;
} }
synchronized(mAttributionChains) {
addLinkToChainIfNotPresent(AppOpsManager.opToPublicName(op), packageName, uid, addLinkToChainIfNotPresent(AppOpsManager.opToPublicName(op), packageName, uid,
attributionTag, attributionFlags, attributionChainId); attributionTag, attributionFlags, attributionChainId);
} }
}
private void addLinkToChainIfNotPresent(String op, String packageName, int uid, private void addLinkToChainIfNotPresent(String op, String packageName, int uid,
String attributionTag, int attributionFlags, int attributionChainId) { String attributionTag, int attributionFlags, int attributionChainId) {
@@ -310,7 +314,7 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis
String permGroup = usedPermGroups.get(permGroupNum); String permGroup = usedPermGroups.get(permGroupNum);
ArrayMap<OpUsage, CharSequence> usagesWithLabels = ArrayMap<OpUsage, CharSequence> usagesWithLabels =
getUniqueUsagesWithLabels(rawUsages.get(permGroup)); getUniqueUsagesWithLabels(permGroup, rawUsages.get(permGroup));
if (permGroup.equals(OPSTR_PHONE_CALL_MICROPHONE)) { if (permGroup.equals(OPSTR_PHONE_CALL_MICROPHONE)) {
isPhone = true; isPhone = true;
@@ -431,7 +435,8 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis
return ListFormatter.getInstance().format(labels); return ListFormatter.getInstance().format(labels);
} }
private ArrayMap<OpUsage, CharSequence> getUniqueUsagesWithLabels(List<OpUsage> usages) { private ArrayMap<OpUsage, CharSequence> getUniqueUsagesWithLabels(String permGroup,
List<OpUsage> usages) {
ArrayMap<OpUsage, CharSequence> usagesAndLabels = new ArrayMap<>(); ArrayMap<OpUsage, CharSequence> usagesAndLabels = new ArrayMap<>();
if (usages == null || usages.isEmpty()) { if (usages == null || usages.isEmpty()) {
@@ -466,7 +471,7 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis
// If this usage has a proxy, but is not a proxy, it is the end of a chain. // If this usage has a proxy, but is not a proxy, it is the end of a chain.
// TODO remove once camera converted // TODO remove once camera converted
if (!proxies.containsKey(usageAttr) && usage.proxy != null if (!proxies.containsKey(usageAttr) && usage.proxy != null
&& !usage.op.equals(OPSTR_RECORD_AUDIO)) { && !MICROPHONE.equals(permGroup)) {
proxyLabels.put(usage, new ArrayList<>()); proxyLabels.put(usage, new ArrayList<>());
proxyPackages.add(usage.getPackageIdHash()); proxyPackages.add(usage.getPackageIdHash());
} }
@@ -538,12 +543,13 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis
// TODO ntmyren: remove this proxy logic once camera is converted to AttributionSource // TODO ntmyren: remove this proxy logic once camera is converted to AttributionSource
// For now: don't add mic proxy usages // For now: don't add mic proxy usages
if (!start.op.equals(OPSTR_RECORD_AUDIO)) { if (!MICROPHONE.equals(permGroup)) {
usagesAndLabels.put(start, usagesAndLabels.put(start,
proxyLabelList.isEmpty() ? null : formatLabelList(proxyLabelList)); proxyLabelList.isEmpty() ? null : formatLabelList(proxyLabelList));
} }
} }
synchronized (mAttributionChains) {
for (int i = 0; i < mAttributionChains.size(); i++) { for (int i = 0; i < mAttributionChains.size(); i++) {
List<AccessChainLink> usageList = mAttributionChains.valueAt(i); List<AccessChainLink> usageList = mAttributionChains.valueAt(i);
int lastVisible = usageList.size() - 1; int lastVisible = usageList.size() - 1;
@@ -551,7 +557,8 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis
// if the list is empty or incomplete, do not show it. // if the list is empty or incomplete, do not show it.
if (usageList.isEmpty() || !usageList.get(lastVisible).isEnd() if (usageList.isEmpty() || !usageList.get(lastVisible).isEnd()
|| !usageList.get(0).isStart() || !usageList.get(0).isStart()
|| !usageList.get(lastVisible).usage.op.equals(OPSTR_RECORD_AUDIO)) { || !permGroup.equals(getGroupForOp(usageList.get(0).usage.op))
|| !MICROPHONE.equals(permGroup)) {
continue; continue;
} }
@@ -581,6 +588,7 @@ public class PermissionUsageHelper implements AppOpsManager.OnOpActiveChangedLis
} }
usagesAndLabels.put(start.usage, proxyLabel); usagesAndLabels.put(start.usage, proxyLabel);
} }
}
for (int packageHash : mostRecentUsages.keySet()) { for (int packageHash : mostRecentUsages.keySet()) {
if (!proxyPackages.contains(packageHash)) { if (!proxyPackages.contains(packageHash)) {