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

Commit 5aa69915 authored by Nate Myren's avatar Nate Myren Committed by Automerger Merge Worker
Browse files

Merge "Store trusted AttributionSources without token" into udc-dev am: f0ebf508

parents f9100712 f0ebf508
Loading
Loading
Loading
Loading
+24 −7
Original line number Original line Diff line number Diff line
@@ -211,6 +211,11 @@ public final class AttributionSource implements Parcelable {
                token, mAttributionSourceState.renouncedPermissions, getNext());
                token, mAttributionSourceState.renouncedPermissions, getNext());
    }
    }


    /** @hide */
    public AttributionSource withDefaultToken() {
        return withToken(sDefaultToken);
    }

    /** @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(),
@@ -520,16 +525,28 @@ public final class AttributionSource implements Parcelable {
        if (this == o) return true;
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        if (o == null || getClass() != o.getClass()) return false;
        AttributionSource that = (AttributionSource) o;
        AttributionSource that = (AttributionSource) o;
        return mAttributionSourceState.uid == that.mAttributionSourceState.uid
        return equalsExceptToken(that) && Objects.equals(
                mAttributionSourceState.token, that.mAttributionSourceState.token);
    }

    /**
     * We store trusted attribution sources without their token (the token is the key to the map)
     * to avoid having a strong reference to the token. This means, when checking the equality of a
     * supplied AttributionSource in PermissionManagerService.isTrustedAttributionSource, we want to
     * compare everything except the token.
     *
     * @hide
     */
    public boolean equalsExceptToken(@Nullable AttributionSource o) {
        if (o == null) return false;
        return mAttributionSourceState.uid == o.mAttributionSourceState.uid
                && Objects.equals(mAttributionSourceState.packageName,
                && Objects.equals(mAttributionSourceState.packageName,
                        that.mAttributionSourceState.packageName)
                o.mAttributionSourceState.packageName)
                && Objects.equals(mAttributionSourceState.attributionTag,
                && Objects.equals(mAttributionSourceState.attributionTag,
                        that.mAttributionSourceState.attributionTag)
                o.mAttributionSourceState.attributionTag)
                && Objects.equals(mAttributionSourceState.token,
                        that.mAttributionSourceState.token)
                && Arrays.equals(mAttributionSourceState.renouncedPermissions,
                && Arrays.equals(mAttributionSourceState.renouncedPermissions,
                        that.mAttributionSourceState.renouncedPermissions)
                o.mAttributionSourceState.renouncedPermissions)
                && Objects.equals(getNext(), that.getNext());
                && Objects.equals(getNext(), o.getNext());
    }
    }


    @Override
    @Override
+4 −2
Original line number Original line Diff line number Diff line
@@ -1001,7 +1001,9 @@ public class PermissionManagerService extends IPermissionManager.Stub {
            }
            }


            synchronized (mLock) {
            synchronized (mLock) {
                mAttributions.put(source.getToken(), source);
                // Change the token for the AttributionSource we're storing, so that we don't store
                // a strong reference to the original token inside the map itself.
                mAttributions.put(source.getToken(), source.withDefaultToken());
            }
            }
        }
        }


@@ -1009,7 +1011,7 @@ public class PermissionManagerService extends IPermissionManager.Stub {
            synchronized (mLock) {
            synchronized (mLock) {
                final AttributionSource cachedSource = mAttributions.get(source.getToken());
                final AttributionSource cachedSource = mAttributions.get(source.getToken());
                if (cachedSource != null) {
                if (cachedSource != null) {
                    return cachedSource.equals(source);
                    return cachedSource.equalsExceptToken(source);
                }
                }
                return false;
                return false;
            }
            }