1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "napi_hichecker.h"
17
18 #include <map>
19
20 #include "hichecker.h"
21 #include "hilog/log_c.h"
22 #include "hilog/log_cpp.h"
23
24 namespace OHOS {
25 namespace HiviewDFX {
26 namespace {
27 constexpr HiLogLabel LABEL = { LOG_CORE, 0xD002D0B, "HiChecker_NAPI" };
28 constexpr int ONE_VALUE_LIMIT = 1;
29 constexpr int ARRAY_INDEX_FIRST = 0;
30 constexpr uint64_t GET_RULE_PARAM_FAIL = 0;
31 constexpr int ERR_PARAM = 401;
32 }
33
AddRule(napi_env env,napi_callback_info info)34 napi_value AddRule(napi_env env, napi_callback_info info)
35 {
36 uint64_t rule = GetRuleParam(env, info);
37 if (rule != GET_RULE_PARAM_FAIL) {
38 HiChecker::AddRule(rule);
39 }
40 return CreateUndefined(env);
41 }
42
RemoveRule(napi_env env,napi_callback_info info)43 napi_value RemoveRule(napi_env env, napi_callback_info info)
44 {
45 uint64_t rule = GetRuleParam(env, info);
46 if (rule != GET_RULE_PARAM_FAIL) {
47 HiChecker::RemoveRule(rule);
48 }
49 return CreateUndefined(env);
50 }
51
GetRule(napi_env env,napi_callback_info info)52 napi_value GetRule(napi_env env, napi_callback_info info)
53 {
54 uint64_t rule = HiChecker::GetRule();
55 return ToUInt64Value(env, rule);
56 }
57
Contains(napi_env env,napi_callback_info info)58 napi_value Contains(napi_env env, napi_callback_info info)
59 {
60 uint64_t rule = GetRuleParam(env, info);
61 napi_value result = nullptr;
62 napi_get_boolean(env, HiChecker::Contains(rule), &result);
63 return result;
64 }
65
AddCheckRule(napi_env env,napi_callback_info info)66 napi_value AddCheckRule(napi_env env, napi_callback_info info)
67 {
68 uint64_t rule = GetRuleParam(env, info);
69 if (rule != GET_RULE_PARAM_FAIL) {
70 HiChecker::AddRule(rule);
71 } else {
72 ThrowError(env, ERR_PARAM);
73 }
74 return CreateUndefined(env);
75 }
76
RemoveCheckRule(napi_env env,napi_callback_info info)77 napi_value RemoveCheckRule(napi_env env, napi_callback_info info)
78 {
79 uint64_t rule = GetRuleParam(env, info);
80 if (rule != GET_RULE_PARAM_FAIL) {
81 HiChecker::RemoveRule(rule);
82 } else {
83 ThrowError(env, ERR_PARAM);
84 }
85 return CreateUndefined(env);
86 }
87
ContainsCheckRule(napi_env env,napi_callback_info info)88 napi_value ContainsCheckRule(napi_env env, napi_callback_info info)
89 {
90 napi_value result = nullptr;
91 uint64_t rule = GetRuleParam(env, info);
92 if (rule == GET_RULE_PARAM_FAIL) {
93 ThrowError(env, ERR_PARAM);
94 }
95 napi_get_boolean(env, HiChecker::Contains(rule), &result);
96 return result;
97 }
98
DeclareHiCheckerInterface(napi_env env,napi_value exports)99 napi_value DeclareHiCheckerInterface(napi_env env, napi_value exports)
100 {
101 napi_property_descriptor desc[] = {
102 DECLARE_NAPI_FUNCTION("addRule", AddRule),
103 DECLARE_NAPI_FUNCTION("removeRule", RemoveRule),
104 DECLARE_NAPI_FUNCTION("getRule", GetRule),
105 DECLARE_NAPI_FUNCTION("contains", Contains),
106 DECLARE_NAPI_FUNCTION("addCheckRule", AddCheckRule),
107 DECLARE_NAPI_FUNCTION("removeCheckRule", RemoveCheckRule),
108 DECLARE_NAPI_FUNCTION("containsCheckRule", ContainsCheckRule),
109 };
110 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
111 DeclareHiCheckerRuleEnum(env, exports);
112 return exports;
113 }
114
DeclareHiCheckerRuleEnum(napi_env env,napi_value exports)115 napi_value DeclareHiCheckerRuleEnum(napi_env env, napi_value exports)
116 {
117 napi_property_descriptor desc[] = {
118 DECLARE_NAPI_STATIC_PROPERTY("RULE_CAUTION_PRINT_LOG", ToUInt64Value(env, Rule::RULE_CAUTION_PRINT_LOG)),
119 DECLARE_NAPI_STATIC_PROPERTY("RULE_CAUTION_TRIGGER_CRASH",
120 ToUInt64Value(env, Rule::RULE_CAUTION_TRIGGER_CRASH)),
121 DECLARE_NAPI_STATIC_PROPERTY("RULE_THREAD_CHECK_SLOW_PROCESS",
122 ToUInt64Value(env, Rule::RULE_THREAD_CHECK_SLOW_PROCESS)),
123 DECLARE_NAPI_STATIC_PROPERTY("RULE_CHECK_SLOW_EVENT", ToUInt64Value(env, Rule::RULE_CHECK_SLOW_EVENT)),
124 DECLARE_NAPI_STATIC_PROPERTY("RULE_CHECK_ABILITY_CONNECTION_LEAK",
125 ToUInt64Value(env, Rule::RULE_CHECK_ABILITY_CONNECTION_LEAK)),
126 };
127 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
128 return exports;
129 }
130
ToUInt64Value(napi_env env,uint64_t value)131 napi_value ToUInt64Value(napi_env env, uint64_t value)
132 {
133 napi_value staticValue = nullptr;
134 napi_create_bigint_uint64(env, value, &staticValue);
135 return staticValue;
136 }
137
CreateUndefined(napi_env env)138 napi_value CreateUndefined(napi_env env)
139 {
140 napi_value result = nullptr;
141 napi_get_undefined(env, &result);
142 return result;
143 }
144
ThrowError(napi_env env,int errCode)145 void ThrowError(napi_env env, int errCode)
146 {
147 std::map<int, std::string> errMap = {
148 { ERR_PARAM, "Invalid input parameter!" },
149 };
150 if (errMap.find(errCode) != errMap.end()) {
151 napi_throw_error(env, std::to_string(errCode).c_str(), errMap[errCode].c_str());
152 }
153 return;
154 }
155
GetRuleParam(napi_env env,napi_callback_info info)156 uint64_t GetRuleParam(napi_env env, napi_callback_info info)
157 {
158 size_t argc = ONE_VALUE_LIMIT;
159 napi_value argv[ONE_VALUE_LIMIT] = { nullptr };
160 napi_value thisVar = nullptr;
161 void *data = nullptr;
162 napi_get_cb_info(env, info, &argc, argv, &thisVar, &data);
163 if (argc != ONE_VALUE_LIMIT) {
164 HiLog::Error(LABEL, "invalid number=%{public}d of params.", ONE_VALUE_LIMIT);
165 return GET_RULE_PARAM_FAIL;
166 }
167 if (!MatchValueType(env, argv[ARRAY_INDEX_FIRST], napi_bigint)) {
168 HiLog::Error(LABEL, "Type error, should be bigint type!");
169 return GET_RULE_PARAM_FAIL;
170 }
171 uint64_t rule = GET_RULE_PARAM_FAIL;
172 bool lossless = true;
173 napi_get_value_bigint_uint64(env, argv[ARRAY_INDEX_FIRST], &rule, &lossless);
174 if (!lossless) {
175 HiLog::Error(LABEL, "Type error, bigint should be 64!");
176 return GET_RULE_PARAM_FAIL;
177 }
178 if (rule == GET_RULE_PARAM_FAIL) {
179 HiLog::Error(LABEL, "invalid input, please check!");
180 }
181 return rule;
182 }
183
MatchValueType(napi_env env,napi_value value,napi_valuetype targetType)184 bool MatchValueType(napi_env env, napi_value value, napi_valuetype targetType)
185 {
186 napi_valuetype valueType = napi_undefined;
187 napi_typeof(env, value, &valueType);
188 return valueType == targetType;
189 }
190
191 static napi_module g_module = {
192 .nm_version = 1,
193 .nm_flags = 0,
194 .nm_filename = nullptr,
195 .nm_register_func = DeclareHiCheckerInterface,
196 .nm_modname = "hichecker",
197 .nm_priv = ((void *)0),
198 .reserved = {0}
199 };
200
HiCheckerRegisterModule(void)201 extern "C" __attribute__((constructor)) void HiCheckerRegisterModule(void)
202 {
203 napi_module_register(&g_module);
204 }
205 } // HiviewDFX
206 } // OHOS