18e9cee63Sopenharmony_ci/* 28e9cee63Sopenharmony_ci* Copyright (C) 2024 Huawei Device Co., Ltd. 38e9cee63Sopenharmony_ci* Licensed under the Apache License, Version 2.0 (the "License"); 48e9cee63Sopenharmony_ci* you may not use this file except in compliance with the License. 58e9cee63Sopenharmony_ci* You may obtain a copy of the License at 68e9cee63Sopenharmony_ci* 78e9cee63Sopenharmony_ci* http://www.apache.org/licenses/LICENSE-2.0 88e9cee63Sopenharmony_ci* 98e9cee63Sopenharmony_ci* Unless required by applicable law or agreed to in writing, software 108e9cee63Sopenharmony_ci* distributed under the License is distributed on an "AS IS" BASIS, 118e9cee63Sopenharmony_ci* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128e9cee63Sopenharmony_ci* See the License for the specific language governing permissions and 138e9cee63Sopenharmony_ci* limitations under the License. 148e9cee63Sopenharmony_ci*/ 158e9cee63Sopenharmony_ci 168e9cee63Sopenharmony_ci#include "request_utils.h" 178e9cee63Sopenharmony_ci 188e9cee63Sopenharmony_ci#include <want.h> 198e9cee63Sopenharmony_ci 208e9cee63Sopenharmony_ci#include "ability_manager_client.h" 218e9cee63Sopenharmony_ci#include "access_token.h" 228e9cee63Sopenharmony_ci#include "accesstoken_kit.h" 238e9cee63Sopenharmony_ci#include "app_mgr_client.h" 248e9cee63Sopenharmony_ci#include "common_event_data.h" 258e9cee63Sopenharmony_ci#include "common_event_manager.h" 268e9cee63Sopenharmony_ci#include "common_event_publish_info.h" 278e9cee63Sopenharmony_ci#include "cxx.h" 288e9cee63Sopenharmony_ci#include "int_wrapper.h" 298e9cee63Sopenharmony_ci#include "log.h" 308e9cee63Sopenharmony_ci#include "string_wrapper.h" 318e9cee63Sopenharmony_ci#include "tokenid_kit.h" 328e9cee63Sopenharmony_ci#include "utils/mod.rs.h" 338e9cee63Sopenharmony_ci 348e9cee63Sopenharmony_cinamespace OHOS::Request { 358e9cee63Sopenharmony_ciusing namespace OHOS::Security::AccessToken; 368e9cee63Sopenharmony_ciusing namespace OHOS::EventFwk; 378e9cee63Sopenharmony_ci 388e9cee63Sopenharmony_ciint GetTopUid(int &uid) 398e9cee63Sopenharmony_ci{ 408e9cee63Sopenharmony_ci sptr<IRemoteObject> token; 418e9cee63Sopenharmony_ci auto ret = OHOS::AAFwk::AbilityManagerClient::GetInstance()->GetTopAbility(token); 428e9cee63Sopenharmony_ci if (ret != 0) { 438e9cee63Sopenharmony_ci REQUEST_HILOGE("GetTopUid failed, ret: %{public}d", ret); 448e9cee63Sopenharmony_ci return ret; 458e9cee63Sopenharmony_ci } 468e9cee63Sopenharmony_ci auto info = OHOS::AppExecFwk::RunningProcessInfo(); 478e9cee63Sopenharmony_ci AppExecFwk::AppMgrClient().GetRunningProcessInfoByToken(token, info); 488e9cee63Sopenharmony_ci 498e9cee63Sopenharmony_ci uid = info.uid_; 508e9cee63Sopenharmony_ci return 0; 518e9cee63Sopenharmony_ci} 528e9cee63Sopenharmony_ci 538e9cee63Sopenharmony_cirust::string GetCallingBundle(rust::u64 tokenId) 548e9cee63Sopenharmony_ci{ 558e9cee63Sopenharmony_ci auto tokenType = AccessTokenKit::GetTokenTypeFlag(static_cast<uint32_t>(tokenId)); 568e9cee63Sopenharmony_ci if (tokenType != TOKEN_HAP) { 578e9cee63Sopenharmony_ci REQUEST_HILOGE("invalid token"); 588e9cee63Sopenharmony_ci return rust::string(""); 598e9cee63Sopenharmony_ci } 608e9cee63Sopenharmony_ci HapTokenInfo info; 618e9cee63Sopenharmony_ci int ret = AccessTokenKit::GetHapTokenInfo(tokenId, info); 628e9cee63Sopenharmony_ci if (ret != 0) { 638e9cee63Sopenharmony_ci REQUEST_HILOGE("failed to get hap info, ret: %{public}d", ret); 648e9cee63Sopenharmony_ci return rust::string(""); 658e9cee63Sopenharmony_ci } 668e9cee63Sopenharmony_ci return rust::string(info.bundleName); 678e9cee63Sopenharmony_ci} 688e9cee63Sopenharmony_ci 698e9cee63Sopenharmony_cibool IsSystemAPI(uint64_t tokenId) 708e9cee63Sopenharmony_ci{ 718e9cee63Sopenharmony_ci return TokenIdKit::IsSystemAppByFullTokenID(tokenId); 728e9cee63Sopenharmony_ci} 738e9cee63Sopenharmony_ci 748e9cee63Sopenharmony_cibool CheckPermission(uint64_t tokenId, rust::str permission) 758e9cee63Sopenharmony_ci{ 768e9cee63Sopenharmony_ci auto perm = std::string(permission); 778e9cee63Sopenharmony_ci TypeATokenTypeEnum tokenType = AccessTokenKit::GetTokenTypeFlag(static_cast<AccessTokenID>(tokenId)); 788e9cee63Sopenharmony_ci if (tokenType == TOKEN_INVALID) { 798e9cee63Sopenharmony_ci REQUEST_HILOGE("invalid token id"); 808e9cee63Sopenharmony_ci return false; 818e9cee63Sopenharmony_ci } 828e9cee63Sopenharmony_ci int result = AccessTokenKit::VerifyAccessToken(tokenId, perm); 838e9cee63Sopenharmony_ci if (result != PERMISSION_GRANTED) { 848e9cee63Sopenharmony_ci REQUEST_HILOGE("check permission %{public}s failed ret %{public}d", perm.c_str(), result); 858e9cee63Sopenharmony_ci return false; 868e9cee63Sopenharmony_ci } 878e9cee63Sopenharmony_ci return true; 888e9cee63Sopenharmony_ci} 898e9cee63Sopenharmony_ci 908e9cee63Sopenharmony_cibool PublishStateChangeEvent(rust::str bundleName, uint32_t taskId, int32_t state) 918e9cee63Sopenharmony_ci{ 928e9cee63Sopenharmony_ci REQUEST_HILOGD("PublishStateChangeEvents in."); 938e9cee63Sopenharmony_ci static constexpr const char *eventAction = "ohos.request.event.COMPLETE"; 948e9cee63Sopenharmony_ci 958e9cee63Sopenharmony_ci Want want; 968e9cee63Sopenharmony_ci want.SetAction(eventAction); 978e9cee63Sopenharmony_ci want.SetBundle(std::string(bundleName)); 988e9cee63Sopenharmony_ci 998e9cee63Sopenharmony_ci std::string data = std::to_string(taskId); 1008e9cee63Sopenharmony_ci CommonEventData commonData(want, state, data); 1018e9cee63Sopenharmony_ci CommonEventPublishInfo publishInfo; 1028e9cee63Sopenharmony_ci publishInfo.SetBundleName(std::string(bundleName)); 1038e9cee63Sopenharmony_ci 1048e9cee63Sopenharmony_ci bool res = CommonEventManager::PublishCommonEvent(commonData, publishInfo); 1058e9cee63Sopenharmony_ci if (!res) { 1068e9cee63Sopenharmony_ci REQUEST_HILOGE("PublishStateChangeEvents failed!"); 1078e9cee63Sopenharmony_ci } 1088e9cee63Sopenharmony_ci return res; 1098e9cee63Sopenharmony_ci} 1108e9cee63Sopenharmony_ci 1118e9cee63Sopenharmony_ci} // namespace OHOS::Request