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

Commit cebd97c0 authored by mrulhania's avatar mrulhania
Browse files

Add device support in attribution source validation

Bug: 283977573
Test: presubmit
Change-Id: Ib419aa26b828fc34726b515ac726e4760487dddf
parent 9dcebfc2
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -9694,6 +9694,7 @@ package android.content {
    method public int describeContents();
    method public int describeContents();
    method public void enforceCallingUid();
    method public void enforceCallingUid();
    method @Nullable public String getAttributionTag();
    method @Nullable public String getAttributionTag();
    method public int getDeviceId();
    method @Nullable public android.content.AttributionSource getNext();
    method @Nullable public android.content.AttributionSource getNext();
    method @Nullable public String getPackageName();
    method @Nullable public String getPackageName();
    method public int getPid();
    method public int getPid();
@@ -9709,6 +9710,7 @@ package android.content {
    ctor public AttributionSource.Builder(@NonNull android.content.AttributionSource);
    ctor public AttributionSource.Builder(@NonNull android.content.AttributionSource);
    method @NonNull public android.content.AttributionSource build();
    method @NonNull public android.content.AttributionSource build();
    method @NonNull public android.content.AttributionSource.Builder setAttributionTag(@Nullable String);
    method @NonNull public android.content.AttributionSource.Builder setAttributionTag(@Nullable String);
    method @NonNull public android.content.AttributionSource.Builder setDeviceId(int);
    method @Deprecated @NonNull public android.content.AttributionSource.Builder setNext(@Nullable android.content.AttributionSource);
    method @Deprecated @NonNull public android.content.AttributionSource.Builder setNext(@Nullable android.content.AttributionSource);
    method @NonNull public android.content.AttributionSource.Builder setNextAttributionSource(@NonNull android.content.AttributionSource);
    method @NonNull public android.content.AttributionSource.Builder setNextAttributionSource(@NonNull android.content.AttributionSource);
    method @NonNull public android.content.AttributionSource.Builder setPackageName(@Nullable String);
    method @NonNull public android.content.AttributionSource.Builder setPackageName(@Nullable String);
+1 −0
Original line number Original line Diff line number Diff line
@@ -850,6 +850,7 @@ package android.content {
    ctor public AttributionSource(int, @Nullable String, @Nullable String, @NonNull android.os.IBinder);
    ctor public AttributionSource(int, @Nullable String, @Nullable String, @NonNull android.os.IBinder);
    ctor public AttributionSource(int, @Nullable String, @Nullable String, @Nullable java.util.Set<java.lang.String>, @Nullable android.content.AttributionSource);
    ctor public AttributionSource(int, @Nullable String, @Nullable String, @Nullable java.util.Set<java.lang.String>, @Nullable android.content.AttributionSource);
    ctor public AttributionSource(int, int, @Nullable String, @Nullable String, @NonNull android.os.IBinder, @Nullable String[], @Nullable android.content.AttributionSource);
    ctor public AttributionSource(int, int, @Nullable String, @Nullable String, @NonNull android.os.IBinder, @Nullable String[], @Nullable android.content.AttributionSource);
    ctor public AttributionSource(int, int, @Nullable String, @Nullable String, @NonNull android.os.IBinder, @Nullable String[], int, @Nullable android.content.AttributionSource);
    method public void enforceCallingPid();
    method public void enforceCallingPid();
  }
  }


+1 −1
Original line number Original line Diff line number Diff line
@@ -3463,7 +3463,7 @@ class ContextImpl extends Context {
        AttributionSource attributionSource = new AttributionSource(Process.myUid(),
        AttributionSource attributionSource = new AttributionSource(Process.myUid(),
                Process.myPid(), mOpPackageName, attributionTag,
                Process.myPid(), mOpPackageName, attributionTag,
                (renouncedPermissions != null) ? renouncedPermissions.toArray(new String[0]) : null,
                (renouncedPermissions != null) ? renouncedPermissions.toArray(new String[0]) : null,
                nextAttributionSource);
                getDeviceId(), nextAttributionSource);
        // If we want to access protected data on behalf of another app we need to
        // If we want to access protected data on behalf of another app we need to
        // tell the OS that we opt in to participate in the attribution chain.
        // tell the OS that we opt in to participate in the attribution chain.
        if (nextAttributionSource != null) {
        if (nextAttributionSource != null) {
+53 −10
Original line number Original line Diff line number Diff line
@@ -115,14 +115,14 @@ public final class AttributionSource implements Parcelable {
    public AttributionSource(int uid, @Nullable String packageName,
    public AttributionSource(int uid, @Nullable String packageName,
            @Nullable String attributionTag, @NonNull IBinder token) {
            @Nullable String attributionTag, @NonNull IBinder token) {
        this(uid, Process.INVALID_PID, packageName, attributionTag, token,
        this(uid, Process.INVALID_PID, packageName, attributionTag, token,
                /*renouncedPermissions*/ null, /*next*/ null);
                /*renouncedPermissions*/ null, Context.DEVICE_ID_DEFAULT, /*next*/ null);
    }
    }


    /** @hide */
    /** @hide */
    public AttributionSource(int uid, int pid, @Nullable String packageName,
    public AttributionSource(int uid, int pid, @Nullable String packageName,
            @Nullable String attributionTag, @NonNull IBinder token) {
            @Nullable String attributionTag, @NonNull IBinder token) {
        this(uid, pid, packageName, attributionTag, token, /*renouncedPermissions*/ null,
        this(uid, pid, packageName, attributionTag, token, /*renouncedPermissions*/ null,
                /*next*/ null);
                Context.DEVICE_ID_DEFAULT, /*next*/ null);
    }
    }


    /** @hide */
    /** @hide */
@@ -132,21 +132,23 @@ public final class AttributionSource implements Parcelable {
            @Nullable AttributionSource next) {
            @Nullable AttributionSource next) {
        this(uid, Process.INVALID_PID, packageName, attributionTag, sDefaultToken,
        this(uid, Process.INVALID_PID, packageName, attributionTag, sDefaultToken,
                (renouncedPermissions != null)
                (renouncedPermissions != null)
                ? renouncedPermissions.toArray(new String[0]) : null, /*next*/ next);
                ? renouncedPermissions.toArray(new String[0]) : null, Context.DEVICE_ID_DEFAULT,
                /*next*/ next);
    }
    }


    /** @hide */
    /** @hide */
    public AttributionSource(@NonNull AttributionSource current, @Nullable AttributionSource next) {
    public AttributionSource(@NonNull AttributionSource current, @Nullable AttributionSource next) {
        this(current.getUid(), current.getPid(), current.getPackageName(),
        this(current.getUid(), current.getPid(), current.getPackageName(),
                current.getAttributionTag(), current.getToken(),
                current.getAttributionTag(), current.getToken(),
                current.mAttributionSourceState.renouncedPermissions, next);
                current.mAttributionSourceState.renouncedPermissions, current.getDeviceId(), next);
    }
    }


    /** @hide */
    /** @hide */
    public AttributionSource(int uid, int pid, @Nullable String packageName,
    public AttributionSource(int uid, int pid, @Nullable String packageName,
            @Nullable String attributionTag, @Nullable String[] renouncedPermissions,
            @Nullable String attributionTag, @Nullable String[] renouncedPermissions, int deviceId,
            @Nullable AttributionSource next) {
            @Nullable AttributionSource next) {
        this(uid, pid, packageName, attributionTag, sDefaultToken, renouncedPermissions, next);
        this(uid, pid, packageName, attributionTag, sDefaultToken, renouncedPermissions, deviceId,
                next);
    }
    }


    /** @hide */
    /** @hide */
@@ -155,6 +157,16 @@ public final class AttributionSource implements Parcelable {
            @Nullable String attributionTag, @NonNull IBinder token,
            @Nullable String attributionTag, @NonNull IBinder token,
            @Nullable String[] renouncedPermissions,
            @Nullable String[] renouncedPermissions,
            @Nullable AttributionSource next) {
            @Nullable AttributionSource next) {
        this(uid, pid, packageName, attributionTag, token, renouncedPermissions,
                Context.DEVICE_ID_DEFAULT, next);
    }

    /** @hide */
    @TestApi
    public AttributionSource(int uid, int pid, @Nullable String packageName,
            @Nullable String attributionTag, @NonNull IBinder token,
            @Nullable String[] renouncedPermissions,
            int deviceId, @Nullable AttributionSource next) {
        mAttributionSourceState = new AttributionSourceState();
        mAttributionSourceState = new AttributionSourceState();
        mAttributionSourceState.uid = uid;
        mAttributionSourceState.uid = uid;
        mAttributionSourceState.pid = pid;
        mAttributionSourceState.pid = pid;
@@ -162,6 +174,7 @@ public final class AttributionSource implements Parcelable {
        mAttributionSourceState.packageName = packageName;
        mAttributionSourceState.packageName = packageName;
        mAttributionSourceState.attributionTag = attributionTag;
        mAttributionSourceState.attributionTag = attributionTag;
        mAttributionSourceState.renouncedPermissions = renouncedPermissions;
        mAttributionSourceState.renouncedPermissions = renouncedPermissions;
        mAttributionSourceState.deviceId = deviceId;
        mAttributionSourceState.next = (next != null) ? new AttributionSourceState[]
        mAttributionSourceState.next = (next != null) ? new AttributionSourceState[]
                {next.mAttributionSourceState} : new AttributionSourceState[0];
                {next.mAttributionSourceState} : new AttributionSourceState[0];
    }
    }
@@ -197,25 +210,31 @@ public final class AttributionSource implements Parcelable {
    /** @hide */
    /** @hide */
    public AttributionSource withNextAttributionSource(@Nullable AttributionSource next) {
    public AttributionSource withNextAttributionSource(@Nullable AttributionSource next) {
        return new AttributionSource(getUid(), getPid(), getPackageName(), getAttributionTag(),
        return new AttributionSource(getUid(), getPid(), getPackageName(), getAttributionTag(),
                getToken(), mAttributionSourceState.renouncedPermissions, next);
                getToken(), mAttributionSourceState.renouncedPermissions, getDeviceId(), next);
    }
    }


    /** @hide */
    /** @hide */
    public AttributionSource withPackageName(@Nullable String packageName) {
    public AttributionSource withPackageName(@Nullable String packageName) {
        return new AttributionSource(getUid(), getPid(), packageName, getAttributionTag(),
        return new AttributionSource(getUid(), getPid(), packageName, getAttributionTag(),
               getToken(), mAttributionSourceState.renouncedPermissions, getNext());
               getToken(), mAttributionSourceState.renouncedPermissions, getDeviceId(), getNext());
    }
    }


    /** @hide */
    /** @hide */
    public AttributionSource withToken(@NonNull Binder token) {
    public AttributionSource withToken(@NonNull Binder token) {
        return new AttributionSource(getUid(), getPid(), getPackageName(), getAttributionTag(),
        return new AttributionSource(getUid(), getPid(), getPackageName(), getAttributionTag(),
                token, mAttributionSourceState.renouncedPermissions, getNext());
                token, mAttributionSourceState.renouncedPermissions, getDeviceId(), getNext());
    }
    }


    /** @hide */
    /** @hide */
    public AttributionSource withPid(int pid) {
    public AttributionSource withPid(int pid) {
        return new AttributionSource(getUid(), pid, getPackageName(), getAttributionTag(),
        return new AttributionSource(getUid(), pid, getPackageName(), getAttributionTag(),
                getToken(), mAttributionSourceState.renouncedPermissions, getNext());
                getToken(), mAttributionSourceState.renouncedPermissions, getDeviceId(), getNext());
    }

    /** @hide */
    public AttributionSource withDeviceId(int deviceId) {
        return new AttributionSource(getUid(), getPid(), getPackageName(), getAttributionTag(),
                getToken(), mAttributionSourceState.renouncedPermissions, deviceId, getNext());
    }
    }


    /** @hide */
    /** @hide */
@@ -259,6 +278,7 @@ public final class AttributionSource implements Parcelable {
        try {
        try {
            return new AttributionSource.Builder(uid)
            return new AttributionSource.Builder(uid)
                .setPid(Process.myPid())
                .setPid(Process.myPid())
                .setDeviceId(Context.DEVICE_ID_DEFAULT)
                .setPackageName(AppGlobals.getPackageManager().getPackagesForUid(uid)[0])
                .setPackageName(AppGlobals.getPackageManager().getPackagesForUid(uid)[0])
                .build();
                .build();
        } catch (Exception ignored) {
        } catch (Exception ignored) {
@@ -496,6 +516,13 @@ public final class AttributionSource implements Parcelable {
        return mAttributionSourceState.attributionTag;
        return mAttributionSourceState.attributionTag;
    }
    }


    /**
     * The device ID for which permissions are checked.
     */
    public int getDeviceId() {
        return mAttributionSourceState.deviceId;
    }

    /**
    /**
     * Unique token for that source.
     * Unique token for that source.
     *
     *
@@ -661,6 +688,19 @@ public final class AttributionSource implements Parcelable {
            return this;
            return this;
        }
        }


        /**
         * Set the device ID for this attribution source, permission check would happen
         * against this device ID.
         *
         * @return the builder
         */
        public @NonNull Builder setDeviceId(int deviceId) {
            checkNotUsed();
            mBuilderFieldsSet |= 0x12;
            mAttributionSourceState.deviceId = deviceId;
            return this;
        }

        /**
        /**
         * The next app to receive the permission protected data.
         * The next app to receive the permission protected data.
         *
         *
@@ -703,6 +743,9 @@ public final class AttributionSource implements Parcelable {
            if ((mBuilderFieldsSet & 0x10) == 0) {
            if ((mBuilderFieldsSet & 0x10) == 0) {
                mAttributionSourceState.renouncedPermissions = null;
                mAttributionSourceState.renouncedPermissions = null;
            }
            }
            if ((mBuilderFieldsSet & 0x12) == 0) {
                mAttributionSourceState.deviceId = Context.DEVICE_ID_DEFAULT;
            }
            if ((mBuilderFieldsSet & 0x20) == 0) {
            if ((mBuilderFieldsSet & 0x20) == 0) {
                mAttributionSourceState.next = null;
                mAttributionSourceState.next = null;
            }
            }
+6 −3
Original line number Original line Diff line number Diff line
@@ -19885,7 +19885,8 @@ public class ActivityManagerService extends IActivityManager.Stub
                    return superImpl.apply(code, new AttributionSource(shellUid,
                    return superImpl.apply(code, new AttributionSource(shellUid,
                            Process.INVALID_PID, "com.android.shell",
                            Process.INVALID_PID, "com.android.shell",
                            attributionSource.getAttributionTag(), attributionSource.getToken(),
                            attributionSource.getAttributionTag(), attributionSource.getToken(),
                            /*renouncedPermissions*/ null, attributionSource.getNext()),
                            /*renouncedPermissions*/ null, attributionSource.getDeviceId(),
                            attributionSource.getNext()),
                            shouldCollectAsyncNotedOp, message, shouldCollectMessage,
                            shouldCollectAsyncNotedOp, message, shouldCollectMessage,
                            skiProxyOperation);
                            skiProxyOperation);
                } finally {
                } finally {
@@ -19938,7 +19939,8 @@ public class ActivityManagerService extends IActivityManager.Stub
                    return superImpl.apply(clientId, code, new AttributionSource(shellUid,
                    return superImpl.apply(clientId, code, new AttributionSource(shellUid,
                            Process.INVALID_PID, "com.android.shell",
                            Process.INVALID_PID, "com.android.shell",
                            attributionSource.getAttributionTag(), attributionSource.getToken(),
                            attributionSource.getAttributionTag(), attributionSource.getToken(),
                            /*renouncedPermissions*/ null, attributionSource.getNext()),
                            /*renouncedPermissions*/ null, attributionSource.getDeviceId(),
                            attributionSource.getNext()),
                            startIfModeDefault, shouldCollectAsyncNotedOp, message,
                            startIfModeDefault, shouldCollectAsyncNotedOp, message,
                            shouldCollectMessage, skipProxyOperation, proxyAttributionFlags,
                            shouldCollectMessage, skipProxyOperation, proxyAttributionFlags,
                            proxiedAttributionFlags, attributionChainId);
                            proxiedAttributionFlags, attributionChainId);
@@ -19964,7 +19966,8 @@ public class ActivityManagerService extends IActivityManager.Stub
                    superImpl.apply(clientId, code, new AttributionSource(shellUid,
                    superImpl.apply(clientId, code, new AttributionSource(shellUid,
                            Process.INVALID_PID, "com.android.shell",
                            Process.INVALID_PID, "com.android.shell",
                            attributionSource.getAttributionTag(), attributionSource.getToken(),
                            attributionSource.getAttributionTag(), attributionSource.getToken(),
                            /*renouncedPermissions*/ null, attributionSource.getNext()),
                            /*renouncedPermissions*/ null, attributionSource.getDeviceId(),
                            attributionSource.getNext()),
                            skipProxyOperation);
                            skipProxyOperation);
                } finally {
                } finally {
                    Binder.restoreCallingIdentity(identity);
                    Binder.restoreCallingIdentity(identity);
Loading