diff --git a/services/bundlemgr/include/base_bundle_installer.h b/services/bundlemgr/include/base_bundle_installer.h index 4655355be44bed372cf0e52691045179ae8eff43..0ce22a287aae77d1bf8e155d00ecab561e0956b0 100644 --- a/services/bundlemgr/include/base_bundle_installer.h +++ b/services/bundlemgr/include/base_bundle_installer.h @@ -764,7 +764,7 @@ private: #endif void PrepareBundleDirQuota(const std::string &bundleName, const int32_t uid, const std::string &bundleDataDirPath, const int32_t limitSize) const; - void ParseSizeFromProvision(int32_t &sizeMb) const; + void ParseSizeFromProvision(const std::string &bundleName, const int32_t uid, int32_t &sizeMb) const; void VerifyDomain(); void ClearDomainVerifyStatus(const std::string &appIdentifier, const std::string &bundleName) const; bool IsRdDevice() const; diff --git a/services/bundlemgr/include/bundle_mgr_service_event_handler.h b/services/bundlemgr/include/bundle_mgr_service_event_handler.h index 270dbcfe6304e0dcc188b18a8262984ef0a2fe51..7a4b98aafb254160c11ad1d14ddd01f037abcf7d 100644 --- a/services/bundlemgr/include/bundle_mgr_service_event_handler.h +++ b/services/bundlemgr/include/bundle_mgr_service_event_handler.h @@ -559,7 +559,7 @@ private: void PrepareBundleDirQuota(const std::string &bundleName, const int32_t uid, const std::string &bundleDataDirPath, const int32_t limitSize) const; - void ParseSizeFromProvision(const std::string &bundleName, int32_t &sizeMb) const; + void ParseSizeFromProvision(const std::string &bundleName, const int32_t uid, int32_t &sizeMb) const; void RefreshQuotaForAllUid(); void InnerProcessStockBundleRouterInfo(); diff --git a/services/bundlemgr/src/base_bundle_installer.cpp b/services/bundlemgr/src/base_bundle_installer.cpp index 2d83c03167e5fec17cf4884593f690a5beafa84b..2c837516396ab9219e7a5c3ad832cd890d845496 100644 --- a/services/bundlemgr/src/base_bundle_installer.cpp +++ b/services/bundlemgr/src/base_bundle_installer.cpp @@ -3230,11 +3230,12 @@ void BaseBundleInstaller::PrepareBundleDirQuota(const std::string &bundleName, c } #endif // QUOTA_PARAM_SET_ENABLE #endif // STORAGE_SERVICE_ENABLE - ParseSizeFromProvision(atomicserviceDatasizeThreshold); + ParseSizeFromProvision(bundleName, uid, atomicserviceDatasizeThreshold); SendToStorageQuota(bundleName, uid, bundleDataDirPath, atomicserviceDatasizeThreshold); } -void BaseBundleInstaller::ParseSizeFromProvision(int32_t &sizeMb) const +void BaseBundleInstaller::ParseSizeFromProvision( + const std::string &bundleName, const int32_t uid, int32_t &sizeMb) const { std::string appServiceCapabilities = verifyRes_.GetProvisionInfo().appServiceCapabilities; if (appServiceCapabilities.empty()) { @@ -3245,6 +3246,11 @@ void BaseBundleInstaller::ParseSizeFromProvision(int32_t &sizeMb) const if (item.first != ServiceConstants::PERMISSION_MANAGE_STORAGE) { continue; } + if (BundlePermissionMgr::VerifyPermission(bundleName, ServiceConstants::PERMISSION_MANAGE_STORAGE, + uid / Constants::BASE_USER_RANGE) != Security::AccessToken::PermissionState::PERMISSION_GRANTED) { + APP_LOGW("no manage storage permission for %{public}s", bundleName.c_str()); + return; + } std::unordered_map storageMap = BundleUtil::ParseMapFromJson(item.second); auto it = storageMap.find(KEY_STORAGE_SIZE); if (it == storageMap.end()) { diff --git a/services/bundlemgr/src/bundle_mgr_service_event_handler.cpp b/services/bundlemgr/src/bundle_mgr_service_event_handler.cpp index a05d40006e7a8ebfd00463c8db4ae8d56e2a8168..5c8a3af7fda435ae823d01b4e75b862fa828ebbf 100644 --- a/services/bundlemgr/src/bundle_mgr_service_event_handler.cpp +++ b/services/bundlemgr/src/bundle_mgr_service_event_handler.cpp @@ -1969,11 +1969,11 @@ void BMSEventHandler::PrepareBundleDirQuota(const std::string &bundleName, const } #endif // QUOTA_PARAM_SET_ENABLE #endif // STORAGE_SERVICE_ENABLE - ParseSizeFromProvision(bundleName, atomicserviceDatasizeThreshold); + ParseSizeFromProvision(bundleName, uid, atomicserviceDatasizeThreshold); SendToStorageQuota(bundleName, uid, bundleDataDirPath, atomicserviceDatasizeThreshold); } -void BMSEventHandler::ParseSizeFromProvision(const std::string &bundleName, int32_t &sizeMb) const +void BMSEventHandler::ParseSizeFromProvision(const std::string &bundleName, const int32_t uid, int32_t &sizeMb) const { AppProvisionInfo provisionInfo; if (!DelayedSingleton::GetInstance()->GetAppProvisionInfo(bundleName, provisionInfo)) { @@ -1988,6 +1988,11 @@ void BMSEventHandler::ParseSizeFromProvision(const std::string &bundleName, int3 if (item.first != ServiceConstants::PERMISSION_MANAGE_STORAGE) { continue; } + if (BundlePermissionMgr::VerifyPermission(bundleName, ServiceConstants::PERMISSION_MANAGE_STORAGE, + uid / Constants::BASE_USER_RANGE) != Security::AccessToken::PermissionState::PERMISSION_GRANTED) { + APP_LOGW("no manage storage permission for %{public}s", bundleName.c_str()); + return; + } std::unordered_map storageMap = BundleUtil::ParseMapFromJson(item.second); auto it = storageMap.find(KEY_STORAGE_SIZE); if (it == storageMap.end()) { diff --git a/services/bundlemgr/test/unittest/bms_bundle_installer_test/bms_bundle_installer_permission_test.cpp b/services/bundlemgr/test/unittest/bms_bundle_installer_test/bms_bundle_installer_permission_test.cpp index 05deb2f31196798f658d1fba154ade8454a53ddb..58dc2d7aed0ae6a2e86ac53878b77fffaecea75c 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_installer_test/bms_bundle_installer_permission_test.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_installer_test/bms_bundle_installer_permission_test.cpp @@ -1219,4 +1219,47 @@ HWTEST_F(BmsBundleInstallerPermissionTest, ProcessArkStartupCache_0010, Function ErrCode ret = installer.ProcessArkStartupCache(ceateArk, 1, 100); EXPECT_EQ(ret, ERR_APPEXECFWK_INSTALLD_PERMISSION_DENIED); } + +/** +* @tc.number: ParseSizeFromProvision_0010 +* @tc.name: test arseSizeFromProvision +* @tc.desc: 1.Test arseSizeFromProvision +*/ +HWTEST_F(BmsBundleInstallerPermissionTest, ParseSizeFromProvision_0010, Function | MediumTest | Level1) +{ + BaseBundleInstaller installer; + int32_t sizeMb = 200; + std::string bundleName = "test"; + int32_t uid = 20020000; + Security::Verify::ProvisionInfo provisionInfo; + + provisionInfo.appServiceCapabilities = ""; + installer.verifyRes_.SetProvisionInfo(provisionInfo); + installer.ParseSizeFromProvision(bundleName, uid, sizeMb); + EXPECT_EQ(sizeMb, 200); + + provisionInfo.appServiceCapabilities = + "{\"ohos.permission.TEST\":{\"storageSize\": 1024}}"; + installer.verifyRes_.SetProvisionInfo(provisionInfo); + installer.ParseSizeFromProvision(bundleName, uid, sizeMb); + EXPECT_EQ(sizeMb, 200); + + provisionInfo.appServiceCapabilities = + "{\"ohos.permission.atomicService.MANAGE_STORAGE\":{\"test\": 1024}}"; + installer.verifyRes_.SetProvisionInfo(provisionInfo); + installer.ParseSizeFromProvision(bundleName, uid, sizeMb); + EXPECT_EQ(sizeMb, 200); + + provisionInfo.appServiceCapabilities = + "{\"ohos.permission.atomicService.MANAGE_STORAGE\":{\"storageSize\": 100}}"; + installer.verifyRes_.SetProvisionInfo(provisionInfo); + installer.ParseSizeFromProvision(bundleName, uid, sizeMb); + EXPECT_EQ(sizeMb, 200); + + provisionInfo.appServiceCapabilities = + "{\"ohos.permission.atomicService.MANAGE_STORAGE\":{\"storageSize\": 1024}}"; + installer.verifyRes_.SetProvisionInfo(provisionInfo); + installer.ParseSizeFromProvision(bundleName, uid, sizeMb); + EXPECT_EQ(sizeMb, 1024); +} } // OHOS diff --git a/services/bundlemgr/test/unittest/bms_bundle_installer_test/bms_bundle_installer_test.cpp b/services/bundlemgr/test/unittest/bms_bundle_installer_test/bms_bundle_installer_test.cpp index 853df9294e163bbdae75c5e1ffdc472eba35eb2b..388b6e0b08a45c3a645fcc589d18eb533d4cece0 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_installer_test/bms_bundle_installer_test.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_installer_test/bms_bundle_installer_test.cpp @@ -10038,47 +10038,6 @@ HWTEST_F(BmsBundleInstallerTest, BaseBundleInstaller_9600, Function | MediumTest EXPECT_TRUE(targetSoPath.find(BUNDLE_CODE_PATH_DIR_NEW) == 0); } -/** -* @tc.number: ParseSizeFromProvision_0010 -* @tc.name: test arseSizeFromProvision -* @tc.desc: 1.Test arseSizeFromProvision -*/ -HWTEST_F(BmsBundleInstallerTest, ParseSizeFromProvision_0010, Function | MediumTest | Level1) -{ - BaseBundleInstaller installer; - int32_t sizeMb = 200; - Security::Verify::ProvisionInfo provisionInfo; - - provisionInfo.appServiceCapabilities = ""; - installer.verifyRes_.SetProvisionInfo(provisionInfo); - installer.ParseSizeFromProvision(sizeMb); - EXPECT_EQ(sizeMb, 200); - - provisionInfo.appServiceCapabilities = - "{\"ohos.permission.TEST\":{\"storageSize\": 1024}}"; - installer.verifyRes_.SetProvisionInfo(provisionInfo); - installer.ParseSizeFromProvision(sizeMb); - EXPECT_EQ(sizeMb, 200); - - provisionInfo.appServiceCapabilities = - "{\"ohos.permission.atomicService.MANAGE_STORAGE\":{\"test\": 1024}}"; - installer.verifyRes_.SetProvisionInfo(provisionInfo); - installer.ParseSizeFromProvision(sizeMb); - EXPECT_EQ(sizeMb, 200); - - provisionInfo.appServiceCapabilities = - "{\"ohos.permission.atomicService.MANAGE_STORAGE\":{\"storageSize\": 100}}"; - installer.verifyRes_.SetProvisionInfo(provisionInfo); - installer.ParseSizeFromProvision(sizeMb); - EXPECT_EQ(sizeMb, 200); - - provisionInfo.appServiceCapabilities = - "{\"ohos.permission.atomicService.MANAGE_STORAGE\":{\"storageSize\": 1024}}"; - installer.verifyRes_.SetProvisionInfo(provisionInfo); - installer.ParseSizeFromProvision(sizeMb); - EXPECT_EQ(sizeMb, 1024); -} - /** * @tc.number: ProcessDynamicIconFileWhenUpdate_0010 * @tc.name: test ProcessDynamicIconFileWhenUpdate diff --git a/services/bundlemgr/test/unittest/bms_bundle_permission_grant_test/bms_bundle_permission_getrequest_test.cpp b/services/bundlemgr/test/unittest/bms_bundle_permission_grant_test/bms_bundle_permission_getrequest_test.cpp index ce247dd1c4f072227b1a220aa434381583f09890..e5e0b72a0bc12ad7a2a2401a09d9bc508548ef30 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_permission_grant_test/bms_bundle_permission_getrequest_test.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_permission_grant_test/bms_bundle_permission_getrequest_test.cpp @@ -19,9 +19,11 @@ #include #include +#include "app_provision_info_manager.h" #include "bundle_info.h" #include "bundle_mgr_host_impl.h" #include "bundle_mgr_service.h" +#include "bundle_mgr_service_event_handler.h" #include "bundle_permission_mgr.h" using namespace testing::ext; @@ -274,4 +276,48 @@ HWTEST_F(BmsBundlePermissionGetRequestTest, BundleMgrHostImpl_0009, Function | S bool ret = localBundleMgrHostImpl->GetProvisionMetadata(bundleName, userId, provisionMetadatas); EXPECT_TRUE(ret); } + +/** + * @tc.number: ParseSizeFromProvision_0010 + * @tc.name: ParseSizeFromProvision + * @tc.desc: test ParseSizeFromProvision + */ +HWTEST_F(BmsBundlePermissionGetRequestTest, ParseSizeFromProvision_0010, Function | SmallTest | Level1) +{ + std::shared_ptr handler = std::make_shared(); + ASSERT_NE(handler, nullptr); + std::string bundleName = "com.example.test"; + int32_t uid = 20020000; + int32_t sizeMb = 200; + AppProvisionInfo provisionInfo; + + provisionInfo.appServiceCapabilities = ""; + DelayedSingleton::GetInstance()->AddAppProvisionInfo(bundleName, provisionInfo); + handler->ParseSizeFromProvision(bundleName, uid, sizeMb); + EXPECT_EQ(sizeMb, 200); + + provisionInfo.appServiceCapabilities = + "{\"ohos.permission.TEST\":{\"storageSize\": 1024}}"; + DelayedSingleton::GetInstance()->AddAppProvisionInfo(bundleName, provisionInfo); + handler->ParseSizeFromProvision(bundleName, uid, sizeMb); + EXPECT_EQ(sizeMb, 200); + + provisionInfo.appServiceCapabilities = + "{\"ohos.permission.atomicService.MANAGE_STORAGE\":{\"test\": 1024}}"; + DelayedSingleton::GetInstance()->AddAppProvisionInfo(bundleName, provisionInfo); + handler->ParseSizeFromProvision(bundleName, uid, sizeMb); + EXPECT_EQ(sizeMb, 200); + + provisionInfo.appServiceCapabilities = + "{\"ohos.permission.atomicService.MANAGE_STORAGE\":{\"storageSize\": 100}}"; + DelayedSingleton::GetInstance()->AddAppProvisionInfo(bundleName, provisionInfo); + handler->ParseSizeFromProvision(bundleName, uid, sizeMb); + EXPECT_EQ(sizeMb, 200); + + provisionInfo.appServiceCapabilities = + "{\"ohos.permission.atomicService.MANAGE_STORAGE\":{\"storageSize\": 1024}}"; + DelayedSingleton::GetInstance()->AddAppProvisionInfo(bundleName, provisionInfo); + handler->ParseSizeFromProvision(bundleName, uid, sizeMb); + EXPECT_EQ(sizeMb, 1024); +} } // OHOS diff --git a/services/bundlemgr/test/unittest/bms_event_handler_test/bms_event_handler_test.cpp b/services/bundlemgr/test/unittest/bms_event_handler_test/bms_event_handler_test.cpp index 718b7f849c336b8ec504042965bc47bb9724231d..912ef570e5a89d56deeac352e07ae46bbba80442 100644 --- a/services/bundlemgr/test/unittest/bms_event_handler_test/bms_event_handler_test.cpp +++ b/services/bundlemgr/test/unittest/bms_event_handler_test/bms_event_handler_test.cpp @@ -2763,49 +2763,6 @@ HWTEST_F(BmsEventHandlerTest, SaveUpdatePermissionsFlag_0100, Function | SmallTe } } -/** - * @tc.number: ParseSizeFromProvision_0010 - * @tc.name: ParseSizeFromProvision - * @tc.desc: test ParseSizeFromProvision - */ -HWTEST_F(BmsEventHandlerTest, ParseSizeFromProvision_0010, Function | SmallTest | Level0) -{ - std::shared_ptr handler = std::make_shared(); - ASSERT_NE(handler, nullptr); - std::string bundleName = "com.example.test"; - int32_t sizeMb = 200; - AppProvisionInfo provisionInfo; - - provisionInfo.appServiceCapabilities = ""; - DelayedSingleton::GetInstance()->AddAppProvisionInfo(bundleName, provisionInfo); - handler->ParseSizeFromProvision(bundleName, sizeMb); - EXPECT_EQ(sizeMb, 200); - - provisionInfo.appServiceCapabilities = - "{\"ohos.permission.TEST\":{\"storageSize\": 1024}}"; - DelayedSingleton::GetInstance()->AddAppProvisionInfo(bundleName, provisionInfo); - handler->ParseSizeFromProvision(bundleName, sizeMb); - EXPECT_EQ(sizeMb, 200); - - provisionInfo.appServiceCapabilities = - "{\"ohos.permission.atomicService.MANAGE_STORAGE\":{\"test\": 1024}}"; - DelayedSingleton::GetInstance()->AddAppProvisionInfo(bundleName, provisionInfo); - handler->ParseSizeFromProvision(bundleName, sizeMb); - EXPECT_EQ(sizeMb, 200); - - provisionInfo.appServiceCapabilities = - "{\"ohos.permission.atomicService.MANAGE_STORAGE\":{\"storageSize\": 100}}"; - DelayedSingleton::GetInstance()->AddAppProvisionInfo(bundleName, provisionInfo); - handler->ParseSizeFromProvision(bundleName, sizeMb); - EXPECT_EQ(sizeMb, 200); - - provisionInfo.appServiceCapabilities = - "{\"ohos.permission.atomicService.MANAGE_STORAGE\":{\"storageSize\": 1024}}"; - DelayedSingleton::GetInstance()->AddAppProvisionInfo(bundleName, provisionInfo); - handler->ParseSizeFromProvision(bundleName, sizeMb); - EXPECT_EQ(sizeMb, 1024); -} - /** * @tc.number: CheckSystemOptimizeShaderCache_0100 * @tc.name: CheckSystemOptimizeShaderCache