• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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