Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c5bdc8a2 authored by Omer Ozer's avatar Omer Ozer Committed by Android (Google) Code Review
Browse files

Merge "[conflict] Merge "Adding tests for ProviderRegistryGetSession" into...

Merge "[conflict] Merge "Adding tests for ProviderRegistryGetSession" into udc-dev am: e9a096d2 am: c76ef54a"
parents aa774af2 014c3660
Loading
Loading
Loading
Loading
+46 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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)) {
@@ -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}.
+18 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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();
@@ -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;

+14 −8
Original line number Diff line number Diff line
@@ -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));
        }
@@ -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) {
@@ -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) {
+1 −1
Original line number Diff line number Diff line
@@ -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";
+14 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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
@@ -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);
    }
@@ -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;
@@ -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