Merge "Remove capability checks for cred desc apis." into udc-dev

This commit is contained in:
Omer Ozer
2023-03-09 05:12:27 +00:00
committed by Android (Google) Code Review
7 changed files with 17 additions and 83 deletions

View File

@@ -33,7 +33,6 @@ import android.content.pm.ServiceInfo;
import android.credentials.ClearCredentialStateRequest; import android.credentials.ClearCredentialStateRequest;
import android.credentials.CreateCredentialException; import android.credentials.CreateCredentialException;
import android.credentials.CreateCredentialRequest; import android.credentials.CreateCredentialRequest;
import android.credentials.CredentialDescription;
import android.credentials.CredentialManager; import android.credentials.CredentialManager;
import android.credentials.CredentialOption; import android.credentials.CredentialOption;
import android.credentials.CredentialProviderInfo; import android.credentials.CredentialProviderInfo;
@@ -296,11 +295,6 @@ public final class CredentialManagerService
mContext, mContext,
UserHandle.getCallingUserId(), UserHandle.getCallingUserId(),
session, session,
CredentialProviderInfoFactory.getCredentialProviderFromPackageName(
mContext, UserHandle.getCallingUserId() ,
result.second.mPackageName,
CredentialManager.PROVIDER_FILTER_ALL_PROVIDERS,
new HashSet<>()),
session.mClientAppInfo, session.mClientAppInfo,
result.second.mPackageName, result.second.mPackageName,
result.first)); result.first));
@@ -752,44 +746,6 @@ public final class CredentialManagerService
enforceCallingPackage(callingPackage, Binder.getCallingUid()); enforceCallingPackage(callingPackage, Binder.getCallingUid());
List<CredentialProviderInfo> services =
getServicesForCredentialDescription(UserHandle.getCallingUserId());
List<String> providers =
services.stream()
.map(
credentialProviderInfo ->
credentialProviderInfo.getServiceInfo().packageName)
.toList();
if (!providers.contains(callingPackage)) {
throw new NonCredentialProviderCallerException(callingPackage);
}
List<CredentialProviderInfo> matchingService =
services.stream()
.filter(
credentialProviderInfo ->
credentialProviderInfo
.getServiceInfo()
.packageName
.equals(callingPackage))
.toList();
CredentialProviderInfo credentialProviderInfo = matchingService.get(0);
Set<String> supportedTypes =
request.getCredentialDescriptions().stream()
.map(CredentialDescription::getType)
.filter(credentialProviderInfo::hasCapability)
.collect(Collectors.toSet());
if (supportedTypes.size() != request.getCredentialDescriptions().size()) {
throw new IllegalArgumentException(
"CredentialProvider does not support one or more"
+ "of the registered types. Check your XML entry.");
}
CredentialDescriptionRegistry session = CredentialDescriptionRegistry session =
CredentialDescriptionRegistry.forUser(UserHandle.getCallingUserId()); CredentialDescriptionRegistry.forUser(UserHandle.getCallingUserId());
@@ -808,20 +764,6 @@ public final class CredentialManagerService
enforceCallingPackage(callingPackage, Binder.getCallingUid()); enforceCallingPackage(callingPackage, Binder.getCallingUid());
List<CredentialProviderInfo> services =
getServicesForCredentialDescription(UserHandle.getCallingUserId());
List<String> providers =
services.stream()
.map(
credentialProviderInfo ->
credentialProviderInfo.getServiceInfo().packageName)
.toList();
if (!providers.contains(callingPackage)) {
throw new NonCredentialProviderCallerException(callingPackage);
}
CredentialDescriptionRegistry session = CredentialDescriptionRegistry session =
CredentialDescriptionRegistry.forUser(UserHandle.getCallingUserId()); CredentialDescriptionRegistry.forUser(UserHandle.getCallingUserId());

View File

@@ -72,7 +72,8 @@ public final class ProviderClearSession extends ProviderSession<ClearCredential
ProviderInternalCallback callbacks, ProviderInternalCallback callbacks,
int userId, RemoteCredentialService remoteCredentialService, int userId, RemoteCredentialService remoteCredentialService,
ClearCredentialStateRequest providerRequest) { ClearCredentialStateRequest providerRequest) {
super(context, info, providerRequest, callbacks, userId, remoteCredentialService); super(context, providerRequest, callbacks, info.getComponentName(),
userId, remoteCredentialService);
setStatus(Status.PENDING); setStatus(Status.PENDING);
} }
@@ -95,7 +96,7 @@ public final class ProviderClearSession extends ProviderSession<ClearCredential
/** Called when provider service dies. */ /** Called when provider service dies. */
@Override // Callback from the remote provider @Override // Callback from the remote provider
public void onProviderServiceDied(RemoteCredentialService service) { public void onProviderServiceDied(RemoteCredentialService service) {
if (service.getComponentName().equals(mProviderInfo.getServiceInfo().getComponentName())) { if (service.getComponentName().equals(mComponentName)) {
updateStatusAndInvokeCallback(Status.SERVICE_DEAD); updateStatusAndInvokeCallback(Status.SERVICE_DEAD);
} else { } else {
Slog.i(TAG, "Component names different in onProviderServiceDied - " Slog.i(TAG, "Component names different in onProviderServiceDied - "

View File

@@ -133,7 +133,7 @@ public final class ProviderCreateSession extends ProviderSession<
@NonNull BeginCreateCredentialRequest beginCreateRequest, @NonNull BeginCreateCredentialRequest beginCreateRequest,
@NonNull CreateCredentialRequest completeCreateRequest, @NonNull CreateCredentialRequest completeCreateRequest,
String hybridService) { String hybridService) {
super(context, info, beginCreateRequest, callbacks, userId, super(context, beginCreateRequest, callbacks, info.getComponentName(), userId,
remoteCredentialService); remoteCredentialService);
mCompleteRequest = completeCreateRequest; mCompleteRequest = completeCreateRequest;
setStatus(Status.PENDING); setStatus(Status.PENDING);
@@ -161,7 +161,7 @@ public final class ProviderCreateSession extends ProviderSession<
/** Called when provider service dies. */ /** Called when provider service dies. */
@Override @Override
public void onProviderServiceDied(RemoteCredentialService service) { public void onProviderServiceDied(RemoteCredentialService service) {
if (service.getComponentName().equals(mProviderInfo.getServiceInfo().getComponentName())) { if (service.getComponentName().equals(mComponentName)) {
updateStatusAndInvokeCallback(Status.SERVICE_DEAD); updateStatusAndInvokeCallback(Status.SERVICE_DEAD);
} else { } else {
Slog.i(TAG, "Component names different in onProviderServiceDied - " Slog.i(TAG, "Component names different in onProviderServiceDied - "

View File

@@ -169,7 +169,8 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
CallingAppInfo callingAppInfo, CallingAppInfo callingAppInfo,
Map<String, CredentialOption> beginGetOptionToCredentialOptionMap, Map<String, CredentialOption> beginGetOptionToCredentialOptionMap,
String hybridService) { String hybridService) {
super(context, info, beginGetRequest, callbacks, userId, remoteCredentialService); super(context, beginGetRequest, callbacks, info.getComponentName() ,
userId, remoteCredentialService);
mCompleteRequest = completeGetRequest; mCompleteRequest = completeGetRequest;
mCallingAppInfo = callingAppInfo; mCallingAppInfo = callingAppInfo;
setStatus(Status.PENDING); setStatus(Status.PENDING);
@@ -196,7 +197,7 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
/** Called when provider service dies. */ /** Called when provider service dies. */
@Override // Callback from the remote provider @Override // Callback from the remote provider
public void onProviderServiceDied(RemoteCredentialService service) { public void onProviderServiceDied(RemoteCredentialService service) {
if (service.getComponentName().equals(mProviderInfo.getServiceInfo().getComponentName())) { if (service.getComponentName().equals(mComponentName)) {
updateStatusAndInvokeCallback(Status.SERVICE_DEAD); updateStatusAndInvokeCallback(Status.SERVICE_DEAD);
} else { } else {
Slog.i(TAG, "Component names different in onProviderServiceDied - " Slog.i(TAG, "Component names different in onProviderServiceDied - "

View File

@@ -19,10 +19,10 @@ package com.android.server.credentials;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.annotation.UserIdInt; import android.annotation.UserIdInt;
import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.credentials.CredentialOption; import android.credentials.CredentialOption;
import android.credentials.CredentialProviderInfo;
import android.credentials.GetCredentialException; import android.credentials.GetCredentialException;
import android.credentials.GetCredentialResponse; import android.credentials.GetCredentialResponse;
import android.credentials.ui.Entry; import android.credentials.ui.Entry;
@@ -64,7 +64,6 @@ public class ProviderRegistryGetSession extends ProviderSession<CredentialOption
@NonNull Context context, @NonNull Context context,
@UserIdInt int userId, @UserIdInt int userId,
@NonNull GetRequestSession getRequestSession, @NonNull GetRequestSession getRequestSession,
@NonNull CredentialProviderInfo credentialProviderInfo,
@NonNull CallingAppInfo callingAppInfo, @NonNull CallingAppInfo callingAppInfo,
@NonNull String credentialProviderPackageName, @NonNull String credentialProviderPackageName,
@NonNull CredentialOption requestOption) { @NonNull CredentialOption requestOption) {
@@ -72,7 +71,6 @@ public class ProviderRegistryGetSession extends ProviderSession<CredentialOption
context, context,
userId, userId,
getRequestSession, getRequestSession,
credentialProviderInfo,
callingAppInfo, callingAppInfo,
credentialProviderPackageName, credentialProviderPackageName,
requestOption); requestOption);
@@ -94,11 +92,12 @@ public class ProviderRegistryGetSession extends ProviderSession<CredentialOption
protected ProviderRegistryGetSession(@NonNull Context context, protected ProviderRegistryGetSession(@NonNull Context context,
@NonNull int userId, @NonNull int userId,
@NonNull GetRequestSession session, @NonNull GetRequestSession session,
@NonNull CredentialProviderInfo credentialProviderInfo,
@NonNull CallingAppInfo callingAppInfo, @NonNull CallingAppInfo callingAppInfo,
@NonNull String servicePackageName, @NonNull String servicePackageName,
@NonNull CredentialOption requestOption) { @NonNull CredentialOption requestOption) {
super(context, credentialProviderInfo, requestOption, session, userId, null); super(context, requestOption, session,
new ComponentName(servicePackageName, servicePackageName) ,
userId, null);
mCredentialDescriptionRegistry = CredentialDescriptionRegistry.forUser(userId); mCredentialDescriptionRegistry = CredentialDescriptionRegistry.forUser(userId);
mCallingAppInfo = callingAppInfo; mCallingAppInfo = callingAppInfo;
mCredentialProviderPackageName = servicePackageName; mCredentialProviderPackageName = servicePackageName;

View File

@@ -114,17 +114,18 @@ public abstract class ProviderSession<T, R>
@Nullable String message); @Nullable String message);
} }
protected ProviderSession(@NonNull Context context, @Nullable CredentialProviderInfo info, protected ProviderSession(@NonNull Context context,
@NonNull T providerRequest, @NonNull T providerRequest,
@Nullable ProviderInternalCallback callbacks, @Nullable ProviderInternalCallback callbacks,
@NonNull ComponentName componentName,
@NonNull int userId, @NonNull int userId,
@Nullable RemoteCredentialService remoteCredentialService) { @Nullable RemoteCredentialService remoteCredentialService) {
mContext = context; mContext = context;
mProviderInfo = info; mProviderInfo = null;
mProviderRequest = providerRequest; mProviderRequest = providerRequest;
mCallbacks = callbacks; mCallbacks = callbacks;
mUserId = userId; mUserId = userId;
mComponentName = info.getServiceInfo().getComponentName(); mComponentName = componentName;
mRemoteCredentialService = remoteCredentialService; mRemoteCredentialService = remoteCredentialService;
mCandidateProviderMetric = new CandidatePhaseMetric(); mCandidateProviderMetric = new CandidatePhaseMetric();
mProviderSessionUid = MetricUtilities.getPackageUid(mContext, mComponentName); mProviderSessionUid = MetricUtilities.getPackageUid(mContext, mComponentName);

View File

@@ -36,7 +36,6 @@ import android.content.pm.SigningDetails;
import android.content.pm.SigningInfo; import android.content.pm.SigningInfo;
import android.credentials.Credential; import android.credentials.Credential;
import android.credentials.CredentialOption; import android.credentials.CredentialOption;
import android.credentials.CredentialProviderInfo;
import android.credentials.GetCredentialException; import android.credentials.GetCredentialException;
import android.credentials.GetCredentialResponse; import android.credentials.GetCredentialResponse;
import android.credentials.ui.GetCredentialProviderData; import android.credentials.ui.GetCredentialProviderData;
@@ -45,7 +44,6 @@ import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.service.credentials.CallingAppInfo; import android.service.credentials.CallingAppInfo;
import android.service.credentials.CredentialEntry; import android.service.credentials.CredentialEntry;
import android.service.credentials.CredentialProviderInfoFactory;
import android.service.credentials.CredentialProviderService; import android.service.credentials.CredentialProviderService;
import android.service.credentials.GetCredentialRequest; import android.service.credentials.GetCredentialRequest;
@@ -61,7 +59,6 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@@ -89,7 +86,6 @@ public class ProviderRegistryGetSessionTest {
@Mock private GetRequestSession mGetRequestSession; @Mock private GetRequestSession mGetRequestSession;
private CredentialOption mGetCredentialOption; private CredentialOption mGetCredentialOption;
@Mock private ServiceInfo mServiceInfo; @Mock private ServiceInfo mServiceInfo;
private CredentialProviderInfo mCredentialProviderInfo;
private CallingAppInfo mCallingAppInfo; private CallingAppInfo mCallingAppInfo;
@Mock private CredentialDescriptionRegistry mCredentialDescriptionRegistry; @Mock private CredentialDescriptionRegistry mCredentialDescriptionRegistry;
private Bundle mRetrievalData; private Bundle mRetrievalData;
@@ -111,12 +107,6 @@ public class ProviderRegistryGetSessionTest {
mGetCredentialOption = new CredentialOption(CREDENTIAL_TYPE, mRetrievalData, mGetCredentialOption = new CredentialOption(CREDENTIAL_TYPE, mRetrievalData,
new Bundle(), false); new Bundle(), false);
when(mServiceInfo.getComponentName()).thenReturn(CREDENTIAL_PROVIDER_COMPONENT); when(mServiceInfo.getComponentName()).thenReturn(CREDENTIAL_PROVIDER_COMPONENT);
mCredentialProviderInfo = CredentialProviderInfoFactory
.createForTests(mServiceInfo,
/* overrideLabel= */ "test",
/* isSystemProvider= */ false,
/* isEnabled= */ true,
/* capabilities= */ Collections.EMPTY_LIST);
CredentialDescriptionRegistry.setSession(USER_ID_1, mCredentialDescriptionRegistry); CredentialDescriptionRegistry.setSession(USER_ID_1, mCredentialDescriptionRegistry);
mResponse = new HashSet<>(); mResponse = new HashSet<>();
mSlice = createSlice(); mSlice = createSlice();
@@ -130,7 +120,7 @@ public class ProviderRegistryGetSessionTest {
when(mCredentialDescriptionRegistry.getFilteredResultForProvider(anyString(), anyString())) when(mCredentialDescriptionRegistry.getFilteredResultForProvider(anyString(), anyString()))
.thenReturn(mResponse); .thenReturn(mResponse);
mProviderRegistryGetSession = ProviderRegistryGetSession mProviderRegistryGetSession = ProviderRegistryGetSession
.createNewSession(context, USER_ID_1, mGetRequestSession, mCredentialProviderInfo, .createNewSession(context, USER_ID_1, mGetRequestSession,
mCallingAppInfo, mCallingAppInfo,
CALLING_PACKAGE_NAME, CALLING_PACKAGE_NAME,
mGetCredentialOption); mGetCredentialOption);