diff options
| author | 2023-03-09 04:42:08 +0000 | |
|---|---|---|
| committer | 2023-03-09 04:42:08 +0000 | |
| commit | 62dcc13ac6b0794c5fa496cf026b93c71ea71a88 (patch) | |
| tree | 551396311dbf90e748246b4f952b9af5872cd4c0 /services/credentials/java | |
| parent | 6fc98811d0c4f01799f188a738dfd9dee569d035 (diff) | |
| parent | d3a125dde336f26f33eaaa0929674d90d4a9a5f8 (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.java | 38 |
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))); + } + } |