mirror of
https://github.com/openharmony/ability_ability_runtime.git
synced 2026-08-24 12:43:16 -04:00
!18361 merge fix_bug210 into master
fix bug Created-by: zzl12383 Commit-by: zhengzhuolan Merged-by: openharmony_ci Description: **IssueNo**: https://gitcode.com/openharmony/ability_ability_runtime/issues/14491 **Description**: **稳定性自检:** | 自检项 | 自检结果 | | ------------------------------------------------------------ | -------- | | 涉及跨进程调用的相关操作需要抛至主线程或加锁防止并发 | pass | | 成员变量进行赋值或创建需要排查并发 | pass | | 谨慎在lambda表达式中使用引用捕获 | pass | | 谨慎在未经拷贝的情况下使用外部传入的string、C字符串 | pass | | map\vector\list\set等stl模板类使用时需要排查并发 | pass | | 谨慎考虑加锁范围 | pass | | 在IPC通信中谨慎使用同步通信方式 | pass | | 禁止传递this指针至其他模块或线程(特别是eventhandler任务) | pass | | 禁止将外部传入的裸指针在内部直接构造智能指针 | pass | | 禁止多个独立创建的智能指针管理同一地址 | pass | | 禁止在析构函数中抛异步任务 | pass | | 禁止js对象在非js线程(例如在IPC线程)创建、使用或销毁 | pass | | 禁止在对外接口中未经判空直接使用外部传入的指针 | pass | | 禁止接口返回局部变量引用 | pass | | 禁止在信号函数中加锁 | pass | | 禁止在关键流程(SA启动、应用启动等主流程)执行耗时的操作 | pass | | 禁止将同一个cpp编译在不同的so中 | pass | **安全编码自检:** | 自检项 | 自检结果 | | -------------------------------------------------------------- | -------- | | 裸指针避免通过隐式转换构造为sptr | pass | | json对象在取值之前必须先判断类型,避免类型不匹配 | pass | | 序列化时必须对传入的数组大小进行校验,避免出现超大数组 | pass | | 避免使用未明确位宽的整型,选择使用int8_t、uint8_t等类型 | pass | | 外部传入的路径要做规范化校验,对路径中的.、..、../等特殊字符严格校验 | pass | | 指针变量、表示资源描述符的变量、bool变量必须赋初值 | pass | | readParcelable获取的对象使用前需要判空 | pass | | 分配和释放内存的函数需要成对出现 | pass | | 申请内存后异常退出前需要及时进行内存释放 | pass | | 内存申请前必须对内存大小进行合法性校验 | pass | | 内存分配后必须判断是否成功 | pass | | 禁止使用realloc、alloca函数 | pass | | 禁止打印文件路径、口令等敏感信息,如有需要,使用private修饰 | pass | | 禁止打印内存地址 | pass | | 整数之间运算时必须严格检查,确保不会出现溢出、反转、除0 | pass | | 禁止对有符号整数进行位操作符运算 | pass | | 禁止对指针进行逻辑或位运算 | pass | | 循环次数如果收外部数据控制,需要检验其合法性 | pass | | 禁止使用内存操作类危险函数,需要使用安全函数 | pass | | 谨慎使用不可重入函数 | pass | | 必须检查安全函数的返回值,并进行正确处理 | pass | | 禁止仅通过TokenType类型判断绕过权限校验 | pass | **TDD Result**: **XTS Result**: ### 是否已执行L0用例 - [ ] 已验证 - [ ] 不涉及。如不涉及,请写明理由 See merge request: openharmony/ability_ability_runtime!18361
This commit is contained in:
@@ -52,6 +52,7 @@ enum class ErrorLifecycleState {
|
||||
ABILITY_STATE_PERMISSION_UPDATE,
|
||||
ABILITY_STATE_LOW_MEMORY_KILL,
|
||||
ABILITY_STATE_SKIP_KILL_IN_STARTUP,
|
||||
ABILITY_STATE_INTERCEPTOR_REJECT,
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -46,6 +46,7 @@ struct DialogCallerInfo {
|
||||
SelectorType type = SelectorType::WITHOUT_SELECTOR;
|
||||
// for app gallery selector
|
||||
bool needGrantUriPermission = false;
|
||||
sptr<IRemoteObject> sessionToken = nullptr;
|
||||
};
|
||||
|
||||
struct StartupSessionInfo {
|
||||
@@ -183,6 +184,9 @@ private:
|
||||
|
||||
void NotifyAbilityRequestFailure(const std::string &dialogSessionId, const Want &want);
|
||||
|
||||
void HandleUserRejected(const std::string &dialogSessionId, const Want &want,
|
||||
const std::shared_ptr<DialogCallerInfo> &dialogCallerInfo);
|
||||
|
||||
mutable ffrt::mutex dialogSessionRecordLock_;
|
||||
std::unordered_map<std::string, sptr<DialogSessionInfo>> dialogSessionInfoMap_;
|
||||
std::unordered_map<std::string, std::shared_ptr<DialogCallerInfo>> dialogCallerInfoMap_;
|
||||
|
||||
@@ -3175,6 +3175,7 @@ int AbilityManagerService::StartUIAbilityBySCBDefault(sptr<SessionInfo> sessionI
|
||||
return result;
|
||||
}
|
||||
abilityRequest.userId = currentUserId;
|
||||
abilityRequest.sessionInfo = sessionInfo;
|
||||
if (!HandleExecuteSAInterceptor(sessionInfo->want, sessionInfo->callerToken, abilityRequest, result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "scene_board_judgement.h"
|
||||
#include "session_manager_lite.h"
|
||||
#endif
|
||||
#include "session/host/include/zidl/session_interface.h"
|
||||
#include "start_ability_utils.h"
|
||||
#include "string_wrapper.h"
|
||||
#include "want.h"
|
||||
@@ -275,17 +276,16 @@ int DialogSessionManager::SendDialogResult(const Want &want, const std::string &
|
||||
ClearDialogContext(dialogSessionId);
|
||||
return ERR_OK;
|
||||
}
|
||||
std::shared_ptr<DialogCallerInfo> dialogCallerInfo = GetDialogCallerInfo(dialogSessionId);
|
||||
if (!isAllowed) {
|
||||
TAG_LOGI(AAFwkTag::ABILITYMGR, "user refuse to jump");
|
||||
NotifyAbilityRequestFailure(dialogSessionId, want);
|
||||
ClearDialogContext(dialogSessionId);
|
||||
HandleUserRejected(dialogSessionId, want, dialogCallerInfo);
|
||||
return ERR_OK;
|
||||
}
|
||||
std::shared_ptr<StartupSessionInfo> startupSessionInfo = GetStartupSessionInfo(dialogSessionId);
|
||||
if (startupSessionInfo != nullptr) {
|
||||
return NotifySCBToRecoveryAfterInterception(dialogSessionId, startupSessionInfo->abilityRequest);
|
||||
}
|
||||
std::shared_ptr<DialogCallerInfo> dialogCallerInfo = GetDialogCallerInfo(dialogSessionId);
|
||||
if (dialogCallerInfo == nullptr) {
|
||||
TAG_LOGE(AAFwkTag::ABILITYMGR, "dialogCallerInfo null");
|
||||
ClearDialogContext(dialogSessionId);
|
||||
@@ -321,6 +321,23 @@ int DialogSessionManager::SendDialogResult(const Want &want, const std::string &
|
||||
return ret;
|
||||
}
|
||||
|
||||
void DialogSessionManager::HandleUserRejected(const std::string &dialogSessionId, const Want &want,
|
||||
const std::shared_ptr<DialogCallerInfo> &dialogCallerInfo)
|
||||
{
|
||||
NotifyAbilityRequestFailure(dialogSessionId, want);
|
||||
if (dialogCallerInfo != nullptr && dialogCallerInfo->sessionToken != nullptr) {
|
||||
auto session = iface_cast<Rosen::ISession>(dialogCallerInfo->sessionToken);
|
||||
if (session != nullptr) {
|
||||
sptr<SessionInfo> sessionInfo = sptr<SessionInfo>::MakeSptr();
|
||||
sessionInfo->errorCode = static_cast<int32_t>(ErrorLifecycleState::ABILITY_STATE_INTERCEPTOR_REJECT);
|
||||
sessionInfo->errorReason = "userReject";
|
||||
Rosen::ExceptionInfo exceptionInfo;
|
||||
session->NotifySessionException(sessionInfo, exceptionInfo);
|
||||
}
|
||||
}
|
||||
ClearDialogContext(dialogSessionId);
|
||||
}
|
||||
|
||||
int32_t DialogSessionManager::NotifySCBToRecoveryAfterInterception(const std::string &dialogSessionId,
|
||||
const AbilityRequest &abilityRequest)
|
||||
{
|
||||
@@ -610,6 +627,9 @@ void DialogSessionManager::OnlySetDialogCallerInfo(AbilityRequest &abilityReques
|
||||
std::lock_guard<ffrt::mutex> guard(dialogSessionRecordLock_);
|
||||
std::shared_ptr<DialogCallerInfo> dialogCallerInfo = std::make_shared<DialogCallerInfo>();
|
||||
GenerateDialogCallerInfo(abilityRequest, userId, dialogCallerInfo, type, needGrantUriPermission);
|
||||
if (abilityRequest.sessionInfo != nullptr) {
|
||||
dialogCallerInfo->sessionToken = abilityRequest.sessionInfo->sessionToken;
|
||||
}
|
||||
dialogCallerInfoMap_[dialogSessionId] = dialogCallerInfo;
|
||||
}
|
||||
} // namespace AAFwk
|
||||
|
||||
@@ -58,6 +58,7 @@ ohos_unittest("dialog_session_manager_test") {
|
||||
|
||||
external_deps = [
|
||||
"ability_base:base",
|
||||
"ability_base:session_info",
|
||||
"ability_base:want",
|
||||
"ability_base:zuri",
|
||||
"bundle_framework:appexecfwk_core",
|
||||
|
||||
@@ -167,6 +167,34 @@ HWTEST_F(DialogSessionManagerTest, SendDialogResultTest_0300, TestSize.Level1)
|
||||
GTEST_LOG_(INFO) << "SendDialogResultTest_0300 end";
|
||||
}
|
||||
|
||||
/**
|
||||
* @tc.name: SendDialogResultTest_0400
|
||||
* @tc.desc: Test SendDialogResult
|
||||
* @tc.type: FUNC
|
||||
*/
|
||||
HWTEST_F(DialogSessionManagerTest, SendDialogResultTest_0400, TestSize.Level1)
|
||||
{
|
||||
GTEST_LOG_(INFO) << "SendDialogResultTest_0400 start";
|
||||
AbilityRequest abilityRequest;
|
||||
DialogSessionManager dialogSessionManager;
|
||||
Want want;
|
||||
bool isAllowed = false;
|
||||
sptr<DialogSessionInfo> dialogSessionInfo = nullptr;
|
||||
std::shared_ptr<DialogCallerInfo> dialogCallerInfo = std::make_shared<DialogCallerInfo>();
|
||||
dialogSessionManager.SetDialogSessionInfo(TEST_DIALOG_SESSION_ID, dialogSessionInfo, dialogCallerInfo);
|
||||
int32_t ret = dialogSessionManager.SendDialogResult(want, TEST_DIALOG_SESSION_ID, isAllowed);
|
||||
EXPECT_EQ(ret, ERR_OK);
|
||||
|
||||
dialogCallerInfo->sessionToken = sptr<AppExecFwk::MockAbilityToken>::MakeSptr();
|
||||
dialogSessionManager.SetDialogSessionInfo(TEST_DIALOG_SESSION_ID, dialogSessionInfo, dialogCallerInfo);
|
||||
ret = dialogSessionManager.SendDialogResult(want, TEST_DIALOG_SESSION_ID, isAllowed);
|
||||
EXPECT_EQ(ret, ERR_OK);
|
||||
bool cleared = dialogSessionManager.dialogSessionInfoMap_.find(TEST_DIALOG_SESSION_ID) ==
|
||||
dialogSessionManager.dialogSessionInfoMap_.end();
|
||||
EXPECT_TRUE(cleared);
|
||||
GTEST_LOG_(INFO) << "SendDialogResultTest_0400 end";
|
||||
}
|
||||
|
||||
/**
|
||||
* @tc.name: NotifySCBToRecoveryAfterInterceptionTest_0100
|
||||
* @tc.desc: Test NotifySCBToRecoveryAfterInterception
|
||||
@@ -397,6 +425,28 @@ HWTEST_F(DialogSessionManagerTest, OnlySetDialogCallerInfo_0100, TestSize.Level1
|
||||
GTEST_LOG_(INFO) << "OnlySetDialogCallerInfo_0100 end";
|
||||
}
|
||||
|
||||
/**
|
||||
* @tc.name: OnlySetDialogCallerInfo_0200
|
||||
* @tc.desc: OnlySetDialogCallerInfo
|
||||
* @tc.type: FUNC
|
||||
*/
|
||||
HWTEST_F(DialogSessionManagerTest, OnlySetDialogCallerInfo_0200, TestSize.Level1)
|
||||
{
|
||||
GTEST_LOG_(INFO) << "OnlySetDialogCallerInfo_0200 start";
|
||||
SelectorType type = SelectorType::INTERCEPTOR_SELECTOR;
|
||||
AbilityRequest abilityRequest;
|
||||
abilityRequest.sessionInfo = sptr<SessionInfo>::MakeSptr();
|
||||
sptr<IRemoteObject> sessionToken = sptr<AppExecFwk::MockAbilityToken>::MakeSptr();
|
||||
abilityRequest.sessionInfo->sessionToken = sessionToken;
|
||||
|
||||
DialogSessionManager dialogSessionManager;
|
||||
dialogSessionManager.OnlySetDialogCallerInfo(abilityRequest, TEST_USER_ID, type, TEST_DIALOG_SESSION_ID, false);
|
||||
auto info = dialogSessionManager.GetDialogCallerInfo(TEST_DIALOG_SESSION_ID);
|
||||
EXPECT_NE(info, nullptr);
|
||||
EXPECT_EQ(info->sessionToken, sessionToken);
|
||||
GTEST_LOG_(INFO) << "OnlySetDialogCallerInfo_0200 end";
|
||||
}
|
||||
|
||||
/**
|
||||
* @tc.name: CreateImplicitSelectorModalDialog_0001
|
||||
* @tc.desc: No APP_LAUNCH_TRUSTLIST
|
||||
|
||||
Reference in New Issue
Block a user