1 /*
2 * Copyright (c) 2024-2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "utils/update_caller_info_util.h"
17
18 #include "ability_event_util.h"
19 #include "ability_util.h"
20 #include "ability_record.h"
21 #include "accesstoken_kit.h"
22 #include "app_scheduler.h"
23 #include "ams_configuration_parameter.h"
24 #include "dialog_session_manager.h"
25 #include "hilog_tag_wrapper.h"
26 #include "hitrace_meter.h"
27 #include "ipc_skeleton.h"
28 #include "permission_verification.h"
29 #include "scene_board_judgement.h"
30 #include "start_ability_utils.h"
31 #include "startup_util.h"
32
33 namespace OHOS {
34 namespace AAFwk {
35 namespace {
36 constexpr const char* DMS_CALLER_BUNDLE_NAME = "ohos.dms.param.sourceCallerBundleName";
37 constexpr const char* DMS_CALLER_ABILITY_NAME = "ohos.dms.param.sourceCallerAbilityName";
38 constexpr const char* DMS_CALLER_NATIVE_NAME = "ohos.dms.param.sourceCallerNativeName";
39 constexpr const char* DMS_CALLER_APP_ID = "ohos.dms.param.sourceCallerAppId";
40 constexpr const char* DMS_CALLER_APP_IDENTIFIER = "ohos.dms.param.sourceCallerAppIdentifier";
41 constexpr const char* PARAM_RESV_ANCO_CALLER_UID = "ohos.anco.param.callerUid";
42 constexpr const char* PARAM_RESV_ANCO_CALLER_BUNDLENAME = "ohos.anco.param.callerBundleName";
43 constexpr const char* WANT_PARAMS_APP_RESTART_FLAG = "ohos.aafwk.app.restart";
44 constexpr const char* CALLER_REQUEST_CODE = "ohos.extra.param.key.callerRequestCode";
45 constexpr const char* IS_SHELL_CALL = "isShellCall";
46 constexpr const char* COMPONENT_STARTUP_NEW_RULES = "component.startup.newRules";
47 constexpr const char* SPECIFIED_ABILITY_FLAG = "ohos.ability.params.specifiedAbilityFlag";
48 }
49
GetInstance()50 UpdateCallerInfoUtil &UpdateCallerInfoUtil::GetInstance()
51 {
52 static UpdateCallerInfoUtil instance;
53 return instance;
54 }
55
UpdateCallerInfo(Want & want,const sptr<IRemoteObject> & callerToken)56 void UpdateCallerInfoUtil::UpdateCallerInfo(Want& want, const sptr<IRemoteObject> &callerToken)
57 {
58 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
59 if (!StartAbilityUtils::IsCallFromAncoShellOrBroker(callerToken)) {
60 TAG_LOGD(AAFwkTag::ABILITYMGR, "not call from anco or broker.");
61 want.RemoveParam(PARAM_RESV_ANCO_CALLER_UID);
62 want.RemoveParam(PARAM_RESV_ANCO_CALLER_BUNDLENAME);
63 }
64 ClearProtectedWantParam(want);
65 int32_t tokenId = static_cast<int32_t>(IPCSkeleton::GetCallingTokenID());
66 int32_t callerUid = IPCSkeleton::GetCallingUid();
67 int32_t callerPid = IPCSkeleton::GetCallingPid();
68 want.RemoveParam(Want::PARAM_RESV_CALLER_TOKEN);
69 want.SetParam(Want::PARAM_RESV_CALLER_TOKEN, tokenId);
70 want.RemoveParam(Want::PARAM_RESV_CALLER_UID);
71 want.SetParam(Want::PARAM_RESV_CALLER_UID, callerUid);
72 want.RemoveParam(Want::PARAM_RESV_CALLER_PID);
73 want.SetParam(Want::PARAM_RESV_CALLER_PID, callerPid);
74 want.RemoveParam(WANT_PARAMS_APP_RESTART_FLAG);
75 want.RemoveParam(IS_SHELL_CALL);
76 want.RemoveParam(Want::PARAMS_REAL_CALLER_KEY);
77
78 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
79 if (!abilityRecord) {
80 std::string bundleName;
81 auto bundleMgr = AbilityUtil::GetBundleManagerHelper();
82 if (bundleMgr != nullptr) {
83 IN_PROCESS_CALL(bundleMgr->GetNameForUid(callerUid, bundleName));
84 }
85 if (bundleName == "") {
86 std::string nativeName;
87 Security::AccessToken::NativeTokenInfo nativeTokenInfo;
88 int32_t result = Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(tokenId, nativeTokenInfo);
89 if (result == ERR_OK) {
90 nativeName = "_" + nativeTokenInfo.processName;
91 }
92 want.SetParam(Want::PARAM_RESV_CALLER_NATIVE_NAME, nativeName);
93 }
94 UpdateCallerBundleName(want, bundleName);
95 UpdateCallerAbilityName(want, "");
96 UpdateCallerAppCloneIndex(want, 0);
97 return;
98 }
99 std::string callerBundleName = abilityRecord->GetAbilityInfo().bundleName;
100 UpdateCallerBundleName(want, callerBundleName);
101 std::string callerAbilityName = abilityRecord->GetAbilityInfo().name;
102 UpdateCallerAbilityName(want, callerAbilityName);
103 UpdateCallerAppCloneIndex(want, abilityRecord->GetAppIndex());
104 UpdateSignatureInfo(callerBundleName, want);
105 }
106
UpdateSignatureInfo(std::string bundleName,Want & want,bool isRemote)107 void UpdateCallerInfoUtil::UpdateSignatureInfo(std::string bundleName, Want& want, bool isRemote)
108 {
109 auto bundleMgr = AbilityUtil::GetBundleManagerHelper();
110 if (bundleMgr != nullptr) {
111 AppExecFwk::SignatureInfo signatureInfo;
112 TAG_LOGD(AAFwkTag::ABILITYMGR, "bundleName: %{public}s", bundleName.c_str());
113 IN_PROCESS_CALL(bundleMgr->GetSignatureInfoByBundleName(bundleName, signatureInfo));
114 std::string callerAppId = isRemote ? DMS_CALLER_APP_ID : Want::PARAM_RESV_CALLER_APP_ID;
115 std::string callerAppIdentifier = isRemote ? DMS_CALLER_APP_IDENTIFIER : Want::PARAM_RESV_CALLER_APP_IDENTIFIER;
116 want.RemoveParam(callerAppId);
117 want.SetParam(callerAppId, signatureInfo.appId);
118 want.RemoveParam(callerAppIdentifier);
119 want.SetParam(callerAppIdentifier, signatureInfo.appIdentifier);
120 }
121 }
122
UpdateAsCallerSourceInfo(Want & want,sptr<IRemoteObject> asCallerSourceToken,sptr<IRemoteObject> callerToken)123 void UpdateCallerInfoUtil::UpdateAsCallerSourceInfo(Want& want, sptr<IRemoteObject> asCallerSourceToken,
124 sptr<IRemoteObject> callerToken)
125 {
126 if (!StartAbilityUtils::IsCallFromAncoShellOrBroker(callerToken)) {
127 TAG_LOGD(AAFwkTag::ABILITYMGR, "not call from anco or broker.");
128 want.RemoveParam(PARAM_RESV_ANCO_CALLER_UID);
129 want.RemoveParam(PARAM_RESV_ANCO_CALLER_BUNDLENAME);
130 }
131 want.RemoveParam(Want::PARAM_RESV_CALLER_TOKEN);
132 want.RemoveParam(Want::PARAM_RESV_CALLER_UID);
133 want.RemoveParam(Want::PARAM_RESV_CALLER_PID);
134 want.RemoveParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
135 want.RemoveParam(Want::PARAM_RESV_CALLER_ABILITY_NAME);
136 want.RemoveParam(WANT_PARAMS_APP_RESTART_FLAG);
137 want.RemoveParam(IS_SHELL_CALL);
138 want.RemoveParam(Want::PARAMS_REAL_CALLER_KEY);
139 want.RemoveParam(Want::PARAM_RESV_CALLER_APP_CLONE_INDEX);
140 ClearProtectedWantParam(want);
141 #ifdef SUPPORT_SCREEN
142 if (UpdateAsCallerInfoFromDialog(want)) {
143 TAG_LOGD(AAFwkTag::ABILITYMGR, "Update as caller source info from dialog.");
144 return;
145 }
146 #endif // SUPPORT_SCREEN
147 if (AAFwk::PermissionVerification::GetInstance()->IsSACall()) {
148 TAG_LOGD(AAFwkTag::ABILITYMGR, "Update as caller source info from token.");
149 UpdateAsCallerInfoFromToken(want, asCallerSourceToken);
150 } else if (callerToken != nullptr) {
151 TAG_LOGD(AAFwkTag::ABILITYMGR, "Update as caller source info from callerRecord.");
152 UpdateAsCallerInfoFromCallerRecord(want, callerToken);
153 }
154 }
155
UpdateAsCallerInfoFromToken(Want & want,sptr<IRemoteObject> asCallerSourceToken)156 void UpdateCallerInfoUtil::UpdateAsCallerInfoFromToken(Want& want, sptr<IRemoteObject> asCallerSourceToken)
157 {
158 auto abilityRecord = Token::GetAbilityRecordByToken(asCallerSourceToken);
159 if (abilityRecord == nullptr) {
160 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed update caller info from token");
161 return;
162 }
163 AppExecFwk::RunningProcessInfo processInfo = {};
164 DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByToken(asCallerSourceToken, processInfo);
165 int32_t tokenId = abilityRecord->GetApplicationInfo().accessTokenId;
166 want.SetParam(Want::PARAM_RESV_CALLER_TOKEN, tokenId);
167 want.SetParam(Want::PARAM_RESV_CALLER_UID, processInfo.uid_);
168 want.SetParam(Want::PARAM_RESV_CALLER_PID, processInfo.pid_);
169
170 std::string callerBundleName = abilityRecord->GetAbilityInfo().bundleName;
171 want.SetParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME, callerBundleName);
172 std::string callerAbilityName = abilityRecord->GetAbilityInfo().name;
173 want.SetParam(Want::PARAM_RESV_CALLER_ABILITY_NAME, callerAbilityName);
174 UpdateCallerAppCloneIndex(want, abilityRecord->GetAppIndex());
175 UpdateSignatureInfo(callerBundleName, want);
176 }
177
UpdateAsCallerInfoFromCallerRecord(Want & want,sptr<IRemoteObject> callerToken)178 void UpdateCallerInfoUtil::UpdateAsCallerInfoFromCallerRecord(Want& want, sptr<IRemoteObject> callerToken)
179 {
180 auto callerRecord = Token::GetAbilityRecordByToken(callerToken);
181 CHECK_POINTER(callerRecord);
182 auto sourceInfo = callerRecord->GetCallerInfo();
183 CHECK_POINTER(sourceInfo);
184 std::string callerBundleName = sourceInfo->callerBundleName;
185 want.SetParam(Want::PARAM_RESV_CALLER_TOKEN, sourceInfo->callerTokenId);
186 want.SetParam(Want::PARAM_RESV_CALLER_UID, sourceInfo->callerUid);
187 want.SetParam(Want::PARAM_RESV_CALLER_PID, sourceInfo->callerPid);
188 want.SetParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME, callerBundleName);
189 want.SetParam(Want::PARAM_RESV_CALLER_ABILITY_NAME, sourceInfo->callerAbilityName);
190 want.SetParam(Want::PARAM_RESV_CALLER_APP_CLONE_INDEX, sourceInfo->callerAppCloneIndex);
191 if (callerBundleName == "") {
192 want.SetParam(Want::PARAM_RESV_CALLER_NATIVE_NAME, sourceInfo->callerNativeName);
193 return;
194 }
195 UpdateSignatureInfo(callerBundleName, want);
196 }
197
UpdateAsCallerInfoFromDialog(Want & want)198 bool UpdateCallerInfoUtil::UpdateAsCallerInfoFromDialog(Want& want)
199 {
200 std::string dialogSessionId = want.GetStringParam("dialogSessionId");
201 auto dialogCallerInfo = DialogSessionManager::GetInstance().GetDialogCallerInfo(dialogSessionId);
202 if (dialogCallerInfo == nullptr) {
203 TAG_LOGW(AAFwkTag::ABILITYMGR, "failed get dialog caller info");
204 return false;
205 }
206 Want dialogCallerWant = dialogCallerInfo->targetWant;
207 int32_t tokenId = dialogCallerWant.GetIntParam(Want::PARAM_RESV_CALLER_TOKEN, 0);
208 int32_t uid = dialogCallerWant.GetIntParam(Want::PARAM_RESV_CALLER_UID, 0);
209 int32_t pid = dialogCallerWant.GetIntParam(Want::PARAM_RESV_CALLER_PID, 0);
210 std::string callerBundleName = dialogCallerWant.GetStringParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
211 std::string callerAbilityName = dialogCallerWant.GetStringParam(Want::PARAM_RESV_CALLER_ABILITY_NAME);
212 int32_t callerAppCloneIndex = dialogCallerWant.GetIntParam(Want::PARAM_RESV_CALLER_APP_CLONE_INDEX, 0);
213 want.SetParam(Want::PARAM_RESV_CALLER_TOKEN, tokenId);
214 want.SetParam(Want::PARAM_RESV_CALLER_UID, uid);
215 want.SetParam(Want::PARAM_RESV_CALLER_PID, pid);
216 want.SetParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME, callerBundleName);
217 want.SetParam(Want::PARAM_RESV_CALLER_ABILITY_NAME, callerAbilityName);
218 want.SetParam(Want::PARAM_RESV_CALLER_APP_CLONE_INDEX, callerAppCloneIndex);
219 if (callerBundleName == "") {
220 want.SetParam(Want::PARAM_RESV_CALLER_NATIVE_NAME,
221 dialogCallerWant.GetStringParam(Want::PARAM_RESV_CALLER_NATIVE_NAME));
222 return true;
223 }
224 UpdateSignatureInfo(callerBundleName, want);
225 return true;
226 }
227
UpdateCallerInfoFromToken(Want & want,const sptr<IRemoteObject> & token)228 void UpdateCallerInfoUtil::UpdateCallerInfoFromToken(Want& want, const sptr<IRemoteObject> &token)
229 {
230 auto abilityRecord = Token::GetAbilityRecordByToken(token);
231 if (!abilityRecord) {
232 TAG_LOGW(AAFwkTag::ABILITYMGR, "caller abilityRecord null");
233 return;
234 }
235 ClearProtectedWantParam(want);
236 int32_t tokenId = abilityRecord->GetApplicationInfo().accessTokenId;
237 int32_t callerUid = abilityRecord->GetUid();
238 int32_t callerPid = abilityRecord->GetPid();
239 want.RemoveParam(Want::PARAM_RESV_CALLER_TOKEN);
240 want.SetParam(Want::PARAM_RESV_CALLER_TOKEN, tokenId);
241 want.RemoveParam(Want::PARAM_RESV_CALLER_UID);
242 want.SetParam(Want::PARAM_RESV_CALLER_UID, callerUid);
243 want.RemoveParam(Want::PARAM_RESV_CALLER_PID);
244 want.SetParam(Want::PARAM_RESV_CALLER_PID, callerPid);
245 want.RemoveParam(WANT_PARAMS_APP_RESTART_FLAG);
246 want.RemoveParam(IS_SHELL_CALL);
247 want.RemoveParam(Want::PARAMS_REAL_CALLER_KEY);
248
249 std::string callerBundleName = abilityRecord->GetAbilityInfo().bundleName;
250 want.RemoveParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
251 want.SetParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME, callerBundleName);
252 std::string callerAbilityName = abilityRecord->GetAbilityInfo().name;
253 want.RemoveParam(Want::PARAM_RESV_CALLER_ABILITY_NAME);
254 want.SetParam(Want::PARAM_RESV_CALLER_ABILITY_NAME, callerAbilityName);
255 UpdateCallerAppCloneIndex(want, abilityRecord->GetAppIndex());
256 UpdateSignatureInfo(callerBundleName, want);
257 }
258
UpdateBackToCallerFlag(const sptr<IRemoteObject> & callerToken,Want & want,int32_t requestCode,bool backFlag)259 void UpdateCallerInfoUtil::UpdateBackToCallerFlag(const sptr<IRemoteObject> &callerToken, Want &want,
260 int32_t requestCode, bool backFlag)
261 {
262 if (want.HasParameter(CALLER_REQUEST_CODE)) {
263 want.RemoveParam(CALLER_REQUEST_CODE);
264 }
265 auto callerAbilityRecord = Token::GetAbilityRecordByToken(callerToken);
266 if (requestCode > 0 && callerAbilityRecord != nullptr) {
267 // default return true on oh
268 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
269 backFlag = AmsConfigurationParameter::GetInstance().IsSupportBackToCaller();
270 }
271 auto fullRequestCode = AbilityRuntime::StartupUtil::GenerateFullRequestCode(
272 callerAbilityRecord->GetPid(), backFlag, requestCode);
273 want.SetParam(CALLER_REQUEST_CODE, std::to_string(fullRequestCode));
274 TAG_LOGI(AAFwkTag::ABILITYMGR,
275 "pid: %{public}d, backFlag:%{private}d, requestCode: %{private}d, fullRequestCode: %{private}s",
276 callerAbilityRecord->GetPid(), backFlag, requestCode, std::to_string(fullRequestCode).c_str());
277 }
278 }
279
UpdateDmsCallerInfo(Want & want,const sptr<IRemoteObject> & callerToken)280 void UpdateCallerInfoUtil::UpdateDmsCallerInfo(Want& want, const sptr<IRemoteObject> &callerToken)
281 {
282 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
283 int32_t tokenId = static_cast<int32_t>(IPCSkeleton::GetCallingTokenID());
284 int32_t callerUid = IPCSkeleton::GetCallingUid();
285 ClearProtectedWantParam(want);
286
287 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
288 if (!abilityRecord) {
289 std::string bundleName;
290 auto bundleMgr = AbilityUtil::GetBundleManagerHelper();
291 if (bundleMgr != nullptr) {
292 IN_PROCESS_CALL(bundleMgr->GetNameForUid(callerUid, bundleName));
293 }
294 if (bundleName == "") {
295 std::string nativeName;
296 Security::AccessToken::NativeTokenInfo nativeTokenInfo;
297 int32_t result = Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(tokenId, nativeTokenInfo);
298 if (result == ERR_OK) {
299 nativeName = "_" + nativeTokenInfo.processName;
300 }
301 want.RemoveParam(DMS_CALLER_NATIVE_NAME);
302 want.SetParam(DMS_CALLER_NATIVE_NAME, nativeName);
303 }
304 want.RemoveParam(DMS_CALLER_BUNDLE_NAME);
305 want.SetParam(DMS_CALLER_BUNDLE_NAME, bundleName);
306 want.RemoveParam(DMS_CALLER_ABILITY_NAME);
307 want.SetParam(DMS_CALLER_ABILITY_NAME, std::string(""));
308 return;
309 }
310 std::string callerBundleName = abilityRecord->GetAbilityInfo().bundleName;
311 want.RemoveParam(DMS_CALLER_BUNDLE_NAME);
312 want.SetParam(DMS_CALLER_BUNDLE_NAME, callerBundleName);
313 std::string callerAbilityName = abilityRecord->GetAbilityInfo().name;
314 want.RemoveParam(DMS_CALLER_ABILITY_NAME);
315 want.SetParam(DMS_CALLER_ABILITY_NAME, callerAbilityName);
316 UpdateSignatureInfo(callerBundleName, want, true);
317 }
318
UpdateCallerBundleName(Want & want,const std::string & bundleName)319 void UpdateCallerInfoUtil::UpdateCallerBundleName(Want& want, const std::string &bundleName)
320 {
321 want.RemoveParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
322 want.SetParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME, bundleName);
323 }
324
UpdateCallerAbilityName(Want & want,const std::string & abilityName)325 void UpdateCallerInfoUtil::UpdateCallerAbilityName(Want& want, const std::string &abilityName)
326 {
327 want.RemoveParam(Want::PARAM_RESV_CALLER_ABILITY_NAME);
328 want.SetParam(Want::PARAM_RESV_CALLER_ABILITY_NAME, abilityName);
329 }
330
UpdateCallerAppCloneIndex(Want & want,int32_t appIndex)331 void UpdateCallerInfoUtil::UpdateCallerAppCloneIndex(Want& want, int32_t appIndex)
332 {
333 want.RemoveParam(Want::PARAM_RESV_CALLER_APP_CLONE_INDEX);
334 want.SetParam(Want::PARAM_RESV_CALLER_APP_CLONE_INDEX, appIndex);
335 }
336
ClearProtectedWantParam(Want & want)337 void UpdateCallerInfoUtil::ClearProtectedWantParam(Want &want)
338 {
339 if (want.HasParameter(Want::PARAM_RESV_CALLER_NATIVE_NAME)) {
340 EventInfo eventInfo;
341 eventInfo.bundleName = want.GetElement().GetBundleName();
342 eventInfo.moduleName = want.GetElement().GetModuleName();
343 eventInfo.abilityName = want.GetElement().GetAbilityName();
344 int32_t callerUid = IPCSkeleton::GetCallingUid();
345 std::string callerBundleName;
346 auto bundleMgr = AbilityUtil::GetBundleManagerHelper();
347 if (bundleMgr != nullptr) {
348 IN_PROCESS_CALL(bundleMgr->GetNameForUid(callerUid, callerBundleName));
349 }
350 eventInfo.callerBundleName = callerBundleName.empty() ? std::to_string(callerUid) : callerBundleName;
351 AbilityEventUtil eventUtil;
352 eventUtil.SendStartAbilityErrorEvent(eventInfo, AAFwk::ERR_NOT_EXPECTED_NATIVE_CALLER_NAME,
353 std::string("no expected caller native name: ") + want.GetStringParam(Want::PARAM_RESV_CALLER_NATIVE_NAME));
354 }
355 want.RemoveParam(Want::PARAM_RESV_CALLER_NATIVE_NAME);
356 want.RemoveParam(COMPONENT_STARTUP_NEW_RULES);
357 if (!PermissionVerification::GetInstance()->IsSystemAppCall()) {
358 // only system app can set unifiedDataKey
359 want.RemoveParam(Want::PARAM_ABILITY_UNIFIED_DATA_KEY);
360 }
361 want.RemoveParam(SPECIFIED_ABILITY_FLAG);
362 }
363 } // namespace AAFwk
364 } // namespace OHOS
365