diff --git a/services/credentials/java/com/android/server/credentials/CredentialDescriptionRegistry.java b/services/credentials/java/com/android/server/credentials/CredentialDescriptionRegistry.java index 3d504efd17974..9c50a5ac2b16b 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialDescriptionRegistry.java +++ b/services/credentials/java/com/android/server/credentials/CredentialDescriptionRegistry.java @@ -49,11 +49,14 @@ public final class CredentialDescriptionRegistry { /** Represents the results of a given query into the registry. */ public static final class FilterResult { final String mPackageName; + final String mFlattenedRequest; final List mCredentialEntries; private FilterResult(String packageName, + String flattenedRequest, List credentialEntries) { mPackageName = packageName; + mFlattenedRequest = flattenedRequest; mCredentialEntries = credentialEntries; } } @@ -133,12 +136,13 @@ public final class CredentialDescriptionRegistry { /** Returns package names and entries of a CredentialProviders that can satisfy a given * {@link CredentialDescription}. */ public Set getFilteredResultForProvider(String packageName, - List flatRequestStrings) { + String flatRequestStrings) { Set result = new HashSet<>(); Set currentSet = mCredentialDescriptions.get(packageName); for (CredentialDescription containedDescription: currentSet) { - if (flatRequestStrings.contains(containedDescription.getFlattenedRequestString())) { - result.add(new FilterResult(packageName, containedDescription + if (flatRequestStrings.equals(containedDescription.getFlattenedRequestString())) { + result.add(new FilterResult(packageName, + containedDescription.getFlattenedRequestString(), containedDescription .getCredentialEntries())); } } @@ -147,13 +151,15 @@ public final class CredentialDescriptionRegistry { /** Returns package names of CredentialProviders that can satisfy a given * {@link CredentialDescription}. */ - public Set getMatchingProviders(Set flatRequestString) { - Set result = new HashSet<>(); + public Set getMatchingProviders(Set flatRequestString) { + Set result = new HashSet<>(); for (String packageName: mCredentialDescriptions.keySet()) { Set currentSet = mCredentialDescriptions.get(packageName); for (CredentialDescription containedDescription : currentSet) { if (flatRequestString.contains(containedDescription.getFlattenedRequestString())) { - result.add(packageName); + result.add(new FilterResult(packageName, + containedDescription.getFlattenedRequestString(), containedDescription + .getCredentialEntries())); } } } diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java index f3bbfb5afb55f..fd7b30405450f 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java +++ b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java @@ -58,6 +58,7 @@ import android.service.credentials.CallingAppInfo; import android.service.credentials.CredentialProviderInfo; import android.text.TextUtils; import android.util.Log; +import android.util.Pair; import android.util.Slog; import android.util.SparseArray; @@ -66,6 +67,7 @@ import com.android.server.infra.AbstractMasterSystemService; import com.android.server.infra.SecureSettingsServiceNameResolver; import java.util.ArrayList; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -274,24 +276,25 @@ public final class CredentialManagerService // to be guarded by 'service.mLock', which is the same as mLock. private List initiateProviderSessionsWithActiveContainers( GetRequestSession session, - List requestOptions, - Set activeCredentialContainers) { + Set> + activeCredentialContainers) { List providerSessions = new ArrayList<>(); - // Invoke all services of a user to initiate a provider session - for (String packageName : activeCredentialContainers) { + for (Pair result : + activeCredentialContainers) { providerSessions.add( ProviderRegistryGetSession.createNewSession( mContext, UserHandle.getCallingUserId(), session, - packageName, - requestOptions)); + result.second.mPackageName, + result.first)); } return providerSessions; } @NonNull - private Set getFilteredResultFromRegistry(List options) { + private Set> + getFilteredResultFromRegistry(List options) { // Session for active/provisioned credential descriptions; CredentialDescriptionRegistry registry = CredentialDescriptionRegistry.forUser(UserHandle.getCallingUserId()); @@ -307,7 +310,22 @@ public final class CredentialManagerService .collect(Collectors.toSet()); // All requested credential descriptions based on the given request. - return registry.getMatchingProviders(requestedCredentialDescriptions); + Set filterResults = + registry.getMatchingProviders(requestedCredentialDescriptions); + + Set> result = + new HashSet<>(); + + for (CredentialDescriptionRegistry.FilterResult filterResult: filterResults) { + for (CredentialOption credentialOption: options) { + if (filterResult.mFlattenedRequest.equals(credentialOption + .getCredentialRetrievalData() + .getString(CredentialOption.FLATTENED_REQUEST))) { + result.add(new Pair<>(credentialOption, filterResult)); + } + } + } + return result; } @SuppressWarnings("GuardedBy") // ErrorProne requires initiateProviderSessionForRequestLocked @@ -452,15 +470,6 @@ public final class CredentialManagerService List sessionsWithoutRemoteService = initiateProviderSessionsWithActiveContainers( session, - optionsThatRequireActiveCredentials.stream() - .map( - getCredentialOption -> - getCredentialOption - .getCredentialRetrievalData() - .getString( - CredentialOption - .FLATTENED_REQUEST)) - .collect(Collectors.toList()), getFilteredResultFromRegistry(optionsThatRequireActiveCredentials)); List sessionsWithRemoteService = diff --git a/services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java b/services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java index 5af8080df5c14..a57cb5fab0dc3 100644 --- a/services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java +++ b/services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java @@ -23,7 +23,6 @@ import android.content.Context; import android.content.Intent; import android.credentials.CredentialOption; import android.credentials.GetCredentialException; -import android.credentials.GetCredentialRequest; import android.credentials.GetCredentialResponse; import android.credentials.ui.Entry; import android.credentials.ui.GetCredentialProviderData; @@ -49,7 +48,7 @@ import java.util.stream.Stream; * * @hide */ -public class ProviderRegistryGetSession extends ProviderSession> { private static final String TAG = "ProviderRegistryGetSession"; @@ -62,15 +61,14 @@ public class ProviderRegistryGetSession extends ProviderSession requestOptions) { + @NonNull CredentialOption requestOption) { return new ProviderRegistryGetSession( context, userId, getRequestSession, - getRequestSession.mClientRequest, getRequestSession.mClientAppInfo, credentialProviderPackageName, - requestOptions); + requestOption); } @NonNull @@ -82,24 +80,22 @@ public class ProviderRegistryGetSession extends ProviderSession mRequestOptions; + private final String mFlattenedRequestOptionString; private List mCredentialEntries; protected ProviderRegistryGetSession(@NonNull Context context, @NonNull int userId, @NonNull GetRequestSession session, - @NonNull GetCredentialRequest request, @NonNull CallingAppInfo callingAppInfo, @NonNull String servicePackageName, - @NonNull List requestOptions) { - super(context, null, request, session, userId, null); - mGetRequestSession = session; + @NonNull CredentialOption requestOption) { + super(context, null, requestOption, session, userId, null); mCredentialDescriptionRegistry = CredentialDescriptionRegistry.forUser(userId); mCallingAppInfo = callingAppInfo; mCredentialProviderPackageName = servicePackageName; - mRequestOptions = requestOptions; + mFlattenedRequestOptionString = requestOption + .getCredentialRetrievalData() + .getString(CredentialOption.FLATTENED_REQUEST); } private List prepareUiCredentialEntries( @@ -114,23 +110,18 @@ public class ProviderRegistryGetSession extends ProviderSession>) filterResult -> filterResult.mCredentialEntries.stream()) .collect(Collectors.toList()); - setStatus(Status.CREDENTIALS_RECEIVED); + updateStatusAndInvokeCallback(Status.CREDENTIALS_RECEIVED); // TODO(use metric later) }