summaryrefslogtreecommitdiff
path: root/services/credentials/java
diff options
context:
space:
mode:
author Omer Ozer <omerozer@google.com> 2023-03-09 04:42:08 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-03-09 04:42:08 +0000
commit62dcc13ac6b0794c5fa496cf026b93c71ea71a88 (patch)
tree551396311dbf90e748246b4f952b9af5872cd4c0 /services/credentials/java
parent6fc98811d0c4f01799f188a738dfd9dee569d035 (diff)
parentd3a125dde336f26f33eaaa0929674d90d4a9a5f8 (diff)
Merge "Change the flat request matching logic" into udc-dev
Diffstat (limited to 'services/credentials/java')
-rw-r--r--services/credentials/java/com/android/server/credentials/CredentialDescriptionRegistry.java38
1 files changed, 33 insertions, 5 deletions
diff --git a/services/credentials/java/com/android/server/credentials/CredentialDescriptionRegistry.java b/services/credentials/java/com/android/server/credentials/CredentialDescriptionRegistry.java
index 14c49b312f34..3b92cc9647f7 100644
--- a/services/credentials/java/com/android/server/credentials/CredentialDescriptionRegistry.java
+++ b/services/credentials/java/com/android/server/credentials/CredentialDescriptionRegistry.java
@@ -25,17 +25,19 @@ import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
-
+import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.locks.ReentrantLock;
+import java.util.stream.Collectors;
/** Contains information on what CredentialProvider has what provisioned Credential. */
public class CredentialDescriptionRegistry {
+ private static final String FLAT_STRING_SPLIT_REGEX = ";";
private static final int MAX_ALLOWED_CREDENTIAL_DESCRIPTIONS = 128;
private static final int MAX_ALLOWED_ENTRIES_PER_PROVIDER = 16;
@GuardedBy("sLock")
@@ -164,14 +166,16 @@ public class CredentialDescriptionRegistry {
/** Returns package names and entries of a CredentialProviders that can satisfy a given
* {@link CredentialDescription}. */
public Set<FilterResult> getFilteredResultForProvider(String packageName,
- String flatRequestStrings) {
+ String flatRequestString) {
Set<FilterResult> result = new HashSet<>();
if (!mCredentialDescriptions.containsKey(packageName)) {
return result;
}
Set<CredentialDescription> currentSet = mCredentialDescriptions.get(packageName);
+ Set<String> unflattenedRequestString = flatStringToSet(flatRequestString);
for (CredentialDescription containedDescription: currentSet) {
- if (flatRequestStrings.equals(containedDescription.getFlattenedRequestString())) {
+ if (checkForMatch(flatStringToSet(containedDescription.getFlattenedRequestString()),
+ unflattenedRequestString)) {
result.add(new FilterResult(packageName,
containedDescription.getFlattenedRequestString(), containedDescription
.getCredentialEntries()));
@@ -182,12 +186,16 @@ public class CredentialDescriptionRegistry {
/** Returns package names of CredentialProviders that can satisfy a given
* {@link CredentialDescription}. */
- public Set<FilterResult> getMatchingProviders(Set<String> flatRequestString) {
+ public Set<FilterResult> getMatchingProviders(Set<String> flatRequestStrings) {
Set<FilterResult> result = new HashSet<>();
+ Set<Set<String>> unflattenedRequestStrings = flatRequestStrings.stream().map(
+ CredentialDescriptionRegistry::flatStringToSet).collect(Collectors.toSet());
for (String packageName: mCredentialDescriptions.keySet()) {
Set<CredentialDescription> currentSet = mCredentialDescriptions.get(packageName);
for (CredentialDescription containedDescription : currentSet) {
- if (flatRequestString.contains(containedDescription.getFlattenedRequestString())) {
+ if (canProviderSatisfyAny(flatStringToSet(containedDescription
+ .getFlattenedRequestString()),
+ unflattenedRequestStrings)) {
result.add(new FilterResult(packageName,
containedDescription.getFlattenedRequestString(), containedDescription
.getCredentialEntries()));
@@ -203,4 +211,24 @@ public class CredentialDescriptionRegistry {
}
}
+ private static boolean canProviderSatisfyAny(Set<String> registeredUnflattenedStrings,
+ Set<Set<String>> requestedUnflattenedStrings) {
+ for (Set<String> requestedUnflattenedString : requestedUnflattenedStrings) {
+ if (registeredUnflattenedStrings.containsAll(requestedUnflattenedString)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static boolean checkForMatch(Set<String> registeredUnflattenedStrings,
+ Set<String> requestedUnflattenedString) {
+ return registeredUnflattenedStrings.containsAll(requestedUnflattenedString);
+ }
+
+ private static Set<String> flatStringToSet(String flatString) {
+ return new HashSet<>(Arrays
+ .asList(flatString.split(FLAT_STRING_SPLIT_REGEX)));
+ }
+
}