1/*
2 * Copyright (c) 2021-2024 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 <cstdio>
17#include <string>
18
19#include "napi/native_api.h"
20#include "napi/native_node_api.h"
21#include "parameter.h"
22#include "sysversion.h"
23#ifdef DEPENDENT_APPEXECFWK_BASE
24#include "bundlemgr/bundle_mgr_proxy.h"
25#endif
26#include "iservice_registry.h"
27#include "if_system_ability_manager.h"
28#include "system_ability_definition.h"
29#include "beget_ext.h"
30#include "init_error.h"
31#include "securec.h"
32
33#ifndef DEVICEINFO_JS_DOMAIN
34#define DEVICEINFO_JS_DOMAIN (BASE_DOMAIN + 8)
35#endif
36
37#ifndef DINFO_TAG
38#define DINFO_TAG "DEVICEINFO_JS"
39#endif
40
41#define DEVINFO_LOGV(fmt, ...) STARTUP_LOGV(DEVICEINFO_JS_DOMAIN, DINFO_TAG, fmt, ##__VA_ARGS__)
42#define DEVINFO_LOGI(fmt, ...) STARTUP_LOGI(DEVICEINFO_JS_DOMAIN, DINFO_TAG, fmt, ##__VA_ARGS__)
43#define DEVINFO_LOGW(fmt, ...) STARTUP_LOGW(DEVICEINFO_JS_DOMAIN, DINFO_TAG, fmt, ##__VA_ARGS__)
44#define DEVINFO_LOGE(fmt, ...) STARTUP_LOGE(DEVICEINFO_JS_DOMAIN, DINFO_TAG, fmt, ##__VA_ARGS__)
45
46const int UDID_LEN = 65;
47const int ODID_LEN = 37;
48
49typedef enum {
50    DEV_INFO_OK,
51    DEV_INFO_ENULLPTR,
52    DEV_INFO_EGETODID,
53    DEV_INFO_ESTRCOPY
54} DevInfoError;
55
56static napi_value GetDeviceType(napi_env env, napi_callback_info info)
57{
58    napi_value deviceType = nullptr;
59    const char *value = GetDeviceType();
60    if (value == nullptr) {
61        value = "";
62    }
63
64    NAPI_CALL(env, napi_create_string_utf8(env, value, strlen(value), &deviceType));
65    return deviceType;
66}
67
68static napi_value GetManufacture(napi_env env, napi_callback_info info)
69{
70    napi_value napiValue = nullptr;
71    const char *manfactureName = GetManufacture();
72    if (manfactureName == nullptr) {
73        manfactureName = "";
74    }
75
76    NAPI_CALL(env, napi_create_string_utf8(env, manfactureName, strlen(manfactureName), &napiValue));
77    return napiValue;
78}
79
80static napi_value GetBrand(napi_env env, napi_callback_info info)
81{
82    napi_value napiValue = nullptr;
83    const char *productBrand = GetBrand();
84    if (productBrand == nullptr) {
85        productBrand = "";
86    }
87
88    NAPI_CALL(env, napi_create_string_utf8(env, productBrand, strlen(productBrand), &napiValue));
89    return napiValue;
90}
91
92static napi_value GetMarketName(napi_env env, napi_callback_info info)
93{
94    napi_value napiValue = nullptr;
95    const char *marketName = GetMarketName();
96    if (marketName == nullptr) {
97        marketName = "";
98    }
99
100    NAPI_CALL(env, napi_create_string_utf8(env, marketName, strlen(marketName), &napiValue));
101    return napiValue;
102}
103
104static napi_value GetProductSeries(napi_env env, napi_callback_info info)
105{
106    napi_value napiValue = nullptr;
107    const char *productSeries = GetProductSeries();
108    if (productSeries == nullptr) {
109        productSeries = "";
110    }
111
112    NAPI_CALL(env, napi_create_string_utf8(env, productSeries, strlen(productSeries), &napiValue));
113    return napiValue;
114}
115
116static napi_value GetProductModel(napi_env env, napi_callback_info info)
117{
118    napi_value napiValue = nullptr;
119    const char *productModel = GetProductModel();
120    if (productModel == nullptr) {
121        productModel = "";
122    }
123
124    NAPI_CALL(env, napi_create_string_utf8(env, productModel, strlen(productModel), &napiValue));
125    return napiValue;
126}
127
128static napi_value GetSoftwareModel(napi_env env, napi_callback_info info)
129{
130    napi_value napiValue = nullptr;
131    const char *softwareModel = GetSoftwareModel();
132    if (softwareModel == nullptr) {
133        softwareModel = "";
134    }
135
136    NAPI_CALL(env, napi_create_string_utf8(env, softwareModel, strlen(softwareModel), &napiValue));
137    return napiValue;
138}
139
140static napi_value GetHardwareModel(napi_env env, napi_callback_info info)
141{
142    napi_value napiValue = nullptr;
143    const char *hardwareModel = GetHardwareModel();
144    if (hardwareModel == nullptr) {
145        hardwareModel = "";
146    }
147
148    NAPI_CALL(env, napi_create_string_utf8(env, hardwareModel, strlen(hardwareModel), &napiValue));
149    return napiValue;
150}
151
152static napi_value GetHardwareProfile(napi_env env, napi_callback_info info)
153{
154    napi_value napiValue = nullptr;
155    const char *hardwareProfile = GetHardwareProfile();
156    if (hardwareProfile == nullptr) {
157        hardwareProfile = "";
158    }
159
160    NAPI_CALL(env, napi_create_string_utf8(env, hardwareProfile, strlen(hardwareProfile), &napiValue));
161    return napiValue;
162}
163
164static napi_value GetSerial(napi_env env, napi_callback_info info)
165{
166    napi_value napiValue = nullptr;
167    const char *serialNumber = AclGetSerial();
168    if (serialNumber == nullptr) {
169        serialNumber = "";
170    }
171
172    NAPI_CALL(env, napi_create_string_utf8(env, serialNumber, strlen(serialNumber), &napiValue));
173    return napiValue;
174}
175
176static napi_value GetBootloaderVersion(napi_env env, napi_callback_info info)
177{
178    napi_value napiValue = nullptr;
179    const char *bootloaderVersion = GetBootloaderVersion();
180    if (bootloaderVersion == nullptr) {
181        bootloaderVersion = "";
182    }
183
184    NAPI_CALL(env, napi_create_string_utf8(env, bootloaderVersion, strlen(bootloaderVersion), &napiValue));
185    return napiValue;
186}
187
188static napi_value GetAbiList(napi_env env, napi_callback_info info)
189{
190    napi_value napiValue = nullptr;
191    const char *abiList = GetAbiList();
192    if (abiList == nullptr) {
193        abiList = "";
194    }
195
196    NAPI_CALL(env, napi_create_string_utf8(env, abiList, strlen(abiList), &napiValue));
197    return napiValue;
198}
199
200static napi_value GetSecurityPatchTag(napi_env env, napi_callback_info info)
201{
202    napi_value napiValue = nullptr;
203    const char *securityPatchTag = GetSecurityPatchTag();
204    if (securityPatchTag == nullptr) {
205        securityPatchTag = "";
206    }
207
208    NAPI_CALL(env, napi_create_string_utf8(env, securityPatchTag, strlen(securityPatchTag), &napiValue));
209    return napiValue;
210}
211
212static napi_value GetDisplayVersion(napi_env env, napi_callback_info info)
213{
214    napi_value napiValue = nullptr;
215    const char *productVersion = GetDisplayVersion();
216    if (productVersion == nullptr) {
217        productVersion = "";
218    }
219
220    NAPI_CALL(env, napi_create_string_utf8(env, productVersion, strlen(productVersion), &napiValue));
221    return napiValue;
222}
223
224static napi_value GetIncrementalVersion(napi_env env, napi_callback_info info)
225{
226    napi_value napiValue = nullptr;
227    const char *incrementalVersion = GetIncrementalVersion();
228    if (incrementalVersion == nullptr) {
229        incrementalVersion = "";
230    }
231
232    NAPI_CALL(env, napi_create_string_utf8(env, incrementalVersion, strlen(incrementalVersion), &napiValue));
233    return napiValue;
234}
235
236static napi_value GetOsReleaseType(napi_env env, napi_callback_info info)
237{
238    napi_value napiValue = nullptr;
239    const char *osReleaseType = GetOsReleaseType();
240    if (osReleaseType == nullptr) {
241        osReleaseType = "";
242    }
243
244    NAPI_CALL(env, napi_create_string_utf8(env, osReleaseType, strlen(osReleaseType), &napiValue));
245    return napiValue;
246}
247
248static napi_value GetOSFullName(napi_env env, napi_callback_info info)
249{
250    napi_value napiValue = nullptr;
251    const char *osVersion = GetOSFullName();
252    if (osVersion == nullptr) {
253        osVersion = "";
254    }
255
256    NAPI_CALL(env, napi_create_string_utf8(env, osVersion, strlen(osVersion), &napiValue));
257    return napiValue;
258}
259
260static napi_value GetMajorVersion(napi_env env, napi_callback_info info)
261{
262    napi_value napiValue = nullptr;
263    int majorVersion = GetMajorVersion();
264
265    NAPI_CALL(env, napi_create_int32(env, majorVersion, &napiValue));
266    return napiValue;
267}
268
269static napi_value GetSeniorVersion(napi_env env, napi_callback_info info)
270{
271    napi_value napiValue = nullptr;
272    int seniorVersion = GetSeniorVersion();
273
274    NAPI_CALL(env, napi_create_int32(env, seniorVersion, &napiValue));
275    return napiValue;
276}
277
278static napi_value GetFeatureVersion(napi_env env, napi_callback_info info)
279{
280    napi_value napiValue = nullptr;
281    int featureVersion = GetFeatureVersion();
282
283    NAPI_CALL(env, napi_create_int32(env, featureVersion, &napiValue));
284    return napiValue;
285}
286
287static napi_value GetBuildVersion(napi_env env, napi_callback_info info)
288{
289    napi_value napiValue = nullptr;
290    int buildVersion = GetBuildVersion();
291
292    NAPI_CALL(env, napi_create_int32(env, buildVersion, &napiValue));
293    return napiValue;
294}
295
296static napi_value GetSdkApiVersion(napi_env env, napi_callback_info info)
297{
298    napi_value napiValue = nullptr;
299    int sdkApiVersion = GetSdkApiVersion();
300
301    NAPI_CALL(env, napi_create_int32(env, sdkApiVersion, &napiValue));
302    return napiValue;
303}
304
305static napi_value GetFirstApiVersion(napi_env env, napi_callback_info info)
306{
307    napi_value napiValue = nullptr;
308    int firstApiVersion = GetFirstApiVersion();
309
310    NAPI_CALL(env, napi_create_int32(env, firstApiVersion, &napiValue));
311    return napiValue;
312}
313
314static napi_value GetVersionId(napi_env env, napi_callback_info info)
315{
316    napi_value napiValue = nullptr;
317    const char *versionId = GetVersionId();
318    if (versionId == nullptr) {
319        versionId = "";
320    }
321
322    NAPI_CALL(env, napi_create_string_utf8(env, versionId, strlen(versionId), &napiValue));
323    return napiValue;
324}
325
326static napi_value GetBuildType(napi_env env, napi_callback_info info)
327{
328    napi_value napiValue = nullptr;
329    const char *buildType = GetBuildType();
330    if (buildType == nullptr) {
331        buildType = "";
332    }
333
334    NAPI_CALL(env, napi_create_string_utf8(env, buildType, strlen(buildType), &napiValue));
335    return napiValue;
336}
337
338static napi_value GetBuildUser(napi_env env, napi_callback_info info)
339{
340    napi_value napiValue = nullptr;
341    const char *buildUser = GetBuildUser();
342    if (buildUser == nullptr) {
343        buildUser = "";
344    }
345
346    NAPI_CALL(env, napi_create_string_utf8(env, buildUser, strlen(buildUser), &napiValue));
347    return napiValue;
348}
349
350static napi_value GetBuildHost(napi_env env, napi_callback_info info)
351{
352    napi_value napiValue = nullptr;
353    const char *buildHost = GetBuildHost();
354    if (buildHost == nullptr) {
355        buildHost = "";
356    }
357
358    NAPI_CALL(env, napi_create_string_utf8(env, buildHost, strlen(buildHost), &napiValue));
359    return napiValue;
360}
361
362static napi_value GetBuildTime(napi_env env, napi_callback_info info)
363{
364    napi_value napiValue = nullptr;
365    const char *buildTime = GetBuildTime();
366    if (buildTime == nullptr) {
367        buildTime = "";
368    }
369
370    NAPI_CALL(env, napi_create_string_utf8(env, buildTime, strlen(buildTime), &napiValue));
371    return napiValue;
372}
373
374static napi_value GetBuildRootHash(napi_env env, napi_callback_info info)
375{
376    napi_value napiValue = nullptr;
377    const char *buildRootHash = GetBuildRootHash();
378    if (buildRootHash == nullptr) {
379        buildRootHash = "";
380    }
381
382    NAPI_CALL(env, napi_create_string_utf8(env, buildRootHash, strlen(buildRootHash), &napiValue));
383    return napiValue;
384}
385
386static napi_value GetDevUdid(napi_env env, napi_callback_info info)
387{
388    napi_value napiValue = nullptr;
389    char localDeviceId[UDID_LEN] = {0};
390    AclGetDevUdid(localDeviceId, UDID_LEN);
391
392    NAPI_CALL(env, napi_create_string_utf8(env, localDeviceId, strlen(localDeviceId), &napiValue));
393    return napiValue;
394}
395
396static napi_value NAPI_GetDistributionOSName(napi_env env, napi_callback_info info)
397{
398    napi_value napiValue = nullptr;
399    const char *val = GetDistributionOSName();
400
401    NAPI_CALL(env, napi_create_string_utf8(env, val, strlen(val), &napiValue));
402    return napiValue;
403}
404
405static napi_value NAPI_GetDistributionOSVersion(napi_env env, napi_callback_info info)
406{
407    napi_value napiValue = nullptr;
408    const char *val = GetDistributionOSVersion();
409
410    NAPI_CALL(env, napi_create_string_utf8(env, val, strlen(val), &napiValue));
411    return napiValue;
412}
413
414static napi_value NAPI_GetDistributionOSApiVersion(napi_env env, napi_callback_info info)
415{
416    napi_value napiValue = nullptr;
417    int sdkApiVersion = GetDistributionOSApiVersion();
418
419    NAPI_CALL(env, napi_create_int32(env, sdkApiVersion, &napiValue));
420    return napiValue;
421}
422
423static napi_value NAPI_GetDistributionOSApiName(napi_env env, napi_callback_info info)
424{
425    napi_value napiValue = nullptr;
426    const char *val = GetDistributionOSApiName();
427
428    NAPI_CALL(env, napi_create_string_utf8(env, val, strlen(val), &napiValue));
429    return napiValue;
430}
431
432static napi_value NAPI_GetDistributionOSReleaseType(napi_env env, napi_callback_info info)
433{
434    napi_value napiValue = nullptr;
435    const char *val = GetDistributionOSReleaseType();
436
437    NAPI_CALL(env, napi_create_string_utf8(env, val, strlen(val), &napiValue));
438    return napiValue;
439}
440
441static DevInfoError AclGetDevOdid(char *odid, int size)
442{
443    DevInfoError ret = DEV_INFO_OK;
444    if (odid[0] != '\0') {
445        return DEV_INFO_OK;
446    }
447    auto systemAbilityManager = OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
448    if (!systemAbilityManager) {
449        return DEV_INFO_ENULLPTR;
450    }
451
452    auto remoteObject = systemAbilityManager->GetSystemAbility(OHOS::BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
453    if (!remoteObject) {
454        return DEV_INFO_ENULLPTR;
455    }
456
457#ifdef DEPENDENT_APPEXECFWK_BASE
458    auto bundleMgrProxy = OHOS::iface_cast<OHOS::AppExecFwk::BundleMgrProxy>(remoteObject);
459    if (!bundleMgrProxy) {
460        return DEV_INFO_ENULLPTR;
461    }
462
463    std::string odidStr;
464    if (bundleMgrProxy->GetOdid(odidStr) != 0) {
465        return DEV_INFO_EGETODID;
466    }
467
468    if (strcpy_s(odid, size, odidStr.c_str()) != EOK) {
469        return DEV_INFO_ESTRCOPY;
470    }
471#else
472    DEVINFO_LOGE("DEPENDENT_APPEXECFWK_BASE does not exist, The ODID could not be obtained");
473    ret = DEV_INFO_EGETODID;
474#endif
475
476    return ret;
477}
478
479static napi_value GetDevOdid(napi_env env, napi_callback_info info)
480{
481    napi_value napiValue = nullptr;
482    static char odid[ODID_LEN] = {0};
483    DevInfoError ret = AclGetDevOdid(odid, ODID_LEN);
484    if (ret != DEV_INFO_OK) {
485        DEVINFO_LOGE("GetDevOdid ret:%d", ret);
486    }
487
488    NAPI_CALL(env, napi_create_string_utf8(env, odid, strlen(odid), &napiValue));
489    return napiValue;
490}
491
492EXTERN_C_START
493/*
494 * Module init
495 */
496static napi_value Init(napi_env env, napi_value exports)
497{
498    /*
499     * Attribute definition
500     */
501    napi_property_descriptor desc[] = {
502        {"deviceType", nullptr, nullptr, GetDeviceType, nullptr, nullptr, napi_default, nullptr},
503        {"manufacture", nullptr, nullptr, GetManufacture, nullptr, nullptr, napi_default, nullptr},
504        {"brand", nullptr, nullptr, GetBrand, nullptr, nullptr, napi_default, nullptr},
505        {"marketName", nullptr, nullptr, GetMarketName, nullptr, nullptr, napi_default, nullptr},
506        {"productSeries", nullptr, nullptr, GetProductSeries, nullptr, nullptr, napi_default, nullptr},
507        {"productModel", nullptr, nullptr, GetProductModel, nullptr, nullptr, napi_default, nullptr},
508        {"softwareModel", nullptr, nullptr, GetSoftwareModel, nullptr, nullptr, napi_default, nullptr},
509        {"hardwareModel", nullptr, nullptr, GetHardwareModel, nullptr, nullptr, napi_default, nullptr},
510        {"hardwareProfile", nullptr, nullptr, GetHardwareProfile, nullptr, nullptr, napi_default, nullptr},
511        {"serial", nullptr, nullptr, GetSerial, nullptr, nullptr, napi_default, nullptr},
512        {"bootloaderVersion", nullptr, nullptr, GetBootloaderVersion, nullptr, nullptr, napi_default, nullptr},
513        {"abiList", nullptr, nullptr, GetAbiList, nullptr, nullptr, napi_default, nullptr},
514        {"securityPatchTag", nullptr, nullptr, GetSecurityPatchTag, nullptr, nullptr, napi_default, nullptr},
515        {"displayVersion", nullptr, nullptr, GetDisplayVersion, nullptr, nullptr, napi_default, nullptr},
516        {"incrementalVersion", nullptr, nullptr, GetIncrementalVersion, nullptr, nullptr, napi_default, nullptr},
517        {"osReleaseType", nullptr, nullptr, GetOsReleaseType, nullptr, nullptr, napi_default, nullptr},
518        {"osFullName", nullptr, nullptr, GetOSFullName, nullptr, nullptr, napi_default, nullptr},
519        {"majorVersion", nullptr, nullptr, GetMajorVersion, nullptr, nullptr, napi_default, nullptr},
520        {"seniorVersion", nullptr, nullptr, GetSeniorVersion, nullptr, nullptr, napi_default, nullptr},
521        {"featureVersion", nullptr, nullptr, GetFeatureVersion, nullptr, nullptr, napi_default, nullptr},
522        {"buildVersion", nullptr, nullptr, GetBuildVersion, nullptr, nullptr, napi_default, nullptr},
523        {"sdkApiVersion", nullptr, nullptr, GetSdkApiVersion, nullptr, nullptr, napi_default, nullptr},
524        {"firstApiVersion", nullptr, nullptr, GetFirstApiVersion, nullptr, nullptr, napi_default, nullptr},
525        {"versionId", nullptr, nullptr, GetVersionId, nullptr, nullptr, napi_default, nullptr},
526        {"buildType", nullptr, nullptr, GetBuildType, nullptr, nullptr, napi_default, nullptr},
527        {"buildUser", nullptr, nullptr, GetBuildUser, nullptr, nullptr, napi_default, nullptr},
528        {"buildHost", nullptr, nullptr, GetBuildHost, nullptr, nullptr, napi_default, nullptr},
529        {"buildTime", nullptr, nullptr, GetBuildTime, nullptr, nullptr, napi_default, nullptr},
530        {"buildRootHash", nullptr, nullptr, GetBuildRootHash, nullptr, nullptr, napi_default, nullptr},
531        {"udid", nullptr, nullptr, GetDevUdid, nullptr, nullptr, napi_default, nullptr},
532        {"distributionOSName", nullptr, nullptr, NAPI_GetDistributionOSName, nullptr, nullptr, napi_default, nullptr},
533        {"distributionOSVersion", nullptr, nullptr, NAPI_GetDistributionOSVersion, nullptr, nullptr, napi_default, nullptr},
534        {"distributionOSApiVersion", nullptr, nullptr, NAPI_GetDistributionOSApiVersion, nullptr, nullptr, napi_default, nullptr},
535        {"distributionOSApiName", nullptr, nullptr, NAPI_GetDistributionOSApiName, nullptr, nullptr, napi_default, nullptr},
536        {"distributionOSReleaseType", nullptr, nullptr, NAPI_GetDistributionOSReleaseType, nullptr, nullptr, napi_default, nullptr},
537        {"ODID", nullptr, nullptr, GetDevOdid, nullptr, nullptr, napi_default, nullptr},
538    };
539    NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(napi_property_descriptor), desc));
540
541    return exports;
542}
543EXTERN_C_END
544
545/*
546 * Module definition
547 */
548static napi_module _module = {
549    .nm_version = 1,
550    .nm_flags = 0,
551    .nm_filename = NULL,
552    .nm_register_func = Init,
553    .nm_modname = "deviceInfo",
554    .nm_priv = ((void *)0),
555    .reserved = { 0 }
556};
557/*
558 * Module registration function
559 */
560extern "C" __attribute__((constructor)) void RegisterModule(void)
561{
562    napi_module_register(&_module);
563}
564