Loading services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java +97 −62 Original line number Diff line number Diff line Loading @@ -53,9 +53,7 @@ import com.android.server.backup.utils.BackupEligibilityRules; import java.util.List; import java.util.function.BiFunction; /** * Restore session. */ /** Restore session. */ public class ActiveRestoreSession extends IRestoreSession.Stub { private static final String TAG = "RestoreSession"; private static final String DEVICE_NAME_FOR_D2D_SET = "D2D"; Loading Loading @@ -88,11 +86,13 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { } // --- Binder interface --- public synchronized int getAvailableRestoreSets(IRestoreObserver observer, IBackupManagerMonitor monitor) { mBackupManagerService.getContext().enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "getAvailableRestoreSets"); @Override public synchronized int getAvailableRestoreSets( IRestoreObserver observer, IBackupManagerMonitor monitor) { mBackupManagerService .getContext() .enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "getAvailableRestoreSets"); if (observer == null) { throw new IllegalArgumentException("Observer must not be null"); } Loading Loading @@ -126,13 +126,21 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { // Prevent lambda from leaking 'this' TransportManager transportManager = mTransportManager; OnTaskFinishedListener listener = caller -> { OnTaskFinishedListener listener = caller -> { transportManager.disposeOfTransportClient(transportConnection, caller); wakelock.release(); }; Message msg = mBackupManagerService.getBackupHandler().obtainMessage( Message msg = mBackupManagerService .getBackupHandler() .obtainMessage( MSG_RUN_GET_RESTORE_SETS, new RestoreGetSetsParams(transportConnection, this, observer, monitor, new RestoreGetSetsParams( transportConnection, this, observer, monitor, listener)); mBackupManagerService.getBackupHandler().sendMessage(msg); return 0; Loading @@ -144,14 +152,15 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { } } public synchronized int restoreAll(long token, IRestoreObserver observer, IBackupManagerMonitor monitor) { mBackupManagerService.getContext().enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "performRestore"); @Override public synchronized int restoreAll( long token, IRestoreObserver observer, IBackupManagerMonitor monitor) { mBackupManagerService .getContext() .enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "performRestore"); Slog.d(TAG, "restoreAll token=" + Long.toHexString(token) + " observer=" + observer); Slog.d(TAG, "restoreAll token=" + Long.toHexString(token) + " observer=" + observer); if (mEnded) { throw new IllegalStateException("Restore session already ended"); Loading Loading @@ -205,11 +214,16 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { } // Restores of more than a single package are treated as 'system' restores public synchronized int restorePackages(long token, @Nullable IRestoreObserver observer, @NonNull String[] packages, @Nullable IBackupManagerMonitor monitor) { mBackupManagerService.getContext().enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "performRestore"); @Override public synchronized int restorePackages( long token, @Nullable IRestoreObserver observer, @NonNull String[] packages, @Nullable IBackupManagerMonitor monitor) { mBackupManagerService .getContext() .enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "performRestore"); StringBuilder b = new StringBuilder(128); b.append("restorePackages token="); Loading Loading @@ -301,17 +315,21 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { BackupEligibilityRules getBackupEligibilityRules(RestoreSet restoreSet) { // TODO(b/182986784): Remove device name comparison once a designated field for operation // type is added to RestoreSet object. int backupDestination = DEVICE_NAME_FOR_D2D_SET.equals(restoreSet.device) ? BackupDestination.DEVICE_TRANSFER : BackupDestination.CLOUD; int backupDestination = DEVICE_NAME_FOR_D2D_SET.equals(restoreSet.device) ? BackupDestination.DEVICE_TRANSFER : BackupDestination.CLOUD; if (!Flags.enableSkippingRestoreLaunchedApps()) { return mBackupManagerService.getEligibilityRulesForOperation(backupDestination); } boolean skipRestoreForLaunchedApps = (restoreSet.backupTransportFlags & BackupAgent.FLAG_SKIP_RESTORE_FOR_LAUNCHED_APPS) != 0; boolean skipRestoreForLaunchedApps = (restoreSet.backupTransportFlags & BackupAgent.FLAG_SKIP_RESTORE_FOR_LAUNCHED_APPS) != 0; return new BackupEligibilityRules(mBackupManagerService.getPackageManager(), return new BackupEligibilityRules( mBackupManagerService.getPackageManager(), LocalServices.getService(PackageManagerInternal.class), mUserId, mBackupManagerService.getContext(), Loading @@ -319,10 +337,12 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { skipRestoreForLaunchedApps); } public synchronized int restorePackage(String packageName, IRestoreObserver observer, IBackupManagerMonitor monitor) { Slog.d(TAG, "restorePackage pkg=" + packageName + " obs=" + observer + "monitor=" + monitor); @Override public synchronized int restorePackage( String packageName, IRestoreObserver observer, IBackupManagerMonitor monitor) { Slog.d( TAG, "restorePackage pkg=" + packageName + " obs=" + observer + "monitor=" + monitor); if (mEnded) { throw new IllegalStateException("Restore session already ended"); Loading @@ -335,16 +355,22 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { if (mPackageName != null) { if (!mPackageName.equals(packageName)) { Slog.e(TAG, "Ignoring attempt to restore pkg=" + packageName + " on session for package " + mPackageName); Slog.e( TAG, "Ignoring attempt to restore pkg=" + packageName + " on session for package " + mPackageName); return -1; } } final PackageInfo app; try { app = mBackupManagerService.getPackageManager().getPackageInfoAsUser( packageName, 0, mUserId); app = mBackupManagerService .getPackageManager() .getPackageInfoAsUser(packageName, 0, mUserId); } catch (NameNotFoundException nnf) { Slog.w(TAG, "Asked to restore nonexistent pkg " + packageName); return -1; Loading @@ -352,13 +378,21 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { // If the caller is not privileged and is not coming from the target // app's uid, throw a permission exception back to the caller. int perm = mBackupManagerService.getContext().checkPermission( int perm = mBackupManagerService .getContext() .checkPermission( android.Manifest.permission.BACKUP, Binder.getCallingPid(), Binder.getCallingUid()); if ((perm == PackageManager.PERMISSION_DENIED) && (app.applicationInfo.uid != Binder.getCallingUid())) { Slog.w(TAG, "restorePackage: bad packageName=" + packageName + " or calling uid=" + Binder.getCallingUid()); Binder.getCallingPid(), Binder.getCallingUid()); if ((perm == PackageManager.PERMISSION_DENIED) && (app.applicationInfo.uid != Binder.getCallingUid())) { Slog.w( TAG, "restorePackage: bad packageName=" + packageName + " or calling uid=" + Binder.getCallingUid()); throw new SecurityException("No permission to restore other packages"); } Loading @@ -373,8 +407,7 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { // Check whether there is data for it in the current dataset, falling back // to the ancestral dataset if not. long token = mBackupManagerService.getAvailableRestoreToken(packageName); Slog.d(TAG, "restorePackage pkg=" + packageName + " token=" + Long.toHexString(token)); Slog.d(TAG, "restorePackage pkg=" + packageName + " token=" + Long.toHexString(token)); // If we didn't come up with a place to look -- no ancestral dataset and // the app has never been backed up from this device -- there's nothing Loading Loading @@ -404,12 +437,11 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { mRestoreSets = restoreSets; } /** * Returns 0 if operation sent or -1 otherwise. */ /** Returns 0 if operation sent or -1 otherwise. */ private int sendRestoreToHandlerLocked( BiFunction<TransportConnection, OnTaskFinishedListener, RestoreParams> restoreParamsBuilder, String callerLogString) { BiFunction<TransportConnection, OnTaskFinishedListener, RestoreParams> restoreParamsBuilder, String callerLogString) { TransportConnection transportConnection = mTransportManager.getTransportClient(mTransportName, callerLogString); if (transportConnection == null) { Loading @@ -429,7 +461,8 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { // Prevent lambda from leaking 'this' TransportManager transportManager = mTransportManager; OnTaskFinishedListener listener = caller -> { OnTaskFinishedListener listener = caller -> { transportManager.disposeOfTransportClient(transportConnection, caller); wakelock.release(); }; Loading Loading @@ -462,6 +495,7 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { } } @Override public synchronized void endRestoreSession() { Slog.d(TAG, "endRestoreSession"); Loading @@ -474,7 +508,8 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { throw new IllegalStateException("Restore session already ended"); } mBackupManagerService.getBackupHandler().post( new EndRestoreRunnable(mBackupManagerService, this)); mBackupManagerService .getBackupHandler() .post(new EndRestoreRunnable(mBackupManagerService, this)); } } Loading
services/backup/java/com/android/server/backup/restore/ActiveRestoreSession.java +97 −62 Original line number Diff line number Diff line Loading @@ -53,9 +53,7 @@ import com.android.server.backup.utils.BackupEligibilityRules; import java.util.List; import java.util.function.BiFunction; /** * Restore session. */ /** Restore session. */ public class ActiveRestoreSession extends IRestoreSession.Stub { private static final String TAG = "RestoreSession"; private static final String DEVICE_NAME_FOR_D2D_SET = "D2D"; Loading Loading @@ -88,11 +86,13 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { } // --- Binder interface --- public synchronized int getAvailableRestoreSets(IRestoreObserver observer, IBackupManagerMonitor monitor) { mBackupManagerService.getContext().enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "getAvailableRestoreSets"); @Override public synchronized int getAvailableRestoreSets( IRestoreObserver observer, IBackupManagerMonitor monitor) { mBackupManagerService .getContext() .enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "getAvailableRestoreSets"); if (observer == null) { throw new IllegalArgumentException("Observer must not be null"); } Loading Loading @@ -126,13 +126,21 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { // Prevent lambda from leaking 'this' TransportManager transportManager = mTransportManager; OnTaskFinishedListener listener = caller -> { OnTaskFinishedListener listener = caller -> { transportManager.disposeOfTransportClient(transportConnection, caller); wakelock.release(); }; Message msg = mBackupManagerService.getBackupHandler().obtainMessage( Message msg = mBackupManagerService .getBackupHandler() .obtainMessage( MSG_RUN_GET_RESTORE_SETS, new RestoreGetSetsParams(transportConnection, this, observer, monitor, new RestoreGetSetsParams( transportConnection, this, observer, monitor, listener)); mBackupManagerService.getBackupHandler().sendMessage(msg); return 0; Loading @@ -144,14 +152,15 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { } } public synchronized int restoreAll(long token, IRestoreObserver observer, IBackupManagerMonitor monitor) { mBackupManagerService.getContext().enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "performRestore"); @Override public synchronized int restoreAll( long token, IRestoreObserver observer, IBackupManagerMonitor monitor) { mBackupManagerService .getContext() .enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "performRestore"); Slog.d(TAG, "restoreAll token=" + Long.toHexString(token) + " observer=" + observer); Slog.d(TAG, "restoreAll token=" + Long.toHexString(token) + " observer=" + observer); if (mEnded) { throw new IllegalStateException("Restore session already ended"); Loading Loading @@ -205,11 +214,16 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { } // Restores of more than a single package are treated as 'system' restores public synchronized int restorePackages(long token, @Nullable IRestoreObserver observer, @NonNull String[] packages, @Nullable IBackupManagerMonitor monitor) { mBackupManagerService.getContext().enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "performRestore"); @Override public synchronized int restorePackages( long token, @Nullable IRestoreObserver observer, @NonNull String[] packages, @Nullable IBackupManagerMonitor monitor) { mBackupManagerService .getContext() .enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "performRestore"); StringBuilder b = new StringBuilder(128); b.append("restorePackages token="); Loading Loading @@ -301,17 +315,21 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { BackupEligibilityRules getBackupEligibilityRules(RestoreSet restoreSet) { // TODO(b/182986784): Remove device name comparison once a designated field for operation // type is added to RestoreSet object. int backupDestination = DEVICE_NAME_FOR_D2D_SET.equals(restoreSet.device) ? BackupDestination.DEVICE_TRANSFER : BackupDestination.CLOUD; int backupDestination = DEVICE_NAME_FOR_D2D_SET.equals(restoreSet.device) ? BackupDestination.DEVICE_TRANSFER : BackupDestination.CLOUD; if (!Flags.enableSkippingRestoreLaunchedApps()) { return mBackupManagerService.getEligibilityRulesForOperation(backupDestination); } boolean skipRestoreForLaunchedApps = (restoreSet.backupTransportFlags & BackupAgent.FLAG_SKIP_RESTORE_FOR_LAUNCHED_APPS) != 0; boolean skipRestoreForLaunchedApps = (restoreSet.backupTransportFlags & BackupAgent.FLAG_SKIP_RESTORE_FOR_LAUNCHED_APPS) != 0; return new BackupEligibilityRules(mBackupManagerService.getPackageManager(), return new BackupEligibilityRules( mBackupManagerService.getPackageManager(), LocalServices.getService(PackageManagerInternal.class), mUserId, mBackupManagerService.getContext(), Loading @@ -319,10 +337,12 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { skipRestoreForLaunchedApps); } public synchronized int restorePackage(String packageName, IRestoreObserver observer, IBackupManagerMonitor monitor) { Slog.d(TAG, "restorePackage pkg=" + packageName + " obs=" + observer + "monitor=" + monitor); @Override public synchronized int restorePackage( String packageName, IRestoreObserver observer, IBackupManagerMonitor monitor) { Slog.d( TAG, "restorePackage pkg=" + packageName + " obs=" + observer + "monitor=" + monitor); if (mEnded) { throw new IllegalStateException("Restore session already ended"); Loading @@ -335,16 +355,22 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { if (mPackageName != null) { if (!mPackageName.equals(packageName)) { Slog.e(TAG, "Ignoring attempt to restore pkg=" + packageName + " on session for package " + mPackageName); Slog.e( TAG, "Ignoring attempt to restore pkg=" + packageName + " on session for package " + mPackageName); return -1; } } final PackageInfo app; try { app = mBackupManagerService.getPackageManager().getPackageInfoAsUser( packageName, 0, mUserId); app = mBackupManagerService .getPackageManager() .getPackageInfoAsUser(packageName, 0, mUserId); } catch (NameNotFoundException nnf) { Slog.w(TAG, "Asked to restore nonexistent pkg " + packageName); return -1; Loading @@ -352,13 +378,21 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { // If the caller is not privileged and is not coming from the target // app's uid, throw a permission exception back to the caller. int perm = mBackupManagerService.getContext().checkPermission( int perm = mBackupManagerService .getContext() .checkPermission( android.Manifest.permission.BACKUP, Binder.getCallingPid(), Binder.getCallingUid()); if ((perm == PackageManager.PERMISSION_DENIED) && (app.applicationInfo.uid != Binder.getCallingUid())) { Slog.w(TAG, "restorePackage: bad packageName=" + packageName + " or calling uid=" + Binder.getCallingUid()); Binder.getCallingPid(), Binder.getCallingUid()); if ((perm == PackageManager.PERMISSION_DENIED) && (app.applicationInfo.uid != Binder.getCallingUid())) { Slog.w( TAG, "restorePackage: bad packageName=" + packageName + " or calling uid=" + Binder.getCallingUid()); throw new SecurityException("No permission to restore other packages"); } Loading @@ -373,8 +407,7 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { // Check whether there is data for it in the current dataset, falling back // to the ancestral dataset if not. long token = mBackupManagerService.getAvailableRestoreToken(packageName); Slog.d(TAG, "restorePackage pkg=" + packageName + " token=" + Long.toHexString(token)); Slog.d(TAG, "restorePackage pkg=" + packageName + " token=" + Long.toHexString(token)); // If we didn't come up with a place to look -- no ancestral dataset and // the app has never been backed up from this device -- there's nothing Loading Loading @@ -404,12 +437,11 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { mRestoreSets = restoreSets; } /** * Returns 0 if operation sent or -1 otherwise. */ /** Returns 0 if operation sent or -1 otherwise. */ private int sendRestoreToHandlerLocked( BiFunction<TransportConnection, OnTaskFinishedListener, RestoreParams> restoreParamsBuilder, String callerLogString) { BiFunction<TransportConnection, OnTaskFinishedListener, RestoreParams> restoreParamsBuilder, String callerLogString) { TransportConnection transportConnection = mTransportManager.getTransportClient(mTransportName, callerLogString); if (transportConnection == null) { Loading @@ -429,7 +461,8 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { // Prevent lambda from leaking 'this' TransportManager transportManager = mTransportManager; OnTaskFinishedListener listener = caller -> { OnTaskFinishedListener listener = caller -> { transportManager.disposeOfTransportClient(transportConnection, caller); wakelock.release(); }; Loading Loading @@ -462,6 +495,7 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { } } @Override public synchronized void endRestoreSession() { Slog.d(TAG, "endRestoreSession"); Loading @@ -474,7 +508,8 @@ public class ActiveRestoreSession extends IRestoreSession.Stub { throw new IllegalStateException("Restore session already ended"); } mBackupManagerService.getBackupHandler().post( new EndRestoreRunnable(mBackupManagerService, this)); mBackupManagerService .getBackupHandler() .post(new EndRestoreRunnable(mBackupManagerService, this)); } }