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 "utils/update_caller_info_util.h"
17
18 #include "ability_util.h"
19 #include "ability_record.h"
20 #include "accesstoken_kit.h"
21 #include "app_scheduler.h"
22 #include "ams_configuration_parameter.h"
23 #include "dialog_session_manager.h"
24 #include "hilog_tag_wrapper.h"
25 #include "hitrace_meter.h"
26 #include "ipc_skeleton.h"
27 #include "scene_board_judgement.h"
28 #include "start_ability_utils.h"
29 #include "startup_util.h"
30
31 namespace OHOS {
32 namespace AAFwk {
33 namespace {
34 constexpr const char* DMS_CALLER_BUNDLE_NAME = "ohos.dms.param.sourceCallerBundleName";
35 constexpr const char* DMS_CALLER_ABILITY_NAME = "ohos.dms.param.sourceCallerAbilityName";
36 constexpr const char* DMS_CALLER_NATIVE_NAME = "ohos.dms.param.sourceCallerNativeName";
37 constexpr const char* DMS_CALLER_APP_ID = "ohos.dms.param.sourceCallerAppId";
38 constexpr const char* DMS_CALLER_APP_IDENTIFIER = "ohos.dms.param.sourceCallerAppIdentifier";
39 constexpr const char* PARAM_RESV_ANCO_CALLER_UID = "ohos.anco.param.callerUid";
40 constexpr const char* PARAM_RESV_ANCO_CALLER_BUNDLENAME = "ohos.anco.param.callerBundleName";
41 constexpr const char* WANT_PARAMS_APP_RESTART_FLAG = "ohos.aafwk.app.restart";
42 constexpr const char* CALLER_REQUEST_CODE = "ohos.extra.param.key.callerRequestCode";
43 }
44
GetInstance()45 UpdateCallerInfoUtil &UpdateCallerInfoUtil::GetInstance()
46 {
47 static UpdateCallerInfoUtil instance;
48 return instance;
49 }
50
UpdateCallerInfo(Want& want, const sptr<IRemoteObject> &callerToken)51 void UpdateCallerInfoUtil::UpdateCallerInfo(Want& want, const sptr<IRemoteObject> &callerToken)
52 {
53 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
54 if (!StartAbilityUtils::IsCallFromAncoShellOrBroker(callerToken)) {
55 TAG_LOGD(AAFwkTag::ABILITYMGR, "not call from anco or broker.");
56 want.RemoveParam(PARAM_RESV_ANCO_CALLER_UID);
57 want.RemoveParam(PARAM_RESV_ANCO_CALLER_BUNDLENAME);
58 }
59 int32_t tokenId = static_cast<int32_t>(IPCSkeleton::GetCallingTokenID());
60 int32_t callerUid = IPCSkeleton::GetCallingUid();
61 int32_t callerPid = IPCSkeleton::GetCallingPid();
62 want.RemoveParam(Want::PARAM_RESV_CALLER_TOKEN);
63 want.SetParam(Want::PARAM_RESV_CALLER_TOKEN, tokenId);
64 want.RemoveParam(Want::PARAM_RESV_CALLER_UID);
65 want.SetParam(Want::PARAM_RESV_CALLER_UID, callerUid);
66 want.RemoveParam(Want::PARAM_RESV_CALLER_PID);
67 want.SetParam(Want::PARAM_RESV_CALLER_PID, callerPid);
68 want.RemoveParam(WANT_PARAMS_APP_RESTART_FLAG);
69
70 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
71 if (!abilityRecord) {
72 std::string bundleName;
73 auto bundleMgr = AbilityUtil::GetBundleManagerHelper();
74 if (bundleMgr != nullptr) {
75 IN_PROCESS_CALL(bundleMgr->GetNameForUid(callerUid, bundleName));
76 }
77 if (bundleName == "") {
78 std::string nativeName;
79 Security::AccessToken::NativeTokenInfo nativeTokenInfo;
80 int32_t result = Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(tokenId, nativeTokenInfo);
81 if (result == ERR_OK) {
82 nativeName = "_" + nativeTokenInfo.processName;
83 }
84 want.RemoveParam(Want::PARAM_RESV_CALLER_NATIVE_NAME);
85 want.SetParam(Want::PARAM_RESV_CALLER_NATIVE_NAME, nativeName);
86 }
87 want.RemoveParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
88 want.SetParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME, bundleName);
89 want.RemoveParam(Want::PARAM_RESV_CALLER_ABILITY_NAME);
90 want.SetParam(Want::PARAM_RESV_CALLER_ABILITY_NAME, std::string(""));
91 return;
92 }
93 std::string callerBundleName = abilityRecord->GetAbilityInfo().bundleName;
94 want.RemoveParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
95 want.SetParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME, callerBundleName);
96 std::string callerAbilityName = abilityRecord->GetAbilityInfo().name;
97 want.RemoveParam(Want::PARAM_RESV_CALLER_ABILITY_NAME);
98 want.SetParam(Want::PARAM_RESV_CALLER_ABILITY_NAME, callerAbilityName);
99 UpdateSignatureInfo(callerBundleName, want);
100 }
101
UpdateSignatureInfo(std::string bundleName, Want& want, bool isRemote)102 void UpdateCallerInfoUtil::UpdateSignatureInfo(std::string bundleName, Want& want, bool isRemote)
103 {
104 auto bundleMgr = AbilityUtil::GetBundleManagerHelper();
105 if (bundleMgr != nullptr) {
106 AppExecFwk::SignatureInfo signatureInfo;
107 IN_PROCESS_CALL(bundleMgr->GetSignatureInfoByBundleName(bundleName, signatureInfo));
108 std::string callerAppId = isRemote ? DMS_CALLER_APP_ID : Want::PARAM_RESV_CALLER_APP_ID;
109 std::string callerAppIdentifier = isRemote ? DMS_CALLER_APP_IDENTIFIER : Want::PARAM_RESV_CALLER_APP_IDENTIFIER;
110 want.RemoveParam(callerAppId);
111 want.SetParam(callerAppId, signatureInfo.appId);
112 want.RemoveParam(callerAppIdentifier);
113 want.SetParam(callerAppIdentifier, signatureInfo.appIdentifier);
114 }
115 }
116
UpdateAsCallerSourceInfo(Want& want, sptr<IRemoteObject> asCallerSourceToken, sptr<IRemoteObject> callerToken)117 void UpdateCallerInfoUtil::UpdateAsCallerSourceInfo(Want& want, sptr<IRemoteObject> asCallerSourceToken,
118 sptr<IRemoteObject> callerToken)
119 {
120 #ifdef SUPPORT_SCREEN
121 if (UpdateAsCallerInfoFromDialog(want)) {
122 TAG_LOGD(AAFwkTag::ABILITYMGR, "Update as caller source info from dialog.");
123 return;
124 }
125 #endif // SUPPORT_SCREEN
126 if (asCallerSourceToken != nullptr) {
127 TAG_LOGD(AAFwkTag::ABILITYMGR, "Update as caller source info from token.");
128 UpdateAsCallerInfoFromToken(want, asCallerSourceToken);
129 } else if (callerToken != nullptr) {
130 TAG_LOGD(AAFwkTag::ABILITYMGR, "Update as caller source info from callerRecord.");
131 UpdateAsCallerInfoFromCallerRecord(want, callerToken);
132 }
133 }
134
UpdateAsCallerInfoFromToken(Want& want, sptr<IRemoteObject> asCallerSourceToken)135 void UpdateCallerInfoUtil::UpdateAsCallerInfoFromToken(Want& want, sptr<IRemoteObject> asCallerSourceToken)
136 {
137 if (!StartAbilityUtils::IsCallFromAncoShellOrBroker(asCallerSourceToken)) {
138 TAG_LOGD(AAFwkTag::ABILITYMGR, "not call from anco or broker.");
139 want.RemoveParam(PARAM_RESV_ANCO_CALLER_UID);
140 want.RemoveParam(PARAM_RESV_ANCO_CALLER_BUNDLENAME);
141 }
142 want.RemoveParam(Want::PARAM_RESV_CALLER_TOKEN);
143 want.RemoveParam(Want::PARAM_RESV_CALLER_UID);
144 want.RemoveParam(Want::PARAM_RESV_CALLER_PID);
145 want.RemoveParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
146 want.RemoveParam(Want::PARAM_RESV_CALLER_ABILITY_NAME);
147 want.RemoveParam(WANT_PARAMS_APP_RESTART_FLAG);
148
149 auto abilityRecord = Token::GetAbilityRecordByToken(asCallerSourceToken);
150 if (abilityRecord == nullptr) {
151 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed update caller info from token");
152 return;
153 }
154 AppExecFwk::RunningProcessInfo processInfo = {};
155 DelayedSingleton<AppScheduler>::GetInstance()->GetRunningProcessInfoByToken(asCallerSourceToken, processInfo);
156 int32_t tokenId = abilityRecord->GetApplicationInfo().accessTokenId;
157 want.SetParam(Want::PARAM_RESV_CALLER_TOKEN, tokenId);
158 want.SetParam(Want::PARAM_RESV_CALLER_UID, processInfo.uid_);
159 want.SetParam(Want::PARAM_RESV_CALLER_PID, processInfo.pid_);
160
161 std::string callerBundleName = abilityRecord->GetAbilityInfo().bundleName;
162 want.SetParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME, callerBundleName);
163 std::string callerAbilityName = abilityRecord->GetAbilityInfo().name;
164 want.SetParam(Want::PARAM_RESV_CALLER_ABILITY_NAME, callerAbilityName);
165 UpdateSignatureInfo(callerBundleName, want);
166 }
167
UpdateAsCallerInfoFromCallerRecord(Want& want, sptr<IRemoteObject> callerToken)168 void UpdateCallerInfoUtil::UpdateAsCallerInfoFromCallerRecord(Want& want, sptr<IRemoteObject> callerToken)
169 {
170 if (!StartAbilityUtils::IsCallFromAncoShellOrBroker(callerToken)) {
171 TAG_LOGD(AAFwkTag::ABILITYMGR, "not call from anco or broker.");
172 want.RemoveParam(PARAM_RESV_ANCO_CALLER_UID);
173 want.RemoveParam(PARAM_RESV_ANCO_CALLER_BUNDLENAME);
174 }
175 want.RemoveParam(Want::PARAM_RESV_CALLER_TOKEN);
176 want.RemoveParam(Want::PARAM_RESV_CALLER_UID);
177 want.RemoveParam(Want::PARAM_RESV_CALLER_PID);
178 want.RemoveParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
179 want.RemoveParam(Want::PARAM_RESV_CALLER_ABILITY_NAME);
180 want.RemoveParam(Want::PARAM_RESV_CALLER_NATIVE_NAME);
181 want.RemoveParam(WANT_PARAMS_APP_RESTART_FLAG);
182 auto callerRecord = Token::GetAbilityRecordByToken(callerToken);
183 CHECK_POINTER(callerRecord);
184 auto sourceInfo = callerRecord->GetCallerInfo();
185 CHECK_POINTER(sourceInfo);
186 std::string callerBundleName = sourceInfo->callerBundleName;
187 want.SetParam(Want::PARAM_RESV_CALLER_TOKEN, sourceInfo->callerTokenId);
188 want.SetParam(Want::PARAM_RESV_CALLER_UID, sourceInfo->callerUid);
189 want.SetParam(Want::PARAM_RESV_CALLER_PID, sourceInfo->callerPid);
190 want.SetParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME, callerBundleName);
191 want.SetParam(Want::PARAM_RESV_CALLER_ABILITY_NAME, sourceInfo->callerAbilityName);
192 if (callerBundleName == "") {
193 want.SetParam(Want::PARAM_RESV_CALLER_NATIVE_NAME, sourceInfo->callerNativeName);
194 return;
195 }
196 UpdateSignatureInfo(callerBundleName, want);
197 }
198
UpdateAsCallerInfoFromDialog(Want& want)199 bool UpdateCallerInfoUtil::UpdateAsCallerInfoFromDialog(Want& want)
200 {
201 std::string dialogSessionId = want.GetStringParam("dialogSessionId");
202 auto dialogCallerInfo = DialogSessionManager::GetInstance().GetDialogCallerInfo(dialogSessionId);
203 if (dialogCallerInfo == nullptr) {
204 TAG_LOGW(AAFwkTag::ABILITYMGR, "failed get dialog caller info");
205 return false;
206 }
207 Want dialogCallerWant = dialogCallerInfo->targetWant;
208 int32_t tokenId = dialogCallerWant.GetIntParam(Want::PARAM_RESV_CALLER_TOKEN, 0);
209 int32_t uid = dialogCallerWant.GetIntParam(Want::PARAM_RESV_CALLER_UID, 0);
210 int32_t pid = dialogCallerWant.GetIntParam(Want::PARAM_RESV_CALLER_PID, 0);
211 std::string callerBundleName = dialogCallerWant.GetStringParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
212 std::string callerAbilityName = dialogCallerWant.GetStringParam(Want::PARAM_RESV_CALLER_ABILITY_NAME);
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.RemoveParam(Want::PARAM_RESV_CALLER_NATIVE_NAME);
219 want.RemoveParam(WANT_PARAMS_APP_RESTART_FLAG);
220 if (callerBundleName == "") {
221 want.SetParam(Want::PARAM_RESV_CALLER_NATIVE_NAME,
222 dialogCallerWant.GetStringParam(Want::PARAM_RESV_CALLER_NATIVE_NAME));
223 return true;
224 }
225 UpdateSignatureInfo(callerBundleName, want);
226 return true;
227 }
228
UpdateCallerInfoFromToken(Want& want, const sptr<IRemoteObject> &token)229 void UpdateCallerInfoUtil::UpdateCallerInfoFromToken(Want& want, const sptr<IRemoteObject> &token)
230 {
231 auto abilityRecord = Token::GetAbilityRecordByToken(token);
232 if (!abilityRecord) {
233 TAG_LOGW(AAFwkTag::ABILITYMGR, "caller abilityRecord null");
234 return;
235 }
236
237 int32_t tokenId = abilityRecord->GetApplicationInfo().accessTokenId;
238 int32_t callerUid = abilityRecord->GetUid();
239 int32_t callerPid = abilityRecord->GetPid();
240 want.RemoveParam(Want::PARAM_RESV_CALLER_TOKEN);
241 want.SetParam(Want::PARAM_RESV_CALLER_TOKEN, tokenId);
242 want.RemoveParam(Want::PARAM_RESV_CALLER_UID);
243 want.SetParam(Want::PARAM_RESV_CALLER_UID, callerUid);
244 want.RemoveParam(Want::PARAM_RESV_CALLER_PID);
245 want.SetParam(Want::PARAM_RESV_CALLER_PID, callerPid);
246 want.RemoveParam(WANT_PARAMS_APP_RESTART_FLAG);
247
248 std::string callerBundleName = abilityRecord->GetAbilityInfo().bundleName;
249 want.RemoveParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME);
250 want.SetParam(Want::PARAM_RESV_CALLER_BUNDLE_NAME, callerBundleName);
251 std::string callerAbilityName = abilityRecord->GetAbilityInfo().name;
252 want.RemoveParam(Want::PARAM_RESV_CALLER_ABILITY_NAME);
253 want.SetParam(Want::PARAM_RESV_CALLER_ABILITY_NAME, callerAbilityName);
254 UpdateSignatureInfo(callerBundleName, want);
255 }
256
UpdateBackToCallerFlag(const sptr<IRemoteObject> &callerToken, Want &want, int32_t requestCode, bool backFlag)257 void UpdateCallerInfoUtil::UpdateBackToCallerFlag(const sptr<IRemoteObject> &callerToken, Want &want,
258 int32_t requestCode, bool backFlag)
259 {
260 if (want.HasParameter(CALLER_REQUEST_CODE)) {
261 want.RemoveParam(CALLER_REQUEST_CODE);
262 }
263 auto callerAbilityRecord = Token::GetAbilityRecordByToken(callerToken);
264 if (requestCode > 0 && callerAbilityRecord != nullptr) {
265 // default return true on oh
266 if (!Rosen::SceneBoardJudgement::IsSceneBoardEnabled()) {
267 backFlag = AmsConfigurationParameter::GetInstance().IsSupportBackToCaller();
268 }
269 auto fullRequestCode = AbilityRuntime::StartupUtil::GenerateFullRequestCode(
270 callerAbilityRecord->GetPid(), backFlag, requestCode);
271 want.SetParam(CALLER_REQUEST_CODE, std::to_string(fullRequestCode));
272 TAG_LOGI(AAFwkTag::ABILITYMGR,
273 "pid: %{public}d, backFlag:%{private}d, requestCode: %{private}d, fullRequestCode: %{private}s",
274 callerAbilityRecord->GetPid(), backFlag, requestCode, std::to_string(fullRequestCode).c_str());
275 }
276 }
277
UpdateDmsCallerInfo(Want& want, const sptr<IRemoteObject> &callerToken)278 void UpdateCallerInfoUtil::UpdateDmsCallerInfo(Want& want, const sptr<IRemoteObject> &callerToken)
279 {
280 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
281 int32_t tokenId = static_cast<int32_t>(IPCSkeleton::GetCallingTokenID());
282 int32_t callerUid = IPCSkeleton::GetCallingUid();
283
284 auto abilityRecord = Token::GetAbilityRecordByToken(callerToken);
285 if (!abilityRecord) {
286 std::string bundleName;
287 auto bundleMgr = AbilityUtil::GetBundleManagerHelper();
288 if (bundleMgr != nullptr) {
289 IN_PROCESS_CALL(bundleMgr->GetNameForUid(callerUid, bundleName));
290 }
291 if (bundleName == "") {
292 std::string nativeName;
293 Security::AccessToken::NativeTokenInfo nativeTokenInfo;
294 int32_t result = Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(tokenId, nativeTokenInfo);
295 if (result == ERR_OK) {
296 nativeName = "_" + nativeTokenInfo.processName;
297 }
298 want.RemoveParam(DMS_CALLER_NATIVE_NAME);
299 want.SetParam(DMS_CALLER_NATIVE_NAME, nativeName);
300 }
301 want.RemoveParam(DMS_CALLER_BUNDLE_NAME);
302 want.SetParam(DMS_CALLER_BUNDLE_NAME, bundleName);
303 want.RemoveParam(DMS_CALLER_ABILITY_NAME);
304 want.SetParam(DMS_CALLER_ABILITY_NAME, std::string(""));
305 return;
306 }
307 std::string callerBundleName = abilityRecord->GetAbilityInfo().bundleName;
308 want.RemoveParam(DMS_CALLER_BUNDLE_NAME);
309 want.SetParam(DMS_CALLER_BUNDLE_NAME, callerBundleName);
310 std::string callerAbilityName = abilityRecord->GetAbilityInfo().name;
311 want.RemoveParam(DMS_CALLER_ABILITY_NAME);
312 want.SetParam(DMS_CALLER_ABILITY_NAME, callerAbilityName);
313 UpdateSignatureInfo(callerBundleName, want, true);
314 }
315 } // namespace AAFwk
316 } // namespace OHOS
317