diff --git a/services/ringtone_restore/include/customised_tone_processor.h b/services/ringtone_restore/include/customised_tone_processor.h index 37efc2a..6881257 100644 --- a/services/ringtone_restore/include/customised_tone_processor.h +++ b/services/ringtone_restore/include/customised_tone_processor.h @@ -25,11 +25,14 @@ namespace OHOS { namespace Media { -const std::string RINGTONE_EXTERNAL_BASE_PATH = "/storage/emulated/0"; -const std::string RINGTONE_EXTERNAL_MUSIC_PATH = RINGTONE_EXTERNAL_BASE_PATH + "/Music"; -const std::string FILE_MANAGER_BASE_PATH = "/storage/media/local/files/Docs"; -const std::string FILE_MANAGER_UPDATE_BACKUP_PATH = FILE_MANAGER_BASE_PATH + "/UpdateBackup"; +const std::string RINGTONE_EXTERNAL_BASE_PATH = "/storage/emulated/"; +const std::string RINGTONE_EXTERNAL_SUB_DIR_MUSIC = "Music/"; +const std::string FILE_MANAGER_BASE_PATH = "/storage/media/"; +const std::string FILE_MANAGER_SUB_DIR_DOCS = "local/files/Docs/"; +const std::string FILE_MANAGER_SUB_DIR_UPDATEBACKUP = FILE_MANAGER_SUB_DIR_DOCS + "UpdateBackup/"; + constexpr int STORAGE_MANAGER_MANAGER_ID = 5003; +static constexpr uint64_t MAX_TONE_FILE_SIZE = 200 * 1024 * 1024; class CustomisedToneProcessor { public: diff --git a/services/ringtone_restore/include/ringtone_restore_base.h b/services/ringtone_restore/include/ringtone_restore_base.h index 1cacbbb..fc475be 100644 --- a/services/ringtone_restore/include/ringtone_restore_base.h +++ b/services/ringtone_restore/include/ringtone_restore_base.h @@ -56,7 +56,7 @@ protected: bool NeedCommitSetting(const std::string &typeColumn, const std::string &sourceColumn, int type, int allSetType); void SetNotRingtone(const std::string &typeColumn, const std::string &sourceColumn, int32_t simCard); - void UpdateSettingTable(const SimcardSettingAsset &asset); + void UpdateSettingTable(const SimcardSettingAsset &asset, bool forceUpdate = false); private: void CheckUpdateVibrateSetting(const FileInfo &info); std::string QuerySingleColumn(const std::string &dataColumn, diff --git a/services/ringtone_restore/src/customised_tone_processor.cpp b/services/ringtone_restore/src/customised_tone_processor.cpp index 8aab6b9..e950c6c 100644 --- a/services/ringtone_restore/src/customised_tone_processor.cpp +++ b/services/ringtone_restore/src/customised_tone_processor.cpp @@ -41,6 +41,7 @@ #endif #include "ringtone_restore_base.h" #include "iservice_registry.h" +#include "ringtone_restore_db_utils.h" namespace OHOS { namespace Media { @@ -153,47 +154,35 @@ int32_t CustomisedToneProcessor::GetCustomisedAudioPath(DualFwkConf &dualFwkConf std::string CustomisedToneProcessor::ConvertCustomisedAudioPath(const std::string &ringtonePath) { - if (ringtonePath.empty()) { - RINGTONE_ERR_LOG("customised audio path is empty"); - return ""; - } + CHECK_AND_RETURN_RET_LOG(!ringtonePath.empty(), "", "customised audio path is empty"); + auto pos = ringtonePath.find(RINGTONE_EXTERNAL_BASE_PATH); + CHECK_AND_RETURN_RET_LOG(pos != std::string::npos, "", + "customised audio file not in the directory: %{public}s", RINGTONE_EXTERNAL_BASE_PATH.c_str()); - std::string::size_type pos = ringtonePath.find(RINGTONE_EXTERNAL_BASE_PATH); - if (pos == std::string::npos) { - RINGTONE_ERR_LOG("customised audio file not in the directory: %{public}s", RINGTONE_EXTERNAL_BASE_PATH.c_str()); - return ""; - } + std::filesystem::path userSubPath = ringtonePath.substr(RINGTONE_EXTERNAL_BASE_PATH.length()); + userSubPath = userSubPath.relative_path(); + auto iter = userSubPath.begin(); + CHECK_AND_RETURN_RET_LOG(iter != userSubPath.end(), "", + "invalid subpath: %{public}s", userSubPath.c_str()); + + std::filesystem::path subPath = RingtoneUtils::IsNumber(*iter) ? + std::filesystem::relative(userSubPath, *iter) : userSubPath; + bool isMusicPath = subPath.string().find(RINGTONE_EXTERNAL_SUB_DIR_MUSIC) != std::string::npos; + std::filesystem::path fileMgrBasePath = FILE_MANAGER_BASE_PATH; + std::filesystem::path searchPath1 = fileMgrBasePath / FILE_MANAGER_SUB_DIR_DOCS; + std::filesystem::path searchPath2 = fileMgrBasePath / FILE_MANAGER_SUB_DIR_UPDATEBACKUP; + std::string strSearchPath1 = (searchPath1 / subPath).lexically_normal().string(); + std::string strSearchPath2 = (searchPath2 / subPath).lexically_normal().string(); + RINGTONE_INFO_LOG("searchPath1:%{public}s, searchPath2:%{public}s", + strSearchPath1.c_str(), strSearchPath2.c_str()); - std::string absPath = ringtonePath.substr(pos + RINGTONE_EXTERNAL_BASE_PATH.length()); - bool isMusicPath = ringtonePath.find(RINGTONE_EXTERNAL_MUSIC_PATH) != std::string::npos; - std::string fileMgrAudioPath = ""; std::string tmpPath; - if (isMusicPath && PathToRealPath(FILE_MANAGER_UPDATE_BACKUP_PATH + absPath, tmpPath)) { - fileMgrAudioPath = FILE_MANAGER_UPDATE_BACKUP_PATH + absPath; - RINGTONE_INFO_LOG("convert %{public}s to %{public}s", ringtonePath.c_str(), fileMgrAudioPath.c_str()); - return fileMgrAudioPath; - } - - if (!isMusicPath && PathToRealPath(FILE_MANAGER_BASE_PATH + absPath, tmpPath)) { - fileMgrAudioPath = FILE_MANAGER_BASE_PATH + absPath; - RINGTONE_INFO_LOG("convert %{public}s to %{public}s", ringtonePath.c_str(), fileMgrAudioPath.c_str()); - return fileMgrAudioPath; - } - - if (!isMusicPath && PathToRealPath(FILE_MANAGER_UPDATE_BACKUP_PATH + absPath, tmpPath)) { - fileMgrAudioPath = FILE_MANAGER_UPDATE_BACKUP_PATH + absPath; - RINGTONE_INFO_LOG("convert %{public}s to %{public}s", ringtonePath.c_str(), fileMgrAudioPath.c_str()); - return fileMgrAudioPath; - } - - if (isMusicPath && PathToRealPath(FILE_MANAGER_BASE_PATH + absPath, tmpPath)) { - fileMgrAudioPath = FILE_MANAGER_BASE_PATH + absPath; - RINGTONE_INFO_LOG("convert %{public}s to %{public}s", ringtonePath.c_str(), fileMgrAudioPath.c_str()); - return fileMgrAudioPath; - } - - RINGTONE_DEBUG_LOG("No rule can convert ringtonePath: %{public}s", ringtonePath.c_str()); - return fileMgrAudioPath; + CHECK_AND_RETURN_RET(!(isMusicPath && PathToRealPath(strSearchPath2, tmpPath)), strSearchPath2); + CHECK_AND_RETURN_RET(!(!isMusicPath && PathToRealPath(strSearchPath1, tmpPath)), strSearchPath1); + CHECK_AND_RETURN_RET(!(!isMusicPath && PathToRealPath(strSearchPath2, tmpPath)), strSearchPath2); + CHECK_AND_RETURN_RET(!(isMusicPath && PathToRealPath(strSearchPath1, tmpPath)), strSearchPath1); + RINGTONE_INFO_LOG("No rule can convert ringtonePath: %{public}s", ringtonePath.c_str()); + return ""; } int32_t CustomisedToneProcessor::BuildFileInfo(const std::string &dualFilePath, int32_t toneType, int32_t ringtoneType, @@ -244,7 +233,7 @@ std::string CustomisedToneProcessor::GetNewUri(int32_t toneType, const std::stri CHECK_AND_RETURN_RET_LOG(manager_ != nullptr, newUri, "get media library manager failed"); std::string fileUri; std::string filePath{oldUri}; - if (mediaType == RINGTONE_MEDIA_TYPE_VIDEO) { + if (mediaType == RINGTONE_MEDIA_TYPE_VIDEO && ext == RINGTONE_CONTAINER_TYPE_VIDEO_MP4) { auto newUris = manager_->GetUrisByOldUris({oldUri}); fileUri = newUris.count(oldUri) == 0 ? oldUri : newUris[oldUri]; if (fileUri != oldUri) { @@ -256,6 +245,11 @@ std::string CustomisedToneProcessor::GetNewUri(int32_t toneType, const std::stri if (!filePath.empty() && filePath != oldUri) { int32_t fd = manager_->OpenAsset(fileUri, RINGTONE_FILEMODE_READONLY); CHECK_AND_RETURN_RET_LOG(fd > 0, newUri, "get file fd failed"); + if (!RingtoneFileUtils::CheckFileSize(fd, MAX_TONE_FILE_SIZE)) { + RINGTONE_ERR_LOG("file size exceed limit"); + manager_->CloseAsset(fileUri, fd); + return newUri; + } std::string target = RingtoneRestoreBase::GetRestoreDir(toneType) + "/" + RingtoneFileUtils::GetFileNameFromPath(oldUri); RingtoneFileUtils::DeleteFile(target); diff --git a/services/ringtone_restore/src/dualfwk_sound_setting.cpp b/services/ringtone_restore/src/dualfwk_sound_setting.cpp index 9e17c3e..cb744b5 100644 --- a/services/ringtone_restore/src/dualfwk_sound_setting.cpp +++ b/services/ringtone_restore/src/dualfwk_sound_setting.cpp @@ -241,7 +241,7 @@ std::string DualFwkSoundSetting::ExtractFileName(const std::string &input) } auto pos = input.find(DUALFWK_CONF_VIBRATE_MODE_STD); - if (pos != std::string::npos) { + if (pos == std::string::npos) { return ret; } diff --git a/services/ringtone_restore/src/ringtone_restore_base.cpp b/services/ringtone_restore/src/ringtone_restore_base.cpp index ca2f476..f3770aa 100644 --- a/services/ringtone_restore/src/ringtone_restore_base.cpp +++ b/services/ringtone_restore/src/ringtone_restore_base.cpp @@ -517,7 +517,7 @@ void RingtoneRestoreBase::SetNotRingtone(const string &columnType, const string RINGTONE_INFO_LOG("update both end changeRows = %{public}d", changeRows); } -void RingtoneRestoreBase::UpdateSettingTable(const SimcardSettingAsset &asset) +void RingtoneRestoreBase::UpdateSettingTable(const SimcardSettingAsset &asset, bool forceUpdate) { CHECK_AND_RETURN_LOG(localRdb_ != nullptr, "localRdb_ is null"); int32_t changeRows = 0; @@ -535,6 +535,9 @@ void RingtoneRestoreBase::UpdateSettingTable(const SimcardSettingAsset &asset) whereArgs.push_back(to_string(asset.GetRingtoneType())); absRdbPredicates.SetWhereClause(whereClause); absRdbPredicates.SetWhereArgs(whereArgs); + if (!forceUpdate) { + absRdbPredicates.IsNull(SIMCARD_SETTING_COLUMN_VIBRATE_MODE); + } localRdb_->Update(changeRows, valuesBucket, absRdbPredicates); RINGTONE_INFO_LOG("update end changeRows = %{public}d", changeRows); } diff --git a/services/utils/include/ringtone_file_utils.h b/services/utils/include/ringtone_file_utils.h index 79bb587..d08009a 100644 --- a/services/utils/include/ringtone_file_utils.h +++ b/services/utils/include/ringtone_file_utils.h @@ -79,6 +79,7 @@ public: EXPORT static std::string GetFileExtension(const std::string &path); EXPORT static void RemoveRingtoneFolder(const std::string &path); EXPORT static bool IsTargetExtension(const std::string &filePath); + EXPORT static bool CheckFileSize(int32_t fd, uint64_t maxFileSize); }; } // namespace Media } // namespace OHOS diff --git a/services/utils/src/ringtone_file_utils.cpp b/services/utils/src/ringtone_file_utils.cpp index c66b706..595061e 100644 --- a/services/utils/src/ringtone_file_utils.cpp +++ b/services/utils/src/ringtone_file_utils.cpp @@ -515,6 +515,15 @@ int32_t RingtoneFileUtils::CopyFileFromFd(int32_t srcFd, const std::string &newP return E_OK; } +bool RingtoneFileUtils::CheckFileSize(int32_t fd, uint64_t maxFileSize) +{ + CHECK_AND_RETURN_RET_LOG(fd > 0, false, "invalid fd"); + struct stat stat_buf; + CHECK_AND_RETURN_RET_LOG(fstat(fd, &stat_buf) == 0, false, "get fd stat failed"); + + return static_cast(stat_buf.st_size) <= maxFileSize; +} + int64_t RingtoneFileUtils::Timespec2Millisecond(const struct timespec &time) { return time.tv_sec * MSEC_TO_SEC + time.tv_nsec / MSEC_TO_NSEC; diff --git a/test/unittest/customised_tone_processor_test/src/customised_tone_processor_test.cpp b/test/unittest/customised_tone_processor_test/src/customised_tone_processor_test.cpp index 54811c9..072807b 100644 --- a/test/unittest/customised_tone_processor_test/src/customised_tone_processor_test.cpp +++ b/test/unittest/customised_tone_processor_test/src/customised_tone_processor_test.cpp @@ -41,11 +41,11 @@ namespace Media { const string TEST_BACKUP_PATH = "/data/test/backup"; const string TEST_BACKUP_DATA = "/data/local/tmp/test/Adara.ogg"; const std::string TEST_RINGTONE_EXTERNAL_BASE_PATH = "/storage/emulated/0"; -const std::string TEST_RINGTONE_EXTERNAL_MUSIC_PATH = TEST_RINGTONE_EXTERNAL_BASE_PATH + "/Music"; -const std::string TEST_FILE_MANAGER_BASE_PATH = "/storage/media/local/files/Docs"; -const std::string TEST_FILE_MANAGER_MUSIC_PATH = TEST_FILE_MANAGER_BASE_PATH + "/Music"; -const std::string TEST_FILE_MANAGER_UPDATE_BACKUP_PATH = TEST_FILE_MANAGER_BASE_PATH + "/UpdateBackup"; -const std::string TEST_FILE_MANAGER_UPDATE_BACKUP_MUSIC_PATH = TEST_FILE_MANAGER_UPDATE_BACKUP_PATH + "/Music"; +const std::string TEST_RINGTONE_EXTERNAL_MUSIC_PATH = TEST_RINGTONE_EXTERNAL_BASE_PATH + "/Music/"; +const std::string TEST_FILE_MANAGER_BASE_PATH = "/storage/media/local/files/Docs/"; +const std::string TEST_FILE_MANAGER_MUSIC_PATH = TEST_FILE_MANAGER_BASE_PATH + "Music/"; +const std::string TEST_FILE_MANAGER_UPDATE_BACKUP_PATH = TEST_FILE_MANAGER_BASE_PATH + "UpdateBackup/"; +const std::string TEST_FILE_MANAGER_UPDATE_BACKUP_MUSIC_PATH = TEST_FILE_MANAGER_UPDATE_BACKUP_PATH + "Music/"; unique_ptr g_customisedToneProcess = nullptr; @@ -137,6 +137,10 @@ HWTEST_F(CustomisedToneProcessorTest, customised_tone_processor_003, TestSize.Le ret1 = g_customisedToneProcess->ConvertCustomisedAudioPath(ringtonePath); EXPECT_EQ(ret1, TEST_FILE_MANAGER_UPDATE_BACKUP_MUSIC_PATH); + EXPECT_EQ(g_customisedToneProcess->ConvertCustomisedAudioPath(""), ""); + EXPECT_EQ(g_customisedToneProcess->ConvertCustomisedAudioPath(TEST_BACKUP_PATH), ""); + EXPECT_EQ(g_customisedToneProcess->ConvertCustomisedAudioPath(RINGTONE_EXTERNAL_BASE_PATH), ""); + RINGTONE_INFO_LOG("customised_tone_processor_003::End"); } diff --git a/test/unittest/ringtone_dualfwk_restore_test/src/ringtone_dualfwk_restore_test.cpp b/test/unittest/ringtone_dualfwk_restore_test/src/ringtone_dualfwk_restore_test.cpp index 53e7525..7b2d5c8 100644 --- a/test/unittest/ringtone_dualfwk_restore_test/src/ringtone_dualfwk_restore_test.cpp +++ b/test/unittest/ringtone_dualfwk_restore_test/src/ringtone_dualfwk_restore_test.cpp @@ -330,7 +330,7 @@ HWTEST_F(RingtoneDualFwkRestoreTest, ringtone_VibrateSettingClone_test_0001, Tes auto settings = dualSetting->GetSettings(); DualFwkSettingItem item; for (auto &setting : settings) { - if (item.toneSetting.settingType == TONE_SETTING_TYPE_ALARM) { + if (setting.toneSetting.settingType == TONE_SETTING_TYPE_ALARM) { item = setting; } } diff --git a/test/unittest/ringtone_utils_test/src/ringtone_file_utils_test.cpp b/test/unittest/ringtone_utils_test/src/ringtone_file_utils_test.cpp index e28c3ac..f81f8e6 100644 --- a/test/unittest/ringtone_utils_test/src/ringtone_file_utils_test.cpp +++ b/test/unittest/ringtone_utils_test/src/ringtone_file_utils_test.cpp @@ -472,5 +472,18 @@ HWTEST_F(RingtoneFileUtilsTest, ringtoneUtils_CopyFileFromFd_Test_001, TestSize. RingtoneFileUtils::DeleteFile(newPath); } +HWTEST_F(RingtoneFileUtilsTest, ringtoneUtils_CheckFileSize_Test_001, TestSize.Level1) +{ + uint64_t maxFileSize = 1024 * 1024 * 100; + string oldPath = "/data/local/tmp/test/check_file_size_utils1.ogg"; + EXPECT_EQ(RingtoneFileUtils::CheckFileSize(-1, maxFileSize), false); + EXPECT_EQ(RingtoneFileUtils::CreateFile(oldPath), E_SUCCESS); + int32_t fd = RingtoneFileUtils::OpenFile(oldPath, RINGTONE_FILEMODE_READONLY); + EXPECT_GT(fd, 0); + EXPECT_EQ(RingtoneFileUtils::CheckFileSize(fd, maxFileSize), true); + + RingtoneFileUtils::DeleteFile(oldPath); +} + } // namespace Media } // namespace OHOS