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

Commit cb33d536 authored by John Wu's avatar John Wu
Browse files

Add attribution tag to checkAccessibilityAccess

Bug: 190659583
Test: build/flash
Change-Id: Ic6b3e92fb2d064939f83aa6aa7e5747f268e60ab
parent 883e4844
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -2405,6 +2405,14 @@ public abstract class AccessibilityService extends Service {
                    if (connection != null) {
                        AccessibilityInteractionClient.getInstance(mContext).addConnection(
                                mConnectionId, connection);
                        if (mContext != null) {
                            try {
                                connection.setAttributionTag(mContext.getAttributionTag());
                            } catch (RemoteException re) {
                                Log.w(LOG_TAG, "Error while setting attributionTag", re);
                                re.rethrowFromSystemServer();
                            }
                        }
                        mCallback.init(mConnectionId, windowToken);
                        mCallback.onServiceConnected();
                    } else {
+2 −0
Original line number Diff line number Diff line
@@ -39,6 +39,8 @@ interface IAccessibilityServiceConnection {

    void setServiceInfo(in AccessibilityServiceInfo info);

    void setAttributionTag(in String attributionTag);

    String[] findAccessibilityNodeInfoByAccessibilityId(int accessibilityWindowId,
        long accessibilityNodeId, int interactionId,
        IAccessibilityInteractionConnectionCallback callback, int flags, long threadId,
+2 −0
Original line number Diff line number Diff line
@@ -34,6 +34,8 @@ import java.util.List;
public class AccessibilityServiceConnectionImpl extends IAccessibilityServiceConnection.Stub {
    public void setServiceInfo(AccessibilityServiceInfo info) {}

    public void setAttributionTag(String attributionTag) {}

    public String[] findAccessibilityNodeInfoByAccessibilityId(int accessibilityWindowId,
            long accessibilityNodeId, int interactionId,
            IAccessibilityInteractionConnectionCallback callback, int flags, long threadId,
+12 −0
Original line number Diff line number Diff line
@@ -139,6 +139,9 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
    protected final AccessibilitySecurityPolicy mSecurityPolicy;
    protected final AccessibilityTrace mTrace;

    // The attribution tag set by the service that is bound to this instance
    protected String mAttributionTag;

    // The service that's bound to this instance. Whenever this value is non-null, this
    // object is registered as a death recipient
    IBinder mService;
@@ -419,6 +422,15 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
        }
    }

    @Override
    public void setAttributionTag(String attributionTag) {
        mAttributionTag = attributionTag;
    }

    String getAttributionTag() {
        return mAttributionTag;
    }

    protected abstract boolean hasRightsToCurrentUserLocked();

    @Nullable
+7 −3
Original line number Diff line number Diff line
@@ -534,7 +534,8 @@ public class AccessibilitySecurityPolicy {

        int servicePackageUid = serviceInfo.applicationInfo.uid;
        if (mAppOpsManager.noteOpNoThrow(AppOpsManager.OPSTR_BIND_ACCESSIBILITY_SERVICE,
                servicePackageUid, serviceInfo.packageName) != AppOpsManager.MODE_ALLOWED) {
                servicePackageUid, serviceInfo.packageName, null, null)
                != AppOpsManager.MODE_ALLOWED) {
            Slog.w(LOG_TAG, "Skipping accessibility service " + new ComponentName(
                    serviceInfo.packageName, serviceInfo.name).flattenToShortString()
                    + ": disallowed by AppOps");
@@ -562,15 +563,18 @@ public class AccessibilitySecurityPolicy {
        final int servicePackageUid = resolveInfo.serviceInfo.applicationInfo.uid;
        final int callingPid = Binder.getCallingPid();
        final long identityToken = Binder.clearCallingIdentity();
        final String attributionTag = service.getAttributionTag();
        try {
            // For the caller is system, just block the data to a11y services.
            if (OWN_PROCESS_ID == callingPid) {
                return mAppOpsManager.noteOpNoThrow(AppOpsManager.OPSTR_ACCESS_ACCESSIBILITY,
                        servicePackageUid, packageName, null, null) == AppOpsManager.MODE_ALLOWED;
                        servicePackageUid, packageName, attributionTag, null)
                        == AppOpsManager.MODE_ALLOWED;
            }

            return mAppOpsManager.noteOp(AppOpsManager.OPSTR_ACCESS_ACCESSIBILITY,
                    servicePackageUid, packageName, null, null) == AppOpsManager.MODE_ALLOWED;
                    servicePackageUid, packageName, attributionTag, null)
                    == AppOpsManager.MODE_ALLOWED;
        } finally {
            Binder.restoreCallingIdentity(identityToken);
        }
Loading