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

Commit d766e212 authored by Michal Karpinski's avatar Michal Karpinski Committed by Android (Google) Code Review
Browse files

Merge "Allow restoring of apps that rotated key" into pi-dev

parents bc20993e 528c3e57
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -547,4 +547,18 @@ public abstract class PackageManagerInternal {
    /** Updates the flags for the given permission. */
    public abstract void updatePermissionFlagsTEMP(@NonNull String permName,
            @NonNull String packageName, int flagMask, int flagValues, int userId);

    /**
     * Returns true if it's still safe to restore data backed up from this app's version
     * that was signed with restoringFromSigHash.
     */
    public abstract boolean isDataRestoreSafe(@NonNull byte[] restoringFromSigHash,
            @NonNull String packageName);

    /**
     * Returns true if it's still safe to restore data backed up from this app's version
     * that was signed with restoringFromSig.
     */
    public abstract boolean isDataRestoreSafe(@NonNull Signature restoringFromSig,
            @NonNull String packageName);
}
+4 −3
Original line number Diff line number Diff line
@@ -1398,7 +1398,7 @@ public class BackupManagerService implements BackupManagerServiceInterface {
    // Returns the set of all applications that define an android:backupAgent attribute
    private List<PackageInfo> allAgentPackages() {
        // !!! TODO: cache this and regenerate only when necessary
        int flags = PackageManager.GET_SIGNATURES;
        int flags = PackageManager.GET_SIGNING_CERTIFICATES;
        List<PackageInfo> packages = mPackageManager.getInstalledPackages(flags);
        int N = packages.size();
        for (int a = N - 1; a >= 0; a--) {
@@ -1643,7 +1643,7 @@ public class BackupManagerService implements BackupManagerServiceInterface {
            }
            try {
                PackageInfo packageInfo = mPackageManager.getPackageInfo(packageName,
                        PackageManager.GET_SIGNATURES);
                        PackageManager.GET_SIGNING_CERTIFICATES);
                if (!AppBackupUtils.appIsEligibleForBackup(packageInfo.applicationInfo,
                        mPackageManager)) {
                    BackupObserverUtils.sendBackupOnPackageResult(observer, packageName,
@@ -2353,7 +2353,8 @@ public class BackupManagerService implements BackupManagerServiceInterface {
        if (DEBUG) Slog.v(TAG, "clearBackupData() of " + packageName + " on " + transportName);
        PackageInfo info;
        try {
            info = mPackageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
            info = mPackageManager.getPackageInfo(packageName,
                    PackageManager.GET_SIGNING_CERTIFICATES);
        } catch (NameNotFoundException e) {
            Slog.d(TAG, "No such package '" + packageName + "' - not clearing backup data");
            return;
+21 −9
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.content.ComponentName;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ResolveInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
@@ -30,6 +31,7 @@ import android.os.Build;
import android.os.ParcelFileDescriptor;
import android.util.Slog;

import com.android.server.LocalServices;
import com.android.server.backup.utils.AppBackupUtils;

import java.io.BufferedInputStream;
@@ -154,7 +156,7 @@ public class PackageManagerBackupAgent extends BackupAgent {

    public static List<PackageInfo> getStorableApplications(PackageManager pm) {
        List<PackageInfo> pkgs;
        pkgs = pm.getInstalledPackages(PackageManager.GET_SIGNATURES);
        pkgs = pm.getInstalledPackages(PackageManager.GET_SIGNING_CERTIFICATES);
        int N = pkgs.size();
        for (int a = N-1; a >= 0; a--) {
            PackageInfo pkg = pkgs.get(a);
@@ -235,10 +237,17 @@ public class PackageManagerBackupAgent extends BackupAgent {
        if (home != null) {
            try {
                homeInfo = mPackageManager.getPackageInfo(home.getPackageName(),
                        PackageManager.GET_SIGNATURES);
                        PackageManager.GET_SIGNING_CERTIFICATES);
                homeInstaller = mPackageManager.getInstallerPackageName(home.getPackageName());
                homeVersion = homeInfo.getLongVersionCode();
                homeSigHashes = BackupUtils.hashSignatureArray(homeInfo.signatures);
                Signature[][] signingHistory = homeInfo.signingCertificateHistory;
                if (signingHistory == null || signingHistory.length == 0) {
                    Slog.e(TAG, "Home app has no signing history");
                } else {
                    // retrieve the newest sigs to back up
                    Signature[] homeInfoSignatures = signingHistory[signingHistory.length - 1];
                    homeSigHashes = BackupUtils.hashSignatureArray(homeInfoSignatures);
                }
            } catch (NameNotFoundException e) {
                Slog.w(TAG, "Can't access preferred home info");
                // proceed as though there were no preferred home set
@@ -252,10 +261,11 @@ public class PackageManagerBackupAgent extends BackupAgent {
            //    2. the home app [or absence] we now use differs from the prior state,
            // OR 3. it looks like we use the same home app + version as before, but
            //       the signatures don't match so we treat them as different apps.
            PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
            final boolean needHomeBackup = (homeVersion != mStoredHomeVersion)
                    || !Objects.equals(home, mStoredHomeComponent)
                    || (home != null
                        && !BackupUtils.signaturesMatch(mStoredHomeSigHashes, homeInfo));
                        && !BackupUtils.signaturesMatch(mStoredHomeSigHashes, homeInfo, pmi));
            if (needHomeBackup) {
                if (DEBUG) {
                    Slog.i(TAG, "Home preference changed; backing up new state " + home);
@@ -304,7 +314,7 @@ public class PackageManagerBackupAgent extends BackupAgent {
                    PackageInfo info = null;
                    try {
                        info = mPackageManager.getPackageInfo(packName,
                                PackageManager.GET_SIGNATURES);
                                PackageManager.GET_SIGNING_CERTIFICATES);
                    } catch (NameNotFoundException e) {
                        // Weird; we just found it, and now are told it doesn't exist.
                        // Treat it as having been removed from the device.
@@ -324,8 +334,8 @@ public class PackageManagerBackupAgent extends BackupAgent {
                        }
                    }

                    if (info.signatures == null || info.signatures.length == 0)
                    {
                    Signature[][] signingHistory = info.signingCertificateHistory;
                    if (signingHistory == null || signingHistory.length == 0) {
                        Slog.w(TAG, "Not backing up package " + packName
                                + " since it appears to have no signatures.");
                        continue;
@@ -347,8 +357,10 @@ public class PackageManagerBackupAgent extends BackupAgent {
                    } else {
                        outputBufferStream.writeInt(info.versionCode);
                    }
                    // retrieve the newest sigs to back up
                    Signature[] infoSignatures = signingHistory[signingHistory.length - 1];
                    writeSignatureHashArray(outputBufferStream,
                            BackupUtils.hashSignatureArray(info.signatures));
                            BackupUtils.hashSignatureArray(infoSignatures));

                    if (DEBUG) {
                        Slog.v(TAG, "+ writing metadata for " + packName
+3 −2
Original line number Diff line number Diff line
@@ -129,7 +129,7 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor
                try {
                    PackageInfo info = backupManagerService.getPackageManager().getPackageInfo(
                            pkgName,
                            PackageManager.GET_SIGNATURES);
                            PackageManager.GET_SIGNING_CERTIFICATES);
                    set.put(pkgName, info);
                } catch (NameNotFoundException e) {
                    Slog.w(TAG, "Unknown package " + pkgName + ", skipping");
@@ -240,7 +240,8 @@ public class PerformAdbBackupTask extends FullBackupTask implements BackupRestor

        // doAllApps supersedes the package set if any
        if (mAllApps) {
            List<PackageInfo> allPackages = pm.getInstalledPackages(PackageManager.GET_SIGNATURES);
            List<PackageInfo> allPackages = pm.getInstalledPackages(
                    PackageManager.GET_SIGNING_CERTIFICATES);
            for (int i = 0; i < allPackages.size(); i++) {
                PackageInfo pkg = allPackages.get(i);
                // Exclude system apps if we've been asked to do so
+1 −1
Original line number Diff line number Diff line
@@ -181,7 +181,7 @@ public class PerformFullTransportBackupTask extends FullBackupTask implements Ba
        for (String pkg : whichPackages) {
            try {
                PackageManager pm = backupManagerService.getPackageManager();
                PackageInfo info = pm.getPackageInfo(pkg, PackageManager.GET_SIGNATURES);
                PackageInfo info = pm.getPackageInfo(pkg, PackageManager.GET_SIGNING_CERTIFICATES);
                mCurrentPackage = info;
                if (!AppBackupUtils.appIsEligibleForBackup(info.applicationInfo, pm)) {
                    // Cull any packages that have indicated that backups are not permitted,
Loading