From 532b53f1856439a8de3afb25a4cd777be057232b Mon Sep 17 00:00:00 2001 From: Reema Bajwa Date: Sat, 24 Dec 2022 21:35:28 +0000 Subject: [PATCH] Populate signatures to pass to credential provider Test: Built & deployed locally Bug: 264598550 Change-Id: I57ca9647dd315fdc7bc4ba14660f766a18fb66e7 --- core/api/current.txt | 4 +- .../service/credentials/CallingAppInfo.java | 48 +++++++++---------- .../CredentialManagerRepo.kt | 11 ++--- .../credentials/ClearRequestSession.java | 5 +- .../credentials/CreateRequestSession.java | 8 ++-- .../credentials/CredentialManagerService.java | 31 +++++++++--- .../server/credentials/GetRequestSession.java | 6 +-- .../credentials/ProviderClearSession.java | 7 ++- .../credentials/ProviderCreateSession.java | 5 +- .../credentials/ProviderGetSession.java | 11 ++--- .../server/credentials/RequestSession.java | 7 +-- 11 files changed, 78 insertions(+), 65 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index 5dd1b3938f40b..2c2076d65f010 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -39811,10 +39811,10 @@ package android.service.credentials { } public final class CallingAppInfo implements android.os.Parcelable { - ctor public CallingAppInfo(@NonNull String, @NonNull java.util.Set); + ctor public CallingAppInfo(@NonNull String, @NonNull android.content.pm.SigningInfo); method public int describeContents(); method @NonNull public String getPackageName(); - method @NonNull public java.util.Set getSignatures(); + method @NonNull public android.content.pm.SigningInfo getSigningInfo(); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; } diff --git a/core/java/android/service/credentials/CallingAppInfo.java b/core/java/android/service/credentials/CallingAppInfo.java index 6116726959ba0..53d24b1d645b0 100644 --- a/core/java/android/service/credentials/CallingAppInfo.java +++ b/core/java/android/service/credentials/CallingAppInfo.java @@ -17,15 +17,9 @@ package android.service.credentials; import android.annotation.NonNull; -import android.content.pm.Signature; +import android.content.pm.SigningInfo; import android.os.Parcel; import android.os.Parcelable; -import android.util.ArraySet; - -import com.android.internal.util.Preconditions; - -import java.util.Objects; -import java.util.Set; /** * Information pertaining to the calling application, including the package name and a list of @@ -33,26 +27,23 @@ import java.util.Set; */ public final class CallingAppInfo implements Parcelable { @NonNull private final String mPackageName; - @NonNull private final Set mSignatures; + @NonNull private final SigningInfo mSigningInfo; /** * Constructs a new instance. * * @throws IllegalArgumentException If {@code packageName} is null or empty. - * @throws NullPointerException If {@code signatures} is null. + * @throws NullPointerException If {@code signingInfo} is null. */ public CallingAppInfo(@NonNull String packageName, - @NonNull Set signatures) { - mPackageName = Preconditions.checkStringNotEmpty(packageName, - "packageName must not be null or empty"); - mSignatures = Objects.requireNonNull(signatures); + @NonNull SigningInfo signingInfo) { + mPackageName = packageName; + mSigningInfo = signingInfo; } private CallingAppInfo(@NonNull Parcel in) { - final ClassLoader boot = Object.class.getClassLoader(); mPackageName = in.readString8(); - ArraySet signatures = (ArraySet) in.readArraySet(boot); - mSignatures = signatures == null ? new ArraySet<>() : signatures; + mSigningInfo = in.readTypedObject(SigningInfo.CREATOR); } public static final @NonNull Creator CREATOR = new Creator() { @@ -72,9 +63,12 @@ public final class CallingAppInfo implements Parcelable { return mPackageName; } - /** Returns the Set of signatures belonging to the app */ - @NonNull public Set getSignatures() { - return mSignatures; + /** + * Returns the SigningInfo object that contains an array of + * {@link android.content.pm.Signature} belonging to the app. + */ + @NonNull public SigningInfo getSigningInfo() { + return mSigningInfo; } @Override @@ -85,14 +79,20 @@ public final class CallingAppInfo implements Parcelable { @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeString8(mPackageName); - dest.writeArraySet(new ArraySet<>(mSignatures)); + dest.writeTypedObject(mSigningInfo, flags); } @Override public String toString() { - return "CallingAppInfo {" - + "packageName= " + mPackageName - + ", No. of signatures: " + mSignatures.size() - + " }"; + StringBuilder builder = new StringBuilder("CallingAppInfo {" + + "packageName= " + mPackageName); + if (mSigningInfo != null) { + builder.append(", mSigningInfo : No. of signatures: " + mSigningInfo + .getApkContentsSigners().length); + } else { + builder.append(", mSigningInfo: null"); + } + builder.append(" }"); + return builder.toString(); } } diff --git a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt index 9b8443dd7c5bf..7b467ff8fafc6 100644 --- a/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt +++ b/packages/CredentialManager/src/com/android/credentialmanager/CredentialManagerRepo.kt @@ -16,14 +16,14 @@ package com.android.credentialmanager -import android.credentials.Credential.TYPE_PASSWORD_CREDENTIAL import android.app.PendingIntent import android.app.slice.Slice import android.app.slice.SliceSpec import android.content.Context import android.content.Intent -import android.content.pm.Signature +import android.content.pm.SigningInfo import android.credentials.CreateCredentialRequest +import android.credentials.Credential.TYPE_PASSWORD_CREDENTIAL import android.credentials.GetCredentialOption import android.credentials.GetCredentialRequest import android.credentials.ui.Constants @@ -41,10 +41,9 @@ import android.os.Binder import android.os.Bundle import android.os.ResultReceiver import android.service.credentials.CredentialProviderService -import android.util.ArraySet -import com.android.credentialmanager.createflow.RequestDisplayInfo -import com.android.credentialmanager.createflow.EnabledProviderInfo import com.android.credentialmanager.createflow.DisabledProviderInfo +import com.android.credentialmanager.createflow.EnabledProviderInfo +import com.android.credentialmanager.createflow.RequestDisplayInfo import com.android.credentialmanager.getflow.GetCredentialUiState import com.android.credentialmanager.jetpack.developer.CreatePasswordRequest.Companion.toBundle import com.android.credentialmanager.jetpack.developer.CreatePublicKeyCredentialRequest @@ -351,7 +350,7 @@ class CredentialManagerRepo( or PendingIntent.FLAG_ONE_SHOT)) val createPasswordRequest = android.service.credentials.CreateCredentialRequest( android.service.credentials.CallingAppInfo( - context.applicationInfo.packageName, ArraySet()), + context.applicationInfo.packageName, SigningInfo()), TYPE_PASSWORD_CREDENTIAL, toBundle("beckett-bakert@gmail.com", "password123") ) diff --git a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java index 6b254bf82cf61..2141d5188f707 100644 --- a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java @@ -24,6 +24,7 @@ import android.credentials.IClearCredentialStateCallback; import android.credentials.ui.ProviderData; import android.credentials.ui.RequestInfo; import android.os.RemoteException; +import android.service.credentials.CallingAppInfo; import android.service.credentials.CredentialProviderInfo; import android.util.Log; @@ -40,8 +41,8 @@ public final class ClearRequestSession extends RequestSession providerSessions = @@ -242,13 +259,14 @@ public final class CredentialManagerService ICancellationSignal cancelTransport = CancellationSignal.createTransport(); // New request session, scoped for this request only. + int userId = UserHandle.getCallingUserId(); final CreateRequestSession session = new CreateRequestSession( getContext(), - UserHandle.getCallingUserId(), + userId, request, callback, - callingPackage); + constructCallingAppInfo(callingPackage, userId)); // Initiate all provider sessions List providerSessions = @@ -352,13 +370,14 @@ public final class CredentialManagerService ICancellationSignal cancelTransport = CancellationSignal.createTransport(); // New request session, scoped for this request only. + int userId = UserHandle.getCallingUserId(); final ClearRequestSession session = new ClearRequestSession( getContext(), - UserHandle.getCallingUserId(), + userId, callback, request, - callingPackage); + constructCallingAppInfo(callingPackage, userId)); // Initiate all provider sessions // TODO: Determine if provider needs to have clear capability in their manifest diff --git a/services/credentials/java/com/android/server/credentials/GetRequestSession.java b/services/credentials/java/com/android/server/credentials/GetRequestSession.java index 5076d74441845..09ff2afabeb1d 100644 --- a/services/credentials/java/com/android/server/credentials/GetRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/GetRequestSession.java @@ -25,6 +25,7 @@ import android.credentials.IGetCredentialCallback; import android.credentials.ui.ProviderData; import android.credentials.ui.RequestInfo; import android.os.RemoteException; +import android.service.credentials.CallingAppInfo; import android.service.credentials.CredentialProviderInfo; import android.util.Log; @@ -41,8 +42,8 @@ public final class GetRequestSession extends RequestSession()), + callingAppInfo, clientRequest.getData()); } diff --git a/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java b/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java index 17a47ec32dfa1..5089de88b2779 100644 --- a/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java +++ b/services/credentials/java/com/android/server/credentials/ProviderCreateSession.java @@ -22,7 +22,6 @@ import android.annotation.UserIdInt; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.content.pm.Signature; import android.credentials.CreateCredentialException; import android.credentials.ui.CreateCredentialProviderData; import android.credentials.ui.Entry; @@ -34,7 +33,6 @@ import android.service.credentials.CreateCredentialRequest; import android.service.credentials.CreateEntry; import android.service.credentials.CredentialProviderInfo; import android.service.credentials.CredentialProviderService; -import android.util.ArraySet; import android.util.Log; import android.util.Slog; @@ -71,8 +69,7 @@ public final class ProviderCreateSession extends ProviderSession< CreateCredentialRequest providerCreateRequest = createProviderRequest(providerInfo.getCapabilities(), createRequestSession.mClientRequest, - new CallingAppInfo(createRequestSession.mClientCallingPackage, - new ArraySet())); + createRequestSession.mClientAppInfo); if (providerCreateRequest != null) { BeginCreateCredentialRequest providerBeginCreateRequest = new BeginCreateCredentialRequest( diff --git a/services/credentials/java/com/android/server/credentials/ProviderGetSession.java b/services/credentials/java/com/android/server/credentials/ProviderGetSession.java index 4a614a69f58a6..e6e81bb20db27 100644 --- a/services/credentials/java/com/android/server/credentials/ProviderGetSession.java +++ b/services/credentials/java/com/android/server/credentials/ProviderGetSession.java @@ -22,7 +22,6 @@ import android.annotation.UserIdInt; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.content.pm.Signature; import android.credentials.GetCredentialException; import android.credentials.GetCredentialOption; import android.credentials.GetCredentialResponse; @@ -39,7 +38,6 @@ import android.service.credentials.CredentialProviderInfo; import android.service.credentials.CredentialProviderService; import android.service.credentials.CredentialsResponseContent; import android.service.credentials.GetCredentialRequest; -import android.util.ArraySet; import android.util.Log; import android.util.Pair; import android.util.Slog; @@ -96,8 +94,7 @@ public final class ProviderGetSession extends ProviderSession())) + return new BeginGetCredentialRequest.Builder(callingAppInfo) .setBeginGetCredentialOptions( filteredRequest.getGetCredentialOptions().stream().map( option -> { diff --git a/services/credentials/java/com/android/server/credentials/RequestSession.java b/services/credentials/java/com/android/server/credentials/RequestSession.java index 7fcea35e4f8f2..f59a0efa9b72d 100644 --- a/services/credentials/java/com/android/server/credentials/RequestSession.java +++ b/services/credentials/java/com/android/server/credentials/RequestSession.java @@ -26,6 +26,7 @@ import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.os.Looper; +import android.service.credentials.CallingAppInfo; import android.service.credentials.CredentialProviderInfo; import android.util.Log; @@ -49,20 +50,20 @@ abstract class RequestSession implements CredentialManagerUi.CredentialMan @NonNull protected final String mRequestType; @NonNull protected final Handler mHandler; @UserIdInt protected final int mUserId; - @NonNull protected final String mClientCallingPackage; + @NonNull protected final CallingAppInfo mClientAppInfo; protected final Map mProviders = new HashMap<>(); protected RequestSession(@NonNull Context context, @UserIdInt int userId, @NonNull T clientRequest, U clientCallback, @NonNull String requestType, - String clientCallingPackage) { + CallingAppInfo callingAppInfo) { mContext = context; mUserId = userId; mClientRequest = clientRequest; mClientCallback = clientCallback; mRequestType = requestType; - mClientCallingPackage = clientCallingPackage; + mClientAppInfo = callingAppInfo; mHandler = new Handler(Looper.getMainLooper(), null, true); mRequestId = new Binder(); mCredentialManagerUi = new CredentialManagerUi(mContext,