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