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 #include "napi_common.h"
16 #include "accesstoken_common_log.h"
17
18 namespace OHOS {
19 namespace Security {
20 namespace AccessToken {
21
IsCurrentThread(std::thread::id threadId)22 bool IsCurrentThread(std::thread::id threadId)
23 {
24 std::thread::id currentThread = std::this_thread::get_id();
25 if (threadId != currentThread) {
26 LOGE(ATM_DOMAIN, ATM_TAG, "Napi_ref can not be compared,different threadId");
27 return false;
28 }
29 return true;
30 }
CompareCallbackRef(const napi_env env,napi_ref subscriberRef,napi_ref unsubscriberRef,std::thread::id threadId)31 bool CompareCallbackRef(const napi_env env, napi_ref subscriberRef, napi_ref unsubscriberRef, std::thread::id threadId)
32 {
33 if (!IsCurrentThread(threadId)) {
34 return false;
35 }
36 napi_value subscriberCallback;
37 NAPI_CALL_BASE(env,
38 napi_get_reference_value(env, subscriberRef, &subscriberCallback), false);
39 napi_value unsubscriberCallback;
40 NAPI_CALL_BASE(env,
41 napi_get_reference_value(env, unsubscriberRef, &unsubscriberCallback), false);
42 bool result = false;
43 NAPI_CALL_BASE(env,
44 napi_strict_equals(env, subscriberCallback, unsubscriberCallback, &result), false);
45 return result;
46 }
47
CheckType(const napi_env & env,const napi_value & value,const napi_valuetype & type)48 bool CheckType(const napi_env& env, const napi_value& value, const napi_valuetype& type)
49 {
50 napi_valuetype valuetype = napi_undefined;
51 napi_typeof(env, value, &valuetype);
52 if (valuetype != type) {
53 LOGE(ATM_DOMAIN, ATM_TAG, "Value type dismatch, [%{public}d]->[%{public}d]", valuetype, type);
54 return false;
55 }
56 return true;
57 }
58
ParseBool(const napi_env & env,const napi_value & value,bool & result)59 bool ParseBool(const napi_env& env, const napi_value& value, bool& result)
60 {
61 if (!CheckType(env, value, napi_boolean)) {
62 return false;
63 }
64
65 if (napi_get_value_bool(env, value, &result) != napi_ok) {
66 LOGE(ATM_DOMAIN, ATM_TAG, "Cannot get value bool");
67 return false;
68 }
69 return true;
70 }
71
ParseInt32(const napi_env & env,const napi_value & value,int32_t & result)72 bool ParseInt32(const napi_env& env, const napi_value& value, int32_t& result)
73 {
74 if (!CheckType(env, value, napi_number)) {
75 return false;
76 }
77 if (napi_get_value_int32(env, value, &result) != napi_ok) {
78 LOGE(ATM_DOMAIN, ATM_TAG, "Cannot get value int32");
79 return false;
80 }
81 return true;
82 }
83
ParseInt64(const napi_env & env,const napi_value & value,int64_t & result)84 bool ParseInt64(const napi_env& env, const napi_value& value, int64_t& result)
85 {
86 if (!CheckType(env, value, napi_number)) {
87 return false;
88 }
89 if (napi_get_value_int64(env, value, &result) != napi_ok) {
90 LOGE(ATM_DOMAIN, ATM_TAG, "Cannot get value int64");
91 return false;
92 }
93 return true;
94 }
95
ParseUint32(const napi_env & env,const napi_value & value,uint32_t & result)96 bool ParseUint32(const napi_env& env, const napi_value& value, uint32_t& result)
97 {
98 if (!CheckType(env, value, napi_number)) {
99 return false;
100 }
101 if (napi_get_value_uint32(env, value, &result) != napi_ok) {
102 LOGE(ATM_DOMAIN, ATM_TAG, "Cannot get value uint32");
103 return false;
104 }
105 return true;
106 }
107
ParseString(const napi_env & env,const napi_value & value,std::string & result)108 bool ParseString(const napi_env& env, const napi_value& value, std::string& result)
109 {
110 if (!CheckType(env, value, napi_string)) {
111 return false;
112 }
113 size_t size;
114 if (napi_get_value_string_utf8(env, value, nullptr, 0, &size) != napi_ok) {
115 LOGE(ATM_DOMAIN, ATM_TAG, "Cannot get string size");
116 return false;
117 }
118 result.reserve(size + 1);
119 result.resize(size);
120 if (napi_get_value_string_utf8(env, value, result.data(), size + 1, &size) != napi_ok) {
121 LOGE(ATM_DOMAIN, ATM_TAG, "Cannot get value string");
122 return false;
123 }
124 return true;
125 }
126
ParseStringArray(const napi_env & env,const napi_value & value,std::vector<std::string> & result)127 bool ParseStringArray(const napi_env& env, const napi_value& value, std::vector<std::string>& result)
128 {
129 if (!IsArray(env, value)) {
130 return false;
131 }
132
133 uint32_t length = 0;
134 napi_get_array_length(env, value, &length);
135
136 LOGI(ATM_DOMAIN, ATM_TAG, "Array size is %{public}d", length);
137
138 if (length == 0) {
139 LOGI(ATM_DOMAIN, ATM_TAG, "Array is empty");
140 return true;
141 }
142
143 napi_value valueArray;
144 for (uint32_t i = 0; i < length; i++) {
145 napi_get_element(env, value, i, &valueArray);
146
147 std::string str;
148 if (!ParseString(env, valueArray, str)) {
149 return false;
150 }
151 result.emplace_back(str);
152 }
153 return true;
154 }
155
ParseAccessTokenIDArray(const napi_env & env,const napi_value & value,std::vector<AccessTokenID> & result)156 bool ParseAccessTokenIDArray(const napi_env& env, const napi_value& value, std::vector<AccessTokenID>& result)
157 {
158 uint32_t length = 0;
159 if (!IsArray(env, value)) {
160 return false;
161 }
162 napi_get_array_length(env, value, &length);
163 napi_value valueArray;
164 for (uint32_t i = 0; i < length; i++) {
165 napi_get_element(env, value, i, &valueArray);
166 uint32_t res;
167 if (!ParseUint32(env, valueArray, res)) {
168 return false;
169 }
170 result.emplace_back(res);
171 }
172 return true;
173 };
174
IsArray(const napi_env & env,const napi_value & value)175 bool IsArray(const napi_env& env, const napi_value& value)
176 {
177 bool isArray = false;
178 napi_status ret = napi_is_array(env, value, &isArray);
179 if (ret != napi_ok) {
180 return false;
181 }
182 return isArray;
183 }
184
IsUndefinedOrNull(const napi_env & env,const napi_value & value)185 bool IsUndefinedOrNull(const napi_env& env, const napi_value& value)
186 {
187 napi_valuetype valueType = napi_undefined;
188 napi_typeof(env, value, &valueType);
189 return (valueType == napi_undefined) || (valueType == napi_null) ;
190 }
191
IsNeedParseProperty(const napi_env & env,const napi_value & value,const std::string & key,napi_value & property)192 bool IsNeedParseProperty(
193 const napi_env& env, const napi_value& value, const std::string& key, napi_value& property)
194 {
195 bool hasProp = false;
196 property = nullptr;
197 napi_has_named_property(env, value, key.c_str(), &hasProp);
198 if (hasProp) {
199 napi_get_named_property(env, value, key.c_str(), &property);
200 napi_valuetype valueType = napi_undefined;
201 napi_typeof(env, property, &valueType);
202 return (valueType != napi_undefined) && (valueType != napi_null);
203 }
204 return false;
205 }
206
ParseCallback(const napi_env & env,const napi_value & value,napi_ref & result)207 bool ParseCallback(const napi_env& env, const napi_value& value, napi_ref& result)
208 {
209 if (!CheckType(env, value, napi_function)) {
210 return false;
211 }
212 if (napi_create_reference(env, value, 1, &result) != napi_ok) {
213 LOGE(ATM_DOMAIN, ATM_TAG, "Cannot get value callback");
214 return false;
215 }
216 return true;
217 }
218 } // namespace AccessToken
219 } // namespace Security
220 } // namespace OHOS
221