diff --git a/interfaces/innerkits/appexecfwk_base/include/appexecfwk_errors.h b/interfaces/innerkits/appexecfwk_base/include/appexecfwk_errors.h index d42414ff75e69834621275014c69687052f11be0..630c09d6c78792ad8b2a781f5311deaacc41c41e 100644 --- a/interfaces/innerkits/appexecfwk_base/include/appexecfwk_errors.h +++ b/interfaces/innerkits/appexecfwk_base/include/appexecfwk_errors.h @@ -85,6 +85,7 @@ enum { ERR_APPEXECFWK_INSTALL_DISK_MEM_INSUFFICIENT, ERR_APPEXECFWK_INSTALL_GRANT_REQUEST_PERMISSIONS_FAILED, ERR_APPEXECFWK_INSTALL_UPDATE_HAP_TOKEN_FAILED, + ERR_APPEXECFWK_INSTALL_SINGLE_USER_NOT_SAME, ERR_APPEXECFWK_PARSE_UNEXPECTED = APPEXECFWK_BUNDLEMGR_ERR_OFFSET + 0x0021, // 8519713 ERR_APPEXECFWK_PARSE_MISSING_BUNDLE, diff --git a/interfaces/innerkits/appexecfwk_core/include/bundlemgr/status_receiver_interface.h b/interfaces/innerkits/appexecfwk_core/include/bundlemgr/status_receiver_interface.h index 2157fafb3ef8afc4097d15c73ee2e244a6ff3618..0fc84c10da5a0ace288d85e9e5edac8f1ea48da5 100644 --- a/interfaces/innerkits/appexecfwk_core/include/bundlemgr/status_receiver_interface.h +++ b/interfaces/innerkits/appexecfwk_core/include/bundlemgr/status_receiver_interface.h @@ -75,6 +75,7 @@ public: ERR_INSTALL_DISK_MEM_INSUFFICIENT, ERR_INSTALL_GRANT_REQUEST_PERMISSIONS_FAILED, ERR_INSTALL_UPDATE_HAP_TOKEN_FAILED, + ERR_INSTALL_SINGLE_USER_NOT_SAME, ERR_INSTALL_PARSE_UNEXPECTED, ERR_INSTALL_PARSE_MISSING_BUNDLE, diff --git a/interfaces/innerkits/appexecfwk_core/src/bundlemgr/status_receiver_proxy.cpp b/interfaces/innerkits/appexecfwk_core/src/bundlemgr/status_receiver_proxy.cpp index 0c95f1868e9139e7c1bb400f22b545247ca08c16..e5a2759ba109cf8cabddb5bc01e5a7aa63eb5115 100644 --- a/interfaces/innerkits/appexecfwk_core/src/bundlemgr/status_receiver_proxy.cpp +++ b/interfaces/innerkits/appexecfwk_core/src/bundlemgr/status_receiver_proxy.cpp @@ -66,6 +66,7 @@ const std::string MSG_ERR_INSTALL_DISK_MEM_INSUFFICIENT = "[MSG_ERR_INSTALL_DISK const std::string MSG_ERR_INSTALL_GRANT_REQUEST_PERMISSIONS_FAILED = "[MSG_ERR_INSTALL_GRANT_REQUEST_PERMISSIONS_FAILED]"; const std::string MSG_ERR_INSTALL_UPDATE_HAP_TOKEN_FAILED = "[MSG_ERR_INSTALL_UPDATE_HAP_TOKEN_FAILED]"; +const std::string MSG_ERR_INSTALL_SINGLE_USER_NOT_SAME = "[MSG_ERR_INSTALL_SINGLE_USER_NOT_SAME]"; const std::string MSG_ERR_INSTALL_PARSE_UNEXPECTED = "[ERR_INSTALL_PARSE_UNEXPECTED]"; const std::string MSG_ERR_INSTALL_PARSE_MISSING_BUNDLE = "[ERR_INSTALL_PARSE_MISSING_BUNDLE]"; const std::string MSG_ERR_INSTALL_PARSE_MISSING_ABILITY = "[ERR_INSTALL_PARSE_MISSING_ABILITY]"; @@ -165,6 +166,8 @@ const std::map MAP_RECEIVED_RESULTS { MSG_ERR_INSTALL_GRANT_REQUEST_PERMISSIONS_FAILED}}, {ERR_APPEXECFWK_INSTALL_UPDATE_HAP_TOKEN_FAILED, {IStatusReceiver::ERR_INSTALL_UPDATE_HAP_TOKEN_FAILED, MSG_ERR_INSTALL_UPDATE_HAP_TOKEN_FAILED}}, + {ERR_APPEXECFWK_INSTALL_SINGLE_USER_NOT_SAME, + {IStatusReceiver::ERR_INSTALL_SINGLE_USER_NOT_SAME, MSG_ERR_INSTALL_SINGLE_USER_NOT_SAME}}, {ERR_APPEXECFWK_INSTALL_DISK_MEM_INSUFFICIENT, {IStatusReceiver::ERR_INSTALL_DISK_MEM_INSUFFICIENT, MSG_ERR_INSTALL_DISK_MEM_INSUFFICIENT}}, {ERR_APPEXECFWK_PARSE_UNEXPECTED, diff --git a/kits/appkit/napi/bundlemgr/bundle_mgr.cpp b/kits/appkit/napi/bundlemgr/bundle_mgr.cpp index 98db59615d375f049f065c8f5da786f2abd6816d..21923a5c1b3148f0345f5a81efc4361a4ac9e6fe 100644 --- a/kits/appkit/napi/bundlemgr/bundle_mgr.cpp +++ b/kits/appkit/napi/bundlemgr/bundle_mgr.cpp @@ -2974,6 +2974,7 @@ static void ConvertInstallResult(InstallResult &installResult) case static_cast(IStatusReceiver::ERR_INSTALL_VENDOR_NOT_SAME): case static_cast(IStatusReceiver::ERR_INSTALL_RELEASETYPE_TARGET_NOT_SAME): case static_cast(IStatusReceiver::ERR_INSTALL_RELEASETYPE_COMPATIBLE_NOT_SAME): + case static_cast(IStatusReceiver::ERR_INSTALL_SINGLE_USER_NOT_SAME): case static_cast(IStatusReceiver::ERR_INSTALL_VERSION_NOT_COMPATIBLE): installResult.resultCode = static_cast(InstallErrorCode::STATUS_INSTALL_FAILURE_CONFLICT); installResult.resultMsg = "STATUS_INSTALL_FAILURE_CONFLICT"; diff --git a/services/bundlemgr/include/inner_bundle_info.h b/services/bundlemgr/include/inner_bundle_info.h index da6454ff7dd2646b47ca4fdf982d004a3692f3f2..ea657dca02673f55bca1a2b3ac7464924b411280 100644 --- a/services/bundlemgr/include/inner_bundle_info.h +++ b/services/bundlemgr/include/inner_bundle_info.h @@ -1347,7 +1347,7 @@ public: * @brief Check whether isSingleUser. * @return Return isSingleUser. */ - bool IsSingleUser() + bool IsSingleUser() const { return baseApplicationInfo_.singleUser; } diff --git a/services/bundlemgr/src/base_bundle_installer.cpp b/services/bundlemgr/src/base_bundle_installer.cpp index da052e1f9a0e8424100c7a3be2474eb65fb15134..e14c9c90a86665ee11556f8abb91833f7a3272cc 100644 --- a/services/bundlemgr/src/base_bundle_installer.cpp +++ b/services/bundlemgr/src/base_bundle_installer.cpp @@ -165,6 +165,10 @@ ErrCode BaseBundleInstaller::InnerProcessBundleInstall(std::unordered_mapsecond.GetBundleName(); APP_LOGD("InnerProcessBundleInstall with bundleName %{public}s", bundleName_.c_str()); + if ((userId_ == Constants::DEFAULT_USERID) && !newInfos.begin()->second.IsSingleUser()) { + APP_LOGE("user(0) can only install singleUser app(%{public}s).", bundleName_.c_str()); + return ERR_APPEXECFWK_INSTALL_BUNDLE_MGR_SERVICE_ERROR; + } // try to get the bundle info to decide use install or update. if (!GetInnerBundleInfo(oldInfo, isAppExist_)) { @@ -1348,6 +1352,7 @@ ErrCode BaseBundleInstaller::CheckAppLabelInfo(const std::unordered_mapsecond).GetVersionName(); uint32_t target = (infos.begin()->second).GetTargetVersion(); uint32_t compatible = (infos.begin()->second).GetCompatibleVersion(); + bool singleUser = (infos.begin()->second).IsSingleUser(); for (const auto &info :infos) { // check bundleName @@ -1372,6 +1377,9 @@ ErrCode BaseBundleInstaller::CheckAppLabelInfo(const std::unordered_map BundleInstaller::GetExistsCommonUserIs() return userIds; } - return dataMgr->GetAllUser(); + for (auto userId : dataMgr->GetAllUser()) { + if (userId == Constants::START_USERID) { + userIds.insert(userId); + } + } + return userIds; } } // namespace AppExecFwk } // namespace OHOS \ No newline at end of file diff --git a/tools/bm/src/bundle_command.cpp b/tools/bm/src/bundle_command.cpp index a27082585caf4c33c0f4d17c3a3c9f1bfb0ef92d..f8d31416ba060883f9b616c4c198cf53aba536cd 100644 --- a/tools/bm/src/bundle_command.cpp +++ b/tools/bm/src/bundle_command.cpp @@ -248,6 +248,10 @@ ErrCode BundleManagerShellCommand::CreateMessageMap() IStatusReceiver::ERR_INSTALL_UPDATE_HAP_TOKEN_FAILED, "error: install failed due to update hap token failed", }, + { + IStatusReceiver::ERR_INSTALL_SINGLE_USER_NOT_SAME, + "error: install failed due to singleUser not same", + }, { IStatusReceiver::ERR_INSTALL_PARSE_UNEXPECTED,