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