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> ¶meters)
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