fix: 擦除want参数, Co-Authored-By: Agent

Signed-off-by: songkeyuan <songkeyuan@huawei.com>
This commit is contained in:
songkeyuan
2026-08-23 20:57:31 +08:00
parent 96990a1459
commit 2c6d4c2de2
3 changed files with 90 additions and 8 deletions
@@ -1097,9 +1097,18 @@ napi_value WrapWant(napi_env env, const Want &want)
napi_value jsObject = nullptr;
napi_value jsValue = nullptr;
// PARAM_SET_URI_WITH_ORIGIN_STRING is an internal system parameter used to
// pass through an origin uri that bypasses scheme validation. It must not be
// exposed to third-party apps, so it is stripped here for non-system apps.
Want wrapWant = want;
auto selfToken = IPCSkeleton::GetSelfTokenID();
if (!Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(selfToken)) {
wrapWant.RemoveParam(Want::PARAM_SET_URI_WITH_ORIGIN_STRING);
}
NAPI_CALL(env, napi_create_object(env, &jsObject));
napi_value jsElementName = WrapElementName(env, want.GetElement());
napi_value jsElementName = WrapElementName(env, wrapWant.GetElement());
if (jsElementName == nullptr) {
TAG_LOGI(AAFwkTag::JSNAPI, "null jsElementName");
return nullptr;
@@ -1121,31 +1130,31 @@ napi_value WrapWant(napi_env env, const Want &want)
SetPropertyValueByPropertyName(env, jsObject, "moduleName", jsValue);
jsValue = nullptr;
jsValue = WrapStringToJS(env, want.GetUriString());
jsValue = WrapStringToJS(env, wrapWant.GetUriString());
SetPropertyValueByPropertyName(env, jsObject, "uri", jsValue);
jsValue = nullptr;
jsValue = WrapStringToJS(env, want.GetType());
jsValue = WrapStringToJS(env, wrapWant.GetType());
SetPropertyValueByPropertyName(env, jsObject, "type", jsValue);
jsValue = nullptr;
jsValue = WrapInt32ToJS(env, want.GetFlags());
jsValue = WrapInt32ToJS(env, wrapWant.GetFlags());
SetPropertyValueByPropertyName(env, jsObject, "flags", jsValue);
jsValue = nullptr;
jsValue = WrapStringToJS(env, want.GetAction());
jsValue = WrapStringToJS(env, wrapWant.GetAction());
SetPropertyValueByPropertyName(env, jsObject, "action", jsValue);
jsValue = nullptr;
jsValue = WrapWantParams(env, want.GetParams());
jsValue = WrapWantParams(env, wrapWant.GetParams());
SetPropertyValueByPropertyName(env, jsObject, "parameters", jsValue);
jsValue = nullptr;
jsValue = WrapWantParamsFD(env, want.GetParams());
jsValue = WrapWantParamsFD(env, wrapWant.GetParams());
SetPropertyValueByPropertyName(env, jsObject, "fds", jsValue);
jsValue = nullptr;
jsValue = WrapArrayStringToJS(env, want.GetEntities());
jsValue = WrapArrayStringToJS(env, wrapWant.GetEntities());
SetPropertyValueByPropertyName(env, jsObject, "entities", jsValue);
return handleEscape.Escape(jsObject);
@@ -20,6 +20,7 @@ ohos_unittest("napi_common_want_test") {
include_dirs = [
"${ability_runtime_path}/frameworks/js/napi/inner/napi_common",
"${ability_runtime_path}/interfaces/inner_api/runtime/include",
]
sources = [
@@ -30,6 +31,7 @@ ohos_unittest("napi_common_want_test") {
"${ability_runtime_innerkits_path}/runtime:runtime",
"${ability_runtime_napi_path}/inner/napi_common:napi_common",
"${ability_runtime_innerkits_path}/wantagent:wantagent_innerkits",
"${ability_runtime_path}/js_environment/frameworks/js_environment:js_environment",
]
external_deps = [
@@ -18,6 +18,8 @@
#include "access_token.h"
#include "hilog_tag_wrapper.h"
#include "js_runtime_lite.h"
#include "napi_common_util.h"
#include "napi_common_want.h"
#include "napi/native_api.h"
#include "token_setproc.h"
@@ -240,5 +242,74 @@ HWTEST_F(NapiCommonWantTest, UnwrapWantParams_NullParam_0100, Function | MediumT
bool result = UnwrapWantParams(env, param, wantParams);
EXPECT_FALSE(result);
}
/**
* @tc.name: WrapWant_NonSystemApp_StripsPassThroughFlag_0100
* @tc.desc: Non-system app is the final hop, the pass-through flag is stripped
* when the want is wrapped to the JS layer.
*/
HWTEST_F(NapiCommonWantTest, WrapWant_NonSystemApp_StripsPassThroughFlag_0100, Function | MediumTest | Level1)
{
uint64_t originalToken = GetSelfTokenID();
SetSelfTokenID(0);
AbilityRuntime::Runtime::Options options;
std::shared_ptr<JsEnv::JsEnvironment> jsEnv = nullptr;
AbilityRuntime::JsRuntimeLite::GetInstance().CreateJsEnv(options, jsEnv);
ASSERT_NE(jsEnv, nullptr);
napi_env env = reinterpret_cast<napi_env>(jsEnv->GetNativeEngine());
ASSERT_NE(env, nullptr);
AAFwk::Want want;
want.SetParam(AAFwk::Want::PARAM_SET_URI_WITH_ORIGIN_STRING, true);
napi_value jsWant = WrapWant(env, want);
ASSERT_NE(jsWant, nullptr);
napi_value jsParams = GetPropertyValueByPropertyName(env, jsWant, "parameters", napi_object);
ASSERT_NE(jsParams, nullptr);
EXPECT_FALSE(IsExistsByPropertyName(env, jsParams,
AAFwk::Want::PARAM_SET_URI_WITH_ORIGIN_STRING.c_str()));
AbilityRuntime::JsRuntimeLite::GetInstance().RemoveJsEnv(env);
SetSelfTokenID(originalToken);
}
/**
* @tc.name: WrapWant_SystemApp_KeepsPassThroughFlag_0100
* @tc.desc: System app may keep forwarding, the pass-through flag is preserved
* when the want is wrapped to the JS layer.
*/
HWTEST_F(NapiCommonWantTest, WrapWant_SystemApp_KeepsPassThroughFlag_0100, Function | MediumTest | Level1)
{
uint64_t originalToken = GetSelfTokenID();
uint64_t systemAppMask = (static_cast<uint64_t>(1) << 32);
uint32_t tokenID = Security::AccessToken::DEFAULT_TOKEN_VERSION;
Security::AccessToken::AccessTokenIDInner *idInner =
reinterpret_cast<Security::AccessToken::AccessTokenIDInner *>(&tokenID);
idInner->type = Security::AccessToken::TOKEN_HAP;
uint64_t fullTokenId = systemAppMask | tokenID;
SetSelfTokenID(fullTokenId);
AbilityRuntime::Runtime::Options options;
std::shared_ptr<JsEnv::JsEnvironment> jsEnv = nullptr;
AbilityRuntime::JsRuntimeLite::GetInstance().CreateJsEnv(options, jsEnv);
ASSERT_NE(jsEnv, nullptr);
napi_env env = reinterpret_cast<napi_env>(jsEnv->GetNativeEngine());
ASSERT_NE(env, nullptr);
AAFwk::Want want;
want.SetParam(AAFwk::Want::PARAM_SET_URI_WITH_ORIGIN_STRING, true);
napi_value jsWant = WrapWant(env, want);
ASSERT_NE(jsWant, nullptr);
napi_value jsParams = GetPropertyValueByPropertyName(env, jsWant, "parameters", napi_object);
ASSERT_NE(jsParams, nullptr);
EXPECT_TRUE(IsExistsByPropertyName(env, jsParams,
AAFwk::Want::PARAM_SET_URI_WITH_ORIGIN_STRING.c_str()));
AbilityRuntime::JsRuntimeLite::GetInstance().RemoveJsEnv(env);
SetSelfTokenID(originalToken);
}
} // namespace AppExecFwk
} // namespace OHOS