205 Commits

Author SHA1 Message Date
Christopher Tate
e82f68d016 Fix the Backup Manager's uninstall tracking
The bug was that when an app was uninstalled, the Backup Manager was
discarding its bookkeeping about that app being represented in the
device's current live backup dataset.  This in turn meant that if the
app was subsequently reinstalled, its data would not be restored from
that most-recent dataset: it would be restored from the *ancestral*
dataset if possible, or not at all.

Now the "ever backed up" state is retained correctly, and the app
will get its most-recent-data restored as expected.

Bug 7394519

Change-Id: I733cf41737765676e0a3a05fb1bcd32b165cb4ba
2012-10-23 15:40:27 -07:00
Christopher Tate
346acb123d Sanity-check erroneous backup agent instantiations
Two distinct changes:

Fix a bug seen in the wild where a newly-launched application will be
spuriously asked to instantiate a backup agent.  What was happening
there is that some Activity Manager state was being left stale in certain
circumstances, and then in combination with app uninstall / install, there
could be a case where uid reuse wound up looking like an app identity
match.

We now positively verify before instantiating the agent that the intended
backup target package is uid-compatible with the app process that the
instantiation was requested of.  The incomplete bookkeeping in the
Activity Manager has also been tightened up, and the Backup Manager is
more aggressive about cleaning up pending operations pertaining to
apps being uninstalled.

Bug 5874010

Change-Id: Ic389f4a96c9dcd0ba6b3962b579084033d8ae9f8
2012-10-17 13:36:15 -07:00
Christopher Tate
f6d6fa8cbc Full (local) restore security changes
(1) Prevent full restore from creating files/directories that are
    accessible by other applications

(2) Don't restore filesets from "system" packages; i.e. any that runs
    as a special uid, unless they define their own agent for handling
    the restore process.

Bug 7168284

Change-Id: Id6a0cb4c113c2e4a8c4605252cffa41bea22d8a3
2012-09-27 12:54:37 -07:00
Jeff Brown
bf6f6f9de7 Update references to migrated global settings.
Fixed one setting that was migrated but not marked deprecated.

Removed a hidden setting that is no longer used by the new
power manager service.

Bug: 7231172
Change-Id: I332f020f876a18d519a1a20598a172f1c98036f7
2012-09-25 15:27:51 -07:00
Jeff Sharkey
b049e212ab Include user identifier in external storage paths.
When building external storage paths, always include user in path
to enable cross-user paths and aid debugging.

Each Zygote process continues to only have access to the appropriate
user-specific emulated storage through bind mounts. A second set of
mounts continue supporting legacy /sdcard-style paths. For example,
a process running as owner has these mount points:

/storage/emulated_legacy
/storage/emulated_legacy/Android/obb
/storage/emulated/0
/storage/emulated/obb

Since Environment is created before Zygote forks, we need to update
its internal paths after each process launches.

Bug: 7131382
Change-Id: I6f8c6971f2a8edfb415c14cb4ed05ff97e587a21
2012-09-11 23:11:14 -07:00
Christopher Tate
e7287a0791 Sanity-check existence of restore agent
When a restore dataset includes data for an app that used to have
a backup agent, but does not in the currently-installed version, we
were merrily trying to bring up the agent for restore anyway, and
crashing.  Now we don't do that; we check whether there's actually
going to be an agent to handle the data before doing any of the
heavy work.

Bug 7130695

Change-Id: I0a38c2a8bb51d4a140a72d22896fa58d98ebaa02
2012-09-07 18:32:12 -07:00
Dianne Hackborn
4120375d46 Remove Binder.getOrigCallingUid().
Replaced all remaining places that used it with explicit user
specification.

While doing this, I ran into stuff that was creating PendingIntent
objects (that now need to specify the explicit user they are for),
which are also posting notifications...  but have no way to specify
the user for the notification.

So the notification manager in the system process now also gets a
formal concept of a user associated with the notification, which
is passed in to all the necessary aidl calls.  I also removed the
old deprecated aidl interface for posting/cancelling notifications,
since we now always need a user supplied.

There is more work that needs to be done here, though.  For example
I think we need to be able to specify USER_ALL for a notification that
should be shown to all users (such as low storage or low battery).
Along with that, the PendingIntent creation needs to be tweaked to
be able to handle USER_CURRENT by evaluating the user at the point the
pending intent is sent.

That's for another change, however.

Change-Id: I468e14dce8def0e13e0870571e7c31ed32b6310c
2012-08-31 15:11:13 -07:00
Dianne Hackborn
f02b60aa4f Rename UserId to UserHandle.
This is the start of turning this into a formal public API.

Change-Id: I5786d2c320f1de41a06ed5d0f65adb68967287a0
2012-08-16 12:46:38 -07:00
Christopher Tate
aac71ff465 Don't back up / restore non-primary users' data
For now only the device owner "user" gets cloud backups.  Also, only the
device owner account has access to local backup/restore.

Bug 6956438

Change-Id: I87d7ba5969e606c23f4214469f9bf2fd47a6c61b
2012-08-13 17:36:14 -07:00
Christopher Tate
97ea122c65 Eliminate "backup enabled but not provisioned" failure modes
Previously, the setup app was responsible for telling the backup
manager through a side band that the user had passed through the
backup/restore-related portion of the setup flow.  Now that the
flow has been streamlined and certain mandatory portions of it
are no longer relevant, we can ditch the whole idea of the backup
manager's internal "provisioned" state.  This makes setup and the
setup "wizard" applications less fragile as well as eliminating
the possibility of unrecoverable "backup was never provisioned"
failure modes.

Now, the only check the backup manager has to do is against the
full "device is provisioned" flag, just like all of the other
components on the phone that only become usable after the setup
process has exited [such as phone calls].

Bug 6493520

Change-Id: I13ec8dd8baa1e74ed8569b0326219a98a7f632a9
2012-05-17 16:02:15 -07:00
Jeff Sharkey
eb4cc492c9 Protect system services with DUMP permission.
Change-Id: I5e53859f8b8e5473e54eca43ebd7de841f1a05ff
2012-04-26 18:17:29 -07:00
Christopher Tate
a3d55342be Fix uninstallation tracking in the Backup Manager
This never worked properly; now it does.  We also no longer
do a redundant pair of remove/add operations when a package is
updated.

Bonus memory savings: we were keeping sets of ApplicationInfo
objects as part of the ongoing bookkeeping, but those were no longer
being used for anything other than the package names.  That's been
tossed out now and only the name strings are now used; hooray for
memory savings!

Change-Id: I4c6e592a1680e28550bcb4f76789260ded22280d
2012-03-27 16:29:35 -07:00
Christopher Tate
0abf6a0014 Don't crash when wiping backup data redundantly in the local transport
Previously, if using the "local" debugging transport:

    adb shell bmgr wipe com.android.browser
    adb shell bmgr wipe com.android.browser

... would bring down the runtime.  This no longer happens.  The fix
covers two aspects of the situation:  1. the local transport no longer
blows up in this use case, and 2. the backup manager itself now catches
blowups on the part of the transport, and tidies up after them.

Bug 6205185

Change-Id: Ieb9b8827a62523148ad5a0ec15b05a954d198b3d
2012-03-23 17:47:58 -07:00
Christopher Tate
5b6f07b461 Merge "Deal gracefully with fatal exceptions during full backup" 2012-03-23 14:01:40 -07:00
Christopher Tate
aa0c02d221 Deal gracefully with fatal exceptions during full backup
In particular, if the low-level zip or crypto layers of the output
pipeline throw, the output becomes invalid at that point, but we
were not properly detecting this; we were missing the exception and
the runtime was going down.  Now we catch any such fatal exception
and make sure to shut down the backup operation cleanly, leaving
the output at whatever point in its construction that it had
achieved.

Bug 6131870

Change-Id: If0fe0337857404b776f407a79d11dd88b8e60fd0
2012-03-23 13:56:34 -07:00
Christopher Tate
9c2efb35e2 Sanity-check backup agent name prior to instantiation
Fixes a crash that would occur if an app with a pending backup
pass in the pipeline was updated to remove its agent declaration
from the manifest (or other more esoteric ways that a backup
pass was expected to run for an app without their own agent).

Bug 5776591

Change-Id: I5a8bc8c12de6a2bfa82f5093fe3a15b754109ab1
2012-03-23 13:00:05 -07:00
Amith Yamasani
742a671273 Multi-user - 1st major checkin
Switching activity stacks
Cache ContentProvider per user
Long-press power to switch users (on phone)

Added ServiceMap for separating services by user
Launch PendingIntents on the correct user's uid
Fix task switching from Recents list
AppWidgetService is mostly working.

Commands added to pm and am to allow creating and switching profiles.

Change-Id: I15810e8cfbe50a04bd3323a7ef5a8ff4230870ed
2012-02-03 12:01:47 -08:00
Christopher Tate
73d7369e0f Fix shared-storage full backup
The special shared-storage step was mistakenly writing its data directly
to the USB output pipe rather than to the proper stacked data handling
chain that applies compression and encryption.  Fix this by getting rid
of the custom handling of the shared-storage data, instead folding it
into the normal data handling flow [with a small amount of additional
management because e.g. it doesn't need a "manifest" pseudofile in the
archive stream].

Fixes bug 5897791

Change-Id: I3995b07963334d2f8cce49b247c87d3d3ff93bed
2012-01-20 17:41:41 -08:00
Christopher Tate
6de74ff2a4 Fix edge cases leading to backup hanging forever
Plug a couple of apparent code paths (one not obviously reachable, but
fixed here on general principles) that could lead to a backup pass
getting confused partway through and simply never properly completing.
In this state it would leave its wakelock held forever until next
reboot.  Bug 5828859.

Those fixes are a total of two lines of code. The rest of the patch
adds a textual journal of the most recently completed (or ongoing!)
backup pass's progress, with an eye to being able to isolate any such
issues that may crop up in the future.

Change-Id: If8a5e8aba11db5a1e618d8b9c9ba3038dd5377a1
2012-01-18 15:44:47 -08:00
Christopher Tate
0bacfd2ba6 Streamline package-installed handling by the Backup Manager
In particular, don't do O(asec_apps * installed_apps) work during the
broadcast receiver's operation.  On devices with many installed apps
and a large number of them moved to ASECs, this was causing the system
process to become unresponsive and the watchdog to fire -- which in turn
would initiate a restart loop, as the same package-installed broadcast
would then be issued again once the package manager rescanned the ASEC
containers, ad infinitum.  With this change, the expensive call to the
package manager is only made once rather than asec_apps times.

Bug 5850283

Change-Id: I14e280ea1fa6af19cebc58869a20fbb599c92c8c
2012-01-12 16:15:09 -08:00
Christopher Tate
32418be49e Require device encryption password to perform adb backup/restore
This supersedes any backup-password that the user might supply.  Per
design, the device encryption password is also always used to encrypt
the backup archive.

The CL introduces two new strings, used for prompting the user for
their device encryption password rather than their settings-defined
"backup password" when confirming a full backup or restore operation.

Bug 5382487

Change-Id: I0b03881b45437c944eaf636b6209278e1bba7a9f
2011-10-13 12:29:32 -07:00
Christopher Tate
e659fb9275 Gracefully handle "needs init" transport errors at finish
Although it's typical for a backup transport to report that it
needs an explicit initialization opportunity when the backup is
initiated, it can sometimes come to pass that the "needs init"
error condition is reported at backup *finish*.  In this case the
framework side was failing to properly reset all of the relevant
state.  The end result was to spin hard forever, holding wakelocks
and continually failing to actually perform the necessary init
operation, possibly continuing even after a reboot.  Fixed.

Bug 5434579

Change-Id: If1d72c338526e4019ea524c48a11e71e44e77f71
2011-10-10 16:34:50 -07:00
Christopher Tate
336a649cd8 Prevent concurrent backup operations
We've seen cases (bug 5417779) where the transport kicked off an immediate
backup operation but then was perfectly content to allow the periodic
timer to start *another* pass concurrently while the first was still in
progress.  This wound up with the backup manager getting mightily
confused and leaking wakelock acquisitions, which is Very Bad(tm).

This patch adds a little bookkeeping so that the backup manager is aware
of backups in flight, and refuses to kick off a new one until the ongoing
one has finished.

Change-Id: If12b54f4db3effc8af36d31c58d8f9b415ddc01e
2011-10-05 16:05:43 -07:00
Christopher Tate
240c7d2d1f Add -nosystem flag to adb backup
This makes it easy to back up everything that belongs to 3rd party apps, but
nothing that comes with the system per se.  If any system packages are
explicitly named on the command line they will be included in the backup
even if -nosystem was passed.  So, for example, this will back up all 3rd
party apps as well as system settings, but nothing else belonging to
system-deployed apps:

   adb backup -all -nosystem com.android.provider.settings

Bug 5361503

Change-Id: Iebe04b7d7027ca58b9f55e8eb7f219d6cca69269
2011-10-04 15:35:00 -07:00
Christopher Tate
b8491bb75f Enforce DUMP permission on BackupManagerService's dump() method
The text of the dumped output can potentially include an email address;
we don't want random code to be able to read it.

Bug 5389201

Change-Id: If84886357a36b7015878e4d72017abba83b4c511
2011-09-29 15:13:11 -07:00
Christopher Tate
d7208b98e9 am 7462251b: Merge "Don\'t hang in restore if the transport reports failure" into ics-factoryrom
* commit '7462251b0a3f2601236b599bcabf54451143b704':
  Don't hang in restore if the transport reports failure
2011-09-26 20:40:56 -07:00
Christopher Tate
ab63aa87c1 Use the new INSTALL_FROM_ADB Package Manager flag...
...when installing an apk in the course of an 'adb restore' operation.

Fixes bug 5374597.

Change-Id: I8ddce0e015e3bab79432e82709d841887667c346
2011-09-26 16:30:30 -07:00
Christopher Tate
5f2f41350e Don't hang in restore if the transport reports failure
Casualty of the recent refactoring: in this particular error case,
the restore sequence wasn't being directed into the finalization
state.  Fixes bug 5336295.

Change-Id: Ibf5570cd1003e123da8b561685de8479663340ce
2011-09-26 13:10:38 -07:00
Christopher Tate
d2c0cd4313 Don't do full backup/restore before setup
On the restore side, there's a bunch of one-time setup, device
provisioning, etc that we're very much not prepared to do in
lieu of running setup wizard, at least at this time.

On the backup side, it simply doesn't make sense to back up
stuff before the device has been set up.

Part of bug 5290261

Change-Id: If1c65e88e2da589d6204232d2b59c3e994f4ed3f
2011-09-15 15:51:29 -07:00
Christopher Tate
a28e854683 Move full backup/restore onto dedicated threads
Running full backup/restore on the Backup Manager looper thread causes problems.
It not only interfered with the delayed-Message timeout processing; in the case
of installing apks during restore it also interfered fatally with the interaction
between the Package Manager and install-time restore of data from the cloud.

The long-term right thing to do here will be a refactoring of full backup and
restore to be structured as the sort of state-machine process that incremental
backup and restore now use.  This is particularly thorny in the case of full
restore (due to the Package Manager interactions), and full backup/restore are
considered experimental at this point, so that refactoring is deferred to a
future release.  The current process is essentially standalone, so the bug is
fixed here pro tem by letting it run to completion on its own thread, freeing
the looper for normal work.

Fixes bug 5173450

Change-Id: I659a61afa18ffe7fde1a07f7fa0e860d5e8d5a89
2011-09-12 13:45:21 -07:00
Christopher Tate
b1543a960f Turn off MORE_DEBUG logspam
Down with logspam!

Change-Id: Idadad3531cee53afd3cb5cbeb68ced2d348311eb
2011-09-07 12:11:09 -07:00
Christopher Tate
2982d06b7c Fix restore-agent timeouts
This patch parallels the previous one that fixed backup timeouts.
It establishes the same sort of state-machine process for walking
through the restore steps solely as events posted to the backup
manager's HandlerThread.

Fixes the rest of bug 5074923

Change-Id: I122a021cb1e9bb1342de0b71e5d4bc84cc630c58
2011-09-06 20:35:24 -07:00
Christopher Tate
8e294d4557 Fix backup-agent timeouts
Away in the misty span of very-long-ago, it was suggested that spinning
a separate thread to run the backup process was wasteful, and that it
could just run it inline on the dedicated HandlerThread that the
backup manager uses for its own operations.  That was indeed true,
except that the timeout management was also using delayed messages
to that handler.  You see where this is going: timeouts were never
actually being processed, with the effect that a badly-behaving
app's backup agent could lock up the entire backup / restore system
until the device was rebooted.

This is bad.

Backup operations are now driven as an asynchronous state machine:
each step (init, call one agent to obtain data, send resulting
data to the transport, finalize the backup) is handled as a formal
state transition on-looper.  No synchronous wait-for-completion
or -timeout is performed on any thread.

As an additional effect this greatly tightens up the serialization
and locking semantics.  We no longer have to worry about an in-
flight operation involving a standalone thread spinning off on
its own; everything is on the HandlerThread and can be coherently
manipulated from that perspective.

Along the way, this CL tightens up the per-agent error handling
logic.  Previously a single failed agent would abort the entire
backup process, tantamount to a transport-level failure.  This could
mean that the aforesaid badly-behaving app's agent could in effect
starve out other apps whose agents were routinely showing up later
in the queue.  There's some nondeterminism involved, but in practice
it could and did happen.  Furthermore, the failure case would
reschedule *immediately* in this case, because the transport itself
would see that all is well and sure, why not run a backup soon?
This, as you might imagine, causes battery-life issues.

Now we note that the single agent has failed, mark it for a future
repeat attempt, and process the rest of the queue normally, pretending
success at the transport level even though we didn't actually send
any data for that app.  This means that (a) we now finish running
backups for everything in the queue, (b) reschedule backups only for
those apps whose agents individually failed during this run, and
(c) perform the retry after the normal interval [typically on the
order of an hour] rather than immediately.

NOTE: this CL does not retool the restore code path, just backup.
Restore is similarly vulnerable to misbehaving apps, though, so a
future CL will address that bug vector.

Addresses bug 5074923

Change-Id: I67e3f8d06f322607881eaa4093de6d675b85ff2c
2011-09-02 17:21:09 -07:00
Christopher Tate
cc55f8136e Properly handle PACKAGE_REPLACED in addition to _ADDED and _REMOVED
Certain kinds of application update generate this broadcast regime rather
than the REMOVE / ADD sequence that results from e.g. using the -r option
when invoking 'adb install'.

We also push the agent classname lookup to the last moment before
actually running the backup, rather than caching it as part of the
record of what apps need a backup pass in the future.  This was causing
a bug in which a package reinstall that renamed the app's agent class
would wind up with a crash at backup time, trying to load the wrong
class.

Fixes bug 5156094 / bug 4308977

Change-Id: I4e3e12d86e6ee40809f14fd12ab762116dbee0b5
2011-08-30 18:23:13 -07:00
Kenny Root
bcc2d40a11 Merge "Throw exception on odd length Signatures" 2011-08-16 08:34:22 -07:00
Christopher Tate
6853fcf53f Fix partial-read handling during restore
...by once and for all making all of the code deal appropriately with
expected partial reads.  We also now produce a properly conformant
underlying 'tar' EOF sequence [which will be compressed to almost
nothing] to doubly bulletproof the end-of-archive logic.

Fixes bug 5133658

Change-Id: I24a785574861d64ef10fc727b9f6b235575696b0
2011-08-10 17:55:15 -07:00
Christopher Tate
eef4ae44b3 Fix bug where sometimes the full backup pw would not be validated
There was a hole where if no backup pw was supplied and the current
pw authentication field was also left blank, it wound up not verifying
and just proceeding with the backup.

Change-Id: I857d8e83cbb2b3bf6b6b04848c5696ef0cf393a1
2011-08-05 13:15:53 -07:00
Kenny Root
1137341885 Throw exception on odd length Signatures
The old version of this code would silently truncate odd-length
Signatures. However, this masks some bugs. Add a throw of
IllegalArgumentException so users can easily see where they're getting
bad input for Signatures.

Also, go through the existing code and catch this exception or
pre-check the input strings so system_server doesn't crash later.

Bug: 5092338
Change-Id: I8c672c5eaeb738a92c4581ce0df09baf719980ef
2011-08-04 11:51:38 -07:00
Christopher Tate
c58efa6052 Reduce backup manager logspew
...with particular attention to boot-time logging.  In particular, the
following kinds of messages are now cut unless someone turns on the new
MORE_DEBUG flag in their local build:

08-01 11:25:32.203   155   223 V BackupManagerService: starting timeout: token=4f52ccd1 interval=30000
08-01 11:25:32.211   155   223 V BackupManagerService: opComplete: 4f52ccd1
08-01 11:25:32.211   155   223 V BackupManagerService: operation 4f52ccd1 complete: finalState=1
08-01 11:25:32.211   155   223 V PerformBackupThread: doBackup() success

and

01-01 00:00:19.710   148   162 V BackupManagerService: Adding 9 backup participants:
01-01 00:00:19.710   148   162 V BackupManagerService:     PackageInfo{41af0380 android} agent=com.android.server.SystemBackupAgent uid=1000 killAfterRestore=false
01-01 00:00:19.710   148   162 V BackupManagerService:     PackageInfo{41aa5068 com.android.browser} agent=com.android.browser.BrowserBackupAgent uid=10005 killAfterRestore=true
01-01 00:00:19.710   148   162 V BackupManagerService:     PackageInfo{4199ce28 com.android.nfc3} agent=com.android.nfc.NfcBackupAgent uid=1025 killAfterRestore=true
01-01 00:00:19.710   148   162 V BackupManagerService:     PackageInfo{41a6e170 com.android.providers.settings} agent=com.android.providers.settings.SettingsBackupAgent uid=1000 killAfterRestore=false
01-01 00:00:19.710   148   162 V BackupManagerService:     PackageInfo{4198ba90 com.android.providers.userdictionary} agent=com.android.providers.userdictionary.DictionaryBackupAgent uid=10000 killAfterRestore=false
01-01 00:00:19.710   148   162 V BackupManagerService:     PackageInfo{41a80190 com.android.vending} agent=com.android.vending.VendingBackupAgent uid=10042 killAfterRestore=false
01-01 00:00:19.710   148   162 V BackupManagerService:     PackageInfo{41ac2980 com.google.android.calendar} agent=com.android.calendar.CalendarBackupAgent uid=10007 killAfterRestore=true
01-01 00:00:19.710   148   162 V BackupManagerService:     PackageInfo{41b14fb8 com.google.android.gm} agent=com.google.android.gm.persistence.GmailBackupAgent uid=10020 killAfterRestore=true
01-01 00:00:19.710   148   162 V BackupManagerService:     PackageInfo{41af89b8 com.google.android.inputmethod.latin} agent=com.android.inputmethod.latin.BackupAgent uid=10028 killAfterRestore=false

and

01-01 00:00:20.000   148   162 D BackupManagerService: Now awaiting backup for 1 participants:
01-01 00:00:20.000   148   162 D BackupManagerService:     + BackupRequest{app=ApplicationInfo{41b15110 android}} agent=com.android.server.SystemBackupAgent
01-01 00:00:20.000   148   162 I BackupManagerService: New app com.android.browser never backed up; scheduling
01-01 00:00:20.015   148   162 D BackupManagerService: Now awaiting backup for 2 participants:
01-01 00:00:20.015   148   162 D BackupManagerService:     + BackupRequest{app=ApplicationInfo{41b15110 android}} agent=com.android.server.SystemBackupAgent
01-01 00:00:20.015   148   162 D BackupManagerService:     + BackupRequest{app=ApplicationInfo{41ae5cf8 com.android.browser}} agent=com.android.browser.BrowserBackupAgent
01-01 00:00:20.015   148   162 I BackupManagerService: New app com.android.nfc3 never backed up; scheduling
01-01 00:00:20.031   148   162 D BackupManagerService: Now awaiting backup for 3 participants:
01-01 00:00:20.031   148   162 D BackupManagerService:     + BackupRequest{app=ApplicationInfo{41b15110 android}} agent=com.android.server.SystemBackupAgent
01-01 00:00:20.031   148   162 D BackupManagerService:     + BackupRequest{app=ApplicationInfo{41ae5cf8 com.android.browser}} agent=com.android.browser.BrowserBackupAgent
01-01 00:00:20.031   148   162 D BackupManagerService:     + BackupRequest{app=ApplicationInfo{41a47d88 com.android.nfc3}} agent=com.android.nfc.NfcBackupAgent
... [N times]

and various other overly-chatty messages that aren't useful for the midrange
debugging needs of early testing.

Bug 5104300

Change-Id: I2b2afb5ba68059cb1f4cccc07f2833e43cd6fe94
2011-08-01 19:25:18 -07:00
Christopher Tate
728a1c4d5e Require the current backup pw in all backup/restore operations
Specifically, we now also require the current password to confirm any
restore operation.

Bug 4901637

Change-Id: I39ecce7837f70cd05778cb7e0e6390ad8f6fe3f3
2011-07-28 18:04:07 -07:00
Christopher Tate
2efd2dbbac Support full-backup encryption and global backup password
If the user has supplied a backup password in Settings, that password
is validated during the full backup process and is used as an encryption
key for encoding the backed-up data itself.  This is the fundamental
mechanism whereby users can secure their data even against malicious
parties getting physical unlocked access to their device.

Technically the user-supplied password is not used as the encryption
key for the backed-up data itself.  What is actually done is that a
random key is generated to use as the raw encryption key.  THAT key,
in turn, is encrypted with the user-supplied password (after random
salting and key expansion with PBKDF2).  The encrypted master key
and a checksum are stored in the backup header.  At restore time,
the user supplies their password, which allows the system to decrypt
the master key, which in turn allows the decryption of the backup
data itself.

The checksum is part of the archive in order to permit validation
of the user-supplied password.  The checksum is the result of running
the user-supplied password through PBKDF2 with a randomly selected
salt.  At restore time, the proposed password is run through PBKDF2
with the salt described by the archive header.  If the result does
not match the archive's stated checksum, then the user has supplied
the wrong decryption password.

Also, suppress backup consideration for a few packages whose
data is either nonexistent or inapplicable across devices or
factory reset operations.

Bug 4901637

Change-Id: Id0cc9d0fdfc046602b129f273d48e23b7a14df36
2011-07-28 16:01:20 -07:00
Christopher Tate
7bdb096289 Support for compressed backups
The backup format now includes a stream header.  That header begins with
a magic string and version number, then includes a flag stating whether
the archive data is compressed, and then in the case of encrypted archives
states the password salt used during encryption key stretching.

When compression is used, everything following the header is run through
a standard zlib "deflate" compressor before being sent downstream.

Change-Id: Ica72753e4ef2c3d13e63b45e7722a00652940a55
2011-07-15 14:55:30 -07:00
Christopher Tate
7926a693c4 Compress the backup output stream
Zlib compression, with a full flush between each application's
data.  Encryption will be performed on the already-compressed data
once that's implemented.

On restore, the streamed data is similarly uncompressed on the fly.

Change-Id: I19b65c88e759a66527d10913d18fffa9df0bc011
2011-07-13 15:30:41 -07:00
Christopher Tate
284f1bb4da Can now restore a subset of apps from historical dataset
Adds the ability to filter a restore of an historical dataset so that it
only restores certain apps' data regardless of what is actually present
in the dataset.  This is currently only used by the bmgr command-line tool,
for debugging / developer support.

Bug 2021590

Change-Id: I7685e5d609b0f5506f71d70c26410602bb387659
2011-07-08 12:28:48 -07:00
Christopher Tate
79ec80db70 Make full backup API available to apps
New methods for full backup/restore have been added to BackupAgent
(still hidden): onFullBackup() and onRestoreFile().  The former is the
entry point for a full app backup to adb/socket/etc: the app then writes
all of its files, entire, to the output.  During restore, the latter
new callback is invoked, once for each file being restored.

The full backup/restore interface does not use the previously-defined
BackupDataInput / BackupDataOutput classes, because those classes
provide an API designed for incremental key/value data structuring.
Instead, a new FullBackupDataOutput class has been introduced, through
which we restrict apps' abilities to write data during a full backup
operation to *only* writing entire on-disk files via a new BackupAgent
method called fullBackupFile().

"FullBackupAgent" exists now solely as a concrete shell class that
can be instantiated in the case of apps that do not have their own
BackupAgent implementations.

Along with the API change, responsibility for backing up the .apk
file and OBB container has been moved into the framework rather than
have the application side of the transaction do it.

Change-Id: I12849b06b1a6e4c44d080587c1e9828a52b70dae
2011-07-06 14:40:32 -07:00
Christopher Tate
e9e78ecd2c Fix handling of directory entries
Don't emit tar blocks for directories with an invalid nonzero size.  Also, if
such an entry is encountered during restore, don't actually attempt to treat
it as valid and thus skip over the next actual tar entry.

This patch also adds tracking of the data actually consumed during restore,
and reports a total at the end of stream.

Change-Id: I625173f76df3c007e899209101ff2b587841f184
2011-06-08 20:11:49 -07:00
Christopher Tate
3f6c77b7ca Fix embedded spaces in tar stream EVEN HARDER
Change-Id: I97ac586ff3541a05d73e1e53f680517c15e6c662
2011-06-07 13:17:17 -07:00
Christopher Tate
b0628bfd5a Implement shared-storage full backup/restore
Every available shared-storage volume is backed up, tagged with its
ordinal in the set of mounted shared volumes.  This is an approximation
of "internal + the external card".  This lets us restore things to the
same volume [or "equivalent" volume, in the case of a cross-model
restore] as they originated on.

Also fixed a bug in the handling of files/dirs with spaces in
their names.

Change-Id: I380019da8d0bb5b3699bd7c11eeff621a88e78c3
2011-06-07 12:16:27 -07:00
Christopher Tate
a858cb075d Respect android:allowBackup="false" during full backup & restore
Packages with this manifest attribute set 'false' will not be backed
up even through the "full device backup" infrastructure.  If someone
produces an apparent restore file with data for such an application,
it will not actually be restored onto the device.

When an apk is installed during the course of a restore operation,
it is validated against the manifest contents and deleted if there
is a mismatch.  Also, if the newly-installed app is found to
disallow backups, no file content will be processed for that app.

Bug 4532159

Change-Id: I59630054584b1394e567de939192e22e597044ee
2011-06-03 14:06:46 -07:00
Christopher Tate
75a99709ac Restore from a previous full backup's tarfile
Usage:  adb restore [tarfilename]

Restores app data [and installs the apps if necessary from the backup
file] captured in a previous invocation of 'adb backup'.  The user
must explicitly acknowledge the action on-device before it is allowed
to proceed; this prevents any "invisible" pushes of content from the
host to the device.

Known issues:

* The settings databases and wallpaper are saved/restored, but lots
  of other system state is not yet captured in the full backup.  This
  means that for practical purposes this is usable for 3rd party
  apps at present but not for full-system cloning/imaging.

Change-Id: I0c748b645845e7c9178e30bf142857861a64efd3
2011-06-01 15:09:55 -07:00