• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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