1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "start_ability_utils.h"
17
18 #include "ability_record.h"
19 #include "ability_util.h"
20 #include "app_utils.h"
21 #include "global_constant.h"
22 #include "hitrace_meter.h"
23 #include "startup_util.h"
24
25 namespace OHOS {
26 namespace AAFwk {
27 namespace {
28 constexpr const char* SCREENSHOT_BUNDLE_NAME = "com.huawei.ohos.screenshot";
29 constexpr const char* SCREENSHOT_ABILITY_NAME = "com.huawei.ohos.screenshot.ServiceExtAbility";
30 constexpr int32_t ERMS_ISALLOW_RESULTCODE = 10;
31 constexpr const char* SHELL_ASSISTANT_BUNDLENAME = "com.huawei.shell_assistant";
32 constexpr int32_t BROKER_UID = 5557;
33 constexpr const char* PARAM_RESV_ANCO_CALLER_UID = "ohos.anco.param.callerUid";
34 constexpr const char* PARAM_RESV_ANCO_CALLER_BUNDLENAME = "ohos.anco.param.callerBundleName";
35 }
36 thread_local std::shared_ptr<StartAbilityInfo> StartAbilityUtils::startAbilityInfo;
37 thread_local std::shared_ptr<StartAbilityInfo> StartAbilityUtils::callerAbilityInfo;
38 thread_local bool StartAbilityUtils::skipCrowTest = false;
39 thread_local bool StartAbilityUtils::skipStartOther = false;
40 thread_local bool StartAbilityUtils::skipErms = false;
41 thread_local int32_t StartAbilityUtils::ermsResultCode = ERMS_ISALLOW_RESULTCODE;
42 thread_local bool StartAbilityUtils::isWantWithAppCloneIndex = false;
43 thread_local bool StartAbilityUtils::ermsSupportBackToCallerFlag = false;
44
GetAppIndex(const Want & want,sptr<IRemoteObject> callerToken,int32_t & appIndex)45 bool StartAbilityUtils::GetAppIndex(const Want &want, sptr<IRemoteObject> callerToken, int32_t &appIndex)
46 {
47 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
48 if (abilityRecord && abilityRecord->GetAppIndex() > AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX &&
49 abilityRecord->GetApplicationInfo().bundleName == want.GetElement().GetBundleName()) {
50 appIndex = abilityRecord->GetAppIndex();
51 return true;
52 }
53 TAG_LOGI(AAFwkTag::ABILITYMGR, "appCloneIndex: %{public}d.", want.GetIntParam(Want::PARAM_APP_CLONE_INDEX_KEY, 0));
54 return AbilityRuntime::StartupUtil::GetAppIndex(want, appIndex);
55 }
56
GetApplicationInfo(const std::string & bundleName,int32_t userId,AppExecFwk::ApplicationInfo & appInfo)57 bool StartAbilityUtils::GetApplicationInfo(const std::string &bundleName, int32_t userId,
58 AppExecFwk::ApplicationInfo &appInfo)
59 {
60 if (StartAbilityUtils::startAbilityInfo &&
61 StartAbilityUtils::startAbilityInfo->GetAppBundleName() == bundleName) {
62 appInfo = StartAbilityUtils::startAbilityInfo->abilityInfo.applicationInfo;
63 } else {
64 if (bundleName.empty()) {
65 return false;
66 }
67 auto bms = AbilityUtil::GetBundleManagerHelper();
68 CHECK_POINTER_AND_RETURN(bms, false);
69 bool result = IN_PROCESS_CALL(
70 bms->GetApplicationInfo(bundleName, AppExecFwk::ApplicationFlag::GET_BASIC_APPLICATION_INFO,
71 userId, appInfo)
72 );
73 if (!result) {
74 TAG_LOGW(AAFwkTag::ABILITYMGR, "Get app info from bms failed: %{public}s", bundleName.c_str());
75 return false;
76 }
77 }
78 return true;
79 }
80
GetCallerAbilityInfo(const sptr<IRemoteObject> & callerToken,AppExecFwk::AbilityInfo & abilityInfo)81 bool StartAbilityUtils::GetCallerAbilityInfo(const sptr<IRemoteObject> &callerToken,
82 AppExecFwk::AbilityInfo &abilityInfo)
83 {
84 if (StartAbilityUtils::callerAbilityInfo) {
85 abilityInfo = StartAbilityUtils::callerAbilityInfo->abilityInfo;
86 } else {
87 if (callerToken == nullptr) {
88 return false;
89 }
90 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
91 if (abilityRecord == nullptr) {
92 return false;
93 }
94 abilityInfo = abilityRecord->GetAbilityInfo();
95 }
96 return true;
97 }
98
GetCloneAppIndexes(const std::string & bundleName,int32_t userId)99 std::vector<int32_t> StartAbilityUtils::GetCloneAppIndexes(const std::string &bundleName, int32_t userId)
100 {
101 std::vector<int32_t> appIndexes;
102 auto bms = AbilityUtil::GetBundleManagerHelper();
103 CHECK_POINTER_AND_RETURN(bms, appIndexes);
104 IN_PROCESS_CALL_WITHOUT_RET(bms->GetCloneAppIndexes(bundleName, appIndexes, userId));
105 return appIndexes;
106 }
107
CheckAppProvisionMode(const std::string & bundleName,int32_t userId)108 int32_t StartAbilityUtils::CheckAppProvisionMode(const std::string& bundleName, int32_t userId)
109 {
110 AppExecFwk::ApplicationInfo appInfo;
111 if (!GetApplicationInfo(bundleName, userId, appInfo)) {
112 TAG_LOGE(AAFwkTag::ABILITYMGR, "Get application info failed: %{public}s", bundleName.c_str());
113 return ERR_INVALID_VALUE;
114 }
115 if (appInfo.appProvisionType != AppExecFwk::Constants::APP_PROVISION_TYPE_DEBUG) {
116 return ERR_NOT_IN_APP_PROVISION_MODE;
117 }
118 return ERR_OK;
119 }
120
CheckAppProvisionMode(const Want & want,int32_t userId)121 int32_t StartAbilityUtils::CheckAppProvisionMode(const Want& want, int32_t userId)
122 {
123 auto abilityInfo = StartAbilityUtils::startAbilityInfo;
124 if (!abilityInfo || abilityInfo->GetAppBundleName() != want.GetElement().GetBundleName()) {
125 int32_t appIndex = 0;
126 if (!AbilityRuntime::StartupUtil::GetAppIndex(want, appIndex)) {
127 TAG_LOGE(AAFwkTag::ABILITYMGR, "invalid app clone index");
128 return ERR_APP_CLONE_INDEX_INVALID;
129 }
130 abilityInfo = StartAbilityInfo::CreateStartAbilityInfo(want, userId, appIndex);
131 }
132 CHECK_POINTER_AND_RETURN(abilityInfo, GET_ABILITY_SERVICE_FAILED);
133 if (abilityInfo->status != ERR_OK) {
134 TAG_LOGE(AAFwkTag::ABILITYMGR, "unexpected abilityInfo status=%{public}d", abilityInfo->status);
135 return abilityInfo->status;
136 }
137 if ((abilityInfo->abilityInfo).applicationInfo.appProvisionType !=
138 AppExecFwk::Constants::APP_PROVISION_TYPE_DEBUG) {
139 TAG_LOGE(AAFwkTag::ABILITYMGR, "window options are not supported in non-app-provision mode.");
140 return ERR_NOT_IN_APP_PROVISION_MODE;
141 }
142 return ERR_OK;
143 }
144
StartAbilityInfoWrap(const Want & want,int32_t validUserId,int32_t appIndex,const sptr<IRemoteObject> & callerToken,bool isExtension)145 StartAbilityInfoWrap::StartAbilityInfoWrap(const Want &want, int32_t validUserId, int32_t appIndex,
146 const sptr<IRemoteObject> &callerToken, bool isExtension)
147 {
148 if (StartAbilityUtils::startAbilityInfo != nullptr) {
149 TAG_LOGW(AAFwkTag::ABILITYMGR, "startAbilityInfo has been created");
150 }
151 // This is for special goal and could be removed later.
152 auto element = want.GetElement();
153 if (element.GetAbilityName() == SCREENSHOT_ABILITY_NAME &&
154 element.GetBundleName() == SCREENSHOT_BUNDLE_NAME) {
155 isExtension = true;
156 StartAbilityUtils::skipErms = true;
157 }
158 Want localWant = want;
159 if (!StartAbilityUtils::IsCallFromAncoShellOrBroker(callerToken)) {
160 TAG_LOGD(AAFwkTag::ABILITYMGR, "not call from anco or broker.");
161 localWant.RemoveParam(PARAM_RESV_ANCO_CALLER_UID);
162 localWant.RemoveParam(PARAM_RESV_ANCO_CALLER_BUNDLENAME);
163 localWant.RemoveParam(Want::PARAM_RESV_CALLER_TOKEN);
164 localWant.RemoveParam(Want::PARAM_RESV_CALLER_UID);
165 localWant.RemoveParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
166 localWant.SetParam(Want::PARAM_RESV_CALLER_TOKEN, static_cast<int32_t>(IPCSkeleton::GetCallingTokenID()));
167 localWant.SetParam(Want::PARAM_RESV_CALLER_UID, IPCSkeleton::GetCallingUid());
168 }
169 if (isExtension) {
170 StartAbilityUtils::startAbilityInfo = StartAbilityInfo::CreateStartExtensionInfo(localWant,
171 validUserId, appIndex);
172 } else {
173 StartAbilityUtils::startAbilityInfo = StartAbilityInfo::CreateStartAbilityInfo(localWant,
174 validUserId, appIndex);
175 }
176 if (StartAbilityUtils::startAbilityInfo != nullptr &&
177 StartAbilityUtils::startAbilityInfo->abilityInfo.type == AppExecFwk::AbilityType::EXTENSION) {
178 StartAbilityUtils::skipCrowTest = true;
179 StartAbilityUtils::skipStartOther = true;
180 }
181
182 if (StartAbilityUtils::callerAbilityInfo != nullptr) {
183 TAG_LOGW(AAFwkTag::ABILITYMGR, "callerAbilityInfo has been created");
184 }
185 StartAbilityUtils::callerAbilityInfo = StartAbilityInfo::CreateCallerAbilityInfo(callerToken);
186
187 StartAbilityUtils::ermsResultCode = ERMS_ISALLOW_RESULTCODE;
188 StartAbilityUtils::isWantWithAppCloneIndex = false;
189 if (want.HasParameter(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY) && appIndex >= 0 &&
190 appIndex < AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
191 StartAbilityUtils::isWantWithAppCloneIndex = true;
192 }
193 }
194
~StartAbilityInfoWrap()195 StartAbilityInfoWrap::~StartAbilityInfoWrap()
196 {
197 StartAbilityUtils::startAbilityInfo.reset();
198 StartAbilityUtils::callerAbilityInfo.reset();
199 StartAbilityUtils::skipCrowTest = false;
200 StartAbilityUtils::skipStartOther = false;
201 StartAbilityUtils::skipErms = false;
202 StartAbilityUtils::ermsResultCode = ERMS_ISALLOW_RESULTCODE;
203 StartAbilityUtils::isWantWithAppCloneIndex = false;
204 }
205
CreateStartAbilityInfo(const Want & want,int32_t userId,int32_t appIndex)206 std::shared_ptr<StartAbilityInfo> StartAbilityInfo::CreateStartAbilityInfo(const Want &want, int32_t userId,
207 int32_t appIndex)
208 {
209 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
210 auto bms = AbilityUtil::GetBundleManagerHelper();
211 CHECK_POINTER_AND_RETURN(bms, nullptr);
212 auto abilityInfoFlag = AbilityRuntime::StartupUtil::BuildAbilityInfoFlag() |
213 AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL;
214 auto request = std::make_shared<StartAbilityInfo>();
215 if (appIndex > 0 && appIndex <= AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
216 IN_PROCESS_CALL_WITHOUT_RET(bms->QueryCloneAbilityInfo(want.GetElement(), abilityInfoFlag, appIndex,
217 request->abilityInfo, userId));
218 if (request->abilityInfo.name.empty() || request->abilityInfo.bundleName.empty()) {
219 FindExtensionInfo(want, abilityInfoFlag, userId, appIndex, request);
220 }
221 return request;
222 }
223 if (appIndex == 0) {
224 IN_PROCESS_CALL_WITHOUT_RET(bms->QueryAbilityInfo(want, abilityInfoFlag, userId, request->abilityInfo));
225 } else {
226 IN_PROCESS_CALL_WITHOUT_RET(bms->GetSandboxAbilityInfo(want, appIndex,
227 abilityInfoFlag, userId, request->abilityInfo));
228 }
229 if (request->abilityInfo.name.empty() || request->abilityInfo.bundleName.empty()) {
230 // try to find extension
231 std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
232 if (appIndex == 0) {
233 IN_PROCESS_CALL_WITHOUT_RET(bms->QueryExtensionAbilityInfos(want, abilityInfoFlag,
234 userId, extensionInfos));
235 } else {
236 IN_PROCESS_CALL_WITHOUT_RET(bms->GetSandboxExtAbilityInfos(want, appIndex,
237 abilityInfoFlag, userId, extensionInfos));
238 }
239 if (extensionInfos.size() <= 0) {
240 TAG_LOGE(AAFwkTag::ABILITYMGR, "Get extension info failed.");
241 request->status = RESOLVE_ABILITY_ERR;
242 return request;
243 }
244
245 AppExecFwk::ExtensionAbilityInfo extensionInfo = extensionInfos.front();
246 if (extensionInfo.bundleName.empty() || extensionInfo.name.empty()) {
247 TAG_LOGE(AAFwkTag::ABILITYMGR, "extensionInfo empty.");
248 request->status = RESOLVE_ABILITY_ERR;
249 return request;
250 }
251 request->extensionProcessMode = extensionInfo.extensionProcessMode;
252 // For compatibility translates to AbilityInfo
253 AbilityRuntime::StartupUtil::InitAbilityInfoFromExtension(extensionInfo, request->abilityInfo);
254 }
255 return request;
256 }
257
CreateStartExtensionInfo(const Want & want,int32_t userId,int32_t appIndex)258 std::shared_ptr<StartAbilityInfo> StartAbilityInfo::CreateStartExtensionInfo(const Want &want, int32_t userId,
259 int32_t appIndex)
260 {
261 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
262 auto bms = AbilityUtil::GetBundleManagerHelper();
263 CHECK_POINTER_AND_RETURN(bms, nullptr);
264 auto abilityInfoFlag = AbilityRuntime::StartupUtil::BuildAbilityInfoFlag() |
265 AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL;
266 auto abilityInfo = std::make_shared<StartAbilityInfo>();
267 if (appIndex > 0 && appIndex <= AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
268 FindExtensionInfo(want, abilityInfoFlag, userId, appIndex, abilityInfo);
269 return abilityInfo;
270 }
271
272 std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
273 if (appIndex == 0) {
274 IN_PROCESS_CALL_WITHOUT_RET(bms->QueryExtensionAbilityInfos(want, abilityInfoFlag, userId, extensionInfos));
275 } else {
276 IN_PROCESS_CALL_WITHOUT_RET(bms->GetSandboxExtAbilityInfos(want, appIndex,
277 abilityInfoFlag, userId, extensionInfos));
278 }
279 if (extensionInfos.size() <= 0) {
280 TAG_LOGE(AAFwkTag::ABILITYMGR, "CreateStartExtensionInfo error. Get extension info failed.");
281 abilityInfo->status = RESOLVE_ABILITY_ERR;
282 return abilityInfo;
283 }
284
285 AppExecFwk::ExtensionAbilityInfo extensionInfo = extensionInfos.front();
286 if (extensionInfo.bundleName.empty() || extensionInfo.name.empty()) {
287 TAG_LOGE(AAFwkTag::ABILITYMGR, "extensionInfo empty.");
288 abilityInfo->status = RESOLVE_ABILITY_ERR;
289 return abilityInfo;
290 }
291 abilityInfo->extensionProcessMode = extensionInfo.extensionProcessMode;
292 // For compatibility translates to AbilityInfo
293 AbilityRuntime::StartupUtil::InitAbilityInfoFromExtension(extensionInfo, abilityInfo->abilityInfo);
294
295 return abilityInfo;
296 }
297
FindExtensionInfo(const Want & want,int32_t flags,int32_t userId,int32_t appIndex,std::shared_ptr<StartAbilityInfo> abilityInfo)298 void StartAbilityInfo::FindExtensionInfo(const Want &want, int32_t flags, int32_t userId,
299 int32_t appIndex, std::shared_ptr<StartAbilityInfo> abilityInfo)
300 {
301 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
302 CHECK_POINTER_LOG(abilityInfo, "abilityInfo is invalid.");
303 auto bms = AbilityUtil::GetBundleManagerHelper();
304 CHECK_POINTER_LOG(bms, "bms is invalid.");
305 AppExecFwk::ExtensionAbilityInfo extensionInfo;
306 IN_PROCESS_CALL_WITHOUT_RET(bms->QueryCloneExtensionAbilityInfoWithAppIndex(want.GetElement(),
307 flags, appIndex, extensionInfo, userId));
308 if (extensionInfo.bundleName.empty() || extensionInfo.name.empty()) {
309 TAG_LOGE(AAFwkTag::ABILITYMGR, "extensionInfo empty.");
310 abilityInfo->status = RESOLVE_ABILITY_ERR;
311 return;
312 }
313 if (AbilityRuntime::StartupUtil::IsSupportAppClone(extensionInfo.type)) {
314 abilityInfo->extensionProcessMode = extensionInfo.extensionProcessMode;
315 // For compatibility translates to AbilityInfo
316 AbilityRuntime::StartupUtil::InitAbilityInfoFromExtension(extensionInfo, abilityInfo->abilityInfo);
317 } else {
318 abilityInfo->status = ERR_APP_CLONE_INDEX_INVALID;
319 }
320 }
321
CreateCallerAbilityInfo(const sptr<IRemoteObject> & callerToken)322 std::shared_ptr<StartAbilityInfo> StartAbilityInfo::CreateCallerAbilityInfo(const sptr<IRemoteObject> &callerToken)
323 {
324 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
325 if (callerToken == nullptr) {
326 TAG_LOGD(AAFwkTag::ABILITYMGR, "not call from context.");
327 return nullptr;
328 }
329 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
330 if (abilityRecord == nullptr) {
331 TAG_LOGE(AAFwkTag::ABILITYMGR, "can not find abilityRecord");
332 return nullptr;
333 }
334 auto request = std::make_shared<StartAbilityInfo>();
335 request->abilityInfo = abilityRecord->GetAbilityInfo();
336 return request;
337 }
338
IsCallFromAncoShellOrBroker(const sptr<IRemoteObject> & callerToken)339 bool StartAbilityUtils::IsCallFromAncoShellOrBroker(const sptr<IRemoteObject> &callerToken)
340 {
341 auto callingUid = IPCSkeleton::GetCallingUid();
342 if (callingUid == BROKER_UID) {
343 return true;
344 }
345 AppExecFwk::AbilityInfo callerAbilityInfo;
346 if (GetCallerAbilityInfo(callerToken, callerAbilityInfo)) {
347 return callerAbilityInfo.bundleName == SHELL_ASSISTANT_BUNDLENAME;
348 }
349 return false;
350 }
351 }
352 }