diff options
| author | 2023-01-13 03:34:35 +0000 | |
|---|---|---|
| committer | 2023-01-13 03:34:35 +0000 | |
| commit | c28af28dfba780462ff097654f05b9431e1e400f (patch) | |
| tree | 4785c8cd8416825e443356b483420febea8e6125 | |
| parent | 346c7a14b74a90b8e5d789fcfc744c007f1faefa (diff) | |
| parent | 51367f892d14b21a1625d62003b213b4d2e85481 (diff) | |
Merge "Log the Credential Manager api invocations."
5 files changed, 99 insertions, 19 deletions
diff --git a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java index 595d03d9845d..be60946dc655 100644 --- a/services/credentials/java/com/android/server/credentials/ClearRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/ClearRequestSession.java @@ -39,15 +39,17 @@ public final class ClearRequestSession extends RequestSession<ClearCredentialSta implements ProviderSession.ProviderInternalCallback<Void> { private static final String TAG = "GetRequestSession"; - public ClearRequestSession(Context context, int userId, + public ClearRequestSession(Context context, int userId, int callingUid, IClearCredentialStateCallback callback, ClearCredentialStateRequest request, CallingAppInfo callingAppInfo) { - super(context, userId, request, callback, RequestInfo.TYPE_UNDEFINED, callingAppInfo); + super(context, userId, callingUid, request, callback, RequestInfo.TYPE_UNDEFINED, + callingAppInfo); } /** * Creates a new provider session, and adds it list of providers that are contributing to * this session. + * * @return the provider session created within this request session, for the given provider * info. */ @@ -111,8 +113,10 @@ public final class ClearRequestSession extends RequestSession<ClearCredentialSta Log.i(TAG, "respondToClientWithResponseAndFinish"); try { mClientCallback.onSuccess(); + logApiCalled(RequestType.CLEAR_CREDENTIALS, /* isSuccessful */ true); } catch (RemoteException e) { Log.i(TAG, "Issue while propagating the response to the client"); + logApiCalled(RequestType.CLEAR_CREDENTIALS, /* isSuccessful */ false); } finishSession(); } @@ -124,10 +128,12 @@ public final class ClearRequestSession extends RequestSession<ClearCredentialSta } catch (RemoteException e) { e.printStackTrace(); } + logApiCalled(RequestType.CLEAR_CREDENTIALS, /* isSuccessful */ false); finishSession(); } + private void processResponses() { - for (ProviderSession session: mProviders.values()) { + for (ProviderSession session : mProviders.values()) { if (session.isProviderResponseSet()) { // If even one provider responded successfully, send back the response // TODO: Aggregate other exceptions diff --git a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java index 4b26ccdbcdb0..acfa491d72e1 100644 --- a/services/credentials/java/com/android/server/credentials/CreateRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/CreateRequestSession.java @@ -44,11 +44,12 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR implements ProviderSession.ProviderInternalCallback<CreateCredentialResponse> { private static final String TAG = "CreateRequestSession"; - CreateRequestSession(@NonNull Context context, int userId, + CreateRequestSession(@NonNull Context context, int userId, int callingUid, CreateCredentialRequest request, ICreateCredentialCallback callback, CallingAppInfo callingAppInfo) { - super(context, userId, request, callback, RequestInfo.TYPE_CREATE, callingAppInfo); + super(context, userId, callingUid, request, callback, RequestInfo.TYPE_CREATE, + callingAppInfo); } /** @@ -63,7 +64,7 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR RemoteCredentialService remoteCredentialService) { ProviderCreateSession providerCreateSession = ProviderCreateSession .createNewSession(mContext, mUserId, providerInfo, - this, remoteCredentialService); + this, remoteCredentialService); if (providerCreateSession != null) { Log.i(TAG, "In startProviderSession - provider session created and being added"); mProviders.put(providerCreateSession.getComponentName().flattenToString(), @@ -115,8 +116,10 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR Log.i(TAG, "respondToClientWithResponseAndFinish"); try { mClientCallback.onResponse(response); + logApiCalled(RequestType.CREATE_CREDENTIALS, /* isSuccessful */ true); } catch (RemoteException e) { Log.i(TAG, "Issue while responding to client: " + e.getMessage()); + logApiCalled(RequestType.CREATE_CREDENTIALS, /* isSuccessful */ false); } finishSession(); } @@ -128,6 +131,7 @@ public final class CreateRequestSession extends RequestSession<CreateCredentialR } catch (RemoteException e) { Log.i(TAG, "Issue while responding to client: " + e.getMessage()); } + logApiCalled(RequestType.CREATE_CREDENTIALS, /* isSuccessful */ false); finishSession(); } diff --git a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java index aefd300956d3..f76cf4993ebc 100644 --- a/services/credentials/java/com/android/server/credentials/CredentialManagerService.java +++ b/services/credentials/java/com/android/server/credentials/CredentialManagerService.java @@ -269,11 +269,13 @@ public final class CredentialManagerService ICancellationSignal cancelTransport = CancellationSignal.createTransport(); int userId = UserHandle.getCallingUserId(); + int callingUid = Binder.getCallingUid(); // New request session, scoped for this request only. final GetRequestSession session = new GetRequestSession( getContext(), userId, + callingUid, callback, request, constructCallingAppInfo(callingPackage, userId)); @@ -319,10 +321,12 @@ public final class CredentialManagerService // New request session, scoped for this request only. int userId = UserHandle.getCallingUserId(); + int callingUid = Binder.getCallingUid(); final CreateRequestSession session = new CreateRequestSession( getContext(), userId, + callingUid, request, callback, constructCallingAppInfo(callingPackage, userId)); @@ -434,10 +438,12 @@ public final class CredentialManagerService // New request session, scoped for this request only. int userId = UserHandle.getCallingUserId(); + int callingUid = Binder.getCallingUid(); final ClearRequestSession session = new ClearRequestSession( getContext(), userId, + callingUid, callback, request, constructCallingAppInfo(callingPackage, userId)); diff --git a/services/credentials/java/com/android/server/credentials/GetRequestSession.java b/services/credentials/java/com/android/server/credentials/GetRequestSession.java index bbd0376d6490..f7c590565ae3 100644 --- a/services/credentials/java/com/android/server/credentials/GetRequestSession.java +++ b/services/credentials/java/com/android/server/credentials/GetRequestSession.java @@ -41,10 +41,10 @@ public final class GetRequestSession extends RequestSession<GetCredentialRequest implements ProviderSession.ProviderInternalCallback<GetCredentialResponse> { private static final String TAG = "GetRequestSession"; - public GetRequestSession(Context context, int userId, + public GetRequestSession(Context context, int userId, int callingUid, IGetCredentialCallback callback, GetCredentialRequest request, CallingAppInfo callingAppInfo) { - super(context, userId, request, callback, RequestInfo.TYPE_GET, callingAppInfo); + super(context, userId, callingUid, request, callback, RequestInfo.TYPE_GET, callingAppInfo); } /** @@ -104,8 +104,10 @@ public final class GetRequestSession extends RequestSession<GetCredentialRequest private void respondToClientWithResponseAndFinish(GetCredentialResponse response) { try { mClientCallback.onResponse(response); + logApiCalled(RequestType.GET_CREDENTIALS, /* isSuccessful */ true); } catch (RemoteException e) { Log.i(TAG, "Issue while responding to client with a response : " + e.getMessage()); + logApiCalled(RequestType.GET_CREDENTIALS, /* isSuccessful */ false); } finishSession(); } @@ -117,6 +119,7 @@ public final class GetRequestSession extends RequestSession<GetCredentialRequest Log.i(TAG, "Issue while responding to client with error : " + e.getMessage()); } + logApiCalled(RequestType.GET_CREDENTIALS, /* isSuccessful */ false); finishSession(); } diff --git a/services/credentials/java/com/android/server/credentials/RequestSession.java b/services/credentials/java/com/android/server/credentials/RequestSession.java index 0c3c34e52d0f..8e44f0f198e5 100644 --- a/services/credentials/java/com/android/server/credentials/RequestSession.java +++ b/services/credentials/java/com/android/server/credentials/RequestSession.java @@ -16,6 +16,13 @@ package com.android.server.credentials; +import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_API_CALLED__API_NAME__API_NAME_CLEAR_CREDENTIAL; +import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_API_CALLED__API_NAME__API_NAME_CREATE_CREDENTIAL; +import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_API_CALLED__API_NAME__API_NAME_GET_CREDENTIAL; +import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_API_CALLED__API_NAME__API_NAME_UNKNOWN; +import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_API_CALLED__API_STATUS__API_STATUS_FAILURE; +import static com.android.internal.util.FrameworkStatsLog.CREDENTIAL_MANAGER_API_CALLED__API_STATUS__API_STATUS_SUCCESS; + import android.annotation.NonNull; import android.annotation.UserIdInt; import android.content.Context; @@ -29,6 +36,8 @@ import android.service.credentials.CallingAppInfo; import android.service.credentials.CredentialProviderInfo; import android.util.Log; +import com.android.internal.util.FrameworkStatsLog; + import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -37,28 +46,53 @@ import java.util.Map; * Base class of a request session, that listens to UI events. This class must be extended * every time a new response type is expected from the providers. */ -abstract class RequestSession<T, U> implements CredentialManagerUi.CredentialManagerUiCallback{ +abstract class RequestSession<T, U> implements CredentialManagerUi.CredentialManagerUiCallback { private static final String TAG = "RequestSession"; + // Metrics constants + private static final int METRICS_API_NAME_UNKNOWN = + CREDENTIAL_MANAGER_API_CALLED__API_NAME__API_NAME_UNKNOWN; + private static final int METRICS_API_NAME_GET_CREDENTIAL = + CREDENTIAL_MANAGER_API_CALLED__API_NAME__API_NAME_GET_CREDENTIAL; + private static final int METRICS_API_NAME_CREATE_CREDENTIAL = + CREDENTIAL_MANAGER_API_CALLED__API_NAME__API_NAME_CREATE_CREDENTIAL; + private static final int METRICS_API_NAME_CLEAR_CREDENTIAL = + CREDENTIAL_MANAGER_API_CALLED__API_NAME__API_NAME_CLEAR_CREDENTIAL; + private static final int METRICS_API_STATUS_SUCCESS = + CREDENTIAL_MANAGER_API_CALLED__API_STATUS__API_STATUS_SUCCESS; + private static final int METRICS_API_STATUS_FAILURE = + CREDENTIAL_MANAGER_API_CALLED__API_STATUS__API_STATUS_FAILURE; + // TODO: Revise access levels of attributes - @NonNull protected final T mClientRequest; - @NonNull protected final U mClientCallback; - @NonNull protected final IBinder mRequestId; - @NonNull protected final Context mContext; - @NonNull protected final CredentialManagerUi mCredentialManagerUi; - @NonNull protected final String mRequestType; - @NonNull protected final Handler mHandler; - @UserIdInt protected final int mUserId; - @NonNull protected final CallingAppInfo mClientAppInfo; + @NonNull + protected final T mClientRequest; + @NonNull + protected final U mClientCallback; + @NonNull + protected final IBinder mRequestId; + @NonNull + protected final Context mContext; + @NonNull + protected final CredentialManagerUi mCredentialManagerUi; + @NonNull + protected final String mRequestType; + @NonNull + protected final Handler mHandler; + @UserIdInt + protected final int mUserId; + private final int mCallingUid; + @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, + @UserIdInt int userId, int callingUid, @NonNull T clientRequest, U clientCallback, @NonNull String requestType, CallingAppInfo callingAppInfo) { mContext = context; mUserId = userId; + mCallingUid = callingUid; mClientRequest = clientRequest; mClientCallback = clientCallback; mRequestType = requestType; @@ -117,6 +151,33 @@ abstract class RequestSession<T, U> implements CredentialManagerUi.CredentialMan return false; } + // TODO: move these definitions to a separate logging focused class. + enum RequestType { + GET_CREDENTIALS, + CREATE_CREDENTIALS, + CLEAR_CREDENTIALS, + } + + private static int getApiNameFromRequestType(RequestType requestType) { + switch (requestType) { + case GET_CREDENTIALS: + return METRICS_API_NAME_GET_CREDENTIAL; + case CREATE_CREDENTIALS: + return METRICS_API_NAME_CREATE_CREDENTIAL; + case CLEAR_CREDENTIALS: + return METRICS_API_NAME_CLEAR_CREDENTIAL; + default: + return METRICS_API_NAME_UNKNOWN; + } + } + + protected void logApiCalled(RequestType requestType, boolean isSuccessful) { + FrameworkStatsLog.write(FrameworkStatsLog.CREDENTIAL_MANAGER_API_CALLED, + /* api_name */getApiNameFromRequestType(requestType), /* caller_uid */ + mCallingUid, /* api_status */ + isSuccessful ? METRICS_API_STATUS_SUCCESS : METRICS_API_STATUS_FAILURE); + } + /** * Returns true if at least one provider is ready for UI invocation, and no * provider is pending a response. |