• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2025 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 <unordered_map>
17 
18 #include "installer.h"
19 
20 #include "appexecfwk_errors.h"
21 #include "app_log_wrapper.h"
22 #include "bundle_errors.h"
23 #include "bundle_death_recipient.h"
24 #include "bundle_mgr_interface.h"
25 #include "bundle_mgr_proxy.h"
26 #include "business_error.h"
27 #include "common_func.h"
28 #include "if_system_ability_manager.h"
29 #include "installer_callback.h"
30 #include "napi_arg.h"
31 #include "napi_constants.h"
32 #include "system_ability_definition.h"
33 #include "ipc_skeleton.h"
34 
35 namespace OHOS {
36 namespace AppExecFwk {
37 namespace {
38 // resource name
39 const char* RESOURCE_NAME_OF_GET_BUNDLE_INSTALLER = "GetBundleInstaller";
40 const char* RESOURCE_NAME_OF_GET_BUNDLE_INSTALLER_SYNC = "GetBundleInstallerSync";
41 const char* RESOURCE_NAME_OF_INSTALL = "Install";
42 const char* RESOURCE_NAME_OF_UNINSTALL = "Uninstall";
43 const char* RESOURCE_NAME_OF_RECOVER = "Recover";
44 const char* RESOURCE_NAME_OF_UPDATE_BUNDLE_FOR_SELF = "UpdateBundleForSelf";
45 const char* RESOURCE_NAME_OF_UNINSTALL_AND_RECOVER = "UninstallAndRecover";
46 const char* EMPTY_STRING = "";
47 // install message
48 constexpr const char* INSTALL_PERMISSION =
49     "ohos.permission.INSTALL_BUNDLE or "
50     "ohos.permission.INSTALL_ENTERPRISE_BUNDLE or "
51     "ohos.permission.INSTALL_ENTERPRISE_MDM_BUNDLE or "
52     "ohos.permission.INSTALL_ENTERPRISE_NORMAL_BUNDLE or "
53     "ohos.permission.INSTALL_INTERNALTESTING_BUNDLE";
54 constexpr const char* UNINSTALL_PERMISSION = "ohos.permission.INSTALL_BUNDLE or ohos.permission.UNINSTALL_BUNDLE";
55 constexpr const char* RECOVER_PERMISSION = "ohos.permission.INSTALL_BUNDLE or ohos.permission.RECOVER_BUNDLE";
56 constexpr const char* INSTALL_SELF_PERMISSION = "ohos.permission.INSTALL_SELF_BUNDLE";
57 constexpr const char* PARAMETERS = "parameters";
58 constexpr const char* CORRESPONDING_TYPE = "corresponding type";
59 constexpr const char* FUNCTION_TYPE = "napi_function";
60 constexpr const char* CALLBACK = "callback";
61 // property name
62 const char* USER_ID = "userId";
63 const char* INSTALL_FLAG = "installFlag";
64 const char* IS_KEEP_DATA = "isKeepData";
65 const char* CROWD_TEST_DEADLINE = "crowdtestDeadline";
66 const char* MODULE_NAME = "moduleName";
67 const char* HASH_VALUE = "hashValue";
68 const char* HASH_PARAMS = "hashParams";
69 const char* BUNDLE_NAME = "bundleName";
70 const char* APP_INDEX = "appIndex";
71 const char* FILE_PATH = "filePath";
72 const char* ADD_EXT_RESOURCE = "AddExtResource";
73 const char* REMOVE_EXT_RESOURCE = "RemoveExtResource";
74 const char* VERSION_CODE = "versionCode";
75 const char* SHARED_BUNDLE_DIR_PATHS = "sharedBundleDirPaths";
76 const char* SPECIFIED_DISTRIBUTION_TYPE = "specifiedDistributionType";
77 const char* ADDITIONAL_INFO = "additionalInfo";
78 const char* VERIFY_CODE_PARAM = "verifyCodeParams";
79 const char* SIGNATURE_FILE_PATH = "signatureFilePath";
80 const char* PGO_PARAM = "pgoParams";
81 const char* PGO_FILE_PATH = "pgoFilePath";
82 const char* KEY = "key";
83 const char* VALUE = "value";
84 const char* HAPS_FILE_NEEDED =
85     "BusinessError 401: Parameter error. parameter hapFiles is needed for code signature";
86 const char* CREATE_APP_CLONE = "CreateAppClone";
87 const char* DESTROY_APP_CLONE = "destroyAppClone";
88 const char* INSTALL_PREEXISTING_APP = "installPreexistingApp";
89 const char* INSTALL_PLUGIN = "InstallPlugin";
90 const char* UNINSTALL_PLUGIN = "UninstallPlugin";
91 const char* PLUGIN_BUNDLE_NAME = "pluginBundleName";
92 constexpr int32_t FIRST_PARAM = 0;
93 constexpr int32_t SECOND_PARAM = 1;
94 
95 constexpr int32_t SPECIFIED_DISTRIBUTION_TYPE_MAX_SIZE = 128;
96 constexpr int32_t ADDITIONAL_INFO_MAX_SIZE = 3000;
97 constexpr int32_t ILLEGAL_APP_INDEX = -1;
98 } // namespace
99 napi_ref thread_local g_classBundleInstaller;
100 bool g_isSystemApp = false;
101 
~AsyncInstallCallbackInfo()102 AsyncInstallCallbackInfo::~AsyncInstallCallbackInfo()
103 {
104     if (callback) {
105         napi_delete_reference(env, callback);
106         callback = nullptr;
107     }
108     if (asyncWork) {
109         napi_delete_async_work(env, asyncWork);
110         asyncWork = nullptr;
111     }
112 }
113 
~AsyncGetBundleInstallerCallbackInfo()114 AsyncGetBundleInstallerCallbackInfo::~AsyncGetBundleInstallerCallbackInfo()
115 {
116     if (callback) {
117         napi_delete_reference(env, callback);
118         callback = nullptr;
119     }
120     if (asyncWork) {
121         napi_delete_async_work(env, asyncWork);
122         asyncWork = nullptr;
123     }
124 }
125 
GetBundleInstallerCompleted(napi_env env,napi_status status,void * data)126 void GetBundleInstallerCompleted(napi_env env, napi_status status, void *data)
127 {
128     AsyncGetBundleInstallerCallbackInfo *asyncCallbackInfo =
129         reinterpret_cast<AsyncGetBundleInstallerCallbackInfo *>(data);
130     std::unique_ptr<AsyncGetBundleInstallerCallbackInfo> callbackPtr {asyncCallbackInfo};
131 
132     napi_value m_classBundleInstaller = nullptr;
133     NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, g_classBundleInstaller,
134         &m_classBundleInstaller));
135     napi_value result[CALLBACK_PARAM_SIZE] = {0};
136     auto iBundleMgr = CommonFunc::GetBundleMgr();
137     if (iBundleMgr == nullptr) {
138         APP_LOGE("can not get iBundleMgr");
139         return;
140     }
141     if (!g_isSystemApp && !iBundleMgr->VerifySystemApi(Constants::INVALID_API_VERSION)) {
142         APP_LOGE("non-system app calling system api");
143         result[0] = BusinessError::CreateCommonError(
144             env, ERROR_NOT_SYSTEM_APP, RESOURCE_NAME_OF_GET_BUNDLE_INSTALLER, INSTALL_PERMISSION);
145         if (callbackPtr->deferred) {
146             NAPI_CALL_RETURN_VOID(env, napi_reject_deferred(env, asyncCallbackInfo->deferred, result[0]));
147         } else {
148             napi_value callback = nullptr;
149             napi_value placeHolder = nullptr;
150             NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, asyncCallbackInfo->callback, &callback));
151             NAPI_CALL_RETURN_VOID(env, napi_call_function(env, nullptr, callback,
152                 sizeof(result) / sizeof(result[0]), result, &placeHolder));
153         }
154         return;
155     }
156     g_isSystemApp = true;
157     NAPI_CALL_RETURN_VOID(env, napi_new_instance(env, m_classBundleInstaller, 0, nullptr, &result[SECOND_PARAM]));
158 
159     if (callbackPtr->deferred) {
160         NAPI_CALL_RETURN_VOID(env, napi_resolve_deferred(env, callbackPtr->deferred, result[SECOND_PARAM]));
161     } else {
162         napi_value callback = CommonFunc::WrapVoidToJS(env);
163         NAPI_CALL_RETURN_VOID(env, napi_get_reference_value(env, callbackPtr->callback, &callback));
164         napi_value undefined = CommonFunc::WrapVoidToJS(env);
165         NAPI_CALL_RETURN_VOID(env, napi_get_undefined(env, &undefined));
166         napi_value callResult = CommonFunc::WrapVoidToJS(env);
167         NAPI_CALL_RETURN_VOID(env, napi_call_function(env, undefined, callback, CALLBACK_PARAM_SIZE,
168             &result[FIRST_PARAM], &callResult));
169     }
170 }
171 
172 /**
173  * Promise and async callback
174  */
GetBundleInstaller(napi_env env,napi_callback_info info)175 napi_value GetBundleInstaller(napi_env env, napi_callback_info info)
176 {
177     APP_LOGI_NOFUNC("napi GetBundleInstaller called");
178     NapiArg args(env, info);
179     if (!args.Init(FIRST_PARAM, SECOND_PARAM)) {
180         APP_LOGE("GetBundleInstaller args init failed");
181         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
182         return nullptr;
183     }
184     std::unique_ptr<AsyncGetBundleInstallerCallbackInfo> callbackPtr =
185         std::make_unique<AsyncGetBundleInstallerCallbackInfo>(env);
186 
187     auto argc = args.GetMaxArgc();
188     APP_LOGD("GetBundleInstaller argc = [%{public}zu]", argc);
189     // check param
190     if (argc == SECOND_PARAM) {
191         napi_value arg = args.GetArgv(argc - SECOND_PARAM);
192         if (arg == nullptr) {
193             APP_LOGE("the param is nullptr");
194             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
195             return nullptr;
196         }
197         napi_valuetype valuetype = napi_undefined;
198         NAPI_CALL(env, napi_typeof(env, arg, &valuetype));
199         if (valuetype != napi_function) {
200             APP_LOGE("the param type is invalid");
201             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, CALLBACK, FUNCTION_TYPE);
202             return nullptr;
203         }
204         NAPI_CALL(env, napi_create_reference(env, arg, NAPI_RETURN_ONE, &callbackPtr->callback));
205     }
206 
207     auto executeFunc = [](napi_env env, void *data) {};
208     napi_value promise = CommonFunc::AsyncCallNativeMethod(
209         env,
210         callbackPtr.get(),
211         RESOURCE_NAME_OF_GET_BUNDLE_INSTALLER,
212         executeFunc,
213         GetBundleInstallerCompleted);
214     callbackPtr.release();
215     APP_LOGI_NOFUNC("call GetBundleInstaller done");
216     return promise;
217 }
218 
GetBundleInstallerSync(napi_env env,napi_callback_info info)219 napi_value GetBundleInstallerSync(napi_env env, napi_callback_info info)
220 {
221     APP_LOGI("NAPI GetBundleInstallerSync called");
222     napi_value m_classBundleInstaller = nullptr;
223     NAPI_CALL(env, napi_get_reference_value(env, g_classBundleInstaller,
224         &m_classBundleInstaller));
225     auto iBundleMgr = CommonFunc::GetBundleMgr();
226     if (iBundleMgr == nullptr) {
227         APP_LOGE("can not get iBundleMgr");
228         return nullptr;
229     }
230     if (!g_isSystemApp && !iBundleMgr->VerifySystemApi(Constants::INVALID_API_VERSION)) {
231         APP_LOGE("non-system app calling system api");
232         napi_value businessError = BusinessError::CreateCommonError(
233             env, ERROR_NOT_SYSTEM_APP, RESOURCE_NAME_OF_GET_BUNDLE_INSTALLER_SYNC, INSTALL_PERMISSION);
234         napi_throw(env, businessError);
235         return nullptr;
236     }
237     g_isSystemApp = true;
238     napi_value nBundleInstaller = nullptr;
239     NAPI_CALL(env, napi_new_instance(env, m_classBundleInstaller, 0, nullptr, &nBundleInstaller));
240     APP_LOGD("call GetBundleInstallerSync done");
241     return nBundleInstaller;
242     APP_LOGI("call GetBundleInstallerSync done");
243 }
244 
CreateErrCodeMap(std::unordered_map<int32_t,int32_t> & errCodeMap)245 static void CreateErrCodeMap(std::unordered_map<int32_t, int32_t> &errCodeMap)
246 {
247     errCodeMap = {
248         { IStatusReceiver::SUCCESS, SUCCESS},
249         { IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
250         { IStatusReceiver::ERR_INSTALL_HOST_INSTALLER_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
251         { IStatusReceiver::ERR_INSTALLD_PARAM_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
252         { IStatusReceiver::ERR_INSTALLD_GET_PROXY_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
253         { IStatusReceiver::ERR_INSTALL_INSTALLD_SERVICE_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
254         { IStatusReceiver::ERR_UNINSTALL_BUNDLE_MGR_SERVICE_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
255         { IStatusReceiver::ERR_FAILED_SERVICE_DIED, ERROR_BUNDLE_SERVICE_EXCEPTION },
256         { IStatusReceiver::ERR_FAILED_GET_INSTALLER_PROXY, ERROR_BUNDLE_SERVICE_EXCEPTION },
257         { IStatusReceiver::ERR_USER_CREATE_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
258         { IStatusReceiver::ERR_USER_REMOVE_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
259         { IStatusReceiver::ERR_UNINSTALL_KILLING_APP_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
260         { IStatusReceiver::ERR_INSTALL_GENERATE_UID_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
261         { IStatusReceiver::ERR_INSTALL_STATE_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
262         { IStatusReceiver::ERR_RECOVER_NOT_ALLOWED, ERROR_BUNDLE_SERVICE_EXCEPTION },
263         { IStatusReceiver::ERR_RECOVER_GET_BUNDLEPATH_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
264         { IStatusReceiver::ERR_UNINSTALL_AND_RECOVER_NOT_PREINSTALLED_BUNDLE, ERROR_BUNDLE_NOT_PREINSTALLED },
265         { IStatusReceiver::ERR_UNINSTALL_SYSTEM_APP_ERROR, ERROR_UNINSTALL_PREINSTALL_APP_FAILED },
266         { IStatusReceiver::ERR_INSTALL_PARSE_FAILED, ERROR_INSTALL_PARSE_FAILED },
267         { IStatusReceiver::ERR_INSTALL_PARSE_UNEXPECTED, ERROR_INSTALL_PARSE_FAILED },
268         { IStatusReceiver::ERR_INSTALL_PARSE_MISSING_BUNDLE, ERROR_INSTALL_PARSE_FAILED },
269         { IStatusReceiver::ERR_INSTALL_PARSE_NO_PROFILE, ERROR_INSTALL_PARSE_FAILED },
270         { IStatusReceiver::ERR_INSTALL_PARSE_BAD_PROFILE, ERROR_INSTALL_PARSE_FAILED },
271         { IStatusReceiver::ERR_INSTALL_PARSE_PROFILE_PROP_TYPE_ERROR, ERROR_INSTALL_PARSE_FAILED },
272         { IStatusReceiver::ERR_INSTALL_PARSE_PROFILE_MISSING_PROP, ERROR_INSTALL_PARSE_FAILED },
273         { IStatusReceiver::ERR_INSTALL_PARSE_PERMISSION_ERROR, ERROR_INSTALL_PARSE_FAILED },
274         { IStatusReceiver::ERR_INSTALL_PARSE_PROFILE_PROP_CHECK_ERROR, ERROR_INSTALL_PARSE_FAILED },
275         { IStatusReceiver::ERR_INSTALL_PARSE_RPCID_FAILED, ERROR_INSTALL_PARSE_FAILED },
276         { IStatusReceiver::ERR_INSTALL_PARSE_NATIVE_SO_FAILED, ERROR_INSTALL_PARSE_FAILED },
277         { IStatusReceiver::ERR_INSTALL_PARSE_AN_FAILED, ERROR_INSTALL_PARSE_FAILED },
278         { IStatusReceiver::ERR_INSTALL_PARSE_MISSING_ABILITY, ERROR_INSTALL_PARSE_FAILED },
279         { IStatusReceiver::ERR_INSTALL_FAILED_PROFILE_PARSE_FAIL, ERROR_INSTALL_PARSE_FAILED },
280         { IStatusReceiver::ERR_INSTALL_VERIFICATION_FAILED, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
281         { IStatusReceiver::ERR_INSTALL_FAILED_INCOMPATIBLE_SIGNATURE, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
282         { IStatusReceiver::ERR_INSTALL_FAILED_INVALID_SIGNATURE_FILE_PATH, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
283         { IStatusReceiver::ERR_INSTALL_FAILED_BAD_BUNDLE_SIGNATURE_FILE, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
284         { IStatusReceiver::ERR_INSTALL_FAILED_NO_BUNDLE_SIGNATURE, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
285         { IStatusReceiver::ERR_INSTALL_FAILED_VERIFY_APP_PKCS7_FAIL, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
286         { IStatusReceiver::ERR_INSTALL_FAILED_APP_SOURCE_NOT_TRUESTED, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
287         { IStatusReceiver::ERR_INSTALL_FAILED_BAD_DIGEST, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
288         { IStatusReceiver::ERR_INSTALL_FAILED_BUNDLE_INTEGRITY_VERIFICATION_FAILURE,
289             ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
290         { IStatusReceiver::ERR_INSTALL_FAILED_BAD_PUBLICKEY, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
291         { IStatusReceiver::ERR_INSTALL_FAILED_BAD_BUNDLE_SIGNATURE, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
292         { IStatusReceiver::ERR_INSTALL_FAILED_NO_PROFILE_BLOCK_FAIL, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
293         { IStatusReceiver::ERR_INSTALL_FAILED_BUNDLE_SIGNATURE_VERIFICATION_FAILURE,
294             ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
295         { IStatusReceiver::ERR_INSTALL_FAILED_VERIFY_SOURCE_INIT_FAIL, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
296         { IStatusReceiver::ERR_INSTALL_SINGLETON_INCOMPATIBLE, ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
297         { IStatusReceiver::ERR_INSTALL_FAILED_INCONSISTENT_SIGNATURE, ERROR_INSTALL_FAILED_INCONSISTENT_SIGNATURE },
298         { IStatusReceiver::ERR_INSTALL_PARAM_ERROR, ERROR_BUNDLE_NOT_EXIST },
299         { IStatusReceiver::ERR_UNINSTALL_PARAM_ERROR, ERROR_BUNDLE_NOT_EXIST },
300         { IStatusReceiver::ERR_RECOVER_INVALID_BUNDLE_NAME, ERROR_BUNDLE_NOT_EXIST },
301         { IStatusReceiver::ERR_UNINSTALL_INVALID_NAME, ERROR_BUNDLE_NOT_EXIST },
302         { IStatusReceiver::ERR_INSTALL_INVALID_BUNDLE_FILE, ERROR_INSTALL_HAP_FILEPATH_INVALID },
303         { IStatusReceiver::ERR_INSTALL_FAILED_MODULE_NAME_EMPTY, ERROR_MODULE_NOT_EXIST },
304         { IStatusReceiver::ERR_INSTALL_FAILED_MODULE_NAME_DUPLICATE, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
305         { IStatusReceiver::ERR_INSTALL_FAILED_CHECK_HAP_HASH_PARAM, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
306         { IStatusReceiver::ERR_UNINSTALL_MISSING_INSTALLED_BUNDLE, ERROR_BUNDLE_NOT_EXIST },
307         { IStatusReceiver::ERR_UNINSTALL_MISSING_INSTALLED_MODULE, ERROR_MODULE_NOT_EXIST },
308         { IStatusReceiver::ERR_USER_NOT_INSTALL_HAP, ERROR_BUNDLE_NOT_EXIST },
309         { IStatusReceiver::ERR_INSTALL_FILE_PATH_INVALID, ERROR_INSTALL_HAP_FILEPATH_INVALID },
310         { IStatusReceiver::ERR_INSTALL_PERMISSION_DENIED, ERROR_PERMISSION_DENIED_ERROR },
311         { IStatusReceiver::ERR_UNINSTALL_PERMISSION_DENIED, ERROR_PERMISSION_DENIED_ERROR },
312         { IStatusReceiver::ERR_INSTALL_GRANT_REQUEST_PERMISSIONS_FAILED, ERROR_INSTALL_PERMISSION_CHECK_ERROR },
313         { IStatusReceiver::ERR_INSTALL_UPDATE_HAP_TOKEN_FAILED, ERROR_INSTALL_PERMISSION_CHECK_ERROR },
314         { IStatusReceiver::ERR_INSTALLD_CREATE_DIR_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
315         { IStatusReceiver::ERR_INSTALLD_CHOWN_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
316         { IStatusReceiver::ERR_INSTALLD_CREATE_DIR_EXIST, ERROR_BUNDLE_SERVICE_EXCEPTION },
317         { IStatusReceiver::ERR_INSTALLD_REMOVE_DIR_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
318         { IStatusReceiver::ERR_INSTALLD_EXTRACT_FILES_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
319         { IStatusReceiver::ERR_INSTALLD_RNAME_DIR_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
320         { IStatusReceiver::ERR_INSTALLD_CLEAN_DIR_FAILED, ERROR_BUNDLE_SERVICE_EXCEPTION },
321         { IStatusReceiver::ERR_INSTALL_ENTRY_ALREADY_EXIST, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
322         { IStatusReceiver::ERR_INSTALL_ALREADY_EXIST, ERROR_INSTALL_ALREADY_EXIST },
323         { IStatusReceiver::ERR_INSTALL_BUNDLENAME_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
324         { IStatusReceiver::ERR_INSTALL_VERSIONCODE_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
325         { IStatusReceiver::ERR_INSTALL_VERSIONNAME_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
326         { IStatusReceiver::ERR_INSTALL_MINCOMPATIBLE_VERSIONCODE_NOT_SAME,
327             ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
328         { IStatusReceiver::ERR_INSTALL_VENDOR_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
329         { IStatusReceiver::ERR_INSTALL_RELEASETYPE_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
330         { IStatusReceiver::ERR_INSTALL_RELEASETYPE_TARGET_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
331         { IStatusReceiver::ERR_INSTALL_RELEASETYPE_COMPATIBLE_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
332         { IStatusReceiver::ERR_INSTALL_SINGLETON_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
333         { IStatusReceiver::ERR_INSTALL_ZERO_USER_WITH_NO_SINGLETON, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
334         { IStatusReceiver::ERR_INSTALL_CHECK_SYSCAP_FAILED, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
335         { IStatusReceiver::ERR_INSTALL_APPTYPE_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
336         { IStatusReceiver::ERR_INSTALL_URI_DUPLICATE, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
337         { IStatusReceiver::ERR_INSTALL_VERSION_NOT_COMPATIBLE, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
338         { IStatusReceiver::ERR_INSTALL_APP_DISTRIBUTION_TYPE_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
339         { IStatusReceiver::ERR_INSTALL_APP_PROVISION_TYPE_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
340         { IStatusReceiver::ERR_INSTALL_SO_INCOMPATIBLE, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
341         { IStatusReceiver::ERR_INSTALL_AN_INCOMPATIBLE, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
342         { IStatusReceiver::ERR_INSTALL_TYPE_ERROR, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
343         { IStatusReceiver::ERR_INSTALL_TYPE_ERROR, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
344         { IStatusReceiver::ERR_INSTALL_NOT_UNIQUE_DISTRO_MODULE_NAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
345         { IStatusReceiver::ERR_INSTALL_INCONSISTENT_MODULE_NAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
346         { IStatusReceiver::ERR_INSTALL_INVALID_NUMBER_OF_ENTRY_HAP, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
347         { IStatusReceiver::ERR_INSTALL_ASAN_ENABLED_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
348         { IStatusReceiver::ERR_INSTALL_ASAN_ENABLED_NOT_SUPPORT, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT},
349         { IStatusReceiver::ERR_INSTALL_BUNDLE_TYPE_NOT_SAME, ERROR_INSTALL_PARSE_FAILED},
350         { IStatusReceiver::ERR_INSTALL_DISK_MEM_INSUFFICIENT, ERROR_INSTALL_NO_DISK_SPACE_LEFT },
351         { IStatusReceiver::ERR_USER_NOT_EXIST, ERROR_INVALID_USER_ID },
352         { IStatusReceiver::ERR_INSTALL_VERSION_DOWNGRADE, ERROR_INSTALL_VERSION_DOWNGRADE },
353         { IStatusReceiver::ERR_INSTALL_DEVICE_TYPE_NOT_SUPPORTED, ERROR_INSTALL_PARSE_FAILED },
354         { IStatusReceiver::ERR_INSTALL_CHECK_SYSCAP_FAILED_AND_DEVICE_TYPE_NOT_SUPPORTED, ERROR_INSTALL_PARSE_FAILED },
355         { IStatusReceiver::ERR_INSTALL_PARSE_PROFILE_PROP_SIZE_CHECK_ERROR, ERROR_INSTALL_PARSE_FAILED },
356         { IStatusReceiver::ERR_INSTALL_DEPENDENT_MODULE_NOT_EXIST, ERROR_INSTALL_DEPENDENT_MODULE_NOT_EXIST },
357         { IStatusReceiver::ERR_INSTALL_SHARE_APP_LIBRARY_NOT_ALLOWED, ERROR_INSTALL_SHARE_APP_LIBRARY_NOT_ALLOWED },
358         { IStatusReceiver::ERR_INSTALL_COMPATIBLE_POLICY_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
359         { IStatusReceiver::ERR_INSTALL_FILE_IS_SHARED_LIBRARY, ERROR_INSTALL_FILE_IS_SHARED_LIBRARY },
360         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_INTERNAL_ERROR, ERROR_BUNDLE_SERVICE_EXCEPTION },
361         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_INVALID_BUNDLE_NAME, ERROR_BUNDLE_NOT_EXIST },
362         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_INVALID_MODULE_NAME, ERROR_MODULE_NOT_EXIST},
363         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_ERROR_HAP_TYPE, ERROR_INVALID_TYPE },
364         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_ERROR_BUNDLE_TYPE, ERROR_INVALID_TYPE },
365         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_TARGET_BUNDLE_NAME_MISSED, ERROR_INSTALL_PARSE_FAILED },
366         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_TARGET_MODULE_NAME_MISSED, ERROR_INSTALL_PARSE_FAILED },
367         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_TARGET_BUNDLE_NAME_NOT_SAME,
368             ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
369         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_INTERNAL_EXTERNAL_OVERLAY_EXISTED_SIMULTANEOUSLY,
370             ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
371         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_TARGET_PRIORITY_NOT_SAME,
372             ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
373         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_INVALID_PRIORITY, ERROR_INSTALL_PARSE_FAILED },
374         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_INCONSISTENT_VERSION_CODE,
375             ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
376         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_SERVICE_EXCEPTION, ERROR_BUNDLE_SERVICE_EXCEPTION },
377         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_BUNDLE_NAME_SAME_WITH_TARGET_BUNDLE_NAME,
378             ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT},
379         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_NO_SYSTEM_APPLICATION_FOR_EXTERNAL_OVERLAY,
380             ERROR_INSTALL_HAP_OVERLAY_CHECK_FAILED },
381         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_DIFFERENT_SIGNATURE_CERTIFICATE,
382             ERROR_INSTALL_VERIFY_SIGNATURE_FAILED },
383         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_TARGET_BUNDLE_IS_OVERLAY_BUNDLE,
384             ERROR_INSTALL_HAP_OVERLAY_CHECK_FAILED },
385         {IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_TARGET_MODULE_IS_OVERLAY_MODULE,
386             ERROR_INSTALL_HAP_OVERLAY_CHECK_FAILED },
387         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_OVERLAY_TYPE_NOT_SAME,
388             ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
389         { IStatusReceiver::ERR_OVERLAY_INSTALLATION_FAILED_INVALID_BUNDLE_DIR, ERROR_BUNDLE_SERVICE_EXCEPTION },
390         { IStatusReceiver::ERR_APPEXECFWK_UNINSTALL_SHARE_APP_LIBRARY_IS_NOT_EXIST,
391             ERROR_UNINSTALL_SHARE_APP_LIBRARY_IS_NOT_EXIST},
392         { IStatusReceiver::ERR_APPEXECFWK_UNINSTALL_SHARE_APP_LIBRARY_IS_RELIED,
393             ERROR_UNINSTALL_SHARE_APP_LIBRARY_IS_RELIED},
394         { IStatusReceiver::ERR_APPEXECFWK_UNINSTALL_BUNDLE_IS_SHARED_LIBRARY,
395             ERROR_UNINSTALL_BUNDLE_IS_SHARED_BUNDLE},
396         { IStatusReceiver::ERR_INSATLL_CHECK_PROXY_DATA_URI_FAILED,
397             ERROR_INSTALL_WRONG_DATA_PROXY_URI},
398         { IStatusReceiver::ERR_INSATLL_CHECK_PROXY_DATA_PERMISSION_FAILED,
399             ERROR_INSTALL_WRONG_DATA_PROXY_PERMISSION},
400         { IStatusReceiver::ERR_INSTALL_FAILED_DEBUG_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT },
401         { IStatusReceiver::ERR_INSTALL_DISALLOWED, ERROR_DISALLOW_INSTALL},
402         { IStatusReceiver::ERR_INSTALL_ISOLATION_MODE_FAILED, ERROR_INSTALL_WRONG_MODE_ISOLATION },
403         { IStatusReceiver::ERR_UNINSTALL_DISALLOWED, ERROR_DISALLOW_UNINSTALL },
404         { IStatusReceiver::ERR_INSTALL_CODE_SIGNATURE_FAILED, ERROR_INSTALL_CODE_SIGNATURE_FAILED },
405         { IStatusReceiver::ERR_INSTALL_CODE_SIGNATURE_FILE_IS_INVALID, ERROR_INSTALL_CODE_SIGNATURE_FAILED},
406         { IStatusReceiver::ERR_UNINSTALL_FROM_BMS_EXTENSION_FAILED, ERROR_BUNDLE_NOT_EXIST},
407         { IStatusReceiver::ERR_INSTALL_SELF_UPDATE_NOT_MDM, ERROR_INSTALL_SELF_UPDATE_NOT_MDM},
408         { IStatusReceiver::ERR_INSTALL_ENTERPRISE_BUNDLE_NOT_ALLOWED, ERROR_INSTALL_ENTERPRISE_BUNDLE_NOT_ALLOWED},
409         { IStatusReceiver::ERR_INSTALL_EXISTED_ENTERPRISE_BUNDLE_NOT_ALLOWED,
410             ERROR_INSTALL_EXISTED_ENTERPRISE_NOT_ALLOWED_ERROR},
411         { IStatusReceiver::ERR_INSTALL_SELF_UPDATE_BUNDLENAME_NOT_SAME, ERROR_INSTALL_SELF_UPDATE_BUNDLENAME_NOT_SAME},
412         { IStatusReceiver::ERR_INSTALL_GWP_ASAN_ENABLED_NOT_SAME, ERROR_INSTALL_MULTIPLE_HAP_INFO_INCONSISTENT},
413         { IStatusReceiver::ERR_INSTALL_DEBUG_BUNDLE_NOT_ALLOWED, ERROR_INSTALL_DEBUG_BUNDLE_NOT_ALLOWED},
414         { IStatusReceiver::ERR_INSTALL_CHECK_ENCRYPTION_FAILED, ERROR_INSTALL_CODE_SIGNATURE_FAILED },
415         { IStatusReceiver::ERR_INSTALL_CODE_SIGNATURE_DELIVERY_FILE_FAILED, ERROR_INSTALL_CODE_SIGNATURE_FAILED},
416         { IStatusReceiver::ERR_INSTALL_CODE_SIGNATURE_REMOVE_FILE_FAILED, ERROR_INSTALL_CODE_SIGNATURE_FAILED},
417         { IStatusReceiver::ERR_INSTALL_CODE_APP_CONTROLLED_FAILED, ERROR_INSTALL_FAILED_CONTROLLED},
418         { IStatusReceiver::ERR_APPEXECFWK_INSTALL_FORCE_UNINSTALLED_BUNDLE_NOT_ALLOW_RECOVER,
419             ERROR_INSTALL_FAILED_CONTROLLED},
420         { IStatusReceiver::ERR_APPEXECFWK_INSTALL_PREINSTALL_BUNDLE_ONLY_ALLOW_FORCE_UNINSTALLED_BY_EDC,
421             ERROR_INSTALL_FAILED_CONTROLLED},
422         { IStatusReceiver::ERR_INSTALL_NATIVE_FAILED, ERROR_INSTALL_NATIVE_FAILED},
423         { IStatusReceiver::ERR_UNINSTALL_NATIVE_FAILED, ERROR_UNINSTALL_NATIVE_FAILED},
424         { IStatusReceiver::ERR_UNINSTALL_DISPOSED_RULE_DENIED, ERROR_APPLICATION_UNINSTALL},
425         { IStatusReceiver::ERR_NATIVE_HNP_EXTRACT_FAILED, ERROR_INSTALL_NATIVE_FAILED},
426         { IStatusReceiver::ERR_UNINSTALL_CONTROLLED, ERROR_BUNDLE_CAN_NOT_BE_UNINSTALLED },
427         { IStatusReceiver::ERR_INSTALL_DEBUG_ENCRYPTED_BUNDLE_FAILED, ERROR_INSTALL_PARSE_FAILED },
428         { IStatusReceiver::ERR_APP_DISTRIBUTION_TYPE_NOT_ALLOW_INSTALL_ISR,
429             ERROR_APP_DISTRIBUTION_TYPE_NOT_ALLOW_INSTALL},
430         { IStatusReceiver::ERR_INSTALL_FAILED_AND_RESTORE_TO_PREINSTALLED,
431             ERROR_INSTALL_FAILED_AND_RESTORE_TO_PREINSTALLED },
432     };
433 }
434 
ConvertInstallResult(InstallResult & installResult)435 static void ConvertInstallResult(InstallResult &installResult)
436 {
437     APP_LOGD("ConvertInstallResult msg %{public}s, errCode is %{public}d", installResult.resultMsg.c_str(),
438         installResult.resultCode);
439     std::unordered_map<int32_t, int32_t> errCodeMap;
440     CreateErrCodeMap(errCodeMap);
441     auto iter = errCodeMap.find(installResult.resultCode);
442     if (iter != errCodeMap.end()) {
443         installResult.resultCode = iter->second;
444         return;
445     }
446     installResult.resultCode = ERROR_BUNDLE_SERVICE_EXCEPTION;
447 }
448 
ParseHashParam(napi_env env,napi_value args,std::string & key,std::string & value)449 static bool ParseHashParam(napi_env env, napi_value args, std::string &key, std::string &value)
450 {
451     APP_LOGD("start to parse moduleName");
452     bool ret = CommonFunc::ParseStringPropertyFromObject(env, args, MODULE_NAME, true, key);
453     if (!ret || key.empty()) {
454         APP_LOGE("param string moduleName is empty");
455         return false;
456     }
457     APP_LOGD("ParseHashParam moduleName=%{public}s", key.c_str());
458 
459     APP_LOGD("start to parse hashValue");
460     ret = CommonFunc::ParseStringPropertyFromObject(env, args, HASH_VALUE, true, value);
461     if (!ret || value.empty()) {
462         APP_LOGE("param string hashValue is empty");
463         return false;
464     }
465     APP_LOGD("ParseHashParam hashValue=%{public}s", value.c_str());
466     return true;
467 }
468 
ParseHashParams(napi_env env,napi_value args,std::map<std::string,std::string> & hashParams)469 static bool ParseHashParams(napi_env env, napi_value args, std::map<std::string, std::string> &hashParams)
470 {
471     APP_LOGD("start to parse hashParams");
472     std::vector<napi_value> valueVec;
473     bool res = CommonFunc::ParsePropertyArray(env, args, HASH_PARAMS, valueVec);
474     if (!res) {
475         APP_LOGW("hashParams type error,using default value");
476         return true;
477     }
478     if (valueVec.empty()) {
479         APP_LOGW("hashParams is empty,using default value");
480         return true;
481     }
482     for (const auto &property : valueVec) {
483         std::string key;
484         std::string value;
485         if (!ParseHashParam(env, property, key, value)) {
486             APP_LOGE("parse hash param failed");
487             return false;
488         }
489         if (hashParams.find(key) != hashParams.end()) {
490             APP_LOGE("moduleName(%{public}s) is duplicate", key.c_str());
491             return false;
492         }
493         hashParams.emplace(key, value);
494     }
495     return true;
496 }
497 
ParseVerifyCodeParam(napi_env env,napi_value args,std::string & key,std::string & value)498 static bool ParseVerifyCodeParam(napi_env env, napi_value args, std::string &key, std::string &value)
499 {
500     APP_LOGD("start to parse moduleName");
501     bool ret = CommonFunc::ParseStringPropertyFromObject(env, args, MODULE_NAME, true, key);
502     if (!ret || key.empty()) {
503         APP_LOGE("param string moduleName is empty");
504         return false;
505     }
506     APP_LOGD("ParseVerifyCodeParam moduleName is %{public}s", key.c_str());
507 
508     APP_LOGD("start to parse signatureFilePath");
509     ret = CommonFunc::ParseStringPropertyFromObject(env, args, SIGNATURE_FILE_PATH, true, value);
510     if (!ret || value.empty()) {
511         APP_LOGE("param string signatureFilePath is empty");
512         return false;
513     }
514     APP_LOGD("ParseVerifyCodeParam signatureFilePath is %{public}s", value.c_str());
515     return true;
516 }
517 
ParseVerifyCodeParams(napi_env env,napi_value args,std::map<std::string,std::string> & verifyCodeParams)518 static bool ParseVerifyCodeParams(napi_env env, napi_value args, std::map<std::string, std::string> &verifyCodeParams)
519 {
520     APP_LOGD("start to parse verifyCodeParams");
521     std::vector<napi_value> valueVec;
522     bool res = CommonFunc::ParsePropertyArray(env, args, VERIFY_CODE_PARAM, valueVec);
523     if (!res) {
524         APP_LOGW("verifyCodeParams type error, using default value");
525         return true;
526     }
527     if (valueVec.empty()) {
528         APP_LOGW("verifyCodeParams is empty, using default value");
529         return true;
530     }
531     for (const auto &property : valueVec) {
532         std::string key;
533         std::string value;
534         if (!ParseVerifyCodeParam(env, property, key, value)) {
535             APP_LOGE("parse verify code param failed");
536             return false;
537         }
538         if (verifyCodeParams.find(key) != verifyCodeParams.end()) {
539             APP_LOGE("moduleName(%{public}s) is duplicate", key.c_str());
540             return false;
541         }
542         verifyCodeParams.emplace(key, value);
543     }
544     return true;
545 }
546 
ParseParameter(napi_env env,napi_value args,std::string & key,std::string & value)547 static bool ParseParameter(napi_env env, napi_value args, std::string &key, std::string &value)
548 {
549     APP_LOGD("start to parse parameter");
550     bool ret = CommonFunc::ParseStringPropertyFromObject(env, args, KEY, true, key);
551     if (!ret || key.empty()) {
552         APP_LOGE("param key is empty");
553         return false;
554     }
555     APP_LOGD("ParseParameter key is %{public}s", key.c_str());
556 
557     APP_LOGD("start to parse value");
558     ret = CommonFunc::ParseStringPropertyFromObject(env, args, VALUE, true, value);
559     if (!ret || value.empty()) {
560         APP_LOGE("param value is empty");
561         return false;
562     }
563     APP_LOGD("ParseParameter value is %{public}s", value.c_str());
564     return true;
565 }
566 
ParseParameters(napi_env env,napi_value args,std::map<std::string,std::string> & parameters)567 static bool ParseParameters(napi_env env, napi_value args, std::map<std::string, std::string> &parameters)
568 {
569     APP_LOGD("start to parse parameters");
570     std::vector<napi_value> valueVec;
571     bool res = CommonFunc::ParsePropertyArray(env, args, PARAMETERS, valueVec);
572     if (!res) {
573         APP_LOGW("parameters type error, using default value");
574         return true;
575     }
576     if (valueVec.empty()) {
577         APP_LOGW("parameters is empty, using default value");
578         return true;
579     }
580     for (const auto &property : valueVec) {
581         std::string key;
582         std::string value;
583         if (!ParseParameter(env, property, key, value)) {
584             APP_LOGE("parse parameter failed");
585             return false;
586         }
587         if (parameters.find(key) != parameters.end()) {
588             APP_LOGE("key(%{public}s) is duplicate", key.c_str());
589             return false;
590         }
591         parameters.emplace(key, value);
592     }
593     return true;
594 }
595 
ParsePgoParam(napi_env env,napi_value args,std::string & key,std::string & value)596 static bool ParsePgoParam(napi_env env, napi_value args, std::string &key, std::string &value)
597 {
598     APP_LOGD("start to parse moduleName");
599     bool ret = CommonFunc::ParseStringPropertyFromObject(env, args, MODULE_NAME, true, key);
600     if (!ret || key.empty()) {
601         APP_LOGE("param string moduleName is empty");
602         return false;
603     }
604     APP_LOGD("ParsePgoParam moduleName is %{public}s", key.c_str());
605 
606     APP_LOGD("start to parse pgoFilePath");
607     ret = CommonFunc::ParseStringPropertyFromObject(env, args, PGO_FILE_PATH, true, value);
608     if (!ret || value.empty()) {
609         APP_LOGE("param string pgoFilePath is empty");
610         return false;
611     }
612     APP_LOGD("ParsePgoParam pgoFilePath is %{public}s", value.c_str());
613     return true;
614 }
615 
ParsePgoParams(napi_env env,napi_value args,std::map<std::string,std::string> & pgoParams)616 static bool ParsePgoParams(napi_env env, napi_value args, std::map<std::string, std::string> &pgoParams)
617 {
618     APP_LOGD("start to parse pgoParams");
619     std::vector<napi_value> valueVec;
620     bool res = CommonFunc::ParsePropertyArray(env, args, PGO_PARAM, valueVec);
621     if (!res) {
622         APP_LOGW("pgoParams type error, using default value");
623         return true;
624     }
625     if (valueVec.empty()) {
626         APP_LOGW("pgoParams is empty, using default value");
627         return true;
628     }
629     for (const auto &property : valueVec) {
630         std::string key;
631         std::string value;
632         if (!ParsePgoParam(env, property, key, value)) {
633             APP_LOGW("parse pgo param failed");
634             continue;
635         }
636         pgoParams.emplace(key, value);
637     }
638     return true;
639 }
640 
ParseBundleName(napi_env env,napi_value args,std::string & bundleName)641 static bool ParseBundleName(napi_env env, napi_value args, std::string &bundleName)
642 {
643     APP_LOGD("start to parse bundleName");
644     PropertyInfo propertyInfo = {
645         .isNecessary = true,
646         .propertyType = napi_string,
647         .propertyName = BUNDLE_NAME
648     };
649     napi_value property = nullptr;
650     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
651     if (!res) {
652         APP_LOGE("parse bundleName failed, bundleName is %{public}s", bundleName.c_str());
653         return res;
654     }
655     if (property != nullptr) {
656         if (!CommonFunc::ParseString(env, property, bundleName)) {
657             APP_LOGE("ParseString failed");
658             return false;
659         }
660     }
661     APP_LOGD("param bundleName is %{public}s", bundleName.c_str());
662     return true;
663 }
664 
ParseModuleName(napi_env env,napi_value args,std::string & moduleName)665 static bool ParseModuleName(napi_env env, napi_value args, std::string &moduleName)
666 {
667     APP_LOGD("start to parse moduleName");
668     PropertyInfo propertyInfo = {
669         .isNecessary = false,
670         .propertyType = napi_string,
671         .propertyName = MODULE_NAME
672     };
673     napi_value property = nullptr;
674     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
675     if (!res) {
676         APP_LOGE("parse moduleName failed");
677         return res;
678     }
679     if (property != nullptr) {
680         if (!CommonFunc::ParseString(env, property, moduleName)) {
681             APP_LOGE("ParseString failed");
682             return false;
683         }
684     }
685     return true;
686 }
687 
ParseVersionCode(napi_env env,napi_value args,int32_t & versionCode)688 static bool ParseVersionCode(napi_env env, napi_value args, int32_t &versionCode)
689 {
690     APP_LOGD("start to parse versionCode");
691     PropertyInfo propertyInfo = {
692         .isNecessary = false,
693         .propertyType = napi_number,
694         .propertyName = VERSION_CODE
695     };
696     napi_value property = nullptr;
697     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
698     if (!res) {
699         APP_LOGE("parse versionCode failed");
700         return res;
701     }
702     if (property != nullptr) {
703         PARSE_PROPERTY(env, property, int32, versionCode);
704     }
705     APP_LOGD("param versionCode is %{public}d", versionCode);
706     return true;
707 }
708 
ParseUserId(napi_env env,napi_value args,int32_t & userId)709 static bool ParseUserId(napi_env env, napi_value args, int32_t &userId)
710 {
711     APP_LOGD("start to parse userId");
712     PropertyInfo propertyInfo = {
713         .isNecessary = false,
714         .propertyType = napi_number,
715         .propertyName = USER_ID
716     };
717     napi_value property = nullptr;
718     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
719     if (!res) {
720         APP_LOGE("parse userId failed");
721         return res;
722     }
723     if (property != nullptr) {
724         PARSE_PROPERTY(env, property, int32, userId);
725     }
726     APP_LOGD("param userId is %{public}d", userId);
727     return true;
728 }
729 
ParseAppIndex(napi_env env,napi_value args,int32_t & appIndex)730 static bool ParseAppIndex(napi_env env, napi_value args, int32_t &appIndex)
731 {
732     APP_LOGD("start to parse appIndex");
733     PropertyInfo propertyInfo = {
734         .isNecessary = true,
735         .propertyType = napi_number,
736         .propertyName = APP_INDEX
737     };
738     napi_value property = nullptr;
739     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
740     if (!res) {
741         APP_LOGE("parse appIndex failed");
742         return res;
743     }
744     if (property != nullptr) {
745         PARSE_PROPERTY(env, property, int32, appIndex);
746     }
747     APP_LOGD("param appIndex is %{public}d", appIndex);
748     return true;
749 }
750 
ParseInstallFlag(napi_env env,napi_value args,InstallFlag & installFlag)751 static bool ParseInstallFlag(napi_env env, napi_value args, InstallFlag &installFlag)
752 {
753     APP_LOGD("start to parse installFlag");
754     PropertyInfo propertyInfo = {
755         .isNecessary = false,
756         .propertyType = napi_number,
757         .propertyName = INSTALL_FLAG
758     };
759     napi_value property = nullptr;
760     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
761     if (!res) {
762         APP_LOGE("parse installFlag failed");
763         return res;
764     }
765 
766     if (property != nullptr) {
767         int32_t flag = 0;
768         PARSE_PROPERTY(env, property, int32, flag);
769         APP_LOGD("param installFlag is %{public}d", flag);
770         if ((flag != static_cast<int32_t>(OHOS::AppExecFwk::InstallFlag::NORMAL)) &&
771             (flag != static_cast<int32_t>(OHOS::AppExecFwk::InstallFlag::REPLACE_EXISTING)) &&
772             (flag != static_cast<int32_t>(OHOS::AppExecFwk::InstallFlag::FREE_INSTALL))) {
773             APP_LOGE("invalid installFlag param");
774             return false;
775         }
776         installFlag = static_cast<OHOS::AppExecFwk::InstallFlag>(flag);
777     }
778     return true;
779 }
780 
ParseIsKeepData(napi_env env,napi_value args,bool & isKeepData)781 static bool ParseIsKeepData(napi_env env, napi_value args, bool &isKeepData)
782 {
783     APP_LOGD("start to parse isKeepData");
784     PropertyInfo propertyInfo = {
785         .isNecessary = false,
786         .propertyType = napi_boolean,
787         .propertyName = IS_KEEP_DATA
788     };
789     napi_value property = nullptr;
790     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
791     if (!res) {
792         APP_LOGE("parse isKeepData failed");
793         return res;
794     }
795     if (property != nullptr) {
796         PARSE_PROPERTY(env, property, bool, isKeepData);
797     }
798     APP_LOGD("param isKeepData is %{public}d", isKeepData);
799     return true;
800 }
801 
ParseCrowdtestDeadline(napi_env env,napi_value args,int64_t & crowdtestDeadline)802 static bool ParseCrowdtestDeadline(napi_env env, napi_value args, int64_t &crowdtestDeadline)
803 {
804     APP_LOGD("start to parse crowdtestDeadline");
805     PropertyInfo propertyInfo = {
806         .isNecessary = false,
807         .propertyType = napi_number,
808         .propertyName = CROWD_TEST_DEADLINE
809     };
810     napi_value property = nullptr;
811     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
812     if (!res) {
813         APP_LOGE("parse crowdtestDeadline failed");
814         return res;
815     }
816     if (property != nullptr) {
817         PARSE_PROPERTY(env, property, int64, crowdtestDeadline);
818     }
819     return true;
820 }
821 
ParseSharedBundleDirPaths(napi_env env,napi_value args,std::vector<std::string> & sharedBundleDirPaths)822 static bool ParseSharedBundleDirPaths(napi_env env, napi_value args, std::vector<std::string> &sharedBundleDirPaths)
823 {
824     APP_LOGD("start to parse sharedBundleDirPaths");
825     std::vector<napi_value> valueVec;
826     bool res = CommonFunc::ParsePropertyArray(env, args, SHARED_BUNDLE_DIR_PATHS, valueVec);
827     if (!res) {
828         APP_LOGE("parse sharedBundleDirPaths failed");
829         return res;
830     }
831     if (valueVec.empty()) {
832         APP_LOGD("sharedBundleDirPaths is empty");
833         return true;
834     }
835     for (const auto &value : valueVec) {
836         std::string path;
837         if (!CommonFunc::ParseString(env, value, path)) {
838             APP_LOGE("parse sharedBundleDirPaths element failed");
839             return false;
840         }
841         sharedBundleDirPaths.emplace_back(path);
842     }
843     return true;
844 }
845 
ParseSpecifiedDistributionType(napi_env env,napi_value args,std::string & specifiedDistributionType)846 static bool ParseSpecifiedDistributionType(napi_env env, napi_value args, std::string &specifiedDistributionType)
847 {
848     APP_LOGD("start to parse specifiedDistributionType");
849     PropertyInfo propertyInfo = {
850         .isNecessary = false,
851         .propertyType = napi_string,
852         .propertyName = SPECIFIED_DISTRIBUTION_TYPE
853     };
854     napi_value property = nullptr;
855     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
856     if (!res) {
857         APP_LOGE("parse specifiedDistributionType failed");
858         return res;
859     }
860     if (property != nullptr) {
861         if (!CommonFunc::ParseString(env, property, specifiedDistributionType)) {
862             APP_LOGE("ParseString failed");
863             return false;
864         }
865     }
866     APP_LOGD("param specifiedDistributionType is %{public}s", specifiedDistributionType.c_str());
867     return true;
868 }
869 
ParseAdditionalInfo(napi_env env,napi_value args,std::string & additionalInfo)870 static bool ParseAdditionalInfo(napi_env env, napi_value args, std::string &additionalInfo)
871 {
872     APP_LOGD("start to parse the additionalInfo");
873     PropertyInfo propertyInfo = {
874         .isNecessary = false,
875         .propertyType = napi_string,
876         .propertyName = ADDITIONAL_INFO
877     };
878     napi_value property = nullptr;
879     bool res = CommonFunc::ParsePropertyFromObject(env, args, propertyInfo, property);
880     if (!res) {
881         APP_LOGE("parse additionalInfo failed");
882         return res;
883     }
884     if (property != nullptr) {
885         if (!CommonFunc::ParseString(env, property, additionalInfo)) {
886             APP_LOGE("ParseString failed");
887             return false;
888         }
889     }
890     APP_LOGD("param additionalInfo is %{public}s", additionalInfo.c_str());
891     return true;
892 }
893 
CheckInstallParam(napi_env env,InstallParam & installParam)894 static bool CheckInstallParam(napi_env env, InstallParam &installParam)
895 {
896     if (installParam.specifiedDistributionType.size() > SPECIFIED_DISTRIBUTION_TYPE_MAX_SIZE) {
897         APP_LOGE("Parse specifiedDistributionType size failed");
898         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR,
899             "BusinessError 401: The size of specifiedDistributionType is greater than 128");
900         return false;
901     }
902     if (installParam.additionalInfo.size() > ADDITIONAL_INFO_MAX_SIZE) {
903         APP_LOGE("Parse additionalInfo size failed");
904         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR,
905             "BusinessError 401: The size of additionalInfo is greater than 3000");
906         return false;
907     }
908     return true;
909 }
910 
ParseInstallParam(napi_env env,napi_value args,InstallParam & installParam)911 static bool ParseInstallParam(napi_env env, napi_value args, InstallParam &installParam)
912 {
913     if (!ParseHashParams(env, args, installParam.hashParams)) {
914         return false;
915     }
916     if (!ParseVerifyCodeParams(env, args, installParam.verifyCodeParams)) {
917         return false;
918     }
919     if (!ParsePgoParams(env, args, installParam.pgoParams)) {
920         return false;
921     }
922     if (!ParseUserId(env, args, installParam.userId)) {
923         APP_LOGW("Parse userId failed,using default value");
924     }
925     if (!ParseInstallFlag(env, args, installParam.installFlag)) {
926         APP_LOGW("Parse installFlag failed,using default value");
927     }
928     if (!ParseIsKeepData(env, args, installParam.isKeepData)) {
929         APP_LOGW("Parse isKeepData failed,using default value");
930     }
931     if (!ParseCrowdtestDeadline(env, args, installParam.crowdtestDeadline)) {
932         APP_LOGW("Parse crowdtestDeadline failed,using default value");
933     }
934     if (!ParseSharedBundleDirPaths(env, args, installParam.sharedBundleDirPaths)) {
935         APP_LOGW("Parse sharedBundleDirPaths failed,using default value");
936     }
937     if (!ParseSpecifiedDistributionType(env, args, installParam.specifiedDistributionType)) {
938         APP_LOGW("Parse specifiedDistributionType failed,using default value");
939     }
940     if (!ParseAdditionalInfo(env, args, installParam.additionalInfo)) {
941         APP_LOGW("Parse additionalInfo failed,using default value");
942     }
943     if (!ParseParameters(env, args, installParam.parameters)) {
944         APP_LOGW("Parse parameters failed,using default value");
945     }
946     return true;
947 }
948 
ParseUninstallParam(napi_env env,napi_value args,UninstallParam & uninstallParam)949 static bool ParseUninstallParam(napi_env env, napi_value args, UninstallParam &uninstallParam)
950 {
951     if (!ParseBundleName(env, args, uninstallParam.bundleName) ||
952         !ParseModuleName(env, args, uninstallParam.moduleName) ||
953         !ParseVersionCode(env, args, uninstallParam.versionCode) ||
954         !ParseUserId(env, args, uninstallParam.userId)) {
955             APP_LOGE("Parse UninstallParam faied");
956             return false;
957     }
958     return true;
959 }
960 
CreateProxyErrCode(std::unordered_map<int32_t,int32_t> & errCodeMap)961 static void CreateProxyErrCode(std::unordered_map<int32_t, int32_t> &errCodeMap)
962 {
963     errCodeMap = {
964         { ERR_APPEXECFWK_INSTALL_PARAM_ERROR, IStatusReceiver::ERR_INSTALL_PARAM_ERROR },
965         { ERR_APPEXECFWK_INSTALL_INTERNAL_ERROR, IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR },
966         { ERR_APPEXECFWK_INSTALL_FILE_PATH_INVALID, IStatusReceiver::ERR_INSTALL_FILE_PATH_INVALID },
967         { ERR_APPEXECFWK_INSTALL_DISK_MEM_INSUFFICIENT, IStatusReceiver::ERR_INSTALL_DISK_MEM_INSUFFICIENT },
968         { ERR_BUNDLEMANAGER_INSTALL_CODE_SIGNATURE_FILE_IS_INVALID,
969             IStatusReceiver::ERR_INSTALL_CODE_SIGNATURE_FILE_IS_INVALID}
970     };
971 }
972 
InstallExecuter(napi_env env,void * data)973 void InstallExecuter(napi_env env, void *data)
974 {
975     AsyncInstallCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncInstallCallbackInfo *>(data);
976     if (asyncCallbackInfo == nullptr) {
977         APP_LOGE("asyncCallbackInfo is nullptr");
978         return;
979     }
980     const std::vector<std::string> bundleFilePath = asyncCallbackInfo->hapFiles;
981     InstallResult &installResult = asyncCallbackInfo->installResult;
982     if (bundleFilePath.empty() && asyncCallbackInfo->installParam.sharedBundleDirPaths.empty()) {
983         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_FILE_PATH_INVALID);
984         return;
985     }
986     auto iBundleInstaller = CommonFunc::GetBundleInstaller();
987     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
988         APP_LOGE("can not get iBundleInstaller");
989         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
990         return;
991     }
992 
993     sptr<InstallerCallback> callback = new (std::nothrow) InstallerCallback();
994     sptr<BundleDeathRecipient> recipient(new (std::nothrow) BundleDeathRecipient(callback));
995     if (callback == nullptr || recipient == nullptr) {
996         APP_LOGE("callback or death recipient is nullptr");
997         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
998         return;
999     }
1000     iBundleInstaller->AsObject()->AddDeathRecipient(recipient);
1001 
1002     ErrCode res = iBundleInstaller->StreamInstall(bundleFilePath, asyncCallbackInfo->installParam, callback);
1003     if (res == ERR_OK) {
1004         installResult.resultCode = callback->GetResultCode();
1005         APP_LOGD("InnerInstall resultCode %{public}d", installResult.resultCode);
1006         installResult.resultMsg = callback->GetResultMsg();
1007         APP_LOGD("InnerInstall resultMsg %{public}s", installResult.resultMsg.c_str());
1008         return;
1009     }
1010     APP_LOGE("install failed due to %{public}d", res);
1011     std::unordered_map<int32_t, int32_t> proxyErrCodeMap;
1012     CreateProxyErrCode(proxyErrCodeMap);
1013     if (proxyErrCodeMap.find(res) != proxyErrCodeMap.end()) {
1014         installResult.resultCode = proxyErrCodeMap.at(res);
1015     } else {
1016         installResult.resultCode = IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR;
1017     }
1018 }
1019 
GetFunctionName(const InstallOption & option)1020 static std::string GetFunctionName(const InstallOption &option)
1021 {
1022     if (option == InstallOption::INSTALL) {
1023         return RESOURCE_NAME_OF_INSTALL;
1024     } else if (option == InstallOption::RECOVER) {
1025         return RESOURCE_NAME_OF_RECOVER;
1026     } else if (option == InstallOption::UNINSTALL) {
1027         return RESOURCE_NAME_OF_UNINSTALL;
1028     } else if (option == InstallOption::UPDATE_BUNDLE_FOR_SELF) {
1029         return RESOURCE_NAME_OF_UPDATE_BUNDLE_FOR_SELF;
1030     } else if (option == InstallOption::UNINSTALL_AND_RECOVER) {
1031         return RESOURCE_NAME_OF_UNINSTALL_AND_RECOVER;
1032     }
1033     return EMPTY_STRING;
1034 }
1035 
OperationCompleted(napi_env env,napi_status status,void * data)1036 void OperationCompleted(napi_env env, napi_status status, void *data)
1037 {
1038     AsyncInstallCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncInstallCallbackInfo *>(data);
1039     std::unique_ptr<AsyncInstallCallbackInfo> callbackPtr {asyncCallbackInfo};
1040     napi_value result[CALLBACK_PARAM_SIZE] = {0};
1041     ConvertInstallResult(callbackPtr->installResult);
1042     if (callbackPtr->installResult.resultCode != SUCCESS) {
1043         switch (callbackPtr->option) {
1044             case InstallOption::INSTALL:
1045                 result[FIRST_PARAM] = BusinessError::CreateCommonError(env, callbackPtr->installResult.resultCode,
1046                     RESOURCE_NAME_OF_INSTALL, INSTALL_PERMISSION);
1047                 break;
1048             case InstallOption::RECOVER:
1049                 result[FIRST_PARAM] = BusinessError::CreateCommonError(env, callbackPtr->installResult.resultCode,
1050                     RESOURCE_NAME_OF_RECOVER, RECOVER_PERMISSION);
1051                 break;
1052             case InstallOption::UNINSTALL:
1053                 result[FIRST_PARAM] = BusinessError::CreateCommonError(env, callbackPtr->installResult.resultCode,
1054                     RESOURCE_NAME_OF_UNINSTALL, UNINSTALL_PERMISSION);
1055                 break;
1056             case InstallOption::UPDATE_BUNDLE_FOR_SELF:
1057                 result[FIRST_PARAM] = BusinessError::CreateCommonError(env, callbackPtr->installResult.resultCode,
1058                     RESOURCE_NAME_OF_UPDATE_BUNDLE_FOR_SELF, INSTALL_SELF_PERMISSION);
1059                 break;
1060             case InstallOption::UNINSTALL_AND_RECOVER:
1061                 result[FIRST_PARAM] = BusinessError::CreateCommonError(env, callbackPtr->installResult.resultCode,
1062                     RESOURCE_NAME_OF_UNINSTALL_AND_RECOVER, UNINSTALL_PERMISSION);
1063                 break;
1064             default:
1065                 break;
1066         }
1067     } else {
1068         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[FIRST_PARAM]));
1069     }
1070     callbackPtr->err = callbackPtr->installResult.resultCode;
1071     APP_LOGI("installer callback");
1072     CommonFunc::NapiReturnDeferred<AsyncInstallCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1073 }
1074 
1075 /**
1076  * Promise and async callback
1077  */
Install(napi_env env,napi_callback_info info)1078 napi_value Install(napi_env env, napi_callback_info info)
1079 {
1080     APP_LOGI("Install called");
1081     // obtain arguments of install interface
1082     NapiArg args(env, info);
1083     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
1084         APP_LOGE("init param failed");
1085         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1086         return nullptr;
1087     }
1088     auto argc = args.GetMaxArgc();
1089     APP_LOGD("the number of argc is  %{public}zu", argc);
1090     if (argc < ARGS_SIZE_ONE) {
1091         APP_LOGE("the params number is incorrect");
1092         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1093         return nullptr;
1094     }
1095     std::unique_ptr<AsyncInstallCallbackInfo> callbackPtr = std::make_unique<AsyncInstallCallbackInfo>(env);
1096     callbackPtr->option = InstallOption::INSTALL;
1097     for (size_t i = 0; i < argc; ++i) {
1098         napi_valuetype valueType = napi_undefined;
1099         napi_typeof(env, args[i], &valueType);
1100         if (i == ARGS_POS_ZERO) {
1101             if (!CommonFunc::ParseStringArray(env, callbackPtr->hapFiles, args[i])) {
1102                 APP_LOGE("Flags %{public}s invalid", callbackPtr->bundleName.c_str());
1103                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1104                 return nullptr;
1105             }
1106         } else if (i == ARGS_POS_ONE) {
1107             if (valueType == napi_function) {
1108                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &callbackPtr->callback));
1109                 break;
1110             }
1111             if (valueType == napi_object && !ParseInstallParam(env, args[i], callbackPtr->installParam)) {
1112                 APP_LOGE("Parse installParam failed");
1113                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1114                 return nullptr;
1115             }
1116         } else if (i == ARGS_POS_TWO) {
1117             if (valueType == napi_function) {
1118                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &callbackPtr->callback));
1119                 break;
1120             }
1121         } else {
1122             APP_LOGE("param check error");
1123             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1124             return nullptr;
1125         }
1126     }
1127     if (!CheckInstallParam(env, callbackPtr->installParam)) {
1128         return nullptr;
1129     }
1130     if (callbackPtr->hapFiles.empty() && !callbackPtr->installParam.verifyCodeParams.empty()) {
1131         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, HAPS_FILE_NEEDED);
1132         return nullptr;
1133     }
1134     auto promise = CommonFunc::AsyncCallNativeMethod(env, callbackPtr.get(), RESOURCE_NAME_OF_INSTALL, InstallExecuter,
1135         OperationCompleted);
1136     callbackPtr.release();
1137     APP_LOGI("call Install done");
1138     return promise;
1139 }
1140 
UninstallOrRecoverExecuter(napi_env env,void * data)1141 void UninstallOrRecoverExecuter(napi_env env, void *data)
1142 {
1143     AsyncInstallCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncInstallCallbackInfo *>(data);
1144     if (asyncCallbackInfo == nullptr) {
1145         APP_LOGE("asyncCallbackInfo is nullptr");
1146         return;
1147     }
1148     const std::string bundleName = asyncCallbackInfo->bundleName;
1149     InstallResult &installResult = asyncCallbackInfo->installResult;
1150     if (bundleName.empty()) {
1151         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_RECOVER_INVALID_BUNDLE_NAME);
1152         return;
1153     }
1154     auto iBundleInstaller = CommonFunc::GetBundleInstaller();
1155     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
1156         APP_LOGE("can not get iBundleInstaller");
1157         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
1158         return;
1159     }
1160 
1161     sptr<InstallerCallback> callback = new (std::nothrow) InstallerCallback();
1162     sptr<BundleDeathRecipient> recipient(new (std::nothrow) BundleDeathRecipient(callback));
1163     if (callback == nullptr || recipient == nullptr) {
1164         APP_LOGE("callback or death recipient is nullptr");
1165         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
1166         return;
1167     }
1168     iBundleInstaller->AsObject()->AddDeathRecipient(recipient);
1169     if (asyncCallbackInfo->option == InstallOption::RECOVER) {
1170         iBundleInstaller->Recover(bundleName, asyncCallbackInfo->installParam, callback);
1171     } else if (asyncCallbackInfo->option == InstallOption::UNINSTALL) {
1172         iBundleInstaller->Uninstall(bundleName, asyncCallbackInfo->installParam, callback);
1173     } else {
1174         APP_LOGE("error install option");
1175         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
1176         return;
1177     }
1178     installResult.resultMsg = callback->GetResultMsg();
1179     APP_LOGD("InnerRecover resultMsg %{public}s", installResult.resultMsg.c_str());
1180     installResult.resultCode = callback->GetResultCode();
1181     APP_LOGD("InnerRecover resultCode %{public}d", installResult.resultCode);
1182 }
1183 
UninstallByUninstallParamExecuter(napi_env env,void * data)1184 void UninstallByUninstallParamExecuter(napi_env env, void* data)
1185 {
1186     AsyncInstallCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncInstallCallbackInfo *>(data);
1187     if (asyncCallbackInfo == nullptr) {
1188         APP_LOGE("asyncCallbackInfo is nullptr");
1189         return;
1190     }
1191     const std::string bundleName = asyncCallbackInfo->uninstallParam.bundleName;
1192     InstallResult &installResult = asyncCallbackInfo->installResult;
1193     if (bundleName.empty()) {
1194         installResult.resultCode =
1195             static_cast<int32_t>(IStatusReceiver::ERR_APPEXECFWK_UNINSTALL_SHARE_APP_LIBRARY_IS_NOT_EXIST);
1196         return;
1197     }
1198     auto iBundleInstaller = CommonFunc::GetBundleInstaller();
1199     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
1200         APP_LOGE("can not get iBundleInstaller");
1201         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
1202         return;
1203     }
1204     sptr<InstallerCallback> callback = new (std::nothrow) InstallerCallback();
1205     sptr<BundleDeathRecipient> recipient(new (std::nothrow) BundleDeathRecipient(callback));
1206     if (callback == nullptr || recipient == nullptr) {
1207         APP_LOGE("callback or death recipient is nullptr");
1208         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
1209         return;
1210     }
1211     iBundleInstaller->AsObject()->AddDeathRecipient(recipient);
1212     iBundleInstaller->Uninstall(asyncCallbackInfo->uninstallParam, callback);
1213     installResult.resultMsg = callback->GetResultMsg();
1214     installResult.resultCode = callback->GetResultCode();
1215 }
1216 
UninstallByUninstallParam(napi_env env,napi_callback_info info,std::unique_ptr<AsyncInstallCallbackInfo> & callbackPtr)1217 napi_value UninstallByUninstallParam(napi_env env, napi_callback_info info,
1218     std::unique_ptr<AsyncInstallCallbackInfo> &callbackPtr)
1219 {
1220     NapiArg args(env, info);
1221     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1222         APP_LOGE("init param failed");
1223         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1224         return nullptr;
1225     }
1226     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
1227         napi_valuetype valueType = napi_undefined;
1228         napi_typeof(env, args[i], &valueType);
1229         if (i == ARGS_POS_ZERO) {
1230             if (!ParseUninstallParam(env, args[i], callbackPtr->uninstallParam)) {
1231                 APP_LOGE("parse uninstallParam failed");
1232                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1233                 return nullptr;
1234             }
1235         } else if ((i == ARGS_POS_ONE) && (valueType == napi_function)) {
1236             NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &callbackPtr->callback));
1237             break;
1238         } else {
1239             APP_LOGE("param check error");
1240             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1241             return nullptr;
1242         }
1243     }
1244     auto promise = CommonFunc::AsyncCallNativeMethod(env, callbackPtr.get(), GetFunctionName(callbackPtr->option),
1245         UninstallByUninstallParamExecuter, OperationCompleted);
1246     callbackPtr.release();
1247     return promise;
1248 }
1249 
UninstallOrRecover(napi_env env,napi_callback_info info,std::unique_ptr<AsyncInstallCallbackInfo> & callbackPtr)1250 napi_value UninstallOrRecover(napi_env env, napi_callback_info info,
1251     std::unique_ptr<AsyncInstallCallbackInfo> &callbackPtr)
1252 {
1253     APP_LOGD("UninstallOrRecover by bundleName called");
1254     // obtain arguments of install interface
1255     NapiArg args(env, info);
1256     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
1257         APP_LOGE("init param failed");
1258         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1259         return nullptr;
1260     }
1261 
1262     auto argc = args.GetMaxArgc();
1263     APP_LOGD("the number of argc is  %{public}zu", argc);
1264     if (argc < ARGS_SIZE_ONE) {
1265         APP_LOGE("the params number is incorrect");
1266         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1267         return nullptr;
1268     }
1269 
1270     for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
1271         napi_valuetype valueType = napi_undefined;
1272         napi_typeof(env, args[i], &valueType);
1273         if (i == ARGS_POS_ZERO) {
1274             if (!CommonFunc::ParseString(env, args[i], callbackPtr->bundleName)) {
1275                 APP_LOGE("Flags %{public}s invalid", callbackPtr->bundleName.c_str());
1276                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1277                 return nullptr;
1278             }
1279         } else if (i == ARGS_POS_ONE) {
1280             if (valueType == napi_function) {
1281                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &callbackPtr->callback));
1282                 break;
1283             }
1284             if (valueType == napi_object && !ParseInstallParam(env, args[i], callbackPtr->installParam)) {
1285                 APP_LOGE("Parse installParam.hashParams failed");
1286                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1287                 return nullptr;
1288             }
1289         } else if (i == ARGS_POS_TWO) {
1290             if (valueType == napi_function) {
1291                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &callbackPtr->callback));
1292                 break;
1293             }
1294         } else {
1295             APP_LOGE("param check error");
1296             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1297             return nullptr;
1298         }
1299     }
1300 
1301     auto promise = CommonFunc::AsyncCallNativeMethod(env, callbackPtr.get(), GetFunctionName(callbackPtr->option),
1302         UninstallOrRecoverExecuter, OperationCompleted);
1303     callbackPtr.release();
1304     return promise;
1305 }
1306 
Recover(napi_env env,napi_callback_info info)1307 napi_value Recover(napi_env env, napi_callback_info info)
1308 {
1309     APP_LOGI("Recover called");
1310     std::unique_ptr<AsyncInstallCallbackInfo> callbackPtr = std::make_unique<AsyncInstallCallbackInfo>(env);
1311     callbackPtr->option = InstallOption::RECOVER;
1312     APP_LOGI("call Recover done");
1313     return UninstallOrRecover(env, info, callbackPtr);
1314 }
1315 
Uninstall(napi_env env,napi_callback_info info)1316 napi_value Uninstall(napi_env env, napi_callback_info info)
1317 {
1318     APP_LOGI_NOFUNC("Uninstall called");
1319     std::unique_ptr<AsyncInstallCallbackInfo> callbackPtr = std::make_unique<AsyncInstallCallbackInfo>(env);
1320     callbackPtr->option = InstallOption::UNINSTALL;
1321     // uninstall uninstallParam
1322     NapiArg args(env, info);
1323     args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE);
1324     napi_valuetype firstType = napi_undefined;
1325     napi_typeof(env, args[FIRST_PARAM], &firstType);
1326     if (firstType == napi_object) {
1327         return UninstallByUninstallParam(env, info, callbackPtr);
1328     }
1329     APP_LOGI_NOFUNC("call Uninstall done");
1330     return UninstallOrRecover(env, info, callbackPtr);
1331 }
1332 
BundleInstallerConstructor(napi_env env,napi_callback_info info)1333 napi_value BundleInstallerConstructor(napi_env env, napi_callback_info info)
1334 {
1335     napi_value jsthis = nullptr;
1336     NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &jsthis, nullptr));
1337     return jsthis;
1338 }
1339 
1340 /**
1341  * Promise and async callback
1342  */
UpdateBundleForSelf(napi_env env,napi_callback_info info)1343 napi_value UpdateBundleForSelf(napi_env env, napi_callback_info info)
1344 {
1345     APP_LOGI("UpdateBundleForSelf called");
1346     // obtain arguments of install interface
1347     NapiArg args(env, info);
1348     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_THREE)) {
1349         APP_LOGE("init param failed");
1350         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1351         return nullptr;
1352     }
1353     auto argc = args.GetMaxArgc();
1354     std::unique_ptr<AsyncInstallCallbackInfo> callbackPtr = std::make_unique<AsyncInstallCallbackInfo>(env);
1355     callbackPtr->option = InstallOption::UPDATE_BUNDLE_FOR_SELF;
1356     for (size_t i = 0; i < argc; ++i) {
1357         napi_valuetype valueType = napi_undefined;
1358         napi_typeof(env, args[i], &valueType);
1359         if (i == ARGS_POS_ZERO) {
1360             if (!CommonFunc::ParseStringArray(env, callbackPtr->hapFiles, args[i])) {
1361                 APP_LOGE("Flags %{public}s invalid", callbackPtr->bundleName.c_str());
1362                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1363                 return nullptr;
1364             }
1365         } else if (i == ARGS_POS_ONE) {
1366             if (valueType == napi_function) {
1367                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &callbackPtr->callback));
1368                 break;
1369             }
1370             if (valueType == napi_object && !ParseInstallParam(env, args[i], callbackPtr->installParam)) {
1371                 APP_LOGE("Parse installParam failed");
1372                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1373                 return nullptr;
1374             }
1375         } else if (i == ARGS_POS_TWO) {
1376             if (valueType == napi_function) {
1377                 NAPI_CALL(env, napi_create_reference(env, args[i], NAPI_RETURN_ONE, &callbackPtr->callback));
1378                 break;
1379             }
1380         } else {
1381             APP_LOGE("param check error");
1382             BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PARAMETERS, CORRESPONDING_TYPE);
1383             return nullptr;
1384         }
1385     }
1386     if (!CheckInstallParam(env, callbackPtr->installParam)) {
1387         return nullptr;
1388     }
1389     if (callbackPtr->hapFiles.empty() && !callbackPtr->installParam.verifyCodeParams.empty()) {
1390         BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, HAPS_FILE_NEEDED);
1391         return nullptr;
1392     }
1393     callbackPtr->installParam.isSelfUpdate = true;
1394     auto promise = CommonFunc::AsyncCallNativeMethod(env, callbackPtr.get(), RESOURCE_NAME_OF_INSTALL, InstallExecuter,
1395         OperationCompleted);
1396     callbackPtr.release();
1397     APP_LOGI("call UpdateBundleForSelf done");
1398     return promise;
1399 }
1400 
UninstallAndRecoverExecuter(napi_env env,void * data)1401 void UninstallAndRecoverExecuter(napi_env env, void *data)
1402 {
1403     AsyncInstallCallbackInfo *asyncCallbackInfo = reinterpret_cast<AsyncInstallCallbackInfo *>(data);
1404     if (asyncCallbackInfo == nullptr) {
1405         APP_LOGE("asyncCallbackInfo is nullptr");
1406         return;
1407     }
1408     const std::string bundleName = asyncCallbackInfo->bundleName;
1409     InstallResult &installResult = asyncCallbackInfo->installResult;
1410     if (bundleName.empty()) {
1411         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_RECOVER_INVALID_BUNDLE_NAME);
1412         return;
1413     }
1414     auto iBundleInstaller = CommonFunc::GetBundleInstaller();
1415     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
1416         APP_LOGE("can not get iBundleInstaller");
1417         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
1418         return;
1419     }
1420     sptr<InstallerCallback> callback = new (std::nothrow) InstallerCallback();
1421     sptr<BundleDeathRecipient> recipient(new (std::nothrow) BundleDeathRecipient(callback));
1422     if (callback == nullptr || recipient == nullptr) {
1423         APP_LOGE("callback or death recipient is nullptr");
1424         installResult.resultCode = static_cast<int32_t>(IStatusReceiver::ERR_INSTALL_INTERNAL_ERROR);
1425         return;
1426     }
1427     iBundleInstaller->AsObject()->AddDeathRecipient(recipient);
1428     iBundleInstaller->UninstallAndRecover(bundleName, asyncCallbackInfo->installParam, callback);
1429     installResult.resultMsg = callback->GetResultMsg();
1430     installResult.resultCode = callback->GetResultCode();
1431 }
1432 
UninstallAndRecover(napi_env env,napi_callback_info info)1433 napi_value UninstallAndRecover(napi_env env, napi_callback_info info)
1434 {
1435     APP_LOGI("UninstallAndRecover called");
1436     NapiArg args(env, info);
1437     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1438         APP_LOGE("init param failed");
1439         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1440         return nullptr;
1441     }
1442     std::unique_ptr<AsyncInstallCallbackInfo> callbackPtr = std::make_unique<AsyncInstallCallbackInfo>(env);
1443     callbackPtr->option = InstallOption::UNINSTALL_AND_RECOVER;
1444     for (size_t i = 0; i < args.GetArgc(); ++i) {
1445         napi_valuetype valueType = napi_undefined;
1446         napi_typeof(env, args[i], &valueType);
1447         if (i == ARGS_POS_ZERO) {
1448             if (!CommonFunc::ParseString(env, args[i], callbackPtr->bundleName)) {
1449                 APP_LOGE("bundleName %{public}s invalid!", callbackPtr->bundleName.c_str());
1450                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1451                 return nullptr;
1452             }
1453         } else if (i == ARGS_POS_ONE) {
1454             if (valueType != napi_object || !ParseInstallParam(env, args[i], callbackPtr->installParam)) {
1455                 APP_LOGW("Parse installParam failed");
1456             }
1457         } else {
1458             APP_LOGE("The number of parameters is incorrect.");
1459             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1460             return nullptr;
1461         }
1462     }
1463     auto promise = CommonFunc::AsyncCallNativeMethod(env, callbackPtr.get(), RESOURCE_NAME_OF_UNINSTALL_AND_RECOVER,
1464         UninstallAndRecoverExecuter, OperationCompleted);
1465     callbackPtr.release();
1466     APP_LOGI("call UninstallAndRecover done");
1467     return promise;
1468 }
1469 
InnerAddExtResource(const std::string & bundleName,const std::vector<std::string> & filePaths)1470 ErrCode InnerAddExtResource(
1471     const std::string &bundleName, const std::vector<std::string> &filePaths)
1472 {
1473     auto extResourceManager = CommonFunc::GetExtendResourceManager();
1474     if (extResourceManager == nullptr) {
1475         APP_LOGE("extResourceManager is null");
1476         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1477     }
1478 
1479     std::vector<std::string> destFiles;
1480     ErrCode ret = extResourceManager->CopyFiles(filePaths, destFiles);
1481     if (ret != ERR_OK) {
1482         APP_LOGE("CopyFiles failed");
1483         return CommonFunc::ConvertErrCode(ret);
1484     }
1485 
1486     ret = extResourceManager->AddExtResource(bundleName, destFiles);
1487     if (ret != ERR_OK) {
1488         APP_LOGE("AddExtResource failed");
1489     }
1490 
1491     return CommonFunc::ConvertErrCode(ret);
1492 }
1493 
AddExtResourceExec(napi_env env,void * data)1494 void AddExtResourceExec(napi_env env, void *data)
1495 {
1496     ExtResourceCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtResourceCallbackInfo *>(data);
1497     if (asyncCallbackInfo == nullptr) {
1498         APP_LOGE("asyncCallbackInfo is null");
1499         return;
1500     }
1501     asyncCallbackInfo->err = InnerAddExtResource(
1502         asyncCallbackInfo->bundleName, asyncCallbackInfo->filePaths);
1503 }
1504 
AddExtResourceComplete(napi_env env,napi_status status,void * data)1505 void AddExtResourceComplete(napi_env env, napi_status status, void *data)
1506 {
1507     ExtResourceCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtResourceCallbackInfo *>(data);
1508     if (asyncCallbackInfo == nullptr) {
1509         APP_LOGE("asyncCallbackInfo is null");
1510         return;
1511     }
1512 
1513     std::unique_ptr<ExtResourceCallbackInfo> callbackPtr {asyncCallbackInfo};
1514     napi_value result[ARGS_POS_TWO] = {0};
1515     if (asyncCallbackInfo->err == NO_ERROR) {
1516         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1517     } else {
1518         result[0] = BusinessError::CreateCommonError(
1519             env, asyncCallbackInfo->err, ADD_EXT_RESOURCE, Constants::PERMISSION_INSTALL_BUNDLE);
1520     }
1521 
1522     CommonFunc::NapiReturnDeferred<ExtResourceCallbackInfo>(
1523         env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1524 }
1525 
AddExtResource(napi_env env,napi_callback_info info)1526 napi_value AddExtResource(napi_env env, napi_callback_info info)
1527 {
1528     APP_LOGD("AddExtResource called");
1529     NapiArg args(env, info);
1530     ExtResourceCallbackInfo *asyncCallbackInfo = new (std::nothrow) ExtResourceCallbackInfo(env);
1531     if (asyncCallbackInfo == nullptr) {
1532         APP_LOGE("asyncCallbackInfo is null");
1533         return nullptr;
1534     }
1535     std::unique_ptr<ExtResourceCallbackInfo> callbackPtr {asyncCallbackInfo};
1536     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
1537         APP_LOGE("param count invalid");
1538         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1539         return nullptr;
1540     }
1541     for (size_t i = 0; i < args.GetArgc(); ++i) {
1542         napi_valuetype valueType = napi_undefined;
1543         napi_typeof(env, args[i], &valueType);
1544         if (i == ARGS_POS_ZERO) {
1545             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
1546                 APP_LOGE("bundleName invalid");
1547                 BusinessError::ThrowParameterTypeError(
1548                     env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1549                 return nullptr;
1550             }
1551         } else if (i == ARGS_POS_ONE) {
1552             if (CommonFunc::ParseStringArray(env, asyncCallbackInfo->filePaths, args[i]) == nullptr) {
1553                 APP_LOGE("filePaths invalid");
1554                 BusinessError::ThrowParameterTypeError(
1555                     env, ERROR_PARAM_CHECK_ERROR, FILE_PATH, TYPE_ARRAY);
1556                 return nullptr;
1557             }
1558         }
1559     }
1560     auto promise = CommonFunc::AsyncCallNativeMethod<ExtResourceCallbackInfo>(
1561         env, asyncCallbackInfo, "AddExtResource", AddExtResourceExec, AddExtResourceComplete);
1562     callbackPtr.release();
1563     APP_LOGD("call AddExtResource done");
1564     return promise;
1565 }
1566 
InnerRemoveExtResource(const std::string & bundleName,const std::vector<std::string> & moduleNames)1567 ErrCode InnerRemoveExtResource(
1568     const std::string &bundleName, const std::vector<std::string> &moduleNames)
1569 {
1570     auto extResourceManager = CommonFunc::GetExtendResourceManager();
1571     if (extResourceManager == nullptr) {
1572         APP_LOGE("extResourceManager is null");
1573         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1574     }
1575 
1576     ErrCode ret = extResourceManager->RemoveExtResource(bundleName, moduleNames);
1577     if (ret != ERR_OK) {
1578         APP_LOGE("RemoveExtResource failed");
1579     }
1580 
1581     return CommonFunc::ConvertErrCode(ret);
1582 }
1583 
RemoveExtResourceExec(napi_env env,void * data)1584 void RemoveExtResourceExec(napi_env env, void *data)
1585 {
1586     ExtResourceCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtResourceCallbackInfo *>(data);
1587     if (asyncCallbackInfo == nullptr) {
1588         APP_LOGE("asyncCallbackInfo is null");
1589         return;
1590     }
1591     asyncCallbackInfo->err = InnerRemoveExtResource(
1592         asyncCallbackInfo->bundleName, asyncCallbackInfo->moduleNames);
1593 }
1594 
RemoveExtResourceComplete(napi_env env,napi_status status,void * data)1595 void RemoveExtResourceComplete(napi_env env, napi_status status, void *data)
1596 {
1597     ExtResourceCallbackInfo *asyncCallbackInfo = reinterpret_cast<ExtResourceCallbackInfo *>(data);
1598     if (asyncCallbackInfo == nullptr) {
1599         APP_LOGE("asyncCallbackInfo is null");
1600         return;
1601     }
1602 
1603     std::unique_ptr<ExtResourceCallbackInfo> callbackPtr {asyncCallbackInfo};
1604     napi_value result[ARGS_POS_TWO] = {0};
1605     if (asyncCallbackInfo->err == NO_ERROR) {
1606         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[0]));
1607     } else {
1608         result[0] = BusinessError::CreateCommonError(
1609             env, asyncCallbackInfo->err, REMOVE_EXT_RESOURCE, Constants::PERMISSION_INSTALL_BUNDLE);
1610     }
1611 
1612     CommonFunc::NapiReturnDeferred<ExtResourceCallbackInfo>(
1613         env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1614 }
1615 
RemoveExtResource(napi_env env,napi_callback_info info)1616 napi_value RemoveExtResource(napi_env env, napi_callback_info info)
1617 {
1618     APP_LOGD("RemoveExtResource called");
1619     NapiArg args(env, info);
1620     ExtResourceCallbackInfo *asyncCallbackInfo = new (std::nothrow) ExtResourceCallbackInfo(env);
1621     if (asyncCallbackInfo == nullptr) {
1622         APP_LOGE("asyncCallbackInfo is null");
1623         return nullptr;
1624     }
1625     std::unique_ptr<ExtResourceCallbackInfo> callbackPtr {asyncCallbackInfo};
1626     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
1627         APP_LOGE("param count invalid");
1628         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1629         return nullptr;
1630     }
1631     for (size_t i = 0; i < args.GetArgc(); ++i) {
1632         napi_valuetype valueType = napi_undefined;
1633         napi_typeof(env, args[i], &valueType);
1634         if (i == ARGS_POS_ZERO) {
1635             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
1636                 APP_LOGE("bundleName invalid");
1637                 BusinessError::ThrowParameterTypeError(
1638                     env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1639                 return nullptr;
1640             }
1641         } else if (i == ARGS_POS_ONE) {
1642             if (CommonFunc::ParseStringArray(env, asyncCallbackInfo->moduleNames, args[i]) == nullptr) {
1643                 APP_LOGE("moduleNames invalid");
1644                 BusinessError::ThrowParameterTypeError(
1645                     env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_ARRAY);
1646                 return nullptr;
1647             }
1648         }
1649     }
1650     auto promise = CommonFunc::AsyncCallNativeMethod<ExtResourceCallbackInfo>(
1651         env, asyncCallbackInfo, "RemoveExtResource", RemoveExtResourceExec, RemoveExtResourceComplete);
1652     callbackPtr.release();
1653     APP_LOGD("call RemoveExtResource done");
1654     return promise;
1655 }
1656 
InnerCreateAppClone(std::string & bundleName,int32_t userId,int32_t & appIndex)1657 static ErrCode InnerCreateAppClone(std::string &bundleName, int32_t userId, int32_t &appIndex)
1658 {
1659     auto iBundleMgr = CommonFunc::GetBundleMgr();
1660     if (iBundleMgr == nullptr) {
1661         APP_LOGE("can not get iBundleMgr");
1662         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1663     }
1664     auto iBundleInstaller = iBundleMgr->GetBundleInstaller();
1665     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
1666         APP_LOGE("can not get iBundleInstaller");
1667         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1668     }
1669     ErrCode result = iBundleInstaller->InstallCloneApp(bundleName, userId, appIndex);
1670     APP_LOGD("InstallCloneApp result is %{public}d", result);
1671     return result;
1672 }
1673 
CreateAppCloneExec(napi_env env,void * data)1674 void CreateAppCloneExec(napi_env env, void *data)
1675 {
1676     CreateAppCloneCallbackInfo *asyncCallbackInfo = reinterpret_cast<CreateAppCloneCallbackInfo *>(data);
1677     if (asyncCallbackInfo == nullptr) {
1678         APP_LOGE("asyncCallbackInfo is null");
1679         return;
1680     }
1681     APP_LOGD("CreateAppCloneExec param: bundleName = %{public}s, userId = %{public}d, appIndex = %{public}d",
1682         asyncCallbackInfo->bundleName.c_str(),
1683         asyncCallbackInfo->userId,
1684         asyncCallbackInfo->appIndex);
1685     asyncCallbackInfo->err =
1686         InnerCreateAppClone(asyncCallbackInfo->bundleName, asyncCallbackInfo->userId, asyncCallbackInfo->appIndex);
1687 }
1688 
CreateAppCloneComplete(napi_env env,napi_status status,void * data)1689 void CreateAppCloneComplete(napi_env env, napi_status status, void *data)
1690 {
1691     CreateAppCloneCallbackInfo *asyncCallbackInfo = reinterpret_cast<CreateAppCloneCallbackInfo *>(data);
1692     if (asyncCallbackInfo == nullptr) {
1693         APP_LOGE("asyncCallbackInfo is null");
1694         return;
1695     }
1696     std::unique_ptr<CreateAppCloneCallbackInfo> callbackPtr {asyncCallbackInfo};
1697     asyncCallbackInfo->err = CommonFunc::ConvertErrCode(asyncCallbackInfo->err);
1698     APP_LOGD("CreateAppCloneComplete err is %{public}d, appIndex is %{public}d",
1699         asyncCallbackInfo->err,
1700         asyncCallbackInfo->appIndex);
1701     napi_value result[ARGS_SIZE_TWO] = {0};
1702     if (asyncCallbackInfo->err == SUCCESS) {
1703         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[FIRST_PARAM]));
1704         NAPI_CALL_RETURN_VOID(env, napi_create_int32(env, asyncCallbackInfo->appIndex, &result[SECOND_PARAM]));
1705     } else {
1706         result[FIRST_PARAM] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
1707             CREATE_APP_CLONE, Constants::PERMISSION_INSTALL_CLONE_BUNDLE);
1708     }
1709     CommonFunc::NapiReturnDeferred<CreateAppCloneCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_TWO);
1710 }
1711 
ParseAppCloneParam(napi_env env,napi_value args,int32_t & userId,int32_t & appIndex)1712 void ParseAppCloneParam(napi_env env, napi_value args, int32_t &userId, int32_t &appIndex)
1713 {
1714     if (!ParseUserId(env, args, userId)) {
1715         APP_LOGI("parse userId failed. assign a default value = %{public}d", userId);
1716     }
1717     if (ParseAppIndex(env, args, appIndex)) {
1718         if (appIndex == 0) {
1719             APP_LOGI("parse appIndex success, but appIndex is 0, assign a value: %{public}d", ILLEGAL_APP_INDEX);
1720             appIndex = ILLEGAL_APP_INDEX;
1721         }
1722     } else {
1723         APP_LOGI("parse appIndex failed. assign a default value = %{public}d", appIndex);
1724     }
1725 }
1726 
CreateAppClone(napi_env env,napi_callback_info info)1727 napi_value CreateAppClone(napi_env env, napi_callback_info info)
1728 {
1729     APP_LOGI("begin to CreateAppClone");
1730     NapiArg args(env, info);
1731     std::unique_ptr<CreateAppCloneCallbackInfo> asyncCallbackInfo = std::make_unique<CreateAppCloneCallbackInfo>(env);
1732     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1733         APP_LOGW("param count invalid");
1734         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1735         return nullptr;
1736     }
1737     size_t argc = args.GetMaxArgc();
1738     for (size_t i = 0; i < argc; ++i) {
1739         napi_valuetype valueType = napi_undefined;
1740         napi_typeof(env, args[i], &valueType);
1741         if (i == ARGS_POS_ZERO) {
1742             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
1743                 APP_LOGW("parse bundleName failed");
1744                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1745                 return nullptr;
1746             }
1747         } else if (i == ARGS_POS_ONE) {
1748             if (valueType == napi_object) {
1749                 ParseAppCloneParam(env, args[i], asyncCallbackInfo->userId, asyncCallbackInfo->appIndex);
1750             }
1751         } else {
1752             APP_LOGW("The number of parameters is incorrect");
1753             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1754             return nullptr;
1755         }
1756     }
1757     if (asyncCallbackInfo->userId == Constants::UNSPECIFIED_USERID) {
1758         asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1759     }
1760     auto promise = CommonFunc::AsyncCallNativeMethod<CreateAppCloneCallbackInfo>(
1761         env, asyncCallbackInfo.get(), CREATE_APP_CLONE, CreateAppCloneExec, CreateAppCloneComplete);
1762     asyncCallbackInfo.release();
1763     APP_LOGI("call napi CreateAppClone done");
1764     return promise;
1765 }
1766 
InnerDestroyAppClone(std::string & bundleName,int32_t userId,int32_t appIndex,DestroyAppCloneParam & destroyAppCloneParam)1767 static ErrCode InnerDestroyAppClone(std::string &bundleName, int32_t userId, int32_t appIndex,
1768                                     DestroyAppCloneParam &destroyAppCloneParam)
1769 {
1770     auto iBundleMgr = CommonFunc::GetBundleMgr();
1771     if (iBundleMgr == nullptr) {
1772         APP_LOGE("can not get iBundleMgr");
1773         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1774     }
1775     auto iBundleInstaller = iBundleMgr->GetBundleInstaller();
1776     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
1777         APP_LOGE("can not get iBundleInstaller");
1778         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1779     }
1780     ErrCode result = iBundleInstaller->UninstallCloneApp(bundleName, userId, appIndex, destroyAppCloneParam);
1781     APP_LOGD("UninstallCloneApp result is %{public}d", result);
1782     return result;
1783 }
1784 
DestroyAppCloneExec(napi_env env,void * data)1785 void DestroyAppCloneExec(napi_env env, void *data)
1786 {
1787     CreateAppCloneCallbackInfo *asyncCallbackInfo = reinterpret_cast<CreateAppCloneCallbackInfo *>(data);
1788     if (asyncCallbackInfo == nullptr) {
1789         APP_LOGE("asyncCallbackInfo is null");
1790         return;
1791     }
1792     APP_LOGD("DestroyAppCloneExec param: bundleName = %{public}s, userId = %{public}d, appIndex = %{public}d",
1793         asyncCallbackInfo->bundleName.c_str(),
1794         asyncCallbackInfo->userId,
1795         asyncCallbackInfo->appIndex);
1796     asyncCallbackInfo->err =
1797         InnerDestroyAppClone(asyncCallbackInfo->bundleName, asyncCallbackInfo->userId,
1798                              asyncCallbackInfo->appIndex, asyncCallbackInfo->destroyAppCloneParam);
1799 }
1800 
DestroyAppCloneComplete(napi_env env,napi_status status,void * data)1801 void DestroyAppCloneComplete(napi_env env, napi_status status, void *data)
1802 {
1803     CreateAppCloneCallbackInfo *asyncCallbackInfo = reinterpret_cast<CreateAppCloneCallbackInfo *>(data);
1804     if (asyncCallbackInfo == nullptr) {
1805         APP_LOGE("asyncCallbackInfo is null");
1806         return;
1807     }
1808     std::unique_ptr<CreateAppCloneCallbackInfo> callbackPtr {asyncCallbackInfo};
1809     asyncCallbackInfo->err = CommonFunc::ConvertErrCode(asyncCallbackInfo->err);
1810     APP_LOGD("DestroyAppCloneComplete err is %{public}d, appIndex is %{public}d",
1811         asyncCallbackInfo->err,
1812         asyncCallbackInfo->appIndex);
1813     napi_value result[ARGS_SIZE_TWO] = {0};
1814     if (asyncCallbackInfo->err == SUCCESS) {
1815         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[FIRST_PARAM]));
1816     } else {
1817         result[FIRST_PARAM] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
1818             DESTROY_APP_CLONE, Constants::PERMISSION_UNINSTALL_CLONE_BUNDLE);
1819     }
1820     CommonFunc::NapiReturnDeferred<CreateAppCloneCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1821 }
1822 
ParseDestroyAppCloneParam(napi_env env,napi_value args,napi_valuetype valueType,int32_t & userId,DestroyAppCloneParam & destroyAppCloneParam)1823 static bool ParseDestroyAppCloneParam(napi_env env, napi_value args, napi_valuetype valueType, int32_t &userId,
1824                                       DestroyAppCloneParam &destroyAppCloneParam)
1825 {
1826     if (valueType == napi_number && !CommonFunc::ParseInt(env, args, userId)) {
1827         APP_LOGW("parse userId failed,set this parameter to the caller userId");
1828     } else if (valueType == napi_object) {
1829         if (!ParseUserId(env, args, destroyAppCloneParam.userId)) {
1830             APP_LOGW("parse userId failed,using default value");
1831         } else {
1832             userId = destroyAppCloneParam.userId;
1833         }
1834         if (!ParseParameters(env, args, destroyAppCloneParam.parameters)) {
1835             APP_LOGW("parse parameters failed,using default value");
1836         }
1837     }
1838     return true;
1839 }
1840 
DestroyAppClone(napi_env env,napi_callback_info info)1841 napi_value DestroyAppClone(napi_env env, napi_callback_info info)
1842 {
1843     APP_LOGI("begin to destroyAppClone");
1844     NapiArg args(env, info);
1845     std::unique_ptr<CreateAppCloneCallbackInfo> asyncCallbackInfo = std::make_unique<CreateAppCloneCallbackInfo>(env);
1846     if (asyncCallbackInfo == nullptr) {
1847         APP_LOGW("asyncCallbackInfo is null");
1848         return nullptr;
1849     }
1850     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
1851         APP_LOGW("param count invalid");
1852         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1853         return nullptr;
1854     }
1855     size_t argc = args.GetMaxArgc();
1856     for (size_t i = 0; i < argc; ++i) {
1857         napi_valuetype valueType = napi_undefined;
1858         napi_typeof(env, args[i], &valueType);
1859         if (i == ARGS_POS_ZERO) {
1860             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
1861                 APP_LOGW("parse bundleName failed");
1862                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1863                 return nullptr;
1864             }
1865         } else if (i == ARGS_POS_ONE) {
1866             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->appIndex)) {
1867                 APP_LOGW("parse appIndex failed");
1868                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_INDEX, TYPE_NUMBER);
1869                 return nullptr;
1870             }
1871         } else if (i == ARGS_POS_TWO) {
1872             if (!ParseDestroyAppCloneParam(
1873                 env, args[i], valueType, asyncCallbackInfo->userId, asyncCallbackInfo->destroyAppCloneParam)) {
1874                 APP_LOGW("parse destroyAppCloneParam failed");
1875             }
1876         } else {
1877             APP_LOGE("The number of parameters is incorrect");
1878             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1879             return nullptr;
1880         }
1881     }
1882     if (asyncCallbackInfo->userId == Constants::UNSPECIFIED_USERID) {
1883         asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1884     }
1885     auto promise = CommonFunc::AsyncCallNativeMethod<CreateAppCloneCallbackInfo>(
1886         env, asyncCallbackInfo.get(), DESTROY_APP_CLONE, DestroyAppCloneExec, DestroyAppCloneComplete);
1887     asyncCallbackInfo.release();
1888     APP_LOGI("call napi destroyAppTwin done");
1889     return promise;
1890 }
1891 
InnerInstallPreexistingApp(std::string & bundleName,int32_t userId)1892 static ErrCode InnerInstallPreexistingApp(std::string &bundleName, int32_t userId)
1893 {
1894     auto iBundleMgr = CommonFunc::GetBundleMgr();
1895     if (iBundleMgr == nullptr) {
1896         APP_LOGE("can not get iBundleMgr");
1897         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1898     }
1899     auto iBundleInstaller = iBundleMgr->GetBundleInstaller();
1900     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
1901         APP_LOGE("can not get iBundleInstaller");
1902         return ERROR_BUNDLE_SERVICE_EXCEPTION;
1903     }
1904     ErrCode result = iBundleInstaller->InstallExisted(bundleName, userId);
1905     APP_LOGD("result is %{public}d", result);
1906     return result;
1907 }
1908 
InstallPreexistingAppExec(napi_env env,void * data)1909 void InstallPreexistingAppExec(napi_env env, void *data)
1910 {
1911     InstallPreexistingAppCallbackInfo *asyncCallbackInfo = reinterpret_cast<InstallPreexistingAppCallbackInfo *>(data);
1912     if (asyncCallbackInfo == nullptr) {
1913         APP_LOGE("asyncCallbackInfo is null");
1914         return;
1915     }
1916     APP_LOGD("param: bundleName = %{public}s, userId = %{public}d",
1917         asyncCallbackInfo->bundleName.c_str(),
1918         asyncCallbackInfo->userId);
1919     asyncCallbackInfo->err =
1920         InnerInstallPreexistingApp(asyncCallbackInfo->bundleName, asyncCallbackInfo->userId);
1921 }
1922 
InstallPreexistingAppComplete(napi_env env,napi_status status,void * data)1923 void InstallPreexistingAppComplete(napi_env env, napi_status status, void *data)
1924 {
1925     InstallPreexistingAppCallbackInfo *asyncCallbackInfo = reinterpret_cast<InstallPreexistingAppCallbackInfo *>(data);
1926     if (asyncCallbackInfo == nullptr) {
1927         APP_LOGE("asyncCallbackInfo is null");
1928         return;
1929     }
1930     std::unique_ptr<InstallPreexistingAppCallbackInfo> callbackPtr {asyncCallbackInfo};
1931     asyncCallbackInfo->err = CommonFunc::ConvertErrCode(asyncCallbackInfo->err);
1932     APP_LOGD("err is %{public}d", asyncCallbackInfo->err);
1933 
1934     napi_value result[ARGS_SIZE_ONE] = {0};
1935     if (asyncCallbackInfo->err == SUCCESS) {
1936         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[FIRST_PARAM]));
1937     } else {
1938         result[FIRST_PARAM] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
1939             INSTALL_PREEXISTING_APP, Constants::PERMISSION_INSTALL_BUNDLE);
1940     }
1941     CommonFunc::NapiReturnDeferred<InstallPreexistingAppCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
1942 }
1943 
InstallPreexistingApp(napi_env env,napi_callback_info info)1944 napi_value InstallPreexistingApp(napi_env env, napi_callback_info info)
1945 {
1946     APP_LOGI("begin");
1947     NapiArg args(env, info);
1948     std::unique_ptr<InstallPreexistingAppCallbackInfo> asyncCallbackInfo
1949         = std::make_unique<InstallPreexistingAppCallbackInfo>(env);
1950     if (asyncCallbackInfo == nullptr) {
1951         APP_LOGW("asyncCallbackInfo is null");
1952         return nullptr;
1953     }
1954     if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
1955         APP_LOGW("param count invalid");
1956         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1957         return nullptr;
1958     }
1959     size_t argc = args.GetMaxArgc();
1960     for (size_t i = 0; i < argc; ++i) {
1961         if (i == ARGS_POS_ZERO) {
1962             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->bundleName)) {
1963                 APP_LOGW("parse bundleName failed");
1964                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
1965                 return nullptr;
1966             }
1967         } else if (i == ARGS_POS_ONE) {
1968             if (!CommonFunc::ParseInt(env, args[i], asyncCallbackInfo->userId)) {
1969                 APP_LOGW("parse userId failed");
1970             }
1971         } else {
1972             APP_LOGW("The number of parameters is incorrect");
1973             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1974             return nullptr;
1975         }
1976     }
1977     if (asyncCallbackInfo->userId == Constants::UNSPECIFIED_USERID) {
1978         asyncCallbackInfo->userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
1979     }
1980     auto promise = CommonFunc::AsyncCallNativeMethod<InstallPreexistingAppCallbackInfo>(
1981         env, asyncCallbackInfo.get(), INSTALL_PREEXISTING_APP,
1982         InstallPreexistingAppExec, InstallPreexistingAppComplete);
1983     asyncCallbackInfo.release();
1984     APP_LOGI("call napi done");
1985     return promise;
1986 }
1987 
1988 
ParseInstallPluginParam(napi_env env,napi_value args,InstallPluginParam & installPluginParam)1989 void ParseInstallPluginParam(napi_env env, napi_value args, InstallPluginParam &installPluginParam)
1990 {
1991     if (!ParseUserId(env, args, installPluginParam.userId)) {
1992         APP_LOGW("parse userId failed. assign default value");
1993     }
1994     if (!ParseParameters(env, args, installPluginParam.parameters)) {
1995         APP_LOGW("parse parameters failed. using default value");
1996     }
1997 }
1998 
InnerInstallPlugin(const std::string & hostBundleName,const std::vector<std::string> & pluginFilePaths,const InstallPluginParam & installPluginParam)1999 static ErrCode InnerInstallPlugin(const std::string &hostBundleName,
2000     const std::vector<std::string> &pluginFilePaths, const InstallPluginParam &installPluginParam)
2001 {
2002     auto iBundleMgr = CommonFunc::GetBundleMgr();
2003     if (iBundleMgr == nullptr) {
2004         APP_LOGE("can not get iBundleMgr");
2005         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2006     }
2007     auto iBundleInstaller = iBundleMgr->GetBundleInstaller();
2008     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
2009         APP_LOGE("can not get iBundleInstaller");
2010         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2011     }
2012     ErrCode result = iBundleInstaller->InstallPlugin(hostBundleName, pluginFilePaths, installPluginParam);
2013     APP_LOGD("InstallPlugin result is %{public}d", result);
2014     return result;
2015 }
2016 
InstallPluginExec(napi_env env,void * data)2017 void InstallPluginExec(napi_env env, void *data)
2018 {
2019     PluginCallbackInfo *asyncCallbackInfo = reinterpret_cast<PluginCallbackInfo *>(data);
2020     if (asyncCallbackInfo == nullptr) {
2021         APP_LOGE("asyncCallbackInfo is null");
2022         return;
2023     }
2024     asyncCallbackInfo->err = InnerInstallPlugin(asyncCallbackInfo->hostBundleName,
2025         asyncCallbackInfo->pluginFilePaths, asyncCallbackInfo->installPluginParam);
2026 }
2027 
InstallPluginComplete(napi_env env,napi_status status,void * data)2028 void InstallPluginComplete(napi_env env, napi_status status, void *data)
2029 {
2030     PluginCallbackInfo *asyncCallbackInfo = reinterpret_cast<PluginCallbackInfo *>(data);
2031     if (asyncCallbackInfo == nullptr) {
2032         APP_LOGE("asyncCallbackInfo is null");
2033         return;
2034     }
2035     std::unique_ptr<PluginCallbackInfo> callbackPtr {asyncCallbackInfo};
2036     asyncCallbackInfo->err = CommonFunc::ConvertErrCode(asyncCallbackInfo->err);
2037     APP_LOGD("InstallPluginComplete err is %{public}d", asyncCallbackInfo->err);
2038 
2039     napi_value result[ARGS_SIZE_ONE] = {0};
2040     if (asyncCallbackInfo->err == SUCCESS) {
2041         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[FIRST_PARAM]));
2042     } else {
2043         result[FIRST_PARAM] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2044             INSTALL_PLUGIN, Constants::PERMISSION_INSTALL_PLUGIN);
2045     }
2046     CommonFunc::NapiReturnDeferred<PluginCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2047 }
2048 
InstallPlugin(napi_env env,napi_callback_info info)2049 napi_value InstallPlugin(napi_env env, napi_callback_info info)
2050 {
2051     APP_LOGI("begin to InstallPlugin");
2052     NapiArg args(env, info);
2053     std::unique_ptr<PluginCallbackInfo> asyncCallbackInfo = std::make_unique<PluginCallbackInfo>(env);
2054     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
2055         APP_LOGW("param count invalid");
2056         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2057         return nullptr;
2058     }
2059     size_t argc = args.GetMaxArgc();
2060     for (size_t i = 0; i < argc; ++i) {
2061         napi_valuetype valueType = napi_undefined;
2062         napi_typeof(env, args[i], &valueType);
2063         if (i == ARGS_POS_ZERO) {
2064             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->hostBundleName)) {
2065                 APP_LOGW("parse hostBundleName failed");
2066                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2067                 return nullptr;
2068             }
2069         } else if (i == ARGS_POS_ONE) {
2070             if (!CommonFunc::ParseStringArray(env, asyncCallbackInfo->pluginFilePaths, args[i])) {
2071                 APP_LOGE("pluginFilePaths invalid");
2072                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, FILE_PATH, TYPE_ARRAY);
2073                 return nullptr;
2074             }
2075         } else if (i == ARGS_POS_TWO && valueType == napi_object) {
2076             ParseInstallPluginParam(env, args[i], asyncCallbackInfo->installPluginParam);
2077         } else {
2078             APP_LOGW("The number of parameters is incorrect");
2079             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2080             return nullptr;
2081         }
2082     }
2083     if (asyncCallbackInfo->installPluginParam.userId == Constants::UNSPECIFIED_USERID) {
2084         asyncCallbackInfo->installPluginParam.userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
2085     }
2086     auto promise = CommonFunc::AsyncCallNativeMethod<PluginCallbackInfo>(
2087         env, asyncCallbackInfo.get(), INSTALL_PLUGIN, InstallPluginExec, InstallPluginComplete);
2088     asyncCallbackInfo.release();
2089     APP_LOGI("call napi InstallPlugin done");
2090     return promise;
2091 }
2092 
InnerUninstallPlugin(const std::string & hostBundleName,const std::string & pluginBundleName,const InstallPluginParam & installPluginParam)2093 static ErrCode InnerUninstallPlugin(const std::string &hostBundleName,
2094     const std::string &pluginBundleName, const InstallPluginParam &installPluginParam)
2095 {
2096     auto iBundleMgr = CommonFunc::GetBundleMgr();
2097     if (iBundleMgr == nullptr) {
2098         APP_LOGE("can not get iBundleMgr");
2099         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2100     }
2101     auto iBundleInstaller = iBundleMgr->GetBundleInstaller();
2102     if ((iBundleInstaller == nullptr) || (iBundleInstaller->AsObject() == nullptr)) {
2103         APP_LOGE("can not get iBundleInstaller");
2104         return ERROR_BUNDLE_SERVICE_EXCEPTION;
2105     }
2106     ErrCode result = iBundleInstaller->UninstallPlugin(hostBundleName, pluginBundleName, installPluginParam);
2107     APP_LOGD("UninstallPlugin result is %{public}d", result);
2108     return result;
2109 }
2110 
UninstallPluginExec(napi_env env,void * data)2111 void UninstallPluginExec(napi_env env, void *data)
2112 {
2113     PluginCallbackInfo *asyncCallbackInfo = reinterpret_cast<PluginCallbackInfo *>(data);
2114     if (asyncCallbackInfo == nullptr) {
2115         APP_LOGE("asyncCallbackInfo is null");
2116         return;
2117     }
2118     APP_LOGD("param: hostBundleName = %{public}s, pluginBundleName = %{public}s, userId = %{public}d",
2119         asyncCallbackInfo->hostBundleName.c_str(),
2120         asyncCallbackInfo->pluginBundleName.c_str(),
2121         asyncCallbackInfo->installPluginParam.userId);
2122     asyncCallbackInfo->err = InnerUninstallPlugin(asyncCallbackInfo->hostBundleName,
2123         asyncCallbackInfo->pluginBundleName, asyncCallbackInfo->installPluginParam);
2124 }
2125 
UninstallPluginComplete(napi_env env,napi_status status,void * data)2126 void UninstallPluginComplete(napi_env env, napi_status status, void *data)
2127 {
2128     PluginCallbackInfo *asyncCallbackInfo = reinterpret_cast<PluginCallbackInfo *>(data);
2129     if (asyncCallbackInfo == nullptr) {
2130         APP_LOGE("asyncCallbackInfo is null");
2131         return;
2132     }
2133     std::unique_ptr<PluginCallbackInfo> callbackPtr {asyncCallbackInfo};
2134     asyncCallbackInfo->err = CommonFunc::ConvertErrCode(asyncCallbackInfo->err);
2135     APP_LOGD("UninstallPluginComplete err is %{public}d", asyncCallbackInfo->err);
2136 
2137     napi_value result[ARGS_SIZE_ONE] = {0};
2138     if (asyncCallbackInfo->err == SUCCESS) {
2139         NAPI_CALL_RETURN_VOID(env, napi_get_null(env, &result[FIRST_PARAM]));
2140     } else {
2141         result[FIRST_PARAM] = BusinessError::CreateCommonError(env, asyncCallbackInfo->err,
2142             UNINSTALL_PLUGIN, Constants::PERMISSION_UNINSTALL_PLUGIN);
2143     }
2144     CommonFunc::NapiReturnDeferred<PluginCallbackInfo>(env, asyncCallbackInfo, result, ARGS_SIZE_ONE);
2145 }
2146 
UninstallPlugin(napi_env env,napi_callback_info info)2147 napi_value UninstallPlugin(napi_env env, napi_callback_info info)
2148 {
2149     APP_LOGI("begin to UninstallPlugin");
2150     NapiArg args(env, info);
2151     std::unique_ptr<PluginCallbackInfo> asyncCallbackInfo = std::make_unique<PluginCallbackInfo>(env);
2152     if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
2153         APP_LOGW("param count invalid");
2154         BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2155         return nullptr;
2156     }
2157     size_t argc = args.GetMaxArgc();
2158     for (size_t i = 0; i < argc; ++i) {
2159         napi_valuetype valueType = napi_undefined;
2160         napi_typeof(env, args[i], &valueType);
2161         if (i == ARGS_POS_ZERO) {
2162             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->hostBundleName)) {
2163                 APP_LOGW("parse hostBundleName failed");
2164                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
2165                 return nullptr;
2166             }
2167         } else if (i == ARGS_POS_ONE) {
2168             if (!CommonFunc::ParseString(env, args[i], asyncCallbackInfo->pluginBundleName)) {
2169                 APP_LOGW("parse pluginBundleName failed");
2170                 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PLUGIN_BUNDLE_NAME, TYPE_STRING);
2171                 return nullptr;
2172             }
2173         } else if (i == ARGS_POS_TWO && valueType == napi_object) {
2174             ParseInstallPluginParam(env, args[i], asyncCallbackInfo->installPluginParam);
2175         } else {
2176             APP_LOGW("The number of parameters is incorrect");
2177             BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
2178             return nullptr;
2179         }
2180     }
2181     if (asyncCallbackInfo->installPluginParam.userId == Constants::UNSPECIFIED_USERID) {
2182         asyncCallbackInfo->installPluginParam.userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
2183     }
2184     auto promise = CommonFunc::AsyncCallNativeMethod<PluginCallbackInfo>(
2185         env, asyncCallbackInfo.get(), UNINSTALL_PLUGIN, UninstallPluginExec, UninstallPluginComplete);
2186     asyncCallbackInfo.release();
2187     APP_LOGI("call napi UninstallPlugin done");
2188     return promise;
2189 }
2190 } // AppExecFwk
2191 } // OHOS
2192