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