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

Commit f89a90bc authored by Michal Karpinski's avatar Michal Karpinski Committed by android-build-merger
Browse files

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

am: d766e212

Change-Id: I974f193fc7e096598f0c49c0199715d75a41c8df
parents 8779e618 d766e212
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