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

Commit bb262065 authored by Nate Myren's avatar Nate Myren Committed by Gerrit Code Review
Browse files

Merge "Store trusted AttributionSources without token" into main

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

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

    /** @hide */
    public AttributionSource withPid(int pid) {
        return new AttributionSource(getUid(), pid, getPackageName(), getAttributionTag(),
@@ -520,16 +525,28 @@ public final class AttributionSource implements Parcelable {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        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,
                        that.mAttributionSourceState.packageName)
                o.mAttributionSourceState.packageName)
                && Objects.equals(mAttributionSourceState.attributionTag,
                        that.mAttributionSourceState.attributionTag)
                && Objects.equals(mAttributionSourceState.token,
                        that.mAttributionSourceState.token)
                o.mAttributionSourceState.attributionTag)
                && Arrays.equals(mAttributionSourceState.renouncedPermissions,
                        that.mAttributionSourceState.renouncedPermissions)
                && Objects.equals(getNext(), that.getNext());
                o.mAttributionSourceState.renouncedPermissions)
                && Objects.equals(getNext(), o.getNext());
    }

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

            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) {
                final AttributionSource cachedSource = mAttributions.get(source.getToken());
                if (cachedSource != null) {
                    return cachedSource.equals(source);
                    return cachedSource.equalsExceptToken(source);
                }
                return false;
            }