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