From 18e24e587d2cce6214a9da111d7d720c196a169a Mon Sep 17 00:00:00 2001
From: Martin Szulecki
Date: Sat, 8 Dec 2012 21:45:19 +0100
Subject: idevicebackup2: Implement support to supply backup password for
 restore

---
 tools/idevicebackup2.c | 31 ++++++++++++++++++++++++-------
 1 file changed, 24 insertions(+), 7 deletions(-)

(limited to 'tools')

diff --git a/tools/idevicebackup2.c b/tools/idevicebackup2.c
index 856c41c..ad3f0f6 100644
--- a/tools/idevicebackup2.c
+++ b/tools/idevicebackup2.c
@@ -1116,11 +1116,12 @@ static void print_usage(int argc, char **argv)
 	printf("commands:\n");
 	printf("  backup\tcreate backup for the device\n");
 	printf("  restore\trestore last backup to the device\n");
-	printf("    --system\trestore system files, too.\n");
-	printf("    --reboot\treboot the system when done.\n");
-	printf("    --copy\tcreate a copy of backup folder before restoring.\n");
-	printf("    --settings\trestore device settings from the backup.\n");
-	printf("    --remove\tremove items which are not being restored\n");
+	printf("    --system\t\trestore system files, too.\n");
+	printf("    --reboot\t\treboot the system when done.\n");
+	printf("    --copy\t\tcreate a copy of backup folder before restoring.\n");
+	printf("    --settings\t\trestore device settings from the backup.\n");
+	printf("    --remove\t\tremove items which are not being restored\n");
+	printf("    --password PWD\tsupply the password of the source backup\n");
 	printf("  info\t\tshow details about last completed backup of device\n");
 	printf("  list\t\tlist files of last completed backup in CSV format\n");
 	printf("  unback\tunpack a completed backup in DIRECTORY/_unback_/\n\n");
@@ -1142,7 +1143,8 @@ int main(int argc, char *argv[])
 	int cmd = -1;
 	int cmd_flags = 0;
 	int is_full_backup = 0;
-	char *backup_directory = NULL;
+	char* backup_directory = NULL;
+	char* backup_password = NULL;
 	struct stat st;
 	plist_t node_tmp = NULL;
 	plist_t info_plist = NULL;
@@ -1206,6 +1208,17 @@ int main(int argc, char *argv[])
 		else if (!strcmp(argv[i], "--remove")) {
 			cmd_flags |= CMD_FLAG_RESTORE_REMOVE_ITEMS;
 		}
+		else if (!strcmp(argv[i], "--password")) {
+			i++;
+			if (!argv[i]) {
+				print_usage(argc, argv);
+				return 0;
+			}
+			if (backup_password)
+				free(backup_password);
+			backup_password = strdup(argv[i]);
+			continue;
+		}
 		else if (!strcmp(argv[i], "info")) {
 			cmd = CMD_INFO;
 			verbose = 0;
@@ -1471,7 +1484,11 @@ checkpoint:
 			PRINT_VERBOSE(1, "Preserve settings of device: %s\n", ((cmd_flags & CMD_FLAG_RESTORE_SETTINGS) == 0 ? "Yes":"No"));
 			if (cmd_flags & CMD_FLAG_RESTORE_REMOVE_ITEMS)
 				plist_dict_insert_item(opts, "RemoveItemsNotRestored", plist_new_bool(1));
-			PRINT_VERBOSE(1, "Remove items that are not restored: %s\n", ((cmd_flags & CMD_FLAG_RESTORE_REMOVE_ITEMS) ? "Yes":"No"));
+				PRINT_VERBOSE(1, "Remove items that are not restored: %s\n", ((cmd_flags & CMD_FLAG_RESTORE_REMOVE_ITEMS) ? "Yes":"No"));
+			if (backup_password != NULL) {
+				plist_dict_insert_item(opts, "Password", plist_new_string(backup_password));
+			}
+			PRINT_VERBOSE(1, "Backup password: %s\n", (backup_password == NULL ? "No":"Yes"));
 
 			err = mobilebackup2_send_request(mobilebackup2, "Restore", udid, source_udid, opts);
 			plist_free(opts);
-- 
cgit v1.1-32-gdbae