Populate signatures to pass to credential provider
Test: Built & deployed locally Bug: 264598550 Change-Id: I57ca9647dd315fdc7bc4ba14660f766a18fb66e7
This commit is contained in:
@@ -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<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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
@@ -43,6 +44,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;
|
||||
@@ -187,6 +189,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(
|
||||
@@ -197,14 +213,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 =
|
||||
@@ -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<ProviderSession> 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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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 -> {
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user