Merge "Populate signatures to pass to credential provider"

This commit is contained in:
TreeHugger Robot
2023-01-07 00:35:01 +00:00
committed by Android (Google) Code Review
11 changed files with 78 additions and 65 deletions

View File

@@ -39834,10 +39834,10 @@ package android.service.credentials {
}
public final class CallingAppInfo implements android.os.Parcelable {
ctor public CallingAppInfo(@NonNull String, @NonNull java.util.Set<android.content.pm.Signature>);
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<android.content.pm.Signature> 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<android.service.credentials.CallingAppInfo> CREATOR;
}

View File

@@ -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<Signature> 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<Signature> 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<Signature> signatures = (ArraySet<Signature>) in.readArraySet(boot);
mSignatures = signatures == null ? new ArraySet<>() : signatures;
mSigningInfo = in.readTypedObject(SigningInfo.CREATOR);
}
public static final @NonNull Creator<CallingAppInfo> CREATOR = new Creator<CallingAppInfo>() {
@@ -72,9 +63,12 @@ public final class CallingAppInfo implements Parcelable {
return mPackageName;
}
/** Returns the Set of signatures belonging to the app */
@NonNull public Set<Signature> 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();
}
}

View File

@@ -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<Signature>()),
context.applicationInfo.packageName, SigningInfo()),
TYPE_PASSWORD_CREDENTIAL,
toBundle("beckett-bakert@gmail.com", "password123")
)

View File

@@ -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<ClearCredentialSta
public ClearRequestSession(Context context, int userId,
IClearCredentialStateCallback callback, ClearCredentialStateRequest request,
String callingPackage) {
super(context, userId, request, callback, RequestInfo.TYPE_UNDEFINED, callingPackage);
CallingAppInfo callingAppInfo) {
super(context, userId, request, callback, RequestInfo.TYPE_UNDEFINED, callingAppInfo);
}
/**

View File

@@ -27,6 +27,7 @@ import android.credentials.ICreateCredentialCallback;
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;
@@ -45,8 +46,8 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR
CreateRequestSession(@NonNull Context context, int userId,
CreateCredentialRequest request,
ICreateCredentialCallback callback,
String callingPackage) {
super(context, userId, request, callback, RequestInfo.TYPE_CREATE, callingPackage);
CallingAppInfo callingAppInfo) {
super(context, userId, request, callback, RequestInfo.TYPE_CREATE, callingAppInfo);
}
/**
@@ -75,7 +76,8 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR
try {
mClientCallback.onPendingIntent(mCredentialManagerUi.createPendingIntent(
RequestInfo.newCreateRequestInfo(
mRequestId, mClientRequest, mClientCallingPackage),
mRequestId, mClientRequest,
mClientAppInfo.getPackageName()),
providerDataList));
} catch (RemoteException e) {
Log.i(TAG, "Issue with invoking pending intent: " + e.getMessage());

View File

@@ -23,6 +23,7 @@ import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.credentials.ClearCredentialStateRequest;
import android.credentials.CreateCredentialRequest;
@@ -44,6 +45,7 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.service.credentials.BeginCreateCredentialRequest;
import android.service.credentials.BeginGetCredentialRequest;
import android.service.credentials.CallingAppInfo;
import android.service.credentials.CredentialProviderInfo;
import android.text.TextUtils;
import android.util.Log;
@@ -189,6 +191,20 @@ public final class CredentialManagerService
return providerSessions;
}
private CallingAppInfo constructCallingAppInfo(String packageName, int userId) {
final PackageInfo packageInfo;
try {
packageInfo = getContext().getPackageManager().getPackageInfoAsUser(
packageName,
PackageManager.PackageInfoFlags.of(PackageManager.GET_SIGNING_CERTIFICATES),
userId);
} catch (PackageManager.NameNotFoundException e) {
Log.i(TAG, "Issue while retrieving signatureInfo : " + e.getMessage());
return new CallingAppInfo(packageName, null);
}
return new CallingAppInfo(packageName, packageInfo.signingInfo);
}
final class CredentialManagerServiceStub extends ICredentialManager.Stub {
@Override
public ICancellationSignal executeGetCredential(
@@ -199,14 +215,15 @@ public final class CredentialManagerService
// TODO : Implement cancellation
ICancellationSignal cancelTransport = CancellationSignal.createTransport();
int userId = UserHandle.getCallingUserId();
// New request session, scoped for this request only.
final GetRequestSession session =
new GetRequestSession(
getContext(),
UserHandle.getCallingUserId(),
userId,
callback,
request,
callingPackage);
constructCallingAppInfo(callingPackage, userId));
// Initiate all provider sessions
List<ProviderSession> providerSessions =
@@ -252,13 +269,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<ProviderSession> providerSessions =
@@ -368,13 +386,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

View File

@@ -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<GetCredentialRequest
public GetRequestSession(Context context, int userId,
IGetCredentialCallback callback, GetCredentialRequest request,
String callingPackage) {
super(context, userId, request, callback, RequestInfo.TYPE_GET, callingPackage);
CallingAppInfo callingAppInfo) {
super(context, userId, request, callback, RequestInfo.TYPE_GET, callingAppInfo);
}
/**
@@ -85,7 +86,6 @@ public final class GetRequestSession extends RequestSession<GetCredentialRequest
super.onProviderStatusChanged(status, componentName);
}
@Override
public void onFinalResponseReceived(ComponentName componentName,
@Nullable GetCredentialResponse response) {

View File

@@ -25,7 +25,6 @@ import android.credentials.ui.ProviderPendingIntentResponse;
import android.service.credentials.CallingAppInfo;
import android.service.credentials.ClearCredentialStateRequest;
import android.service.credentials.CredentialProviderInfo;
import android.util.ArraySet;
import android.util.Log;
import android.util.Slog;
@@ -52,7 +51,7 @@ public final class ProviderClearSession extends ProviderSession<ClearCredentialS
ClearCredentialStateRequest providerRequest =
createProviderRequest(
clearRequestSession.mClientRequest,
clearRequestSession.mClientCallingPackage);
clearRequestSession.mClientAppInfo);
return new ProviderClearSession(context, providerInfo, clearRequestSession, userId,
remoteCredentialService, providerRequest);
}
@@ -60,11 +59,11 @@ public final class ProviderClearSession extends ProviderSession<ClearCredentialS
@Nullable
private static ClearCredentialStateRequest createProviderRequest(
android.credentials.ClearCredentialStateRequest clientRequest,
String clientCallingPackage
CallingAppInfo callingAppInfo
) {
// TODO: Determine if provider needs to declare clear capability in manifest
return new ClearCredentialStateRequest(
new CallingAppInfo(clientCallingPackage, new ArraySet<>()),
callingAppInfo,
clientRequest.getData());
}

View File

@@ -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<Signature>()));
createRequestSession.mClientAppInfo);
if (providerCreateRequest != null) {
BeginCreateCredentialRequest providerBeginCreateRequest =
new BeginCreateCredentialRequest(

View File

@@ -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<BeginGetCredential
getRequestSession.mClientRequest);
if (filteredRequest != null) {
BeginGetCredentialRequest beginGetCredentialRequest = constructQueryPhaseRequest(
filteredRequest, getRequestSession.mClientCallingPackage);
filteredRequest, getRequestSession.mClientAppInfo);
return new ProviderGetSession(context, providerInfo, getRequestSession, userId,
remoteCredentialService, beginGetCredentialRequest, filteredRequest);
}
@@ -107,11 +104,9 @@ public final class ProviderGetSession extends ProviderSession<BeginGetCredential
private static BeginGetCredentialRequest constructQueryPhaseRequest(
android.credentials.GetCredentialRequest filteredRequest,
String clientCallingPackage
CallingAppInfo callingAppInfo
) {
return new BeginGetCredentialRequest.Builder(
new CallingAppInfo(clientCallingPackage,
new ArraySet<Signature>()))
return new BeginGetCredentialRequest.Builder(callingAppInfo)
.setBeginGetCredentialOptions(
filteredRequest.getGetCredentialOptions().stream().map(
option -> {

View File

@@ -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<T, U> 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<String, ProviderSession> 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,