1 /*
2 * Copyright (c) 2023-2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include <string>
16
17 #include "app_log_wrapper.h"
18 #include "bundle_errors.h"
19 #include "bundle_mgr_client.h"
20 #include "bundle_mgr_interface.h"
21 #include "bundle_mgr_proxy.h"
22 #include "business_error.h"
23 #include "bundle_constants.h"
24 #include "common_func.h"
25 #include "hap_module_info.h"
26 #include "ipc_skeleton.h"
27 #include "napi_arg.h"
28 #include "napi_common_want.h"
29 #include "napi_constants.h"
30 #include "bundle_manager_sync.h"
31
32 namespace OHOS {
33 namespace AppExecFwk {
34 constexpr const char* IS_ENABLE = "isEnable";
35 constexpr const char* EXTENSIONABILITY_TYPE = "extensionAbilityType";
ParseWantWithParameter(napi_env env,napi_value args,Want & want)36 bool ParseWantWithParameter(napi_env env, napi_value args, Want &want)
37 {
38 napi_valuetype valueType;
39 NAPI_CALL_BASE(env, napi_typeof(env, args, &valueType), false);
40 if (valueType != napi_object) {
41 APP_LOGW("args not object type");
42 return false;
43 }
44 napi_value prop = nullptr;
45 napi_get_named_property(env, args, BUNDLE_NAME, &prop);
46 std::string bundleName = CommonFunc::GetStringFromNAPI(env, prop);
47
48 prop = nullptr;
49 napi_get_named_property(env, args, MODULE_NAME, &prop);
50 std::string moduleName = CommonFunc::GetStringFromNAPI(env, prop);
51
52 prop = nullptr;
53 napi_get_named_property(env, args, ABILITY_NAME, &prop);
54 std::string abilityName = CommonFunc::GetStringFromNAPI(env, prop);
55 if (!bundleName.empty() && !abilityName.empty()) {
56 ElementName elementName("", bundleName, abilityName, moduleName);
57 want.SetElement(elementName);
58 return true;
59 }
60 if (!UnwrapWant(env, args, want)) {
61 APP_LOGW("parse want failed");
62 return false;
63 }
64 bool isExplicit = !want.GetBundle().empty() && !want.GetElement().GetAbilityName().empty();
65 if (!isExplicit && want.GetAction().empty() && want.GetEntities().empty() &&
66 want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
67 APP_LOGW("implicit params all empty");
68 return false;
69 }
70 return true;
71 }
72
IsArray(napi_env env,napi_value value)73 bool IsArray(napi_env env, napi_value value)
74 {
75 bool result = false;
76 NAPI_CALL_BASE(env, napi_is_array(env, value, &result), false);
77 return result;
78 }
79
ParseWantListWithParameter(napi_env env,napi_value args,std::vector<Want> & wants)80 bool ParseWantListWithParameter(napi_env env, napi_value args, std::vector<Want> &wants)
81 {
82 if (!IsArray(env, args)) {
83 return false;
84 }
85
86 uint32_t length = 0;
87 napi_get_array_length(env, args, &length);
88
89 for (uint32_t i = 0; i < length; i++) {
90 napi_value array;
91 Want want;
92 napi_get_element(env, args, i, &array);
93 if (!UnwrapWant(env, array, want)) {
94 APP_LOGW("parse want failed");
95 return false;
96 }
97 bool isExplicit = !want.GetBundle().empty() && !want.GetElement().GetAbilityName().empty();
98 if (!isExplicit && want.GetAction().empty() && want.GetEntities().empty() &&
99 want.GetUriString().empty() && want.GetType().empty() && want.GetStringParam(LINK_FEATURE).empty()) {
100 APP_LOGW("implicit params all empty of want %{public}d", i);
101 continue;
102 }
103 wants.push_back(want);
104 }
105
106 if (wants.empty()) {
107 return false;
108 }
109
110 return true;
111 }
112
SetApplicationEnabledSync(napi_env env,napi_callback_info info)113 napi_value SetApplicationEnabledSync(napi_env env, napi_callback_info info)
114 {
115 APP_LOGD("NAPI SetApplicationEnabledSync called");
116 NapiArg args(env, info);
117 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
118 APP_LOGE("param count invalid");
119 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
120 return nullptr;
121 }
122 std::string bundleName;
123 bool isEnable = false;
124 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
125 APP_LOGE("parse bundleName failed");
126 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
127 return nullptr;
128 }
129 if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], isEnable)) {
130 APP_LOGE("parse isEnable failed");
131 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLE, TYPE_BOOLEAN);
132 return nullptr;
133 }
134 auto iBundleMgr = CommonFunc::GetBundleMgr();
135 if (iBundleMgr == nullptr) {
136 APP_LOGE("can not get iBundleMgr");
137 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
138 return nullptr;
139 }
140 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->SetApplicationEnabled(bundleName, isEnable));
141 if (ret != NO_ERROR) {
142 APP_LOGE("SetApplicationEnabledSync failed, bundleName is %{public}s", bundleName.c_str());
143 napi_value businessError = BusinessError::CreateCommonError(
144 env, ret, SET_APPLICATION_ENABLED_SYNC, Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE);
145 napi_throw(env, businessError);
146 return nullptr;
147 }
148 napi_value nRet = nullptr;
149 NAPI_CALL(env, napi_get_undefined(env, &nRet));
150 APP_LOGD("call SetApplicationEnabledSync done");
151 return nRet;
152 }
153
SetAbilityEnabledSync(napi_env env,napi_callback_info info)154 napi_value SetAbilityEnabledSync(napi_env env, napi_callback_info info)
155 {
156 APP_LOGD("NAPI SetAbilityEnabledSync called");
157 NapiArg args(env, info);
158 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
159 APP_LOGE("param count invalid");
160 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
161 return nullptr;
162 }
163 AbilityInfo abilityInfo;
164 bool isEnable = false;
165 if (!CommonFunc::ParseAbilityInfo(env, args[ARGS_POS_ZERO], abilityInfo)) {
166 APP_LOGE("parse abilityInfo failed");
167 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_INFO, TYPE_OBJECT);
168 return nullptr;
169 }
170 if (!CommonFunc::ParseBool(env, args[ARGS_POS_ONE], isEnable)) {
171 APP_LOGE("parse isEnable failed");
172 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, IS_ENABLE, TYPE_BOOLEAN);
173 return nullptr;
174 }
175 auto iBundleMgr = CommonFunc::GetBundleMgr();
176 if (iBundleMgr == nullptr) {
177 APP_LOGE("can not get iBundleMgr");
178 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
179 return nullptr;
180 }
181 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->SetAbilityEnabled(abilityInfo, isEnable));
182 if (ret != NO_ERROR) {
183 APP_LOGE("SetAbilityEnabledSync failed");
184 napi_value businessError = BusinessError::CreateCommonError(
185 env, ret, SET_ABILITY_ENABLED_SYNC, Constants::PERMISSION_CHANGE_ABILITY_ENABLED_STATE);
186 napi_throw(env, businessError);
187 return nullptr;
188 }
189 napi_value nRet = nullptr;
190 NAPI_CALL(env, napi_get_undefined(env, &nRet));
191 APP_LOGD("call SetAbilityEnabledSync done");
192 return nRet;
193 }
194
IsApplicationEnabledSync(napi_env env,napi_callback_info info)195 napi_value IsApplicationEnabledSync(napi_env env, napi_callback_info info)
196 {
197 APP_LOGD("NAPI IsApplicationEnabledSync called");
198 NapiArg args(env, info);
199 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
200 APP_LOGE("param count invalid");
201 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
202 return nullptr;
203 }
204 std::string bundleName;
205 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
206 APP_LOGE("parse bundleName failed");
207 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
208 return nullptr;
209 }
210 auto iBundleMgr = CommonFunc::GetBundleMgr();
211 if (iBundleMgr == nullptr) {
212 APP_LOGE("can not get iBundleMgr");
213 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
214 return nullptr;
215 }
216 if (bundleName.empty()) {
217 APP_LOGW("bundleName is empty");
218 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_BUNDLENAME_EMPTY_ERROR);
219 return nullptr;
220 }
221 bool isEnable = false;
222 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->IsApplicationEnabled(bundleName, isEnable));
223 if (ret != NO_ERROR) {
224 APP_LOGE("IsApplicationEnabledSync failed, bundleName is %{public}s", bundleName.c_str());
225 napi_value businessError = BusinessError::CreateCommonError(env, ret, IS_APPLICATION_ENABLED_SYNC);
226 napi_throw(env, businessError);
227 return nullptr;
228 }
229 napi_value nIsEnabled = nullptr;
230 NAPI_CALL(env, napi_get_boolean(env, isEnable, &nIsEnabled));
231 APP_LOGD("call IsApplicationEnabledSync done");
232 return nIsEnabled;
233 }
234
IsAbilityEnabledSync(napi_env env,napi_callback_info info)235 napi_value IsAbilityEnabledSync(napi_env env, napi_callback_info info)
236 {
237 APP_LOGD("NAPI IsAbilityEnabledSync called");
238 NapiArg args(env, info);
239 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
240 APP_LOGE("param count invalid");
241 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
242 return nullptr;
243 }
244 AbilityInfo abilityInfo;
245 if (!CommonFunc::ParseAbilityInfo(env, args[ARGS_POS_ZERO], abilityInfo)) {
246 APP_LOGE("parse abilityInfo failed");
247 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_INFO, TYPE_OBJECT);
248 return nullptr;
249 }
250 auto iBundleMgr = CommonFunc::GetBundleMgr();
251 if (iBundleMgr == nullptr) {
252 APP_LOGE("can not get iBundleMgr");
253 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
254 return nullptr;
255 }
256 bool isEnable = false;
257 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->IsAbilityEnabled(abilityInfo, isEnable));
258 if (ret != NO_ERROR) {
259 APP_LOGE("IsAbilityEnabledSync failed");
260 napi_value businessError = BusinessError::CreateCommonError(env, ret, IS_ABILITY_ENABLED_SYNC);
261 napi_throw(env, businessError);
262 return nullptr;
263 }
264 napi_value nIsEnabled = nullptr;
265 NAPI_CALL(env, napi_get_boolean(env, isEnable, &nIsEnabled));
266 APP_LOGD("call IsAbilityEnabledSync done");
267 return nIsEnabled;
268 }
269
ParamsExtensionTypeSync(napi_env env,napi_valuetype valueType,napi_value args,ExtensionParamInfo & extensionParamInfo)270 bool ParamsExtensionTypeSync(napi_env env, napi_valuetype valueType, napi_value args,
271 ExtensionParamInfo& extensionParamInfo)
272 {
273 if (valueType == napi_number) {
274 extensionParamInfo.isExtensionTypeName = false;
275 return CommonFunc::ParseInt(env, args, extensionParamInfo.extensionAbilityType);
276 } else if (valueType == napi_string) {
277 extensionParamInfo.isExtensionTypeName = true;
278 return CommonFunc::ParseString(env, args, extensionParamInfo.extensionTypeName);
279 }
280 APP_LOGE("Parameter is invalid");
281 return false;
282 }
283
ParamsProcessQueryExtensionInfosSync(napi_env env,napi_callback_info info,ExtensionParamInfo & extensionParamInfo)284 ErrCode ParamsProcessQueryExtensionInfosSync(napi_env env, napi_callback_info info,
285 ExtensionParamInfo& extensionParamInfo)
286 {
287 NapiArg args(env, info);
288 if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_FOUR)) {
289 APP_LOGE("param count invalid");
290 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
291 return ERROR_PARAM_CHECK_ERROR;
292 }
293 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
294 napi_valuetype valueType = napi_undefined;
295 napi_typeof(env, args[i], &valueType);
296 if (i == ARGS_POS_ZERO) {
297 // parse want with parameter
298 if (!ParseWantWithParameter(env, args[i], extensionParamInfo.want)) {
299 APP_LOGE("invalid want");
300 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, INVALID_WANT_ERROR);
301 return ERROR_PARAM_CHECK_ERROR;
302 }
303 } else if (i == ARGS_POS_ONE) {
304 if (!ParamsExtensionTypeSync(env, valueType, args[i], extensionParamInfo)) {
305 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR,
306 (extensionParamInfo.isExtensionTypeName ? EXTENSION_TYPE_NAME : EXTENSIONABILITY_TYPE),
307 (extensionParamInfo.isExtensionTypeName ? TYPE_STRING : TYPE_NUMBER));
308 return ERROR_PARAM_CHECK_ERROR;
309 }
310 } else if (i == ARGS_POS_TWO && (valueType == napi_number)) {
311 if (!CommonFunc::ParseInt(env, args[i], extensionParamInfo.flags)) {
312 APP_LOGE("invalid flags");
313 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, FLAGS, TYPE_NUMBER);
314 return ERROR_PARAM_CHECK_ERROR;
315 }
316 } else if (i == ARGS_POS_THREE && (valueType == napi_number)) {
317 if (!CommonFunc::ParseInt(env, args[i], extensionParamInfo.userId)) {
318 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
319 }
320 } else {
321 APP_LOGE("parameter is invalid");
322 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
323 return ERROR_PARAM_CHECK_ERROR;
324 }
325 }
326 if (extensionParamInfo.userId == Constants::UNSPECIFIED_USERID) {
327 extensionParamInfo.userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
328 }
329 return ERR_OK;
330 }
331
ParamsProcessQueryExtensionInfosOnlyWithTypeNameSync(napi_env env,napi_callback_info info,ExtensionParamInfo & extensionParamInfo)332 ErrCode ParamsProcessQueryExtensionInfosOnlyWithTypeNameSync(napi_env env, napi_callback_info info,
333 ExtensionParamInfo& extensionParamInfo)
334 {
335 NapiArg args(env, info);
336 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
337 APP_LOGE("param count invalid");
338 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
339 return ERROR_PARAM_CHECK_ERROR;
340 }
341 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
342 napi_valuetype valueType = napi_undefined;
343 napi_typeof(env, args[i], &valueType);
344 if (i == ARGS_POS_ZERO) {
345 if (!CommonFunc::ParseString(env, args[i], extensionParamInfo.extensionTypeName)) {
346 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, EXTENSION_TYPE_NAME,
347 TYPE_STRING);
348 return ERROR_PARAM_CHECK_ERROR;
349 }
350 } else if (i == ARGS_POS_ONE) {
351 if (!CommonFunc::ParseInt(env, args[i], extensionParamInfo.flags)) {
352 APP_LOGE("invalid flags");
353 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, FLAGS, TYPE_NUMBER);
354 return ERROR_PARAM_CHECK_ERROR;
355 }
356 } else if (i == ARGS_POS_TWO) {
357 if (!CommonFunc::ParseInt(env, args[i], extensionParamInfo.userId)) {
358 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
359 }
360 } else {
361 APP_LOGE("parameter is invalid");
362 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
363 return ERROR_PARAM_CHECK_ERROR;
364 }
365 }
366 if (extensionParamInfo.extensionTypeName.empty()) {
367 APP_LOGE("The input extensionAbilityType is empty");
368 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_EXTENSION_ABILITY_TYPE_EMPTY_ERROR);
369 return ERROR_PARAM_CHECK_ERROR;
370 }
371 if (extensionParamInfo.userId == Constants::UNSPECIFIED_USERID) {
372 extensionParamInfo.userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
373 }
374 return ERR_OK;
375 }
376
QueryExtensionInfosSync(napi_env env,napi_callback_info info,ExtensionParamInfo extensionParamInfo,std::vector<ExtensionAbilityInfo> & extensionInfos)377 ErrCode QueryExtensionInfosSync(napi_env env, napi_callback_info info,
378 ExtensionParamInfo extensionParamInfo, std::vector<ExtensionAbilityInfo>& extensionInfos)
379 {
380 if (ParamsProcessQueryExtensionInfosSync(env, info, extensionParamInfo) != ERR_OK) {
381 APP_LOGE("paramsProcess is invalid");
382 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
383 return ERROR_PARAM_CHECK_ERROR;
384 }
385 ErrCode ret;
386 auto iBundleMgr = CommonFunc::GetBundleMgr();
387 if (iBundleMgr == nullptr) {
388 APP_LOGE("can not get iBundleMgr");
389 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
390 return ERROR_BUNDLE_SERVICE_EXCEPTION;
391 }
392 if (!extensionParamInfo.isExtensionTypeName) {
393 if (extensionParamInfo.extensionAbilityType == static_cast<int32_t>(ExtensionAbilityType::UNSPECIFIED)) {
394 APP_LOGD("Query extensionAbilityInfo sync without type");
395 ret = CommonFunc::ConvertErrCode(iBundleMgr->QueryExtensionAbilityInfosV9(extensionParamInfo.want,
396 extensionParamInfo.flags, extensionParamInfo.userId, extensionInfos));
397 } else {
398 ExtensionAbilityType type = static_cast<ExtensionAbilityType>(extensionParamInfo.extensionAbilityType);
399 APP_LOGD("Query extensionAbilityInfo sync with type %{public}d", extensionParamInfo.extensionAbilityType);
400 ret = CommonFunc::ConvertErrCode(iBundleMgr->QueryExtensionAbilityInfosV9(extensionParamInfo.want,
401 type, extensionParamInfo.flags, extensionParamInfo.userId, extensionInfos));
402 }
403 } else {
404 APP_LOGD("Query extensionAbilityInfo sync with extensionTypeName %{public}s",
405 extensionParamInfo.extensionTypeName.c_str());
406 ret = CommonFunc::ConvertErrCode(iBundleMgr->QueryExtensionAbilityInfosWithTypeName(extensionParamInfo.want,
407 extensionParamInfo.extensionTypeName, extensionParamInfo.flags, extensionParamInfo.userId,
408 extensionInfos));
409 }
410 return ret;
411 }
412
QueryExtensionInfosSyncOnlyWithTypeName(napi_env env,napi_callback_info info,ExtensionParamInfo extensionParamInfo,std::vector<ExtensionAbilityInfo> & extensionInfos)413 ErrCode QueryExtensionInfosSyncOnlyWithTypeName(napi_env env, napi_callback_info info,
414 ExtensionParamInfo extensionParamInfo, std::vector<ExtensionAbilityInfo>& extensionInfos)
415 {
416 if (ParamsProcessQueryExtensionInfosOnlyWithTypeNameSync(env, info, extensionParamInfo) != ERR_OK) {
417 APP_LOGE("paramsProcess is invalid");
418 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
419 return ERROR_PARAM_CHECK_ERROR;
420 }
421 ErrCode ret;
422 auto iBundleMgr = CommonFunc::GetBundleMgr();
423 if (iBundleMgr == nullptr) {
424 APP_LOGE("can not get iBundleMgr");
425 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
426 return ERROR_BUNDLE_SERVICE_EXCEPTION;
427 }
428 uint32_t flags = static_cast<uint32_t>(extensionParamInfo.flags);
429 if (extensionParamInfo.flags < 0) {
430 flags = 0;
431 }
432 ret = CommonFunc::ConvertErrCode(iBundleMgr->QueryExtensionAbilityInfosOnlyWithTypeName(
433 extensionParamInfo.extensionTypeName, flags, extensionParamInfo.userId,
434 extensionInfos));
435 return ret;
436 }
437
QueryExtensionInfosSync(napi_env env,napi_callback_info info)438 napi_value QueryExtensionInfosSync(napi_env env, napi_callback_info info)
439 {
440 APP_LOGD("NAPI QueryExtensionInfosSync call");
441 ExtensionParamInfo extensionParamInfo;
442 NapiArg args(env, info);
443 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_FOUR)) {
444 APP_LOGE("param count invalid");
445 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
446 return nullptr;
447 }
448 napi_valuetype firstValueType = napi_undefined;
449 napi_typeof(env, args[0], &firstValueType);
450 std::vector<ExtensionAbilityInfo> extensionInfos;
451 ErrCode ret;
452 if (firstValueType == napi_object) {
453 ret = QueryExtensionInfosSync(env, info, extensionParamInfo, extensionInfos);
454 } else {
455 ret = QueryExtensionInfosSyncOnlyWithTypeName(env, info, extensionParamInfo, extensionInfos);
456 }
457 if (ret != NO_ERROR) {
458 APP_LOGE("QueryExtensionAbilityInfosV9 failed");
459 napi_value businessError = BusinessError::CreateCommonError(
460 env, ret, QUERY_EXTENSION_INFOS_SYNC, BUNDLE_PERMISSIONS);
461 napi_throw(env, businessError);
462 return nullptr;
463 }
464 napi_value nExtensionInfos = nullptr;
465 NAPI_CALL(env, napi_create_array(env, &nExtensionInfos));
466 CommonFunc::ConvertExtensionInfos(env, extensionInfos, nExtensionInfos);
467 APP_LOGD("call QueryExtensionInfosSync done");
468 return nExtensionInfos;
469 }
470
GetPermissionDefSync(napi_env env,napi_callback_info info)471 napi_value GetPermissionDefSync(napi_env env, napi_callback_info info)
472 {
473 APP_LOGD("GetPermissionDefSync called");
474 NapiArg args(env, info);
475 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
476 APP_LOGE("param count invalid");
477 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
478 return nullptr;
479 }
480 std::string permissionName;
481 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], permissionName)) {
482 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, PERMISSION_NAME, TYPE_STRING);
483 return nullptr;
484 }
485 auto iBundleMgr = CommonFunc::GetBundleMgr();
486 if (iBundleMgr == nullptr) {
487 APP_LOGE("can not get iBundleMgr");
488 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
489 return nullptr;
490 }
491 OHOS::AppExecFwk::PermissionDef permissionDef;
492 ErrCode ret = CommonFunc::ConvertErrCode(
493 iBundleMgr->GetPermissionDef(permissionName, permissionDef));
494 if (ret != NO_ERROR) {
495 APP_LOGE("GetPermissionDef failed, permissionName is %{public}s", permissionName.c_str());
496 napi_value businessError = BusinessError::CreateCommonError(
497 env, ret, GET_PERMISSION_DEF_SYNC, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
498 napi_throw(env, businessError);
499 return nullptr;
500 }
501 napi_value nPermissionDef = nullptr;
502 NAPI_CALL(env, napi_create_object(env, &nPermissionDef));
503 CommonFunc::ConvertPermissionDef(env, nPermissionDef, permissionDef);
504 APP_LOGD("call GetPermissionDefSync done");
505 return nPermissionDef;
506 }
507
ParamsProcessGetAbilityLabelSync(napi_env env,napi_callback_info info,std::string & bundleName,std::string & moduleName,std::string & abilityName)508 ErrCode ParamsProcessGetAbilityLabelSync(napi_env env, napi_callback_info info,
509 std::string& bundleName, std::string& moduleName, std::string& abilityName)
510 {
511 NapiArg args(env, info);
512 if (!args.Init(ARGS_SIZE_THREE, ARGS_SIZE_THREE)) {
513 APP_LOGE("param count invalid");
514 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
515 return ERROR_PARAM_CHECK_ERROR;
516 }
517 if (args.GetMaxArgc() >= ARGS_SIZE_THREE) {
518 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
519 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
520 return ERROR_PARAM_CHECK_ERROR;
521 }
522 if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], moduleName)) {
523 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
524 return ERROR_PARAM_CHECK_ERROR;
525 }
526 if (!CommonFunc::ParseString(env, args[ARGS_POS_TWO], abilityName)) {
527 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, TYPE_STRING);
528 return ERROR_PARAM_CHECK_ERROR;
529 }
530 } else {
531 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
532 return ERROR_PARAM_CHECK_ERROR;
533 }
534 return ERR_OK;
535 }
536
GetAbilityLabelSync(napi_env env,napi_callback_info info)537 napi_value GetAbilityLabelSync(napi_env env, napi_callback_info info)
538 {
539 APP_LOGD("begin to GetAbilityLabelSync");
540 #ifdef GLOBAL_RESMGR_ENABLE
541 std::string bundleName;
542 std::string moduleName;
543 std::string abilityName;
544 if (ParamsProcessGetAbilityLabelSync(env, info, bundleName, moduleName, abilityName) != ERR_OK) {
545 APP_LOGE("paramsProcess is invalid");
546 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
547 return nullptr;
548 }
549 auto iBundleMgr = CommonFunc::GetBundleMgr();
550 if (iBundleMgr == nullptr) {
551 APP_LOGE("can not get iBundleMgr");
552 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
553 return nullptr;
554 }
555 std::string abilityLabel;
556 ErrCode ret = CommonFunc::ConvertErrCode(
557 iBundleMgr->GetAbilityLabel(bundleName, moduleName, abilityName, abilityLabel));
558 if (ret != NO_ERROR) {
559 APP_LOGE("GetAbilityLabel failed, bundleName is %{public}s", bundleName.c_str());
560 napi_value businessError = BusinessError::CreateCommonError(
561 env, ret, GET_ABILITY_LABEL_SYNC, BUNDLE_PERMISSIONS);
562 napi_throw(env, businessError);
563 return nullptr;
564 }
565 napi_value nAbilityLabel = nullptr;
566 napi_create_string_utf8(env, abilityLabel.c_str(), NAPI_AUTO_LENGTH, &nAbilityLabel);
567 APP_LOGD("call GetAbilityLabelSync done");
568 return nAbilityLabel;
569 #else
570 APP_LOGE("SystemCapability.BundleManager.BundleFramework.Resource not supported");
571 napi_value error = BusinessError::CreateCommonError(env, ERROR_SYSTEM_ABILITY_NOT_FOUND, "getAbilityLabel");
572 napi_throw(env, error);
573 return nullptr;
574 #endif
575 }
576
ParamsProcessGetLaunchWantForBundleSync(napi_env env,napi_callback_info info,std::string & bundleName,int32_t & userId)577 ErrCode ParamsProcessGetLaunchWantForBundleSync(napi_env env, napi_callback_info info,
578 std::string& bundleName, int32_t& userId)
579 {
580 NapiArg args(env, info);
581 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
582 APP_LOGE("param count invalid");
583 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
584 return ERROR_PARAM_CHECK_ERROR;
585 }
586 for (size_t i = 0; i < args.GetMaxArgc(); ++i) {
587 napi_valuetype valueType = napi_undefined;
588 napi_typeof(env, args[i], &valueType);
589 if (i == ARGS_POS_ZERO) {
590 if (!CommonFunc::ParseString(env, args[i], bundleName)) {
591 APP_LOGE("bundleName %{public}s invalid", bundleName.c_str());
592 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
593 return ERROR_PARAM_CHECK_ERROR;
594 }
595 } else if (i == ARGS_POS_ONE) {
596 if (!CommonFunc::ParseInt(env, args[i], userId)) {
597 APP_LOGW("userId parseInt failed");
598 }
599 } else {
600 APP_LOGE("parameter is invalid");
601 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
602 return ERROR_PARAM_CHECK_ERROR;
603 }
604 }
605 if (bundleName.size() == 0) {
606 return ERROR_PARAM_CHECK_ERROR;
607 }
608 if (userId == Constants::UNSPECIFIED_USERID) {
609 userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
610 }
611 return ERR_OK;
612 }
613
GetLaunchWantForBundleSync(napi_env env,napi_callback_info info)614 napi_value GetLaunchWantForBundleSync(napi_env env, napi_callback_info info)
615 {
616 APP_LOGD("NAPI GetLaunchWantForBundleSync call");
617 std::string bundleName;
618 int32_t userId = Constants::UNSPECIFIED_USERID;
619 if (ParamsProcessGetLaunchWantForBundleSync(env, info, bundleName, userId) != ERR_OK) {
620 APP_LOGE("paramsProcess is invalid");
621 BusinessError::ThrowError(env, ERROR_PARAM_CHECK_ERROR, PARAM_TYPE_CHECK_ERROR);
622 return nullptr;
623 }
624 auto iBundleMgr = CommonFunc::GetBundleMgr();
625 if (iBundleMgr == nullptr) {
626 APP_LOGE("can not get iBundleMgr");
627 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
628 return nullptr;
629 }
630 OHOS::AAFwk::Want want;
631 ErrCode ret = CommonFunc::ConvertErrCode(
632 iBundleMgr->GetLaunchWantForBundle(bundleName, want, userId));
633 if (ret != NO_ERROR) {
634 APP_LOGE("GetLaunchWantForBundle failed, bundleName is %{public}s, userId is %{public}d",
635 bundleName.c_str(), userId);
636 napi_value businessError = BusinessError::CreateCommonError(
637 env, ret, GET_LAUNCH_WANT_FOR_BUNDLE_SYNC, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
638 napi_throw(env, businessError);
639 return nullptr;
640 }
641 napi_value nWant = nullptr;
642 NAPI_CALL(env, napi_create_object(env, &nWant));
643 CommonFunc::ConvertWantInfo(env, nWant, want);
644 APP_LOGD("call GetLaunchWantForBundleSync done");
645 return nWant;
646 }
647
GetBundleArchiveInfoSync(napi_env env,napi_callback_info info)648 napi_value GetBundleArchiveInfoSync(napi_env env, napi_callback_info info)
649 {
650 APP_LOGD("NAPI getBundleArchiveInfoSync called");
651 NapiArg args(env, info);
652 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
653 APP_LOGE("param count invalid");
654 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
655 return nullptr;
656 }
657 std::string hapFilePath;
658 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], hapFilePath)) {
659 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, HAP_FILE_PATH, TYPE_STRING);
660 return nullptr;
661 }
662 int32_t bundleFlags;
663 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ONE], bundleFlags)) {
664 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_FLAGS, TYPE_NUMBER);
665 return nullptr;
666 }
667 auto iBundleMgr = CommonFunc::GetBundleMgr();
668 if (iBundleMgr == nullptr) {
669 napi_value error = BusinessError::CreateCommonError(env, ERROR_BUNDLE_SERVICE_EXCEPTION,
670 GET_BUNDLE_ARCHIVE_INFO_SYNC, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
671 napi_throw(env, error);
672 return nullptr;
673 }
674 BundleInfo bundleInfo;
675 ErrCode ret = CommonFunc::ConvertErrCode(
676 iBundleMgr->GetBundleArchiveInfoV9(hapFilePath, bundleFlags, bundleInfo));
677 if (ret != ERR_OK) {
678 APP_LOGE("getBundleArchiveInfoSync failed");
679 napi_value businessError = BusinessError::CreateCommonError(
680 env, ret, GET_BUNDLE_ARCHIVE_INFO_SYNC, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
681 napi_throw(env, businessError);
682 return nullptr;
683 }
684 napi_value nBundleInfo = nullptr;
685 NAPI_CALL(env, napi_create_object(env, &nBundleInfo));
686 CommonFunc::ConvertBundleInfo(env, bundleInfo, nBundleInfo, bundleFlags);
687 APP_LOGD("call getBundleArchiveInfoSync done");
688 return nBundleInfo;
689 }
690
GetBundleNameByUidSync(napi_env env,napi_callback_info info)691 napi_value GetBundleNameByUidSync(napi_env env, napi_callback_info info)
692 {
693 APP_LOGD("NAPI GetBundleNameByUidSync called");
694 NapiArg args(env, info);
695 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
696 APP_LOGE("param count invalid");
697 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
698 return nullptr;
699 }
700 int32_t uid = -1;
701 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], uid)) {
702 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, UID, TYPE_NUMBER);
703 return nullptr;
704 }
705 auto iBundleMgr = CommonFunc::GetBundleMgr();
706 if (iBundleMgr == nullptr) {
707 napi_value error = BusinessError::CreateCommonError(env, ERROR_BUNDLE_SERVICE_EXCEPTION,
708 GET_BUNDLE_NAME_BY_UID_SYNC, BUNDLE_PERMISSIONS);
709 napi_throw(env, error);
710 return nullptr;
711 }
712 std::string bundleName;
713 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetNameForUid(uid, bundleName));
714 if (ret != ERR_OK) {
715 if (uid > Constants::BASE_APP_UID) {
716 APP_LOGE("failed uid: %{public}d bundleName: %{public}s", uid, bundleName.c_str());
717 }
718 napi_value businessError = BusinessError::CreateCommonError(
719 env, ret, GET_BUNDLE_NAME_BY_UID_SYNC, BUNDLE_PERMISSIONS);
720 napi_throw(env, businessError);
721 return nullptr;
722 }
723 napi_value nBundleName = nullptr;
724 napi_create_string_utf8(env, bundleName.c_str(), NAPI_AUTO_LENGTH, &nBundleName);
725 APP_LOGD("call GetBundleNameByUidSync done");
726 return nBundleName;
727 }
728
ParamsProcessGetProfileByAbilitySync(napi_env env,napi_callback_info info,std::string & moduleName,std::string & abilityName,std::string & metadataName)729 ErrCode ParamsProcessGetProfileByAbilitySync(napi_env env, napi_callback_info info,
730 std::string& moduleName, std::string& abilityName, std::string& metadataName)
731 {
732 NapiArg args(env, info);
733 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_THREE)) {
734 APP_LOGE("param count invalid");
735 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
736 return ERROR_PARAM_CHECK_ERROR;
737 }
738 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], moduleName)) {
739 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, MODULE_NAME, TYPE_STRING);
740 return ERROR_PARAM_CHECK_ERROR;
741 }
742 if (moduleName.empty()) {
743 APP_LOGE("param failed due to empty moduleName");
744 napi_value businessError = BusinessError::CreateCommonError(env, ERROR_MODULE_NOT_EXIST);
745 napi_throw(env, businessError);
746 return ERROR_MODULE_NOT_EXIST;
747 }
748 if (!CommonFunc::ParseString(env, args[ARGS_POS_ONE], abilityName)) {
749 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, ABILITY_NAME, TYPE_STRING);
750 return ERROR_PARAM_CHECK_ERROR;
751 }
752 if (abilityName.empty()) {
753 APP_LOGE("param failed due to empty abilityName");
754 napi_value businessError = BusinessError::CreateCommonError(env, ERROR_ABILITY_NOT_EXIST);
755 napi_throw(env, businessError);
756 return ERROR_ABILITY_NOT_EXIST;
757 }
758 if (args.GetMaxArgc() == ARGS_SIZE_THREE) {
759 if (!CommonFunc::ParseString(env, args[ARGS_POS_TWO], metadataName)) {
760 APP_LOGW("Parse metadataName param failed");
761 }
762 }
763 return ERR_OK;
764 }
765
CheckAbilityFromBundleInfo(const BundleInfo & bundleInfo,const std::string & abilityName,const std::string & moduleName,AbilityInfo & targetAbilityInfo)766 ErrCode CheckAbilityFromBundleInfo(const BundleInfo& bundleInfo, const std::string& abilityName,
767 const std::string& moduleName, AbilityInfo& targetAbilityInfo)
768 {
769 for (const auto& hapModuleInfo : bundleInfo.hapModuleInfos) {
770 for (const auto& abilityInfo : hapModuleInfo.abilityInfos) {
771 if (abilityInfo.name == abilityName && abilityInfo.moduleName == moduleName) {
772 if (!abilityInfo.enabled) {
773 APP_LOGI("ability disabled");
774 return ERROR_ABILITY_IS_DISABLED;
775 }
776 targetAbilityInfo = abilityInfo;
777 return ERR_OK;
778 }
779 }
780 }
781 return ERROR_ABILITY_NOT_EXIST;
782 }
783
GetProfileByAbilitySync(napi_env env,napi_callback_info info)784 napi_value GetProfileByAbilitySync(napi_env env, napi_callback_info info)
785 {
786 APP_LOGD("NAPI GetProfileByAbilitySync called");
787 std::string moduleName;
788 std::string abilityName;
789 std::string metadataName;
790 if (ParamsProcessGetProfileByAbilitySync(env, info, moduleName, abilityName, metadataName) != ERR_OK) {
791 return nullptr;
792 }
793 auto iBundleMgr = CommonFunc::GetBundleMgr();
794 if (iBundleMgr == nullptr) {
795 napi_value error = BusinessError::CreateCommonError(env, ERROR_BUNDLE_SERVICE_EXCEPTION,
796 GET_PROFILE_BY_ABILITY_SYNC);
797 napi_throw(env, error);
798 return nullptr;
799 }
800 auto baseFlag = static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) +
801 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA) +
802 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
803 auto getAbilityFlag = baseFlag + static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY);
804 BundleInfo bundleInfo;
805 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetBundleInfoForSelf(getAbilityFlag, bundleInfo));
806 if (ret != ERR_OK) {
807 APP_LOGE("GetProfileByAbilitySync failed");
808 napi_value businessError = BusinessError::CreateCommonError(env, ret, GET_PROFILE_BY_ABILITY_SYNC);
809 napi_throw(env, businessError);
810 return nullptr;
811 }
812 AbilityInfo targetAbilityInfo;
813 ret = CheckAbilityFromBundleInfo(bundleInfo, abilityName, moduleName, targetAbilityInfo);
814 if (ret != ERR_OK) {
815 APP_LOGE("GetProfileByAbilitySync failed by CheckAbilityFromBundleInfo");
816 napi_value businessError = BusinessError::CreateCommonError(env, ret, GET_PROFILE_BY_ABILITY_SYNC);
817 napi_throw(env, businessError);
818 return nullptr;
819 }
820 BundleMgrClient client;
821 std::vector<std::string> profileVec;
822 if (!client.GetProfileFromAbility(targetAbilityInfo, metadataName, profileVec)) {
823 APP_LOGE("GetProfileByAbilitySync failed by GetProfileFromAbility");
824 napi_value businessError = BusinessError::CreateCommonError(
825 env, ERROR_PROFILE_NOT_EXIST, GET_PROFILE_BY_ABILITY_SYNC);
826 napi_throw(env, businessError);
827 return nullptr;
828 }
829 napi_value nProfileInfos = nullptr;
830 NAPI_CALL(env, napi_create_array(env, &nProfileInfos));
831 CommonFunc::ConvertStringArrays(env, profileVec, nProfileInfos);
832 return nProfileInfos;
833 }
834
CheckExtensionFromBundleInfo(const BundleInfo & bundleInfo,const std::string & abilityName,const std::string & moduleName,ExtensionAbilityInfo & targetExtensionInfo)835 ErrCode CheckExtensionFromBundleInfo(const BundleInfo& bundleInfo, const std::string& abilityName,
836 const std::string& moduleName, ExtensionAbilityInfo& targetExtensionInfo)
837 {
838 for (const auto& hapModuleInfo : bundleInfo.hapModuleInfos) {
839 for (const auto& extensionInfo : hapModuleInfo.extensionInfos) {
840 if (extensionInfo.name == abilityName && extensionInfo.moduleName == moduleName) {
841 if (!extensionInfo.enabled) {
842 APP_LOGI("extension disabled");
843 return ERROR_ABILITY_IS_DISABLED;
844 }
845 targetExtensionInfo = extensionInfo;
846 return ERR_OK;
847 }
848 }
849 }
850 return ERROR_ABILITY_NOT_EXIST;
851 }
852
GetProfileByExAbilitySync(napi_env env,napi_callback_info info)853 napi_value GetProfileByExAbilitySync(napi_env env, napi_callback_info info)
854 {
855 APP_LOGD("NAPI GetProfileByExAbilitySync called");
856 std::string moduleName;
857 std::string extensionAbilityName;
858 std::string metadataName;
859 if (ParamsProcessGetProfileByAbilitySync(env, info, moduleName, extensionAbilityName, metadataName) != ERR_OK) {
860 return nullptr;
861 }
862 auto iBundleMgr = CommonFunc::GetBundleMgr();
863 if (iBundleMgr == nullptr) {
864 napi_value error = BusinessError::CreateCommonError(env, ERROR_BUNDLE_SERVICE_EXCEPTION,
865 GET_PROFILE_BY_EXTENSION_ABILITY_SYNC);
866 napi_throw(env, error);
867 return nullptr;
868 }
869 auto baseFlag = static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) +
870 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_METADATA) +
871 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_DISABLE);
872 auto getExtensionFlag = baseFlag +
873 static_cast<int32_t>(GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_EXTENSION_ABILITY);
874 BundleInfo bundleInfo;
875 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetBundleInfoForSelf(getExtensionFlag, bundleInfo));
876 if (ret != ERR_OK) {
877 APP_LOGE("GetProfileByExAbilitySync failed");
878 napi_value businessError = BusinessError::CreateCommonError(env, ret, GET_PROFILE_BY_EXTENSION_ABILITY_SYNC);
879 napi_throw(env, businessError);
880 return nullptr;
881 }
882 ExtensionAbilityInfo targetExtensionInfo;
883 ret = CheckExtensionFromBundleInfo(bundleInfo, extensionAbilityName, moduleName, targetExtensionInfo);
884 if (ret != ERR_OK) {
885 APP_LOGE("GetProfileByExAbilitySync failed by CheckExtensionFromBundleInfo");
886 napi_value businessError = BusinessError::CreateCommonError(env, ret, GET_PROFILE_BY_EXTENSION_ABILITY_SYNC);
887 napi_throw(env, businessError);
888 return nullptr;
889 }
890 BundleMgrClient client;
891 std::vector<std::string> profileVec;
892 if (!client.GetProfileFromExtension(targetExtensionInfo, metadataName, profileVec)) {
893 APP_LOGE("GetProfileByExAbilitySync failed by GetProfileFromExtension");
894 napi_value businessError = BusinessError::CreateCommonError(
895 env, ERROR_PROFILE_NOT_EXIST, GET_PROFILE_BY_EXTENSION_ABILITY_SYNC);
896 napi_throw(env, businessError);
897 return nullptr;
898 }
899 napi_value nProfileInfos = nullptr;
900 NAPI_CALL(env, napi_create_array(env, &nProfileInfos));
901 CommonFunc::ConvertStringArrays(env, profileVec, nProfileInfos);
902 return nProfileInfos;
903 }
904
GetAppProvisionInfoSync(napi_env env,napi_callback_info info)905 napi_value GetAppProvisionInfoSync(napi_env env, napi_callback_info info)
906 {
907 APP_LOGD("NAPI GetAppProvisionInfoSync called");
908 NapiArg args(env, info);
909 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_TWO)) {
910 APP_LOGE("param count invalid");
911 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
912 return nullptr;
913 }
914 std::string bundleName;
915 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
916 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
917 return nullptr;
918 }
919 CHECK_STRING_EMPTY(env, bundleName, std::string{ BUNDLE_NAME });
920 int32_t userId = IPCSkeleton::GetCallingUid() / Constants::BASE_USER_RANGE;
921 if (args.GetMaxArgc() >= ARGS_SIZE_TWO) {
922 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ONE], userId)) {
923 APP_LOGW("Parse userId failed, set this parameter to the caller userId");
924 }
925 }
926 auto iBundleMgr = CommonFunc::GetBundleMgr();
927 if (iBundleMgr == nullptr) {
928 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
929 return nullptr;
930 }
931 AppProvisionInfo appProvisionInfo;
932 ErrCode ret = CommonFunc::ConvertErrCode(
933 iBundleMgr->GetAppProvisionInfo(bundleName, userId, appProvisionInfo));
934 if (ret != ERR_OK) {
935 APP_LOGD("GetAppProvisionInfoSync fail -n %{public}s -u %{public}d ret:%{public}d",
936 bundleName.c_str(), userId, ret);
937 napi_value businessError = BusinessError::CreateCommonError(
938 env, ret, GET_APP_PROVISION_INFO_SYNC, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
939 napi_throw(env, businessError);
940 return nullptr;
941 }
942 napi_value nAppProvisionInfo = nullptr;
943 NAPI_CALL(env, napi_create_object(env, &nAppProvisionInfo));
944 CommonFunc::ConvertAppProvisionInfo(env, appProvisionInfo, nAppProvisionInfo);
945 APP_LOGD("call GetAppProvisionInfoSync done");
946 return nAppProvisionInfo;
947 }
948
GetSignatureInfoSync(napi_env env,napi_callback_info info)949 napi_value GetSignatureInfoSync(napi_env env, napi_callback_info info)
950 {
951 APP_LOGD("NAPI GetSignatureInfoSync called");
952 NapiArg args(env, info);
953 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
954 APP_LOGE("param count invalid");
955 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
956 return nullptr;
957 }
958 int32_t uid = -1;
959 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ZERO], uid)) {
960 APP_LOGE("uid invalid");
961 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, UID, TYPE_NUMBER);
962 return nullptr;
963 }
964 auto iBundleMgr = CommonFunc::GetBundleMgr();
965 if (iBundleMgr == nullptr) {
966 BusinessError::ThrowError(env, ERROR_BUNDLE_SERVICE_EXCEPTION, ERR_MSG_BUNDLE_SERVICE_EXCEPTION);
967 return nullptr;
968 }
969 SignatureInfo signatureInfo;
970 ErrCode ret = CommonFunc::ConvertErrCode(iBundleMgr->GetSignatureInfoByUid(uid, signatureInfo));
971 if (ret != NO_ERROR) {
972 APP_LOGE("call GetSignatureInfoByUid failed, uid is %{public}d", uid);
973 napi_value businessError = BusinessError::CreateCommonError(
974 env, ret, GET_SIGNATURE_INFO, GET_SIGNATURE_INFO_PERMISSIONS);
975 napi_throw(env, businessError);
976 return nullptr;
977 }
978 napi_value nSignatureInfo = nullptr;
979 NAPI_CALL(env, napi_create_object(env, &nSignatureInfo));
980 CommonFunc::ConvertSignatureInfo(env, signatureInfo, nSignatureInfo);
981 APP_LOGD("call GetSignatureInfoSync done");
982 return nSignatureInfo;
983 }
984
GetSandboxDataDirSync(napi_env env,napi_callback_info info)985 napi_value GetSandboxDataDirSync(napi_env env, napi_callback_info info)
986 {
987 APP_LOGD("NAPI GetSandboxDataDirSync called");
988 NapiArg args(env, info);
989 if (!args.Init(ARGS_SIZE_TWO, ARGS_SIZE_TWO)) {
990 APP_LOGE("param count invalid");
991 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
992 return nullptr;
993 }
994 std::string bundleName;
995 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], bundleName)) {
996 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, BUNDLE_NAME, TYPE_STRING);
997 return nullptr;
998 }
999 int32_t appIndex;
1000 if (!CommonFunc::ParseInt(env, args[ARGS_POS_ONE], appIndex)) {
1001 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, APP_INDEX, TYPE_NUMBER);
1002 return nullptr;
1003 }
1004 if (appIndex < Constants::MAIN_APP_INDEX || appIndex > Constants::CLONE_APP_INDEX_MAX) {
1005 APP_LOGE("appIndex: %{public}d not in valid range", appIndex);
1006 BusinessError::ThrowParameterTypeError(env, ERROR_INVALID_APPINDEX, APP_INDEX, TYPE_NUMBER);
1007 return nullptr;
1008 }
1009 auto iBundleMgr = CommonFunc::GetBundleMgr();
1010 if (iBundleMgr == nullptr) {
1011 napi_value error = BusinessError::CreateCommonError(env, ERROR_BUNDLE_SERVICE_EXCEPTION,
1012 GET_SANDBOX_DATA_DIR_SYNC, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
1013 napi_throw(env, error);
1014 return nullptr;
1015 }
1016
1017 std::string sandboxDataDir;
1018 ErrCode ret = CommonFunc::ConvertErrCode(
1019 iBundleMgr->GetSandboxDataDir(bundleName, appIndex, sandboxDataDir));
1020 if (ret != ERR_OK) {
1021 APP_LOGE("GetSandboxDataDirSync failed ret=%{public}d", ret);
1022 napi_value businessError = BusinessError::CreateCommonError(
1023 env, ret, GET_SANDBOX_DATA_DIR_SYNC, Constants::PERMISSION_GET_BUNDLE_INFO_PRIVILEGED);
1024 napi_throw(env, businessError);
1025 return nullptr;
1026 }
1027
1028 napi_value nSandboxDataDir = nullptr;
1029 napi_create_string_utf8(env, sandboxDataDir.c_str(), NAPI_AUTO_LENGTH, &nSandboxDataDir);
1030
1031 APP_LOGD("call GetSandboxDataDirSync done");
1032 return nSandboxDataDir;
1033 }
1034
GetAppCloneIdentityBySandboxDataDirSync(napi_env env,napi_callback_info info)1035 napi_value GetAppCloneIdentityBySandboxDataDirSync(napi_env env, napi_callback_info info)
1036 {
1037 APP_LOGD("NAPI GetAppCloneIdentityBySandboxDataDirSync called");
1038 NapiArg args(env, info);
1039 if (!args.Init(ARGS_SIZE_ONE, ARGS_SIZE_ONE)) {
1040 APP_LOGE("param count invalid");
1041 BusinessError::ThrowTooFewParametersError(env, ERROR_PARAM_CHECK_ERROR);
1042 return nullptr;
1043 }
1044 std::string sandboxDataDir;
1045 if (!CommonFunc::ParseString(env, args[ARGS_POS_ZERO], sandboxDataDir)) {
1046 BusinessError::ThrowParameterTypeError(env, ERROR_PARAM_CHECK_ERROR, SANDBOX_DATA_DIR, TYPE_STRING);
1047 return nullptr;
1048 }
1049 std::string bundleName;
1050 int32_t appIndex;
1051 CommonFunc::GetBundleNameAndIndexBySandboxDataDir(sandboxDataDir, bundleName, appIndex);
1052
1053 napi_value nAppCloneIdentity = nullptr;
1054 NAPI_CALL(env, napi_create_object(env, &nAppCloneIdentity));
1055 CommonFunc::ConvertAppCloneIdentity(env, bundleName, appIndex, nAppCloneIdentity);
1056
1057 APP_LOGD("call GetAppCloneIdentityBySandboxDataDirSync done");
1058 return nAppCloneIdentity;
1059 }
1060 } // namespace AppExecFwk
1061 } // namespace OHOS
1062