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