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

Commit c7de46c8 authored by Christopher Tate's avatar Christopher Tate Committed by Chris Tate
Browse files

Restrict cross-user wallpaper inspection

Don't provide information about published wallpaper resources across
user boundaries unless the caller holds full cross-user permission.

Bug: 193800652
Test: atest WallpaperManagerTest
Test: manual POC
Change-Id: Ia2944dd32fdae47657a6683125eb3da54e6a2d2e
(cherry picked from commit be08e040)
parent 617f9bb7
Loading
Loading
Loading
Loading
+20 −0
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.server.wallpaper;
package com.android.server.wallpaper;


import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
import static android.app.WallpaperManager.COMMAND_REAPPLY;
import static android.app.WallpaperManager.COMMAND_REAPPLY;
import static android.app.WallpaperManager.FLAG_LOCK;
import static android.app.WallpaperManager.FLAG_LOCK;
import static android.app.WallpaperManager.FLAG_SYSTEM;
import static android.app.WallpaperManager.FLAG_SYSTEM;
@@ -2045,7 +2046,21 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
        }
        }
    }
    }


    private boolean hasCrossUserPermission() {
        final int interactPermission =
                mContext.checkCallingPermission(INTERACT_ACROSS_USERS_FULL);
        return interactPermission == PackageManager.PERMISSION_GRANTED;
    }

    @Override
    public boolean hasNamedWallpaper(String name) {
    public boolean hasNamedWallpaper(String name) {
        final int callingUser = UserHandle.getCallingUserId();
        final boolean allowCrossUser = hasCrossUserPermission();
        if (DEBUG) {
            Slog.d(TAG, "hasNamedWallpaper() caller " + Binder.getCallingUid()
                    + " cross-user?: " + allowCrossUser);
        }

        synchronized (mLock) {
        synchronized (mLock) {
            List<UserInfo> users;
            List<UserInfo> users;
            final long ident = Binder.clearCallingIdentity();
            final long ident = Binder.clearCallingIdentity();
@@ -2055,6 +2070,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub
                Binder.restoreCallingIdentity(ident);
                Binder.restoreCallingIdentity(ident);
            }
            }
            for (UserInfo user: users) {
            for (UserInfo user: users) {
                if (!allowCrossUser && callingUser != user.id) {
                    // No cross-user information for callers without permission
                    continue;
                }

                // ignore managed profiles
                // ignore managed profiles
                if (user.isManagedProfile()) {
                if (user.isManagedProfile()) {
                    continue;
                    continue;