From e58d5269a6f032812f55b6d85f7d2e7b72220fa8 Mon Sep 17 00:00:00 2001 From: Dees_Troy Date: Fri, 21 Sep 2012 12:27:57 -0400 Subject: Add android_secure support --- partition.cpp | 99 +++++++++++++++++++++++++++++++++++++++++++--------- partitionmanager.cpp | 55 ++++++++++++++++++----------- partitions.hpp | 7 +++- 3 files changed, 123 insertions(+), 38 deletions(-) diff --git a/partition.cpp b/partition.cpp index 341dee704..063603933 100644 --- a/partition.cpp +++ b/partition.cpp @@ -55,6 +55,7 @@ TWPartition::TWPartition(void) { Symlink_Path = ""; Symlink_Mount_Point = ""; Mount_Point = ""; + Backup_Path = ""; Actual_Block_Device = ""; Primary_Block_Device = ""; Alternate_Block_Device = ""; @@ -75,6 +76,7 @@ TWPartition::TWPartition(void) { MTD_Name = ""; Backup_Method = NONE; Has_Data_Media = false; + Has_Android_Secure = false; Is_Storage = false; Storage_Path = ""; Current_File_System = ""; @@ -100,6 +102,7 @@ bool TWPartition::Process_Fstab_Line(string Line, bool Display_Error) { } string mount_pt(full_line); Mount_Point = mount_pt; + Backup_Path = Mount_Point; index = Mount_Point.size(); while (index < line_len) { while (index < line_len && full_line[index] == '\0') @@ -231,17 +234,26 @@ bool TWPartition::Process_Fstab_Line(string Line, bool Display_Error) { Is_Storage = true; Storage_Path = "/sdcard"; Removable = true; +#ifndef RECOVERY_SDCARD_ON_DATA + Setup_AndSec(); +#endif } #endif #ifdef TW_INTERNAL_STORAGE_PATH if (Mount_Point == EXPAND(TW_INTERNAL_STORAGE_PATH)) { Is_Storage = true; Storage_Path = EXPAND(TW_INTERNAL_STORAGE_PATH); +#ifndef RECOVERY_SDCARD_ON_DATA + Setup_AndSec(); +#endif } #else if (Mount_Point == "/emmc") { Is_Storage = true; Storage_Path = "/emmc"; +#ifndef RECOVERY_SDCARD_ON_DATA + Setup_AndSec(); +#endif } #endif } else if (Is_Image(Fstab_File_System)) { @@ -405,6 +417,16 @@ void TWPartition::Setup_Image(bool Display_Error) { } } +void TWPartition::Setup_AndSec(void) { + Backup_Name = "and-sec"; + Has_Android_Secure = true; + Symlink_Path = Mount_Point + "/.android_secure"; + Symlink_Mount_Point = "/and-sec"; + Backup_Path = Symlink_Mount_Point; + Make_Dir("/and-sec", true); + Recreate_AndSec_Folder(); +} + void TWPartition::Find_Real_Block_Device(string& Block, bool Display_Error) { char device[512], realDevice[512]; @@ -527,6 +549,7 @@ bool TWPartition::Get_Size_Via_df(bool Display_Error) { } else { // The device block string is so long that the df information is on the next line int space_count = 0; + sprintf(tmpString, "/dev/block/%s", Actual_Block_Device.c_str()); while (tmpString[space_count] == 32) space_count++; sscanf(line + space_count, "%lu %lu %lu", &blocks, &used, &available); @@ -693,6 +716,23 @@ bool TWPartition::Wipe() { return false; } +bool TWPartition::Wipe_AndSec(void) { + if (!Has_Android_Secure) + return false; + + char cmd[512]; + + if (!Mount(true)) + return false; + + ui_print("Using rm -rf on .android_secure\n"); + sprintf(cmd, "rm -rf %s/.android_secure/* && rm -rf %s/.android_secure/.*", Mount_Point.c_str(), Mount_Point.c_str()); + + LOGI("rm -rf command is: '%s'\n", cmd); + system(cmd); + return true; +} + bool TWPartition::Backup(string backup_folder) { if (Backup_Method == FILES) return Backup_Tar(backup_folder); @@ -876,6 +916,7 @@ bool TWPartition::Wipe_EXT23() { sprintf(command, "mke2fs -t %s -m 0 %s", Current_File_System.c_str(), Actual_Block_Device.c_str()); LOGI("mke2fs command: %s\n", command); if (system(command) == 0) { + Recreate_AndSec_Folder(); ui_print("Done.\n"); return true; } else { @@ -908,6 +949,7 @@ bool TWPartition::Wipe_EXT4() { Command += " " + Actual_Block_Device; LOGI("make_ext4fs command: %s\n", Command.c_str()); if (system(Command.c_str()) == 0) { + Recreate_AndSec_Folder(); ui_print("Done.\n"); return true; } else { @@ -923,9 +965,6 @@ bool TWPartition::Wipe_EXT4() { bool TWPartition::Wipe_FAT() { char command[512]; - if (Backup_Name == "and-sec") // Don't format if it's android secure - return Wipe_RMRF(); - if (TWFunc::Path_Exists("/sbin/mkdosfs")) { if (!UnMount(true)) return false; @@ -934,6 +973,7 @@ bool TWPartition::Wipe_FAT() { Find_Actual_Block_Device(); sprintf(command,"mkdosfs %s", Actual_Block_Device.c_str()); // use mkdosfs to format it if (system(command) == 0) { + Recreate_AndSec_Folder(); ui_print("Done.\n"); return true; } else { @@ -975,6 +1015,7 @@ bool TWPartition::Wipe_MTD() { LOGE("Failed to close '%s'", MTD_Name.c_str()); return false; } + Recreate_AndSec_Folder(); ui_print("Done.\n"); return true; } @@ -985,16 +1026,12 @@ bool TWPartition::Wipe_RMRF() { if (!Mount(true)) return false; - if (Backup_Name == "and-sec") { - ui_print("Using rm -rf on .android_secure\n"); - sprintf(cmd, "rm -rf %s/.android_secure/* && rm -rf %s/.android_secure/.*", Mount_Point.c_str(), Mount_Point.c_str()); - } else { - ui_print("Using rm -rf on '%s'\n", Mount_Point.c_str()); - sprintf(cmd, "rm -rf %s/* && rm -rf %s/.*", Mount_Point.c_str(), Mount_Point.c_str()); - } + ui_print("Using rm -rf on '%s'\n", Mount_Point.c_str()); + sprintf(cmd, "rm -rf %s/* && rm -rf %s/.*", Mount_Point.c_str(), Mount_Point.c_str()); LOGI("rm -rf command is: '%s'\n", cmd); system(cmd); + Recreate_AndSec_Folder(); return true; } @@ -1050,7 +1087,7 @@ bool TWPartition::Backup_Tar(string backup_folder) { if (Backup_Size > MAX_ARCHIVE_SIZE) { // This backup needs to be split into multiple archives ui_print("Breaking backup file into multiple archives...\nGenerating file lists\n"); - sprintf(back_name, "%s", Mount_Point.c_str()); + sprintf(back_name, "%s", Backup_Path.c_str()); backup_count = make_file_list(back_name); if (backup_count < 1) { LOGE("Error generating file list!\n"); @@ -1075,9 +1112,9 @@ bool TWPartition::Backup_Tar(string backup_folder) { } else { Full_FileName = backup_folder + "/" + Backup_FileName; if (Has_Data_Media) - Command = "cd " + Mount_Point + " && tar " + Tar_Args + " ./ --exclude='media*' -f '" + Full_FileName + "'"; + Command = "cd " + Backup_Path + " && tar " + Tar_Args + " ./ --exclude='media*' -f '" + Full_FileName + "'"; else - Command = "cd " + Mount_Point + " && tar " + Tar_Args + " -f '" + Full_FileName + "' ./*"; + Command = "cd " + Backup_Path + " && tar " + Tar_Args + " -f '" + Full_FileName + "' ./*"; LOGI("Backup command: '%s'\n", Command.c_str()); system(Command.c_str()); } @@ -1143,9 +1180,14 @@ bool TWPartition::Restore_Tar(string restore_folder) { Restore_File_System.resize(second_period); LOGI("Restore file system is: '%s'.\n", Restore_File_System.c_str()); Current_File_System = Restore_File_System; - ui_print("Wiping %s...\n", Display_Name.c_str()); - if (!Wipe()) + if (Has_Android_Secure) { + ui_print("Wiping android secure...\n"); + if (!Wipe_AndSec()) + return false; + } else if (!Wipe()) { + ui_print("Wiping %s...\n", Display_Name.c_str()); return false; + } if (!Mount(true)) return false; @@ -1159,7 +1201,7 @@ bool TWPartition::Restore_Tar(string restore_folder) { Full_FileName = restore_folder + "/" + Backup_FileName + split_index; while (TWFunc::Path_Exists(Full_FileName)) { ui_print("Restoring archive %i...\n", index + 1); - Command = "cd " + Mount_Point + " && tar -xf '" + Full_FileName + "'"; + Command = "cd " + Backup_Path + " && tar -xf '" + Full_FileName + "'"; LOGI("Restore command: '%s'\n", Command.c_str()); system(Command.c_str()); index++; @@ -1171,7 +1213,7 @@ bool TWPartition::Restore_Tar(string restore_folder) { return false; } } else { - Command = "cd " + Mount_Point + " && tar -xf '" + Full_FileName + "'"; + Command = "cd " + Backup_Path + " && tar -xf '" + Full_FileName + "'"; LOGI("Restore command: '%s'\n", Command.c_str()); system(Command.c_str()); } @@ -1236,6 +1278,11 @@ bool TWPartition::Update_Size(bool Display_Error) { LOGI("Data backup size is %iMB, size: %iMB, used: %iMB, free: %iMB, in data/media: %iMB.\n", bak, total, us, fre, datmed); } else return false; + } else if (Has_Android_Secure) { + if (Mount(Display_Error)) + Backup_Size = TWFunc::Get_Folder_Size(Backup_Path, Display_Error); + else + return false; } return true; } @@ -1270,3 +1317,21 @@ void TWPartition::Recreate_Media_Folder(void) { system(Command.c_str()); } } + +void TWPartition::Recreate_AndSec_Folder(void) { + string Command; + + if (!Has_Android_Secure) + return; + + if (!Mount(true)) { + LOGE("Unable to recreate android secure folder.\n"); + } else if (!TWFunc::Path_Exists(Symlink_Path)) { + LOGI("Recreating android secure folder.\n"); + TWFunc::Recursive_Mkdir(Symlink_Path); + Command = "umount " + Symlink_Mount_Point; + system(Command.c_str()); + Command = "mount " + Symlink_Path + " " + Symlink_Mount_Point; + system(Command.c_str()); + } +} diff --git a/partitionmanager.cpp b/partitionmanager.cpp index 2e0219e01..968507274 100644 --- a/partitionmanager.cpp +++ b/partitionmanager.cpp @@ -147,6 +147,8 @@ void TWPartitionManager::Output_Partition(TWPartition* Part) { printf("Is_Decrypted "); if (Part->Has_Data_Media) printf("Has_Data_Media "); + if (Part->Has_Android_Secure) + printf("Has_Android_Secure "); if (Part->Is_Storage) printf("Is_Storage "); printf("\n"); @@ -166,6 +168,8 @@ void TWPartitionManager::Output_Partition(TWPartition* Part) { printf(" Length: %i\n", Part->Length); if (!Part->Display_Name.empty()) printf(" Display_Name: %s\n", Part->Display_Name.c_str()); + if (!Part->Backup_Path.empty()) + printf(" Backup_Path: %s\n", Part->Backup_Path.c_str()); if (!Part->Backup_Name.empty()) printf(" Backup_Name: %s\n", Part->Backup_Name.c_str()); if (!Part->Backup_FileName.empty()) @@ -1030,30 +1034,30 @@ void TWPartitionManager::Set_Restore_Files(string Restore_Name) { } // Now, we just need to find the correct label - if (Part->Mount_Point == "/system") + if (Part->Backup_Path == "/system") tw_restore_system = 1; - if (Part->Mount_Point == "/data") + if (Part->Backup_Path == "/data") tw_restore_data = 1; - if (Part->Mount_Point == "/cache") + if (Part->Backup_Path == "/cache") tw_restore_cache = 1; - if (Part->Mount_Point == "/recovery") + if (Part->Backup_Path == "/recovery") tw_restore_recovery = 1; - if (Part->Mount_Point == "/boot") + if (Part->Backup_Path == "/boot") tw_restore_boot = 1; - if (Part->Mount_Point == "/.android_secure") + if (Part->Backup_Path == "/and-sec") tw_restore_andsec = 1; - if (Part->Mount_Point == "/sd-ext") + if (Part->Backup_Path == "/sd-ext") tw_restore_sdext = 1; #ifdef SP1_NAME - if (Part->Mount_Point == TWFunc::Get_Root_Path(SP1_Name)) + if (Part->Backup_Path == TWFunc::Get_Root_Path(SP1_Name)) tw_restore_sp1 = 1; #endif #ifdef SP2_NAME - if (Part->Mount_Point == TWFunc::Get_Root_Path(SP2_Name)) + if (Part->Backup_Path == TWFunc::Get_Root_Path(SP2_Name)) tw_restore_sp2 = 1; #endif #ifdef SP3_NAME - if (Part->Mount_Point == TWFunc::Get_Root_Path(SP3_Name)) + if (Part->Backup_Path == TWFunc::Get_Root_Path(SP3_Name)) tw_restore_sp3 = 1; #endif } @@ -1083,7 +1087,10 @@ int TWPartitionManager::Wipe_By_Path(string Path) { // Iterate through all partitions for (iter = Partitions.begin(); iter != Partitions.end(); iter++) { if ((*iter)->Mount_Point == Local_Path || (!(*iter)->Symlink_Mount_Point.empty() && (*iter)->Symlink_Mount_Point == Local_Path)) { - ret = (*iter)->Wipe(); + if (Path == "/and-sec") + ret = (*iter)->Wipe_AndSec(); + else + ret = (*iter)->Wipe(); found = true; } else if ((*iter)->Is_SubPartition && (*iter)->SubPartition_Of == Local_Path) { (*iter)->Wipe(); @@ -1272,9 +1279,9 @@ void TWPartitionManager::Update_System_Details(void) { DataManager::SetValue(TW_BACKUP_SDEXT_VAR, 0); } else DataManager::SetValue(TW_HAS_SDEXT_PARTITION, 1); - } else if ((*iter)->Mount_Point == "/and-sec") { + } else if ((*iter)->Has_Android_Secure) { int backup_display_size = (int)((*iter)->Backup_Size / 1048576LLU); - DataManager::SetValue(TW_BACKUP_SDEXT_SIZE, backup_display_size); + DataManager::SetValue(TW_BACKUP_ANDSEC_SIZE, backup_display_size); if ((*iter)->Backup_Size == 0) { DataManager::SetValue(TW_HAS_ANDROID_SECURE, 0); DataManager::SetValue(TW_BACKUP_ANDSEC_VAR, 0); @@ -1481,23 +1488,31 @@ int TWPartitionManager::usb_storage_disable(void) { sprintf(lun_file, CUSTOM_LUN_FILE, index); if ((fd = open(lun_file, O_WRONLY)) < 0) { - if (index == 0) + Mount_All_Storage(); + Update_System_Details(); + if (index == 0) { LOGE("Unable to open ums lunfile '%s': (%s)", lun_file, strerror(errno)); - return false; + return false; + } else + return true; } char ch = 0; if (write(fd, &ch, 1) < 0) { - if (index == 0) - LOGE("Unable to write to ums lunfile '%s': (%s)", lun_file, strerror(errno)); close(fd); - return false; + Mount_All_Storage(); + Update_System_Details(); + if (index == 0) { + LOGE("Unable to write to ums lunfile '%s': (%s)", lun_file, strerror(errno)); + return false; + } else + return true; } close(fd); } - Mount_By_Path(DataManager::GetSettingsStoragePath(), true); - Mount_By_Path(DataManager::GetCurrentStoragePath(), true); + Mount_All_Storage(); + Update_System_Details(); return true; } diff --git a/partitions.hpp b/partitions.hpp index c253d3b83..e968468c5 100644 --- a/partitions.hpp +++ b/partitions.hpp @@ -50,6 +50,7 @@ public: virtual bool Mount(bool Display_Error); // Mounts the partition if it is not mounted virtual bool UnMount(bool Display_Error); // Unmounts the partition if it is mounted virtual bool Wipe(); // Wipes the partition + virtual bool Wipe_AndSec(); // Wipes android secure virtual bool Backup(string backup_folder); // Backs up the partition to the folder specified virtual bool Check_MD5(string restore_folder); // Checks MD5 of a backup virtual bool Restore(string restore_folder); // Restores the partition using the backup folder provided @@ -75,6 +76,7 @@ protected: string Symlink_Path; // Symlink path (e.g. /data/media) string Symlink_Mount_Point; // /sdcard could be the symlink mount point for /data/media string Mount_Point; // Mount point for this partition (e.g. /system or /data) + string Backup_Path; // Path for backup string Actual_Block_Device; // Actual block device (one of primary, alternate, or decrypted) string Primary_Block_Device; // Block device (e.g. /dev/block/mmcblk1p1) string Alternate_Block_Device; // Alternate block device (e.g. /dev/block/mmcblk1) @@ -95,6 +97,7 @@ protected: string MTD_Name; // Name of the partition for MTD devices Backup_Method_enum Backup_Method; // Method used for backup bool Has_Data_Media; // Indicates presence of /data/media, may affect wiping and backup methods + bool Has_Android_Secure; // Indicates the presence of .android_secure on this partition bool Is_Storage; // Indicates if this partition is used for storage for backup, restore, and installing zips string Storage_Path; // Indicates the path to the storage -- root indicates mount point, media/ indicates e.g. /data/media string Current_File_System; // Current file system @@ -107,6 +110,7 @@ private: bool Is_Image(string File_System); // Checks to see if the file system given is considered an image void Setup_File_System(bool Display_Error); // Sets defaults for a file system partition void Setup_Image(bool Display_Error); // Sets defaults for an image partition + void Setup_AndSec(void); // Sets up .android_secure settings void Find_Real_Block_Device(string& Block_Device, bool Display_Error); // Checks the block device given and follows symlinks until it gets to the real block device bool Find_Partition_Size(); // Finds the partition size from /proc/partitions unsigned long long Get_Size_Via_du(string Path, bool Display_Error); // Uses du to get sizes @@ -114,7 +118,7 @@ private: bool Wipe_EXT23(); // Formats as ext3 or ext2 bool Wipe_EXT4(); // Formats using ext4, uses make_ext4fs when present bool Wipe_FAT(); // Formats as FAT except that mkdosfs from busybox usually fails so oftentimes this is actually a rm -rf wipe - bool Wipe_MTD(); // Formats as yaffs2 for MTD memory types + bool Wipe_MTD(); // Formats as yaffs2 for MTD memory types bool Wipe_RMRF(); // Uses rm -rf to wipe bool Wipe_Data_Without_Wiping_Media(); // Uses rm -rf to wipe but does not wipe /data/media bool Backup_Tar(string backup_folder); // Backs up using tar for file systems @@ -127,6 +131,7 @@ private: bool Get_Size_Via_df(bool Display_Error); // Get Partition size, used, and free space using df command bool Make_Dir(string Path, bool Display_Error); // Creates a directory if it doesn't already exist bool Find_MTD_Block_Device(string MTD_Name); // Finds the mtd block device based on the name from the fstab + void Recreate_AndSec_Folder(void); // Recreates the .android_secure folder friend class TWPartitionManager; }; -- cgit v1.2.3