From 4a43f273390b7b01e1586b431603f73b0a606f30 Mon Sep 17 00:00:00 2001 From: xuzheheng Date: Sun, 21 Jun 2026 11:10:01 +0800 Subject: [PATCH] claw MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: xuzheheng 🤖‍ AI[97%] 👌 AI Adopted[97%] 🧑 Human[3%] Co-authored-by: claude (glm-4.7) Change-Id: I2ba866788c8a3f2fc5288cacc1978445246c126a --- .../src/js_cli_manager_utils.cpp | 4 +++ .../interfaces/cli_tool/ICliToolData.idl | 1 + .../interfaces/cli_tool/include/tool_info.h | 1 + .../interfaces/cli_tool/src/tool_info.cpp | 14 +++++++-- .../climgr/include/permission_query_util.h | 16 +++++++--- .../climgr/src/permission_query_util.cpp | 24 ++++++++++----- .../mock/include/icli_tool_data.h | 1 + .../include/cli_tool_data_manager_mock.h | 1 + .../src/cli_tool_data_manager_mock.cpp | 3 ++ .../permission_query_util_test.cpp | 30 ++++++++++++++----- 10 files changed, 73 insertions(+), 22 deletions(-) diff --git a/cli_tool_framework/frameworks/js/napi/cli_tool_manager/src/js_cli_manager_utils.cpp b/cli_tool_framework/frameworks/js/napi/cli_tool_manager/src/js_cli_manager_utils.cpp index 7474212db6..6d1e83f004 100644 --- a/cli_tool_framework/frameworks/js/napi/cli_tool_manager/src/js_cli_manager_utils.cpp +++ b/cli_tool_framework/frameworks/js/napi/cli_tool_manager/src/js_cli_manager_utils.cpp @@ -611,6 +611,10 @@ napi_value CreateJsToolInfo(napi_env env, const ToolInfo &tool) } napi_set_named_property(env, jsObj, "subcommands", jsSubcommands); + // Set isLockScreenExecutionAllowed + napi_value jsIsLockScreenExecutionAllowed = AppExecFwk::WrapBoolToJS(env, tool.isLockScreenExecutionAllowed); + napi_set_named_property(env, jsObj, "isLockScreenExecutionAllowed", jsIsLockScreenExecutionAllowed); + return jsObj; } diff --git a/cli_tool_framework/interfaces/cli_tool/ICliToolData.idl b/cli_tool_framework/interfaces/cli_tool/ICliToolData.idl index c90feea27f..e10b543529 100644 --- a/cli_tool_framework/interfaces/cli_tool/ICliToolData.idl +++ b/cli_tool_framework/interfaces/cli_tool/ICliToolData.idl @@ -25,5 +25,6 @@ struct CommandPermission { Command cmd; List permissions; + boolean isLockScreenExecutionAllowed; int queryRet; }; diff --git a/cli_tool_framework/interfaces/cli_tool/include/tool_info.h b/cli_tool_framework/interfaces/cli_tool/include/tool_info.h index 0a85f054b9..4b9d975792 100644 --- a/cli_tool_framework/interfaces/cli_tool/include/tool_info.h +++ b/cli_tool_framework/interfaces/cli_tool/include/tool_info.h @@ -65,6 +65,7 @@ public: std::string eventSchemas; // JSON string (map of event type to schema) bool hasSubCommand = false; std::map subcommands; + bool isLockScreenExecutionAllowed = false; // Allow execution when screen is locked ToolInfo() = default; ~ToolInfo() = default; diff --git a/cli_tool_framework/interfaces/cli_tool/src/tool_info.cpp b/cli_tool_framework/interfaces/cli_tool/src/tool_info.cpp index 70b9aed5a9..6be9d01122 100644 --- a/cli_tool_framework/interfaces/cli_tool/src/tool_info.cpp +++ b/cli_tool_framework/interfaces/cli_tool/src/tool_info.cpp @@ -52,7 +52,8 @@ bool ToolInfo::Marshalling(Parcel &parcel) const parcel.WriteString(eventSchemas) && parcel.WriteStringVector(eventTypes) && parcel.WriteBool(hasSubCommand) && - parcel.WriteString(subcommandsJson); + parcel.WriteString(subcommandsJson) && + parcel.WriteBool(isLockScreenExecutionAllowed); } ToolInfo *ToolInfo::Unmarshalling(Parcel &parcel) @@ -73,7 +74,8 @@ ToolInfo *ToolInfo::Unmarshalling(Parcel &parcel) !parcel.ReadString(tool->eventSchemas) || !parcel.ReadStringVector(&tool->eventTypes) || !parcel.ReadBool(tool->hasSubCommand) || - !parcel.ReadString(subcommandsJson)) { + !parcel.ReadString(subcommandsJson) || + !parcel.ReadBool(tool->isLockScreenExecutionAllowed)) { delete tool; return nullptr; } @@ -314,6 +316,13 @@ bool ToolInfo::ParseFromJson(const nlohmann::json &json, ToolInfo &tool) tool.subcommands[it.key()] = std::move(subCmd); } } + if (json.contains("isLockScreenExecutionAllowed")) { + if (!json["isLockScreenExecutionAllowed"].is_boolean()) { + TAG_LOGE(AAFwkTag::CLI_TOOL, "ParseFromJson failed: isLockScreenExecutionAllowed is not a boolean"); + return false; + } + tool.isLockScreenExecutionAllowed = json["isLockScreenExecutionAllowed"]; + } return true; } @@ -360,6 +369,7 @@ nlohmann::json ToolInfo::ParseToJson() const } j["subcommands"] = subcommandsJson; } + j["isLockScreenExecutionAllowed"] = isLockScreenExecutionAllowed; return j; } diff --git a/cli_tool_framework/services/climgr/include/permission_query_util.h b/cli_tool_framework/services/climgr/include/permission_query_util.h index 2f1bb2def6..77511f695f 100644 --- a/cli_tool_framework/services/climgr/include/permission_query_util.h +++ b/cli_tool_framework/services/climgr/include/permission_query_util.h @@ -54,31 +54,36 @@ private: * @brief Query permissions for a single command * @param cmd Command to query * @param permissions Output vector of permission strings + * @param isLockScreenExecutionAllowed Output whether lock screen execution is enabled * @return ERR_OK on success * ERR_TOOL_NOT_EXIST when tool not found * ERR_NO_INIT on database error */ static int32_t QuerySingleCommand( const Command &cmd, - std::vector &permissions); + std::vector &permissions, + bool &isLockScreenExecutionAllowed); /** * @brief Query permissions for main command (no subcommand) * @param toolName Tool name * @param permissions Output vector of permission strings + * @param isLockScreenExecutionAllowed Output whether lock screen execution is enabled * @return ERR_OK on success * ERR_TOOL_NOT_EXIST when tool not found * ERR_NO_INIT on database error */ static int32_t QueryMainCommandPermission( const std::string &toolName, - std::vector &permissions); + std::vector &permissions, + bool &isLockScreenExecutionAllowed); /** * @brief Query permissions for subcommand * @param toolName Tool name * @param subCommand Subcommand name * @param permissions Output vector of permission strings + * @param isLockScreenExecutionAllowed Output whether lock screen execution is enabled * @return ERR_OK on success * ERR_TOOL_NOT_EXIST when tool or subcommand not found * ERR_NO_INIT on database error @@ -86,19 +91,22 @@ private: static int32_t QuerySubCommandPermission( const std::string &toolName, const std::string &subCommand, - std::vector &permissions); + std::vector &permissions, + bool &isLockScreenExecutionAllowed); /** * @brief Build CommandPermission result object * @param cmd Command * @param permissions Permission list * @param queryRet Query result code + * @param isLockScreenExecutionAllowed Whether lock screen execution is enabled * @return CommandPermission object */ static CommandPermission BuildCommandPermission( const Command &cmd, const std::vector &permissions, - int32_t queryRet); + int32_t queryRet, + bool isLockScreenExecutionAllowed); }; } // namespace CliTool } // namespace OHOS diff --git a/cli_tool_framework/services/climgr/src/permission_query_util.cpp b/cli_tool_framework/services/climgr/src/permission_query_util.cpp index 437a043d5e..c642aafd12 100644 --- a/cli_tool_framework/services/climgr/src/permission_query_util.cpp +++ b/cli_tool_framework/services/climgr/src/permission_query_util.cpp @@ -27,7 +27,8 @@ int32_t PermissionQueryUtil::BatchQueryPermissions( cmdPermissions.reserve(cmds.size()); for (const auto &cmd : cmds) { std::vector permissions; - int32_t ret = QuerySingleCommand(cmd, permissions); + bool isLockScreenExecutionAllowed = false; + int32_t ret = QuerySingleCommand(cmd, permissions, isLockScreenExecutionAllowed); int32_t queryRet; if (ret == ERR_OK) { queryRet = QueryResult::SUCCESS; @@ -38,7 +39,7 @@ int32_t PermissionQueryUtil::BatchQueryPermissions( queryRet = QueryResult::DB_ERROR; permissions.clear(); } - cmdPermissions.push_back(BuildCommandPermission(cmd, permissions, queryRet)); + cmdPermissions.push_back(BuildCommandPermission(cmd, permissions, queryRet, isLockScreenExecutionAllowed)); } TAG_LOGI(AAFwkTag::CLI_TOOL, "Batch query completed, total=%{public}zu", cmdPermissions.size()); return ERR_OK; @@ -46,21 +47,23 @@ int32_t PermissionQueryUtil::BatchQueryPermissions( int32_t PermissionQueryUtil::QuerySingleCommand( const Command &cmd, - std::vector &permissions) + std::vector &permissions, + bool &isLockScreenExecutionAllowed) { if (cmd.toolName.empty()) { TAG_LOGW(AAFwkTag::CLI_TOOL, "Tool name is empty"); return ERR_TOOL_NOT_EXIST; } if (cmd.subCommand.empty()) { - return QueryMainCommandPermission(cmd.toolName, permissions); + return QueryMainCommandPermission(cmd.toolName, permissions, isLockScreenExecutionAllowed); } - return QuerySubCommandPermission(cmd.toolName, cmd.subCommand, permissions); + return QuerySubCommandPermission(cmd.toolName, cmd.subCommand, permissions, isLockScreenExecutionAllowed); } int32_t PermissionQueryUtil::QueryMainCommandPermission( const std::string &toolName, - std::vector &permissions) + std::vector &permissions, + bool &isLockScreenExecutionAllowed) { ToolInfo toolInfo; int32_t ret = CliToolDataManager::GetInstance().GetToolByName(toolName, toolInfo); @@ -72,13 +75,15 @@ int32_t PermissionQueryUtil::QueryMainCommandPermission( return ERR_TOOL_NOT_EXIST; } permissions = toolInfo.requirePermissions; + isLockScreenExecutionAllowed = toolInfo.isLockScreenExecutionAllowed; return ERR_OK; } int32_t PermissionQueryUtil::QuerySubCommandPermission( const std::string &toolName, const std::string &subCommand, - std::vector &permissions) + std::vector &permissions, + bool &isLockScreenExecutionAllowed) { ToolInfo toolInfo; int32_t ret = CliToolDataManager::GetInstance().GetToolByName(toolName, toolInfo); @@ -100,18 +105,21 @@ int32_t PermissionQueryUtil::QuerySubCommandPermission( return ERR_TOOL_NOT_EXIST; } permissions = it->second.requirePermissions; + isLockScreenExecutionAllowed = toolInfo.isLockScreenExecutionAllowed; return ERR_OK; } CommandPermission PermissionQueryUtil::BuildCommandPermission( const Command &cmd, const std::vector &permissions, - int32_t queryRet) + int32_t queryRet, + bool isLockScreenExecutionAllowed) { CommandPermission cmdPerm; cmdPerm.cmd = cmd; cmdPerm.permissions = permissions; cmdPerm.queryRet = queryRet; + cmdPerm.isLockScreenExecutionAllowed = isLockScreenExecutionAllowed; return cmdPerm; } } // namespace CliTool diff --git a/cli_tool_framework/test/unittest/cli_tool_mgr_client_test/mock/include/icli_tool_data.h b/cli_tool_framework/test/unittest/cli_tool_mgr_client_test/mock/include/icli_tool_data.h index 663412d570..80b09880ee 100644 --- a/cli_tool_framework/test/unittest/cli_tool_mgr_client_test/mock/include/icli_tool_data.h +++ b/cli_tool_framework/test/unittest/cli_tool_mgr_client_test/mock/include/icli_tool_data.h @@ -19,6 +19,7 @@ struct Command { struct CommandPermission { Command cmd; std::vector permissions; + bool isLockScreenExecutionAllowed = false; int32_t queryRet = 0; }; } // namespace CliTool diff --git a/cli_tool_framework/test/unittest/common_mock/climgr_data/include/cli_tool_data_manager_mock.h b/cli_tool_framework/test/unittest/common_mock/climgr_data/include/cli_tool_data_manager_mock.h index fcdce75389..bbf9f6dd4a 100644 --- a/cli_tool_framework/test/unittest/common_mock/climgr_data/include/cli_tool_data_manager_mock.h +++ b/cli_tool_framework/test/unittest/common_mock/climgr_data/include/cli_tool_data_manager_mock.h @@ -16,6 +16,7 @@ class CliToolDataManagerMock { public: static int32_t getToolByNameResult; static bool toolHasSubCommand; + static bool toolIsLockScreenExecEnabled; static std::string subCommandName; static std::vector toolPermissions; static std::vector subCommandPermissions; diff --git a/cli_tool_framework/test/unittest/common_mock/climgr_data/src/cli_tool_data_manager_mock.cpp b/cli_tool_framework/test/unittest/common_mock/climgr_data/src/cli_tool_data_manager_mock.cpp index 4960f4bd93..d00ef468ec 100644 --- a/cli_tool_framework/test/unittest/common_mock/climgr_data/src/cli_tool_data_manager_mock.cpp +++ b/cli_tool_framework/test/unittest/common_mock/climgr_data/src/cli_tool_data_manager_mock.cpp @@ -14,6 +14,7 @@ namespace OHOS { namespace CliTool { int32_t CliToolDataManagerMock::getToolByNameResult = ERR_TOOL_NOT_EXIST; bool CliToolDataManagerMock::toolHasSubCommand = false; +bool CliToolDataManagerMock::toolIsLockScreenExecEnabled = false; std::string CliToolDataManagerMock::subCommandName = "build"; std::vector CliToolDataManagerMock::toolPermissions = {}; std::vector CliToolDataManagerMock::subCommandPermissions = {}; @@ -22,6 +23,7 @@ void CliToolDataManagerMock::Reset() { getToolByNameResult = ERR_TOOL_NOT_EXIST; toolHasSubCommand = false; + toolIsLockScreenExecEnabled = false; subCommandName = "build"; toolPermissions.clear(); subCommandPermissions.clear(); @@ -94,6 +96,7 @@ int32_t CliToolDataManager::GetToolByName(const std::string &name, ToolInfo &too toolInfo.inputSchema = "{}"; toolInfo.outputSchema = "{}"; toolInfo.hasSubCommand = CliToolDataManagerMock::toolHasSubCommand; + toolInfo.isLockScreenExecutionAllowed = CliToolDataManagerMock::toolIsLockScreenExecEnabled; if (toolInfo.hasSubCommand) { SubCommandInfo subCommand; subCommand.description = "mock subcommand"; diff --git a/cli_tool_framework/test/unittest/permission_query_util_test/permission_query_util_test.cpp b/cli_tool_framework/test/unittest/permission_query_util_test/permission_query_util_test.cpp index 372aa4e6f4..316d522f9d 100644 --- a/cli_tool_framework/test/unittest/permission_query_util_test/permission_query_util_test.cpp +++ b/cli_tool_framework/test/unittest/permission_query_util_test/permission_query_util_test.cpp @@ -197,8 +197,9 @@ HWTEST_F(PermissionQueryUtilTest, QuerySingleCommand_EmptyToolName, TestSize.Lev Command cmd; cmd.toolName = ""; std::vector permissions; + bool isLockScreenExecutionAllowed = false; - int32_t ret = PermissionQueryUtil::QuerySingleCommand(cmd, permissions); + int32_t ret = PermissionQueryUtil::QuerySingleCommand(cmd, permissions, isLockScreenExecutionAllowed); EXPECT_EQ(ret, ERR_TOOL_NOT_EXIST); EXPECT_EQ(permissions.size(), 0u); @@ -213,8 +214,9 @@ HWTEST_F(PermissionQueryUtilTest, QuerySingleCommand_ToolNotExist, TestSize.Leve { Command cmd = CreateTestCommand("non_existent_tool"); std::vector permissions; + bool isLockScreenExecutionAllowed = false; - int32_t ret = PermissionQueryUtil::QuerySingleCommand(cmd, permissions); + int32_t ret = PermissionQueryUtil::QuerySingleCommand(cmd, permissions, isLockScreenExecutionAllowed); EXPECT_EQ(ret, ERR_TOOL_NOT_EXIST); EXPECT_EQ(permissions.size(), 0u); @@ -229,10 +231,12 @@ HWTEST_F(PermissionQueryUtilTest, QuerySingleCommand_MainCommandSuccess, TestSiz { CliToolDataManagerMock::getToolByNameResult = ERR_OK; CliToolDataManagerMock::toolPermissions = {TEST_PERMISSION_1, TEST_PERMISSION_2}; + CliToolDataManagerMock::toolIsLockScreenExecEnabled = true; Command cmd = CreateTestCommand(TEST_TOOL_NAME); std::vector permissions; + bool isLockScreenExecutionAllowed = false; - int32_t ret = PermissionQueryUtil::QuerySingleCommand(cmd, permissions); + int32_t ret = PermissionQueryUtil::QuerySingleCommand(cmd, permissions, isLockScreenExecutionAllowed); EXPECT_EQ(ret, ERR_OK); EXPECT_EQ(permissions.size(), 2u); @@ -251,10 +255,12 @@ HWTEST_F(PermissionQueryUtilTest, QuerySingleCommand_SubCommandSuccess, TestSize CliToolDataManagerMock::toolHasSubCommand = true; CliToolDataManagerMock::subCommandName = TEST_SUBCOMMAND; CliToolDataManagerMock::subCommandPermissions = {TEST_PERMISSION_2}; + CliToolDataManagerMock::toolIsLockScreenExecEnabled = true; Command cmd = CreateTestCommand(TEST_TOOL_NAME, TEST_SUBCOMMAND); std::vector permissions; + bool isLockScreenExecutionAllowed = false; - int32_t ret = PermissionQueryUtil::QuerySingleCommand(cmd, permissions); + int32_t ret = PermissionQueryUtil::QuerySingleCommand(cmd, permissions, isLockScreenExecutionAllowed); EXPECT_EQ(ret, ERR_OK); ASSERT_EQ(permissions.size(), 1u); @@ -272,8 +278,9 @@ HWTEST_F(PermissionQueryUtilTest, QuerySingleCommand_NoSubCommand, TestSize.Leve CliToolDataManagerMock::toolHasSubCommand = false; Command cmd = CreateTestCommand(TEST_TOOL_NAME, TEST_SUBCOMMAND); std::vector permissions = {TEST_PERMISSION_1}; + bool isLockScreenExecutionAllowed = false; - int32_t ret = PermissionQueryUtil::QuerySingleCommand(cmd, permissions); + int32_t ret = PermissionQueryUtil::QuerySingleCommand(cmd, permissions, isLockScreenExecutionAllowed); EXPECT_EQ(ret, ERR_TOOL_NOT_EXIST); } @@ -288,8 +295,9 @@ HWTEST_F(PermissionQueryUtilTest, QuerySingleCommand_DbError, TestSize.Level1) CliToolDataManagerMock::getToolByNameResult = ERR_NO_INIT; Command cmd = CreateTestCommand(TEST_TOOL_NAME); std::vector permissions; + bool isLockScreenExecutionAllowed = false; - int32_t ret = PermissionQueryUtil::QuerySingleCommand(cmd, permissions); + int32_t ret = PermissionQueryUtil::QuerySingleCommand(cmd, permissions, isLockScreenExecutionAllowed); EXPECT_EQ(ret, ERR_NO_INIT); } @@ -323,8 +331,10 @@ HWTEST_F(PermissionQueryUtilTest, BuildCommandPermission_CreatesCorrectObject, T Command cmd = CreateTestCommand(TEST_TOOL_NAME, TEST_SUBCOMMAND); std::vector permissions = {TEST_PERMISSION_1, TEST_PERMISSION_2}; int32_t queryRet = QueryResult::SUCCESS; + bool isLockScreenExecutionAllowed = true; - CommandPermission cmdPerm = PermissionQueryUtil::BuildCommandPermission(cmd, permissions, queryRet); + CommandPermission cmdPerm = PermissionQueryUtil::BuildCommandPermission(cmd, permissions, queryRet, + isLockScreenExecutionAllowed); EXPECT_EQ(cmdPerm.cmd.toolName, TEST_TOOL_NAME); EXPECT_EQ(cmdPerm.cmd.subCommand, TEST_SUBCOMMAND); @@ -332,6 +342,7 @@ HWTEST_F(PermissionQueryUtilTest, BuildCommandPermission_CreatesCorrectObject, T EXPECT_EQ(cmdPerm.permissions.size(), 2u); EXPECT_EQ(cmdPerm.permissions[0], TEST_PERMISSION_1); EXPECT_EQ(cmdPerm.permissions[1], TEST_PERMISSION_2); + EXPECT_TRUE(cmdPerm.isLockScreenExecutionAllowed); } /** @@ -344,13 +355,16 @@ HWTEST_F(PermissionQueryUtilTest, BuildCommandPermission_EmptyPermissions, TestS Command cmd = CreateTestCommand(TEST_TOOL_NAME); std::vector permissions; int32_t queryRet = QueryResult::COMMAND_NOT_EXIST; + bool isLockScreenExecutionAllowed = false; - CommandPermission cmdPerm = PermissionQueryUtil::BuildCommandPermission(cmd, permissions, queryRet); + CommandPermission cmdPerm = PermissionQueryUtil::BuildCommandPermission(cmd, permissions, queryRet, + isLockScreenExecutionAllowed); EXPECT_EQ(cmdPerm.cmd.toolName, TEST_TOOL_NAME); EXPECT_EQ(cmdPerm.cmd.subCommand, ""); EXPECT_EQ(cmdPerm.queryRet, QueryResult::COMMAND_NOT_EXIST); EXPECT_EQ(cmdPerm.permissions.size(), 0u); + EXPECT_FALSE(cmdPerm.isLockScreenExecutionAllowed); } } // namespace CliTool } // namespace OHOS