• 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_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