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
CheckType(const napi_env & env,const napi_value & value,const napi_valuetype & type)25 bool CheckType(const napi_env& env, const napi_value& value, const napi_valuetype& type)
26 {
27 napi_valuetype valuetype = napi_undefined;
28 napi_typeof(env, value, &valuetype);
29 if (valuetype != type) {
30 ACCESSTOKEN_LOG_ERROR(LABEL, "value type dismatch");
31 return false;
32 }
33 return true;
34 }
35
ParseBool(const napi_env & env,const napi_value & value,bool & result)36 bool ParseBool(const napi_env& env, const napi_value& value, bool& result)
37 {
38 if (!CheckType(env, value, napi_boolean)) {
39 return false;
40 }
41
42 if (napi_get_value_bool(env, value, &result) != napi_ok) {
43 ACCESSTOKEN_LOG_ERROR(LABEL, "cannot get value bool");
44 return false;
45 }
46 return true;
47 }
48
ParseInt32(const napi_env & env,const napi_value & value,int32_t & result)49 bool ParseInt32(const napi_env& env, const napi_value& value, int32_t& result)
50 {
51 if (!CheckType(env, value, napi_number)) {
52 return false;
53 }
54 if (napi_get_value_int32(env, value, &result) != napi_ok) {
55 ACCESSTOKEN_LOG_ERROR(LABEL, "cannot get value int32");
56 return false;
57 }
58 return true;
59 }
60
ParseInt64(const napi_env & env,const napi_value & value,int64_t & result)61 bool ParseInt64(const napi_env& env, const napi_value& value, int64_t& result)
62 {
63 if (!CheckType(env, value, napi_number)) {
64 return false;
65 }
66 if (napi_get_value_int64(env, value, &result) != napi_ok) {
67 ACCESSTOKEN_LOG_ERROR(LABEL, "cannot get value int64");
68 return false;
69 }
70 return true;
71 }
72
ParseUint32(const napi_env & env,const napi_value & value,uint32_t & result)73 bool ParseUint32(const napi_env& env, const napi_value& value, uint32_t& result)
74 {
75 if (!CheckType(env, value, napi_number)) {
76 return false;
77 }
78 if (napi_get_value_uint32(env, value, &result) != napi_ok) {
79 ACCESSTOKEN_LOG_ERROR(LABEL, "cannot get value uint32");
80 return false;
81 }
82 return true;
83 }
84
ParseString(const napi_env & env,const napi_value & value,std::string & result)85 bool ParseString(const napi_env& env, const napi_value& value, std::string& result)
86 {
87 if (!CheckType(env, value, napi_string)) {
88 return false;
89 }
90 size_t size;
91 if (napi_get_value_string_utf8(env, value, nullptr, 0, &size) != napi_ok) {
92 ACCESSTOKEN_LOG_ERROR(LABEL, "cannot get string size");
93 return false;
94 }
95 result.reserve(size + 1);
96 result.resize(size);
97 if (napi_get_value_string_utf8(env, value, result.data(), size + 1, &size) != napi_ok) {
98 ACCESSTOKEN_LOG_ERROR(LABEL, "cannot get value string");
99 return false;
100 }
101 return true;
102 }
103
ParseStringArray(const napi_env & env,const napi_value & value,std::vector<std::string> & result)104 bool ParseStringArray(const napi_env& env, const napi_value& value, std::vector<std::string>& result)
105 {
106 if (!IsArray(env, value)) {
107 return false;
108 }
109
110 uint32_t length = 0;
111 napi_get_array_length(env, value, &length);
112
113 if (length == 0) {
114 ACCESSTOKEN_LOG_INFO(LABEL, "array is empty");
115 return true;
116 }
117
118 napi_value valueArray;
119 for (uint32_t i = 0; i < length; i++) {
120 napi_get_element(env, value, i, &valueArray);
121
122 std::string str;
123 if (!ParseString(env, valueArray, str)) {
124 return false;
125 }
126 result.emplace_back(str);
127 }
128 return true;
129 }
130
ParseAccessTokenIDArray(const napi_env & env,const napi_value & value,std::vector<AccessTokenID> & result)131 bool ParseAccessTokenIDArray(const napi_env& env, const napi_value& value, std::vector<AccessTokenID>& result)
132 {
133 uint32_t length = 0;
134 if (!IsArray(env, value)) {
135 return false;
136 }
137 napi_get_array_length(env, value, &length);
138 napi_value valueArray;
139 for (uint32_t i = 0; i < length; i++) {
140 napi_get_element(env, value, i, &valueArray);
141 uint32_t res;
142 if (!ParseUint32(env, valueArray, res)) {
143 return false;
144 }
145 result.emplace_back(res);
146 }
147 return true;
148 };
149
IsArray(const napi_env & env,const napi_value & value)150 bool IsArray(const napi_env& env, const napi_value& value)
151 {
152 bool isArray = false;
153 napi_status ret = napi_is_array(env, value, &isArray);
154 if (ret != napi_ok) {
155 return false;
156 }
157 return isArray;
158 }
159
ParseCallback(const napi_env & env,const napi_value & value,napi_ref & result)160 bool ParseCallback(const napi_env& env, const napi_value& value, napi_ref& result)
161 {
162 if (!CheckType(env, value, napi_function)) {
163 return false;
164 }
165 if (napi_create_reference(env, value, 1, &result) != napi_ok) {
166 ACCESSTOKEN_LOG_ERROR(LABEL, "cannot get value callback");
167 return false;
168 }
169 return true;
170 }
171 } // namespace AccessToken
172 } // namespace Security
173 } // namespace OHOS
174