• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 
16 #include "napi/native_api.h"
17 #include "napi/native_node_api.h"
18 
19 #include "asset_api.h"
20 #include "asset_napi_common.h"
21 #include "asset_type.h"
22 
23 using namespace OHOS::Security::Asset;
24 
25 namespace {
26 
AddUint32Property(napi_env env,napi_value object,const char * name,uint32_t value)27 void AddUint32Property(napi_env env, napi_value object, const char *name, uint32_t value)
28 {
29     napi_value property = nullptr;
30     NAPI_CALL_RETURN_VOID(env, napi_create_uint32(env, value, &property));
31     NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, object, name, property));
32 }
33 
DeclareTag(napi_env env)34 napi_value DeclareTag(napi_env env)
35 {
36     napi_value tag = nullptr;
37     NAPI_CALL(env, napi_create_object(env, &tag));
38     AddUint32Property(env, tag, "SECRET", ASSET_TAG_SECRET);
39     AddUint32Property(env, tag, "ALIAS", ASSET_TAG_ALIAS);
40     AddUint32Property(env, tag, "ACCESSIBILITY", ASSET_TAG_ACCESSIBILITY);
41     AddUint32Property(env, tag, "REQUIRE_PASSWORD_SET", ASSET_TAG_REQUIRE_PASSWORD_SET);
42     AddUint32Property(env, tag, "AUTH_TYPE", ASSET_TAG_AUTH_TYPE);
43     AddUint32Property(env, tag, "AUTH_VALIDITY_PERIOD", ASSET_TAG_AUTH_VALIDITY_PERIOD);
44     AddUint32Property(env, tag, "AUTH_CHALLENGE", ASSET_TAG_AUTH_CHALLENGE);
45     AddUint32Property(env, tag, "AUTH_TOKEN", ASSET_TAG_AUTH_TOKEN);
46     AddUint32Property(env, tag, "SYNC_TYPE", ASSET_TAG_SYNC_TYPE);
47     AddUint32Property(env, tag, "IS_PERSISTENT", ASSET_TAG_IS_PERSISTENT);
48     AddUint32Property(env, tag, "CONFLICT_RESOLUTION", ASSET_TAG_CONFLICT_RESOLUTION);
49     AddUint32Property(env, tag, "DATA_LABEL_CRITICAL_1", ASSET_TAG_DATA_LABEL_CRITICAL_1);
50     AddUint32Property(env, tag, "DATA_LABEL_CRITICAL_2", ASSET_TAG_DATA_LABEL_CRITICAL_2);
51     AddUint32Property(env, tag, "DATA_LABEL_CRITICAL_3", ASSET_TAG_DATA_LABEL_CRITICAL_3);
52     AddUint32Property(env, tag, "DATA_LABEL_CRITICAL_4", ASSET_TAG_DATA_LABEL_CRITICAL_4);
53     AddUint32Property(env, tag, "DATA_LABEL_NORMAL_1", ASSET_TAG_DATA_LABEL_NORMAL_1);
54     AddUint32Property(env, tag, "DATA_LABEL_NORMAL_2", ASSET_TAG_DATA_LABEL_NORMAL_2);
55     AddUint32Property(env, tag, "DATA_LABEL_NORMAL_3", ASSET_TAG_DATA_LABEL_NORMAL_3);
56     AddUint32Property(env, tag, "DATA_LABEL_NORMAL_4", ASSET_TAG_DATA_LABEL_NORMAL_4);
57     AddUint32Property(env, tag, "RETURN_TYPE", ASSET_TAG_RETURN_TYPE);
58     AddUint32Property(env, tag, "RETURN_LIMIT", ASSET_TAG_RETURN_LIMIT);
59     AddUint32Property(env, tag, "RETURN_OFFSET", ASSET_TAG_RETURN_OFFSET);
60     AddUint32Property(env, tag, "RETURN_ORDERED_BY", ASSET_TAG_RETURN_ORDERED_BY);
61     return tag;
62 }
63 
DeclareTagType(napi_env env)64 napi_value DeclareTagType(napi_env env)
65 {
66     napi_value tagType = nullptr;
67     NAPI_CALL(env, napi_create_object(env, &tagType));
68     AddUint32Property(env, tagType, "BOOL", ASSET_TYPE_BOOL);
69     AddUint32Property(env, tagType, "NUMBER", ASSET_TYPE_NUMBER);
70     AddUint32Property(env, tagType, "BYTES", ASSET_TYPE_BYTES);
71     return tagType;
72 }
73 
DeclareErrorCode(napi_env env)74 napi_value DeclareErrorCode(napi_env env)
75 {
76     napi_value errorCode = nullptr;
77     NAPI_CALL(env, napi_create_object(env, &errorCode));
78     AddUint32Property(env, errorCode, "PERMISSION_DENIED", ASSET_PERMISSION_DENIED);
79     AddUint32Property(env, errorCode, "INVALID_ARGUMENT", ASSET_INVALID_ARGUMENT);
80     AddUint32Property(env, errorCode, "SERVICE_UNAVAILABLE", ASSET_SERVICE_UNAVAILABLE);
81     AddUint32Property(env, errorCode, "NOT_FOUND", ASSET_NOT_FOUND);
82     AddUint32Property(env, errorCode, "DUPLICATED", ASSET_DUPLICATED);
83     AddUint32Property(env, errorCode, "ACCESS_DENIED", ASSET_ACCESS_DENIED);
84     AddUint32Property(env, errorCode, "STATUS_MISMATCH", ASSET_STATUS_MISMATCH);
85     AddUint32Property(env, errorCode, "OUT_OF_MEMORY", ASSET_OUT_OF_MEMORY);
86     AddUint32Property(env, errorCode, "DATA_CORRUPTED", ASSET_DATA_CORRUPTED);
87     AddUint32Property(env, errorCode, "DATABASE_ERROR", ASSET_DATABASE_ERROR);
88     AddUint32Property(env, errorCode, "CRYPTO_ERROR", ASSET_CRYPTO_ERROR);
89     AddUint32Property(env, errorCode, "IPC_ERROR", ASSET_IPC_ERROR);
90     AddUint32Property(env, errorCode, "BMS_ERROR", ASSET_BMS_ERROR);
91     AddUint32Property(env, errorCode, "ACCOUNT_ERROR", ASSET_ACCOUNT_ERROR);
92     AddUint32Property(env, errorCode, "ACCESS_TOKEN_ERROR", ASSET_ACCESS_TOKEN_ERROR);
93     AddUint32Property(env, errorCode, "FILE_OPERATION_ERROR", ASSET_FILE_OPERATION_ERROR);
94     AddUint32Property(env, errorCode, "GET_SYSTEM_TIME_ERROR", ASSET_GET_SYSTEM_TIME_ERROR);
95     AddUint32Property(env, errorCode, "LIMIT_EXCEEDED", ASSET_LIMIT_EXCEEDED);
96     AddUint32Property(env, errorCode, "UNSUPPORTED", ASSET_UNSUPPORTED);
97     return errorCode;
98 }
99 
DeclareAccessibility(napi_env env)100 napi_value DeclareAccessibility(napi_env env)
101 {
102     napi_value accessibility = nullptr;
103     NAPI_CALL(env, napi_create_object(env, &accessibility));
104     AddUint32Property(env, accessibility, "DEVICE_POWERED_ON", ASSET_ACCESSIBILITY_DEVICE_POWERED_ON);
105     AddUint32Property(env, accessibility, "DEVICE_FIRST_UNLOCKED", ASSET_ACCESSIBILITY_DEVICE_FIRST_UNLOCKED);
106     AddUint32Property(env, accessibility, "DEVICE_UNLOCKED", ASSET_ACCESSIBILITY_DEVICE_UNLOCKED);
107     return accessibility;
108 }
109 
DeclareAuthType(napi_env env)110 napi_value DeclareAuthType(napi_env env)
111 {
112     napi_value authType = nullptr;
113     NAPI_CALL(env, napi_create_object(env, &authType));
114     AddUint32Property(env, authType, "NONE", ASSET_AUTH_TYPE_NONE);
115     AddUint32Property(env, authType, "ANY", ASSET_AUTH_TYPE_ANY);
116     return authType;
117 }
118 
DeclareSyncType(napi_env env)119 napi_value DeclareSyncType(napi_env env)
120 {
121     napi_value syncType = nullptr;
122     NAPI_CALL(env, napi_create_object(env, &syncType));
123     AddUint32Property(env, syncType, "NEVER", ASSET_SYNC_TYPE_NEVER);
124     AddUint32Property(env, syncType, "THIS_DEVICE", ASSET_SYNC_TYPE_THIS_DEVICE);
125     AddUint32Property(env, syncType, "TRUSTED_DEVICE", ASSET_SYNC_TYPE_TRUSTED_DEVICE);
126     return syncType;
127 }
128 
DeclareConflictResolution(napi_env env)129 napi_value DeclareConflictResolution(napi_env env)
130 {
131     napi_value conflictResolution = nullptr;
132     NAPI_CALL(env, napi_create_object(env, &conflictResolution));
133     AddUint32Property(env, conflictResolution, "OVERWRITE", ASSET_CONFLICT_OVERWRITE);
134     AddUint32Property(env, conflictResolution, "THROW_ERROR", ASSET_CONFLICT_THROW_ERROR);
135     return conflictResolution;
136 }
137 
DeclareReturnType(napi_env env)138 napi_value DeclareReturnType(napi_env env)
139 {
140     napi_value returnType = nullptr;
141     NAPI_CALL(env, napi_create_object(env, &returnType));
142     AddUint32Property(env, returnType, "ALL", ASSET_RETURN_ALL);
143     AddUint32Property(env, returnType, "ATTRIBUTES", ASSET_RETURN_ATTRIBUTES);
144     return returnType;
145 }
146 
NapiAdd(napi_env env,napi_callback_info info)147 napi_value NapiAdd(napi_env env, napi_callback_info info)
148 {
149     napi_async_execute_callback execute =
150         [](napi_env env, void *data) {
151             AsyncContext *context = static_cast<AsyncContext *>(data);
152             context->result = OH_Asset_Add(&context->attrs[0], context->attrs.size());
153         };
154     return NapiEntry(env, info, __func__, execute);
155 }
156 
NapiRemove(napi_env env,napi_callback_info info)157 napi_value NapiRemove(napi_env env, napi_callback_info info)
158 {
159     napi_async_execute_callback execute =
160         [](napi_env env, void *data) {
161             AsyncContext *context = static_cast<AsyncContext *>(data);
162             context->result = OH_Asset_Remove(&context->attrs[0], context->attrs.size());
163         };
164     return NapiEntry(env, info, __func__, execute);
165 }
166 
NapiUpdate(napi_env env,napi_callback_info info)167 napi_value NapiUpdate(napi_env env, napi_callback_info info)
168 {
169     napi_async_execute_callback execute =
170         [](napi_env env, void *data) {
171             AsyncContext *context = static_cast<AsyncContext *>(data);
172             context->result = OH_Asset_Update(&context->attrs[0], context->attrs.size(),
173                 &context->updateAttrs[0], context->updateAttrs.size());
174         };
175     return NapiEntry(env, info, __func__, execute, UPDATE_ARGS_NUM);
176 }
177 
NapiPreQuery(napi_env env,napi_callback_info info)178 napi_value NapiPreQuery(napi_env env, napi_callback_info info)
179 {
180     napi_async_execute_callback execute =
181         [](napi_env env, void *data) {
182             AsyncContext *context = static_cast<AsyncContext *>(data);
183             context->result = OH_Asset_PreQuery(&context->attrs[0], context->attrs.size(), &context->challenge);
184         };
185     return NapiEntry(env, info, __func__, execute);
186 }
187 
NapiQuery(napi_env env,napi_callback_info info)188 napi_value NapiQuery(napi_env env, napi_callback_info info)
189 {
190     napi_async_execute_callback execute =
191         [](napi_env env, void *data) {
192             AsyncContext *context = static_cast<AsyncContext *>(data);
193             context->result = OH_Asset_Query(&context->attrs[0], context->attrs.size(), &context->resultSet);
194         };
195     return NapiEntry(env, info, __func__, execute);
196 }
197 
NapiPostQuery(napi_env env,napi_callback_info info)198 napi_value NapiPostQuery(napi_env env, napi_callback_info info)
199 {
200     napi_async_execute_callback execute =
201         [](napi_env env, void *data) {
202             AsyncContext *context = static_cast<AsyncContext *>(data);
203             context->result = OH_Asset_PostQuery(&context->attrs[0], context->attrs.size());
204         };
205     return NapiEntry(env, info, __func__, execute);
206 }
207 
Register(napi_env env,napi_value exports)208 napi_value Register(napi_env env, napi_value exports)
209 {
210     napi_property_descriptor desc[] = {
211         // register function
212         DECLARE_NAPI_FUNCTION("add", NapiAdd),
213         DECLARE_NAPI_FUNCTION("remove", NapiRemove),
214         DECLARE_NAPI_FUNCTION("update", NapiUpdate),
215         DECLARE_NAPI_FUNCTION("preQuery", NapiPreQuery),
216         DECLARE_NAPI_FUNCTION("query", NapiQuery),
217         DECLARE_NAPI_FUNCTION("postQuery", NapiPostQuery),
218 
219         // register enumerate
220         DECLARE_NAPI_PROPERTY("Tag", DeclareTag(env)),
221         DECLARE_NAPI_PROPERTY("TagType", DeclareTagType(env)),
222         DECLARE_NAPI_PROPERTY("ErrorCode", DeclareErrorCode(env)),
223         DECLARE_NAPI_PROPERTY("Accessibility", DeclareAccessibility(env)),
224         DECLARE_NAPI_PROPERTY("AuthType", DeclareAuthType(env)),
225         DECLARE_NAPI_PROPERTY("SyncType", DeclareSyncType(env)),
226         DECLARE_NAPI_PROPERTY("ConflictResolution", DeclareConflictResolution(env)),
227         DECLARE_NAPI_PROPERTY("ReturnType", DeclareReturnType(env)),
228     };
229 
230     NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
231     return exports;
232 }
233 
234 napi_module g_module = {
235     .nm_version = 1,
236     .nm_flags = 0,
237     .nm_filename = nullptr,
238     .nm_register_func = Register,
239     .nm_modname = "security.asset",
240     .nm_priv = static_cast<void *>(0),
241     .reserved = { 0 },
242 };
243 
244 } // anonymous namespace
245 
RegisterModule(void)246 extern "C" __attribute__((constructor)) void RegisterModule(void)
247 {
248     napi_module_register(&g_module);
249 }
250