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