Loading core/java/android/service/credentials/CredentialProviderInfoFactory.java +46 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import android.util.Log; import android.util.Slog; import android.util.Xml; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.R; import org.xmlpull.v1.XmlPullParser; Loading Loading @@ -132,6 +133,26 @@ public final class CredentialProviderInfoFactory { .build(); } /** * Constructs an information instance of the credential provider for testing purposes. Does * not run any verifications and passes parameters as is. */ @VisibleForTesting public static CredentialProviderInfo createForTests( @NonNull ServiceInfo serviceInfo, @NonNull CharSequence overrideLabel, boolean isSystemProvider, boolean isEnabled, @NonNull List<String> capabilities) { return new CredentialProviderInfo.Builder(serviceInfo) .setEnabled(isEnabled) .setOverrideLabel(overrideLabel) .setSystemProvider(isSystemProvider) .addCapabilities(capabilities) .build(); } private static void verifyProviderPermission(ServiceInfo serviceInfo) throws SecurityException { final String permission = Manifest.permission.BIND_CREDENTIAL_PROVIDER_SERVICE; if (permission.equals(serviceInfo.permission)) { Loading Loading @@ -484,6 +505,31 @@ public final class CredentialProviderInfoFactory { return null; } /** * Returns a valid credential provider that has the given package name. Returns null if no * match is found. */ @Nullable public static CredentialProviderInfo getCredentialProviderFromPackageName( @NonNull Context context, int userId, @NonNull String packageName, int providerFilter, @NonNull Set<ServiceInfo> enabledServices) { requireNonNull(context, "context must not be null"); requireNonNull(packageName, "package name must not be null"); requireNonNull(enabledServices, "enabledServices must not be null"); for (CredentialProviderInfo credentialProviderInfo : getCredentialProviderServices(context, userId, providerFilter, enabledServices)) { if (credentialProviderInfo.getServiceInfo() .packageName.equals(packageName)) { return credentialProviderInfo; } } return null; } /** * Returns the valid credential provider services available for the user with the given {@code * userId}. Loading services/credentials/java/com/android/server/credentials/CredentialDescriptionRegistry.java +18 −4 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ import java.util.Set; import java.util.concurrent.locks.ReentrantLock; /** Contains information on what CredentialProvider has what provisioned Credential. */ public final class CredentialDescriptionRegistry { public class CredentialDescriptionRegistry { private static final int MAX_ALLOWED_CREDENTIAL_DESCRIPTIONS = 128; private static final int MAX_ALLOWED_ENTRIES_PER_PROVIDER = 16; Loading @@ -54,7 +54,8 @@ public final class CredentialDescriptionRegistry { final String mFlattenedRequest; final List<CredentialEntry> mCredentialEntries; private FilterResult(String packageName, @VisibleForTesting FilterResult(String packageName, String flattenedRequest, List<CredentialEntry> credentialEntries) { mPackageName = packageName; Loading Loading @@ -92,10 +93,10 @@ public final class CredentialDescriptionRegistry { } } /** Clears an existing session for a given user identifier. */ /** Clears an existing session for a given user identifier. Used when testing only. */ @GuardedBy("sLock") @VisibleForTesting public static void clearAllSessions() { static void clearAllSessions() { sLock.lock(); try { sCredentialDescriptionSessionPerUser.clear(); Loading @@ -104,6 +105,19 @@ public final class CredentialDescriptionRegistry { } } /** Sets an existing session for a given user identifier. Used when testing only. */ @GuardedBy("sLock") @VisibleForTesting static void setSession(int userId, CredentialDescriptionRegistry credentialDescriptionRegistry) { sLock.lock(); try { sCredentialDescriptionSessionPerUser.put(userId, credentialDescriptionRegistry); } finally { sLock.unlock(); } } private Map<String, Set<CredentialDescription>> mCredentialDescriptions; private int mTotalDescriptionCount; Loading services/credentials/java/com/android/server/credentials/CredentialManagerService.java +14 −8 Original line number Diff line number Diff line Loading @@ -296,6 +296,12 @@ public final class CredentialManagerService mContext, UserHandle.getCallingUserId(), session, CredentialProviderInfoFactory.getCredentialProviderFromPackageName( mContext, UserHandle.getCallingUserId() , result.second.mPackageName, CredentialManager.PROVIDER_FILTER_ALL_PROVIDERS, new HashSet<>()), session.mClientAppInfo, result.second.mPackageName, result.first)); } Loading Loading @@ -358,6 +364,14 @@ public final class CredentialManagerService return providerSessions; } private List<CredentialProviderInfo> getServicesForCredentialDescription(int userId) { return CredentialProviderInfoFactory.getCredentialProviderServices( mContext, userId, CredentialManager.PROVIDER_FILTER_ALL_PROVIDERS, new HashSet<>()); } @Override @GuardedBy("CredentialDescriptionRegistry.sLock") public void onUserStopped(@NonNull TargetUser user) { Loading Loading @@ -813,14 +827,6 @@ public final class CredentialManagerService session.executeUnregisterRequest(request, callingPackage); } private List<CredentialProviderInfo> getServicesForCredentialDescription(int userId) { return CredentialProviderInfoFactory.getCredentialProviderServices( mContext, userId, CredentialManager.PROVIDER_FILTER_ALL_PROVIDERS, new HashSet<>()); } } private void enforceCallingPackage(String callingPackage, int callingUid) { Loading services/credentials/java/com/android/server/credentials/GetRequestSession.java +1 −1 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ import java.util.ArrayList; * Central session for a single getCredentials request. This class listens to the * responses from providers, and the UX app, and updates the provider(S) state. */ public final class GetRequestSession extends RequestSession<GetCredentialRequest, public class GetRequestSession extends RequestSession<GetCredentialRequest, IGetCredentialCallback> implements ProviderSession.ProviderInternalCallback<GetCredentialResponse> { private static final String TAG = "GetRequestSession"; Loading services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java +14 −5 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.annotation.UserIdInt; import android.content.Context; import android.content.Intent; import android.credentials.CredentialOption; import android.credentials.CredentialProviderInfo; import android.credentials.GetCredentialException; import android.credentials.GetCredentialResponse; import android.credentials.ui.Entry; Loading @@ -33,6 +34,8 @@ import android.service.credentials.CredentialEntry; import android.service.credentials.CredentialProviderService; import android.telecom.Log; import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.HashMap; import java.util.List; Loading @@ -52,7 +55,8 @@ public class ProviderRegistryGetSession extends ProviderSession<CredentialOption Set<CredentialDescriptionRegistry.FilterResult>> { private static final String TAG = "ProviderRegistryGetSession"; private static final String CREDENTIAL_ENTRY_KEY = "credential_key"; @VisibleForTesting static final String CREDENTIAL_ENTRY_KEY = "credential_key"; /** Creates a new provider session to be used by the request session. */ @Nullable Loading @@ -60,13 +64,16 @@ public class ProviderRegistryGetSession extends ProviderSession<CredentialOption @NonNull Context context, @UserIdInt int userId, @NonNull GetRequestSession getRequestSession, @NonNull CredentialProviderInfo credentialProviderInfo, @NonNull CallingAppInfo callingAppInfo, @NonNull String credentialProviderPackageName, @NonNull CredentialOption requestOption) { return new ProviderRegistryGetSession( context, userId, getRequestSession, getRequestSession.mClientAppInfo, credentialProviderInfo, callingAppInfo, credentialProviderPackageName, requestOption); } Loading @@ -81,15 +88,17 @@ public class ProviderRegistryGetSession extends ProviderSession<CredentialOption private final String mCredentialProviderPackageName; @NonNull private final String mFlattenedRequestOptionString; private List<CredentialEntry> mCredentialEntries; @VisibleForTesting List<CredentialEntry> mCredentialEntries; protected ProviderRegistryGetSession(@NonNull Context context, @NonNull int userId, @NonNull GetRequestSession session, @NonNull CredentialProviderInfo credentialProviderInfo, @NonNull CallingAppInfo callingAppInfo, @NonNull String servicePackageName, @NonNull CredentialOption requestOption) { super(context, null, requestOption, session, userId, null); super(context, credentialProviderInfo, requestOption, session, userId, null); mCredentialDescriptionRegistry = CredentialDescriptionRegistry.forUser(userId); mCallingAppInfo = callingAppInfo; mCredentialProviderPackageName = servicePackageName; Loading Loading @@ -183,7 +192,7 @@ public class ProviderRegistryGetSession extends ProviderSession<CredentialOption providerPendingIntentResponse.getResultData()); if (getCredentialResponse != null) { if (mCallbacks != null) { mCallbacks.onFinalResponseReceived(mComponentName, ((GetRequestSession) mCallbacks).onFinalResponseReceived(mComponentName, getCredentialResponse); } return; Loading Loading
core/java/android/service/credentials/CredentialProviderInfoFactory.java +46 −0 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import android.util.Log; import android.util.Slog; import android.util.Xml; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.R; import org.xmlpull.v1.XmlPullParser; Loading Loading @@ -132,6 +133,26 @@ public final class CredentialProviderInfoFactory { .build(); } /** * Constructs an information instance of the credential provider for testing purposes. Does * not run any verifications and passes parameters as is. */ @VisibleForTesting public static CredentialProviderInfo createForTests( @NonNull ServiceInfo serviceInfo, @NonNull CharSequence overrideLabel, boolean isSystemProvider, boolean isEnabled, @NonNull List<String> capabilities) { return new CredentialProviderInfo.Builder(serviceInfo) .setEnabled(isEnabled) .setOverrideLabel(overrideLabel) .setSystemProvider(isSystemProvider) .addCapabilities(capabilities) .build(); } private static void verifyProviderPermission(ServiceInfo serviceInfo) throws SecurityException { final String permission = Manifest.permission.BIND_CREDENTIAL_PROVIDER_SERVICE; if (permission.equals(serviceInfo.permission)) { Loading Loading @@ -484,6 +505,31 @@ public final class CredentialProviderInfoFactory { return null; } /** * Returns a valid credential provider that has the given package name. Returns null if no * match is found. */ @Nullable public static CredentialProviderInfo getCredentialProviderFromPackageName( @NonNull Context context, int userId, @NonNull String packageName, int providerFilter, @NonNull Set<ServiceInfo> enabledServices) { requireNonNull(context, "context must not be null"); requireNonNull(packageName, "package name must not be null"); requireNonNull(enabledServices, "enabledServices must not be null"); for (CredentialProviderInfo credentialProviderInfo : getCredentialProviderServices(context, userId, providerFilter, enabledServices)) { if (credentialProviderInfo.getServiceInfo() .packageName.equals(packageName)) { return credentialProviderInfo; } } return null; } /** * Returns the valid credential provider services available for the user with the given {@code * userId}. Loading
services/credentials/java/com/android/server/credentials/CredentialDescriptionRegistry.java +18 −4 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ import java.util.Set; import java.util.concurrent.locks.ReentrantLock; /** Contains information on what CredentialProvider has what provisioned Credential. */ public final class CredentialDescriptionRegistry { public class CredentialDescriptionRegistry { private static final int MAX_ALLOWED_CREDENTIAL_DESCRIPTIONS = 128; private static final int MAX_ALLOWED_ENTRIES_PER_PROVIDER = 16; Loading @@ -54,7 +54,8 @@ public final class CredentialDescriptionRegistry { final String mFlattenedRequest; final List<CredentialEntry> mCredentialEntries; private FilterResult(String packageName, @VisibleForTesting FilterResult(String packageName, String flattenedRequest, List<CredentialEntry> credentialEntries) { mPackageName = packageName; Loading Loading @@ -92,10 +93,10 @@ public final class CredentialDescriptionRegistry { } } /** Clears an existing session for a given user identifier. */ /** Clears an existing session for a given user identifier. Used when testing only. */ @GuardedBy("sLock") @VisibleForTesting public static void clearAllSessions() { static void clearAllSessions() { sLock.lock(); try { sCredentialDescriptionSessionPerUser.clear(); Loading @@ -104,6 +105,19 @@ public final class CredentialDescriptionRegistry { } } /** Sets an existing session for a given user identifier. Used when testing only. */ @GuardedBy("sLock") @VisibleForTesting static void setSession(int userId, CredentialDescriptionRegistry credentialDescriptionRegistry) { sLock.lock(); try { sCredentialDescriptionSessionPerUser.put(userId, credentialDescriptionRegistry); } finally { sLock.unlock(); } } private Map<String, Set<CredentialDescription>> mCredentialDescriptions; private int mTotalDescriptionCount; Loading
services/credentials/java/com/android/server/credentials/CredentialManagerService.java +14 −8 Original line number Diff line number Diff line Loading @@ -296,6 +296,12 @@ public final class CredentialManagerService mContext, UserHandle.getCallingUserId(), session, CredentialProviderInfoFactory.getCredentialProviderFromPackageName( mContext, UserHandle.getCallingUserId() , result.second.mPackageName, CredentialManager.PROVIDER_FILTER_ALL_PROVIDERS, new HashSet<>()), session.mClientAppInfo, result.second.mPackageName, result.first)); } Loading Loading @@ -358,6 +364,14 @@ public final class CredentialManagerService return providerSessions; } private List<CredentialProviderInfo> getServicesForCredentialDescription(int userId) { return CredentialProviderInfoFactory.getCredentialProviderServices( mContext, userId, CredentialManager.PROVIDER_FILTER_ALL_PROVIDERS, new HashSet<>()); } @Override @GuardedBy("CredentialDescriptionRegistry.sLock") public void onUserStopped(@NonNull TargetUser user) { Loading Loading @@ -813,14 +827,6 @@ public final class CredentialManagerService session.executeUnregisterRequest(request, callingPackage); } private List<CredentialProviderInfo> getServicesForCredentialDescription(int userId) { return CredentialProviderInfoFactory.getCredentialProviderServices( mContext, userId, CredentialManager.PROVIDER_FILTER_ALL_PROVIDERS, new HashSet<>()); } } private void enforceCallingPackage(String callingPackage, int callingUid) { Loading
services/credentials/java/com/android/server/credentials/GetRequestSession.java +1 −1 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ import java.util.ArrayList; * Central session for a single getCredentials request. This class listens to the * responses from providers, and the UX app, and updates the provider(S) state. */ public final class GetRequestSession extends RequestSession<GetCredentialRequest, public class GetRequestSession extends RequestSession<GetCredentialRequest, IGetCredentialCallback> implements ProviderSession.ProviderInternalCallback<GetCredentialResponse> { private static final String TAG = "GetRequestSession"; Loading
services/credentials/java/com/android/server/credentials/ProviderRegistryGetSession.java +14 −5 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.annotation.UserIdInt; import android.content.Context; import android.content.Intent; import android.credentials.CredentialOption; import android.credentials.CredentialProviderInfo; import android.credentials.GetCredentialException; import android.credentials.GetCredentialResponse; import android.credentials.ui.Entry; Loading @@ -33,6 +34,8 @@ import android.service.credentials.CredentialEntry; import android.service.credentials.CredentialProviderService; import android.telecom.Log; import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.HashMap; import java.util.List; Loading @@ -52,7 +55,8 @@ public class ProviderRegistryGetSession extends ProviderSession<CredentialOption Set<CredentialDescriptionRegistry.FilterResult>> { private static final String TAG = "ProviderRegistryGetSession"; private static final String CREDENTIAL_ENTRY_KEY = "credential_key"; @VisibleForTesting static final String CREDENTIAL_ENTRY_KEY = "credential_key"; /** Creates a new provider session to be used by the request session. */ @Nullable Loading @@ -60,13 +64,16 @@ public class ProviderRegistryGetSession extends ProviderSession<CredentialOption @NonNull Context context, @UserIdInt int userId, @NonNull GetRequestSession getRequestSession, @NonNull CredentialProviderInfo credentialProviderInfo, @NonNull CallingAppInfo callingAppInfo, @NonNull String credentialProviderPackageName, @NonNull CredentialOption requestOption) { return new ProviderRegistryGetSession( context, userId, getRequestSession, getRequestSession.mClientAppInfo, credentialProviderInfo, callingAppInfo, credentialProviderPackageName, requestOption); } Loading @@ -81,15 +88,17 @@ public class ProviderRegistryGetSession extends ProviderSession<CredentialOption private final String mCredentialProviderPackageName; @NonNull private final String mFlattenedRequestOptionString; private List<CredentialEntry> mCredentialEntries; @VisibleForTesting List<CredentialEntry> mCredentialEntries; protected ProviderRegistryGetSession(@NonNull Context context, @NonNull int userId, @NonNull GetRequestSession session, @NonNull CredentialProviderInfo credentialProviderInfo, @NonNull CallingAppInfo callingAppInfo, @NonNull String servicePackageName, @NonNull CredentialOption requestOption) { super(context, null, requestOption, session, userId, null); super(context, credentialProviderInfo, requestOption, session, userId, null); mCredentialDescriptionRegistry = CredentialDescriptionRegistry.forUser(userId); mCallingAppInfo = callingAppInfo; mCredentialProviderPackageName = servicePackageName; Loading Loading @@ -183,7 +192,7 @@ public class ProviderRegistryGetSession extends ProviderSession<CredentialOption providerPendingIntentResponse.getResultData()); if (getCredentialResponse != null) { if (mCallbacks != null) { mCallbacks.onFinalResponseReceived(mComponentName, ((GetRequestSession) mCallbacks).onFinalResponseReceived(mComponentName, getCredentialResponse); } return; Loading