• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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