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