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 int32_t ERMS_ISALLOW_RESULTCODE = 10;
29 constexpr const char* PARAM_RESV_ANCO_CALLER_UID = "ohos.anco.param.callerUid";
30 constexpr const char* PARAM_RESV_ANCO_CALLER_BUNDLENAME = "ohos.anco.param.callerBundleName";
31 }
32 thread_local std::shared_ptr<StartAbilityInfo> StartAbilityUtils::startAbilityInfo;
33 thread_local std::shared_ptr<StartAbilityInfo> StartAbilityUtils::callerAbilityInfo;
34 thread_local bool StartAbilityUtils::skipCrowTest = false;
35 thread_local bool StartAbilityUtils::skipStartOther = false;
36 thread_local bool StartAbilityUtils::skipErms = false;
37 thread_local int32_t StartAbilityUtils::ermsResultCode = ERMS_ISALLOW_RESULTCODE;
38 thread_local bool StartAbilityUtils::isWantWithAppCloneIndex = false;
39 thread_local bool StartAbilityUtils::ermsSupportBackToCallerFlag = false;
40
GetAppIndex(const Want & want,sptr<IRemoteObject> callerToken,int32_t & appIndex)41 bool StartAbilityUtils::GetAppIndex(const Want &want, sptr<IRemoteObject> callerToken, int32_t &appIndex)
42 {
43 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
44 if (abilityRecord && abilityRecord->GetAppIndex() > AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX &&
45 abilityRecord->GetApplicationInfo().bundleName == want.GetElement().GetBundleName()) {
46 appIndex = abilityRecord->GetAppIndex();
47 return true;
48 }
49 TAG_LOGI(AAFwkTag::ABILITYMGR, "appCloneIndex:%{public}d", want.GetIntParam(Want::PARAM_APP_CLONE_INDEX_KEY, -1));
50 return AbilityRuntime::StartupUtil::GetAppIndex(want, appIndex);
51 }
52
GetApplicationInfo(const std::string & bundleName,int32_t userId,AppExecFwk::ApplicationInfo & appInfo)53 bool StartAbilityUtils::GetApplicationInfo(const std::string &bundleName, int32_t userId,
54 AppExecFwk::ApplicationInfo &appInfo)
55 {
56 if (StartAbilityUtils::startAbilityInfo &&
57 StartAbilityUtils::startAbilityInfo->GetAppBundleName() == bundleName) {
58 appInfo = StartAbilityUtils::startAbilityInfo->abilityInfo.applicationInfo;
59 return true;
60 }
61 if (bundleName.empty()) {
62 return false;
63 }
64 auto bms = AbilityUtil::GetBundleManagerHelper();
65 CHECK_POINTER_AND_RETURN(bms, false);
66 bool result = IN_PROCESS_CALL(
67 bms->GetApplicationInfo(bundleName, AppExecFwk::ApplicationFlag::GET_BASIC_APPLICATION_INFO,
68 userId, appInfo)
69 );
70 if (!result) {
71 TAG_LOGW(AAFwkTag::ABILITYMGR, "failed: %{public}s", bundleName.c_str());
72 return false;
73 }
74 return true;
75 }
76
GetCallerAbilityInfo(const sptr<IRemoteObject> & callerToken,AppExecFwk::AbilityInfo & abilityInfo)77 bool StartAbilityUtils::GetCallerAbilityInfo(const sptr<IRemoteObject> &callerToken,
78 AppExecFwk::AbilityInfo &abilityInfo)
79 {
80 if (StartAbilityUtils::callerAbilityInfo) {
81 abilityInfo = StartAbilityUtils::callerAbilityInfo->abilityInfo;
82 } else {
83 if (callerToken == nullptr) {
84 return false;
85 }
86 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
87 if (abilityRecord == nullptr) {
88 return false;
89 }
90 abilityInfo = abilityRecord->GetAbilityInfo();
91 }
92 return true;
93 }
94
GetCloneAppIndexes(const std::string & bundleName,int32_t userId)95 std::vector<int32_t> StartAbilityUtils::GetCloneAppIndexes(const std::string &bundleName, int32_t userId)
96 {
97 std::vector<int32_t> appIndexes;
98 auto bms = AbilityUtil::GetBundleManagerHelper();
99 CHECK_POINTER_AND_RETURN(bms, appIndexes);
100 IN_PROCESS_CALL_WITHOUT_RET(bms->GetCloneAppIndexes(bundleName, appIndexes, userId));
101 return appIndexes;
102 }
103
CheckAppProvisionMode(const std::string & bundleName,int32_t userId)104 int32_t StartAbilityUtils::CheckAppProvisionMode(const std::string& bundleName, int32_t userId)
105 {
106 AppExecFwk::ApplicationInfo appInfo;
107 if (!GetApplicationInfo(bundleName, userId, appInfo)) {
108 TAG_LOGE(AAFwkTag::ABILITYMGR, "Get application info failed: %{public}s", bundleName.c_str());
109 return ERR_INVALID_VALUE;
110 }
111 if (appInfo.appProvisionType != AppExecFwk::Constants::APP_PROVISION_TYPE_DEBUG) {
112 return ERR_NOT_IN_APP_PROVISION_MODE;
113 }
114 return ERR_OK;
115 }
116
CheckAppProvisionMode(const Want & want,int32_t userId)117 int32_t StartAbilityUtils::CheckAppProvisionMode(const Want& want, int32_t userId)
118 {
119 auto abilityInfo = StartAbilityUtils::startAbilityInfo;
120 if (!abilityInfo || abilityInfo->GetAppBundleName() != want.GetElement().GetBundleName()) {
121 int32_t appIndex = 0;
122 if (!AbilityRuntime::StartupUtil::GetAppIndex(want, appIndex)) {
123 TAG_LOGE(AAFwkTag::ABILITYMGR, "invalid app clone index");
124 return ERR_APP_CLONE_INDEX_INVALID;
125 }
126 abilityInfo = StartAbilityInfo::CreateStartAbilityInfo(want, userId, appIndex);
127 }
128 CHECK_POINTER_AND_RETURN(abilityInfo, GET_ABILITY_SERVICE_FAILED);
129 if (abilityInfo->status != ERR_OK) {
130 TAG_LOGE(AAFwkTag::ABILITYMGR, "unexpected abilityInfo status: %{public}d", abilityInfo->status);
131 return abilityInfo->status;
132 }
133 if ((abilityInfo->abilityInfo).applicationInfo.appProvisionType !=
134 AppExecFwk::Constants::APP_PROVISION_TYPE_DEBUG) {
135 TAG_LOGE(AAFwkTag::ABILITYMGR, "window options invalid");
136 return ERR_NOT_IN_APP_PROVISION_MODE;
137 }
138 return ERR_OK;
139 }
140
StartAbilityInfoWrap(const Want & want,int32_t validUserId,int32_t appIndex,const sptr<IRemoteObject> & callerToken,bool isExtension)141 StartAbilityInfoWrap::StartAbilityInfoWrap(const Want &want, int32_t validUserId, int32_t appIndex,
142 const sptr<IRemoteObject> &callerToken, bool isExtension)
143 {
144 if (StartAbilityUtils::startAbilityInfo != nullptr) {
145 TAG_LOGW(AAFwkTag::ABILITYMGR, "startAbilityInfo created");
146 }
147 Want localWant = want;
148 if (!StartAbilityUtils::IsCallFromAncoShellOrBroker(callerToken)) {
149 TAG_LOGD(AAFwkTag::ABILITYMGR, "not call from anco or broker.");
150 localWant.RemoveParam(PARAM_RESV_ANCO_CALLER_UID);
151 localWant.RemoveParam(PARAM_RESV_ANCO_CALLER_BUNDLENAME);
152 localWant.RemoveParam(Want::PARAM_RESV_CALLER_TOKEN);
153 localWant.RemoveParam(Want::PARAM_RESV_CALLER_UID);
154 localWant.RemoveParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
155 localWant.SetParam(Want::PARAM_RESV_CALLER_TOKEN, static_cast<int32_t>(IPCSkeleton::GetCallingTokenID()));
156 localWant.SetParam(Want::PARAM_RESV_CALLER_UID, IPCSkeleton::GetCallingUid());
157 }
158 if (isExtension) {
159 StartAbilityUtils::startAbilityInfo = StartAbilityInfo::CreateStartExtensionInfo(localWant,
160 validUserId, appIndex);
161 } else {
162 StartAbilityUtils::startAbilityInfo = StartAbilityInfo::CreateStartAbilityInfo(localWant,
163 validUserId, appIndex);
164 }
165 if (StartAbilityUtils::startAbilityInfo != nullptr &&
166 StartAbilityUtils::startAbilityInfo->abilityInfo.type == AppExecFwk::AbilityType::EXTENSION) {
167 StartAbilityUtils::skipCrowTest = true;
168 StartAbilityUtils::skipStartOther = true;
169 }
170
171 if (StartAbilityUtils::callerAbilityInfo != nullptr) {
172 TAG_LOGW(AAFwkTag::ABILITYMGR, "callerAbilityInfo created");
173 }
174 StartAbilityUtils::callerAbilityInfo = StartAbilityInfo::CreateCallerAbilityInfo(callerToken);
175
176 StartAbilityUtils::ermsResultCode = ERMS_ISALLOW_RESULTCODE;
177 StartAbilityUtils::isWantWithAppCloneIndex = false;
178 if (want.HasParameter(AAFwk::Want::PARAM_APP_CLONE_INDEX_KEY) && appIndex >= 0 &&
179 appIndex < AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
180 StartAbilityUtils::isWantWithAppCloneIndex = true;
181 }
182 }
StartAbilityInfoWrap()183 StartAbilityInfoWrap::StartAbilityInfoWrap()
184 {
185 StartAbilityUtils::startAbilityInfo.reset();
186 StartAbilityUtils::callerAbilityInfo.reset();
187 StartAbilityUtils::skipCrowTest = false;
188 StartAbilityUtils::skipStartOther = false;
189 StartAbilityUtils::skipErms = false;
190 StartAbilityUtils::ermsResultCode = ERMS_ISALLOW_RESULTCODE;
191 StartAbilityUtils::isWantWithAppCloneIndex = false;
192 }
193
~StartAbilityInfoWrap()194 StartAbilityInfoWrap::~StartAbilityInfoWrap()
195 {
196 StartAbilityUtils::startAbilityInfo.reset();
197 StartAbilityUtils::callerAbilityInfo.reset();
198 StartAbilityUtils::skipCrowTest = false;
199 StartAbilityUtils::skipStartOther = false;
200 StartAbilityUtils::skipErms = false;
201 StartAbilityUtils::ermsResultCode = ERMS_ISALLOW_RESULTCODE;
202 StartAbilityUtils::isWantWithAppCloneIndex = false;
203 }
204
SetStartAbilityInfo(const AppExecFwk::AbilityInfo & abilityInfo)205 void StartAbilityInfoWrap::SetStartAbilityInfo(const AppExecFwk::AbilityInfo& abilityInfo)
206 {
207 if (StartAbilityUtils::startAbilityInfo != nullptr) {
208 return;
209 }
210 StartAbilityUtils::startAbilityInfo = std::make_shared<StartAbilityInfo>();
211 StartAbilityUtils::startAbilityInfo->abilityInfo = abilityInfo;
212 }
213
CreateStartAbilityInfo(const Want & want,int32_t userId,int32_t appIndex)214 std::shared_ptr<StartAbilityInfo> StartAbilityInfo::CreateStartAbilityInfo(const Want &want, int32_t userId,
215 int32_t appIndex)
216 {
217 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
218 auto bms = AbilityUtil::GetBundleManagerHelper();
219 CHECK_POINTER_AND_RETURN(bms, nullptr);
220 auto abilityInfoFlag = static_cast<uint32_t>(AbilityRuntime::StartupUtil::BuildAbilityInfoFlag()) |
221 static_cast<uint32_t>(AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL);
222 auto request = std::make_shared<StartAbilityInfo>();
223 if (appIndex > 0 && appIndex <= AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
224 IN_PROCESS_CALL_WITHOUT_RET(bms->QueryCloneAbilityInfo(want.GetElement(), abilityInfoFlag, appIndex,
225 request->abilityInfo, userId));
226 request->customProcess = request->abilityInfo.process;
227 if (request->abilityInfo.name.empty() || request->abilityInfo.bundleName.empty()) {
228 FindExtensionInfo(want, abilityInfoFlag, userId, appIndex, request);
229 }
230 return request;
231 }
232 if (appIndex == 0) {
233 IN_PROCESS_CALL_WITHOUT_RET(bms->QueryAbilityInfo(want, abilityInfoFlag, userId, request->abilityInfo));
234 } else {
235 IN_PROCESS_CALL_WITHOUT_RET(bms->GetSandboxAbilityInfo(want, appIndex,
236 abilityInfoFlag, userId, request->abilityInfo));
237 }
238 request->customProcess = request->abilityInfo.process;
239 TAG_LOGD(AAFwkTag::ABILITYMGR, "abilityInfo customProcess: %{public}s", request->customProcess.c_str());
240 if (request->abilityInfo.name.empty() || request->abilityInfo.bundleName.empty()) {
241 // try to find extension
242 std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
243 if (appIndex == 0) {
244 IN_PROCESS_CALL_WITHOUT_RET(bms->QueryExtensionAbilityInfos(want, abilityInfoFlag,
245 userId, extensionInfos));
246 } else {
247 IN_PROCESS_CALL_WITHOUT_RET(bms->GetSandboxExtAbilityInfos(want, appIndex,
248 abilityInfoFlag, userId, extensionInfos));
249 }
250 if (extensionInfos.size() <= 0) {
251 TAG_LOGE(AAFwkTag::ABILITYMGR, "extensionInfo empty");
252 request->status = RESOLVE_ABILITY_ERR;
253 return request;
254 }
255
256 AppExecFwk::ExtensionAbilityInfo extensionInfo = extensionInfos.front();
257 if (extensionInfo.bundleName.empty() || extensionInfo.name.empty()) {
258 TAG_LOGE(AAFwkTag::ABILITYMGR, "extensionInfo empty.");
259 request->status = RESOLVE_ABILITY_ERR;
260 return request;
261 }
262 request->extensionProcessMode = extensionInfo.extensionProcessMode;
263 // For compatibility translates to AbilityInfo
264 AbilityRuntime::StartupUtil::InitAbilityInfoFromExtension(extensionInfo, request->abilityInfo);
265 }
266 return request;
267 }
268
CreateStartExtensionInfo(const Want & want,int32_t userId,int32_t appIndex)269 std::shared_ptr<StartAbilityInfo> StartAbilityInfo::CreateStartExtensionInfo(const Want &want, int32_t userId,
270 int32_t appIndex)
271 {
272 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
273 auto bms = AbilityUtil::GetBundleManagerHelper();
274 CHECK_POINTER_AND_RETURN(bms, nullptr);
275 auto abilityInfoFlag = static_cast<uint32_t>(AbilityRuntime::StartupUtil::BuildAbilityInfoFlag()) |
276 static_cast<uint32_t>(AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL);
277 auto abilityInfo = std::make_shared<StartAbilityInfo>();
278 if (appIndex > 0 && appIndex <= AbilityRuntime::GlobalConstant::MAX_APP_CLONE_INDEX) {
279 FindExtensionInfo(want, abilityInfoFlag, userId, appIndex, abilityInfo);
280 return abilityInfo;
281 }
282
283 std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
284 if (appIndex == 0) {
285 IN_PROCESS_CALL_WITHOUT_RET(bms->QueryExtensionAbilityInfos(want, abilityInfoFlag, userId, extensionInfos));
286 } else {
287 IN_PROCESS_CALL_WITHOUT_RET(bms->GetSandboxExtAbilityInfos(want, appIndex,
288 abilityInfoFlag, userId, extensionInfos));
289 }
290 if (extensionInfos.size() <= 0) {
291 TAG_LOGE(AAFwkTag::ABILITYMGR, "extensionInfo empty");
292 abilityInfo->status = RESOLVE_ABILITY_ERR;
293 return abilityInfo;
294 }
295
296 AppExecFwk::ExtensionAbilityInfo extensionInfo = extensionInfos.front();
297 if (extensionInfo.bundleName.empty() || extensionInfo.name.empty()) {
298 TAG_LOGE(AAFwkTag::ABILITYMGR, "extensionInfo empty");
299 abilityInfo->status = RESOLVE_ABILITY_ERR;
300 return abilityInfo;
301 }
302 abilityInfo->extensionProcessMode = extensionInfo.extensionProcessMode;
303 abilityInfo->customProcess = extensionInfo.customProcess;
304 // For compatibility translates to AbilityInfo
305 AbilityRuntime::StartupUtil::InitAbilityInfoFromExtension(extensionInfo, abilityInfo->abilityInfo);
306
307 return abilityInfo;
308 }
309
FindExtensionInfo(const Want & want,int32_t flags,int32_t userId,int32_t appIndex,std::shared_ptr<StartAbilityInfo> abilityInfo)310 void StartAbilityInfo::FindExtensionInfo(const Want &want, int32_t flags, int32_t userId,
311 int32_t appIndex, std::shared_ptr<StartAbilityInfo> abilityInfo)
312 {
313 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
314 CHECK_POINTER_LOG(abilityInfo, "abilityInfo is invalid.");
315 auto bms = AbilityUtil::GetBundleManagerHelper();
316 CHECK_POINTER_LOG(bms, "bms is invalid.");
317 AppExecFwk::ExtensionAbilityInfo extensionInfo;
318 IN_PROCESS_CALL_WITHOUT_RET(bms->QueryCloneExtensionAbilityInfoWithAppIndex(want.GetElement(),
319 flags, appIndex, extensionInfo, userId));
320 if (extensionInfo.bundleName.empty() || extensionInfo.name.empty()) {
321 TAG_LOGE(AAFwkTag::ABILITYMGR, "extensionInfo empty");
322 abilityInfo->status = RESOLVE_ABILITY_ERR;
323 return;
324 }
325 abilityInfo->customProcess = extensionInfo.customProcess;
326 if (AbilityRuntime::StartupUtil::IsSupportAppClone(extensionInfo.type)) {
327 abilityInfo->extensionProcessMode = extensionInfo.extensionProcessMode;
328 // For compatibility translates to AbilityInfo
329 AbilityRuntime::StartupUtil::InitAbilityInfoFromExtension(extensionInfo, abilityInfo->abilityInfo);
330 } else {
331 abilityInfo->status = ERR_APP_CLONE_INDEX_INVALID;
332 }
333 }
334
CreateCallerAbilityInfo(const sptr<IRemoteObject> & callerToken)335 std::shared_ptr<StartAbilityInfo> StartAbilityInfo::CreateCallerAbilityInfo(const sptr<IRemoteObject> &callerToken)
336 {
337 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
338 if (callerToken == nullptr) {
339 TAG_LOGD(AAFwkTag::ABILITYMGR, "not call from context.");
340 return nullptr;
341 }
342 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
343 if (abilityRecord == nullptr) {
344 TAG_LOGE(AAFwkTag::ABILITYMGR, "abilityRecord empty");
345 return nullptr;
346 }
347 auto request = std::make_shared<StartAbilityInfo>();
348 request->abilityInfo = abilityRecord->GetAbilityInfo();
349 return request;
350 }
351
IsCallFromAncoShellOrBroker(const sptr<IRemoteObject> & callerToken)352 bool StartAbilityUtils::IsCallFromAncoShellOrBroker(const sptr<IRemoteObject> &callerToken)
353 {
354 auto callingUid = IPCSkeleton::GetCallingUid();
355 if (callingUid == AppUtils::GetInstance().GetCollaboratorBrokerUID()) {
356 return true;
357 }
358 AppExecFwk::AbilityInfo callerAbilityInfo;
359 if (GetCallerAbilityInfo(callerToken, callerAbilityInfo)) {
360 return callerAbilityInfo.bundleName == AppUtils::GetInstance().GetBrokerDelegateBundleName();
361 }
362 return false;
363 }
364 }
365 }