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 <cstdint>
17
18#include "napi/native_api.h"
19#include "napi/native_node_api.h"
20
21#include "asset_system_api.h"
22#include "asset_system_type.h"
23
24#include "asset_napi_add.h"
25#include "asset_napi_post_query.h"
26#include "asset_napi_pre_query.h"
27#include "asset_napi_query.h"
28#include "asset_napi_remove.h"
29#include "asset_napi_update.h"
30
31using namespace OHOS::Security::Asset;
32
33namespace {
34
35void AddUint32Property(const napi_env env, napi_value object, const char *name, uint32_t value)
36{
37    napi_value property = nullptr;
38    NAPI_CALL_RETURN_VOID(env, napi_create_uint32(env, value, &property));
39    NAPI_CALL_RETURN_VOID(env, napi_set_named_property(env, object, name, property));
40}
41
42napi_value DeclareTag(const napi_env env)
43{
44    napi_value tag = nullptr;
45    NAPI_CALL(env, napi_create_object(env, &tag));
46    AddUint32Property(env, tag, "SECRET", SEC_ASSET_TAG_SECRET);
47    AddUint32Property(env, tag, "ALIAS", SEC_ASSET_TAG_ALIAS);
48    AddUint32Property(env, tag, "ACCESSIBILITY", SEC_ASSET_TAG_ACCESSIBILITY);
49    AddUint32Property(env, tag, "REQUIRE_PASSWORD_SET", SEC_ASSET_TAG_REQUIRE_PASSWORD_SET);
50    AddUint32Property(env, tag, "AUTH_TYPE", SEC_ASSET_TAG_AUTH_TYPE);
51    AddUint32Property(env, tag, "AUTH_VALIDITY_PERIOD", SEC_ASSET_TAG_AUTH_VALIDITY_PERIOD);
52    AddUint32Property(env, tag, "AUTH_CHALLENGE", SEC_ASSET_TAG_AUTH_CHALLENGE);
53    AddUint32Property(env, tag, "AUTH_TOKEN", SEC_ASSET_TAG_AUTH_TOKEN);
54    AddUint32Property(env, tag, "SYNC_TYPE", SEC_ASSET_TAG_SYNC_TYPE);
55    AddUint32Property(env, tag, "IS_PERSISTENT", SEC_ASSET_TAG_IS_PERSISTENT);
56    AddUint32Property(env, tag, "CONFLICT_RESOLUTION", SEC_ASSET_TAG_CONFLICT_RESOLUTION);
57    AddUint32Property(env, tag, "DATA_LABEL_CRITICAL_1", SEC_ASSET_TAG_DATA_LABEL_CRITICAL_1);
58    AddUint32Property(env, tag, "DATA_LABEL_CRITICAL_2", SEC_ASSET_TAG_DATA_LABEL_CRITICAL_2);
59    AddUint32Property(env, tag, "DATA_LABEL_CRITICAL_3", SEC_ASSET_TAG_DATA_LABEL_CRITICAL_3);
60    AddUint32Property(env, tag, "DATA_LABEL_CRITICAL_4", SEC_ASSET_TAG_DATA_LABEL_CRITICAL_4);
61    AddUint32Property(env, tag, "DATA_LABEL_NORMAL_1", SEC_ASSET_TAG_DATA_LABEL_NORMAL_1);
62    AddUint32Property(env, tag, "DATA_LABEL_NORMAL_2", SEC_ASSET_TAG_DATA_LABEL_NORMAL_2);
63    AddUint32Property(env, tag, "DATA_LABEL_NORMAL_3", SEC_ASSET_TAG_DATA_LABEL_NORMAL_3);
64    AddUint32Property(env, tag, "DATA_LABEL_NORMAL_4", SEC_ASSET_TAG_DATA_LABEL_NORMAL_4);
65    AddUint32Property(env, tag, "DATA_LABEL_NORMAL_LOCAL_1", SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_1);
66    AddUint32Property(env, tag, "DATA_LABEL_NORMAL_LOCAL_2", SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_2);
67    AddUint32Property(env, tag, "DATA_LABEL_NORMAL_LOCAL_3", SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_3);
68    AddUint32Property(env, tag, "DATA_LABEL_NORMAL_LOCAL_4", SEC_ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_4);
69    AddUint32Property(env, tag, "RETURN_TYPE", SEC_ASSET_TAG_RETURN_TYPE);
70    AddUint32Property(env, tag, "RETURN_LIMIT", SEC_ASSET_TAG_RETURN_LIMIT);
71    AddUint32Property(env, tag, "RETURN_OFFSET", SEC_ASSET_TAG_RETURN_OFFSET);
72    AddUint32Property(env, tag, "RETURN_ORDERED_BY", SEC_ASSET_TAG_RETURN_ORDERED_BY);
73    AddUint32Property(env, tag, "UPDATE_TIME", SEC_ASSET_TAG_UPDATE_TIME);
74    AddUint32Property(env, tag, "OPERATION_TYPE", SEC_ASSET_TAG_OPERATION_TYPE);
75    AddUint32Property(env, tag, "REQUIRE_ATTR_ENCRYPTED", SEC_ASSET_TAG_REQUIRE_ATTR_ENCRYPTED);
76    return tag;
77}
78
79napi_value DeclareTagType(const napi_env env)
80{
81    napi_value tagType = nullptr;
82    NAPI_CALL(env, napi_create_object(env, &tagType));
83    AddUint32Property(env, tagType, "BOOL", SEC_ASSET_TYPE_BOOL);
84    AddUint32Property(env, tagType, "NUMBER", SEC_ASSET_TYPE_NUMBER);
85    AddUint32Property(env, tagType, "BYTES", SEC_ASSET_TYPE_BYTES);
86    return tagType;
87}
88
89napi_value DeclareErrorCode(const napi_env env)
90{
91    napi_value errorCode = nullptr;
92    NAPI_CALL(env, napi_create_object(env, &errorCode));
93    AddUint32Property(env, errorCode, "PERMISSION_DENIED", SEC_ASSET_PERMISSION_DENIED);
94    AddUint32Property(env, errorCode, "NOT_SYSTEM_APPLICATION", SEC_ASSET_NOT_SYSTEM_APPLICATION);
95    AddUint32Property(env, errorCode, "INVALID_ARGUMENT", SEC_ASSET_INVALID_ARGUMENT);
96    AddUint32Property(env, errorCode, "SERVICE_UNAVAILABLE", SEC_ASSET_SERVICE_UNAVAILABLE);
97    AddUint32Property(env, errorCode, "NOT_FOUND", SEC_ASSET_NOT_FOUND);
98    AddUint32Property(env, errorCode, "DUPLICATED", SEC_ASSET_DUPLICATED);
99    AddUint32Property(env, errorCode, "ACCESS_DENIED", SEC_ASSET_ACCESS_DENIED);
100    AddUint32Property(env, errorCode, "STATUS_MISMATCH", SEC_ASSET_STATUS_MISMATCH);
101    AddUint32Property(env, errorCode, "OUT_OF_MEMORY", SEC_ASSET_OUT_OF_MEMORY);
102    AddUint32Property(env, errorCode, "DATA_CORRUPTED", SEC_ASSET_DATA_CORRUPTED);
103    AddUint32Property(env, errorCode, "DATABASE_ERROR", SEC_ASSET_DATABASE_ERROR);
104    AddUint32Property(env, errorCode, "CRYPTO_ERROR", SEC_ASSET_CRYPTO_ERROR);
105    AddUint32Property(env, errorCode, "IPC_ERROR", SEC_ASSET_IPC_ERROR);
106    AddUint32Property(env, errorCode, "BMS_ERROR", SEC_ASSET_BMS_ERROR);
107    AddUint32Property(env, errorCode, "ACCOUNT_ERROR", SEC_ASSET_ACCOUNT_ERROR);
108    AddUint32Property(env, errorCode, "ACCESS_TOKEN_ERROR", SEC_ASSET_ACCESS_TOKEN_ERROR);
109    AddUint32Property(env, errorCode, "FILE_OPERATION_ERROR", SEC_ASSET_FILE_OPERATION_ERROR);
110    AddUint32Property(env, errorCode, "GET_SYSTEM_TIME_ERROR", SEC_ASSET_GET_SYSTEM_TIME_ERROR);
111    AddUint32Property(env, errorCode, "LIMIT_EXCEEDED", SEC_ASSET_LIMIT_EXCEEDED);
112    AddUint32Property(env, errorCode, "UNSUPPORTED", SEC_ASSET_UNSUPPORTED);
113    return errorCode;
114}
115
116napi_value DeclareAccessibility(const napi_env env)
117{
118    napi_value accessibility = nullptr;
119    NAPI_CALL(env, napi_create_object(env, &accessibility));
120    AddUint32Property(env, accessibility, "DEVICE_POWERED_ON", SEC_ASSET_ACCESSIBILITY_DEVICE_POWERED_ON);
121    AddUint32Property(env, accessibility, "DEVICE_FIRST_UNLOCKED", SEC_ASSET_ACCESSIBILITY_DEVICE_FIRST_UNLOCKED);
122    AddUint32Property(env, accessibility, "DEVICE_UNLOCKED", SEC_ASSET_ACCESSIBILITY_DEVICE_UNLOCKED);
123    return accessibility;
124}
125
126napi_value DeclareAuthType(const napi_env env)
127{
128    napi_value authType = nullptr;
129    NAPI_CALL(env, napi_create_object(env, &authType));
130    AddUint32Property(env, authType, "NONE", SEC_ASSET_AUTH_TYPE_NONE);
131    AddUint32Property(env, authType, "ANY", SEC_ASSET_AUTH_TYPE_ANY);
132    return authType;
133}
134
135napi_value DeclareSyncType(const napi_env env)
136{
137    napi_value syncType = nullptr;
138    NAPI_CALL(env, napi_create_object(env, &syncType));
139    AddUint32Property(env, syncType, "NEVER", SEC_ASSET_SYNC_TYPE_NEVER);
140    AddUint32Property(env, syncType, "THIS_DEVICE", SEC_ASSET_SYNC_TYPE_THIS_DEVICE);
141    AddUint32Property(env, syncType, "TRUSTED_DEVICE", SEC_ASSET_SYNC_TYPE_TRUSTED_DEVICE);
142    AddUint32Property(env, syncType, "TRUSTED_ACCOUNT", SEC_ASSET_SYNC_TYPE_TRUSTED_ACCOUNT);
143    return syncType;
144}
145
146napi_value DeclareConflictResolution(const napi_env env)
147{
148    napi_value conflictResolution = nullptr;
149    NAPI_CALL(env, napi_create_object(env, &conflictResolution));
150    AddUint32Property(env, conflictResolution, "OVERWRITE", SEC_ASSET_CONFLICT_OVERWRITE);
151    AddUint32Property(env, conflictResolution, "THROW_ERROR", SEC_ASSET_CONFLICT_THROW_ERROR);
152    return conflictResolution;
153}
154
155napi_value DeclareReturnType(const napi_env env)
156{
157    napi_value returnType = nullptr;
158    NAPI_CALL(env, napi_create_object(env, &returnType));
159    AddUint32Property(env, returnType, "ALL", SEC_ASSET_RETURN_ALL);
160    AddUint32Property(env, returnType, "ATTRIBUTES", SEC_ASSET_RETURN_ATTRIBUTES);
161    return returnType;
162}
163
164napi_value DeclareOperationType(const napi_env env)
165{
166    napi_value operationType = nullptr;
167    NAPI_CALL(env, napi_create_object(env, &operationType));
168    AddUint32Property(env, operationType, "NEED_SYNC", SEC_ASSET_NEED_SYNC);
169    AddUint32Property(env, operationType, "NEED_LOGOUT", SEC_ASSET_NEED_LOGOUT);
170    AddUint32Property(env, operationType, "NEED_DELETE_CLOUD_DATA", SEC_ASSET_NEED_DELETE_CLOUD_DATA);
171    return operationType;
172}
173
174napi_value Register(const napi_env env, napi_value exports)
175{
176    napi_property_descriptor desc[] = {
177        // register function
178        DECLARE_NAPI_FUNCTION("add", NapiAdd),
179        DECLARE_NAPI_FUNCTION("addSync", NapiAddSync),
180        DECLARE_NAPI_FUNCTION("addAsUser", NapiAddAsUser),
181        DECLARE_NAPI_FUNCTION("remove", NapiRemove),
182        DECLARE_NAPI_FUNCTION("removeSync", NapiRemoveSync),
183        DECLARE_NAPI_FUNCTION("removeAsUser", NapiRemoveAsUser),
184        DECLARE_NAPI_FUNCTION("update", NapiUpdate),
185        DECLARE_NAPI_FUNCTION("updateSync", NapiUpdateSync),
186        DECLARE_NAPI_FUNCTION("updateAsUser", NapiUpdateAsUser),
187        DECLARE_NAPI_FUNCTION("preQuery", NapiPreQuery),
188        DECLARE_NAPI_FUNCTION("preQuerySync", NapiPreQuerySync),
189        DECLARE_NAPI_FUNCTION("preQueryAsUser", NapiPreQueryAsUser),
190        DECLARE_NAPI_FUNCTION("query", NapiQuery),
191        DECLARE_NAPI_FUNCTION("querySync", NapiQuerySync),
192        DECLARE_NAPI_FUNCTION("queryAsUser", NapiQueryAsUser),
193        DECLARE_NAPI_FUNCTION("postQuery", NapiPostQuery),
194        DECLARE_NAPI_FUNCTION("postQuerySync", NapiPostQuerySync),
195        DECLARE_NAPI_FUNCTION("postQueryAsUser", NapiPostQueryAsUser),
196
197        // register enumerate
198        DECLARE_NAPI_PROPERTY("Tag", DeclareTag(env)),
199        DECLARE_NAPI_PROPERTY("TagType", DeclareTagType(env)),
200        DECLARE_NAPI_PROPERTY("ErrorCode", DeclareErrorCode(env)),
201        DECLARE_NAPI_PROPERTY("Accessibility", DeclareAccessibility(env)),
202        DECLARE_NAPI_PROPERTY("AuthType", DeclareAuthType(env)),
203        DECLARE_NAPI_PROPERTY("SyncType", DeclareSyncType(env)),
204        DECLARE_NAPI_PROPERTY("ConflictResolution", DeclareConflictResolution(env)),
205        DECLARE_NAPI_PROPERTY("ReturnType", DeclareReturnType(env)),
206        DECLARE_NAPI_PROPERTY("OperationType", DeclareOperationType(env)),
207    };
208
209    NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
210    return exports;
211}
212
213napi_module g_module = {
214    .nm_version = 1,
215    .nm_flags = 0,
216    .nm_filename = nullptr,
217    .nm_register_func = Register,
218    .nm_modname = "security.asset",
219    .nm_priv = static_cast<void *>(0),
220    .reserved = { 0 },
221};
222
223} // anonymous namespace
224
225extern "C" __attribute__((constructor)) void RegisterModule(void)
226{
227    napi_module_register(&g_module);
228}
229