1bc2ed2b3Sopenharmony_ci/* 2bc2ed2b3Sopenharmony_ci* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. 3bc2ed2b3Sopenharmony_ci* Licensed under the Apache License, Version 2.0 (the "License"); 4bc2ed2b3Sopenharmony_ci* you may not use this file except in compliance with the License. 5bc2ed2b3Sopenharmony_ci* You may obtain a copy of the License at 6bc2ed2b3Sopenharmony_ci* 7bc2ed2b3Sopenharmony_ci* http://www.apache.org/licenses/LICENSE-2.0 8bc2ed2b3Sopenharmony_ci* 9bc2ed2b3Sopenharmony_ci* Unless required by applicable law or agreed to in writing, software 10bc2ed2b3Sopenharmony_ci* distributed under the License is distributed on an "AS IS" BASIS, 11bc2ed2b3Sopenharmony_ci* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12bc2ed2b3Sopenharmony_ci* See the License for the specific language governing permissions and 13bc2ed2b3Sopenharmony_ci* limitations under the License. 14bc2ed2b3Sopenharmony_ci*/ 15bc2ed2b3Sopenharmony_ci#include "app_data_parser.h" 16bc2ed2b3Sopenharmony_ci 17bc2ed2b3Sopenharmony_ci#include "accesstoken_kit.h" 18bc2ed2b3Sopenharmony_ci#include "common_event_manager.h" 19bc2ed2b3Sopenharmony_ci#include "iservice_registry.h" 20bc2ed2b3Sopenharmony_ci#include "loghelper.h" 21bc2ed2b3Sopenharmony_ci#include "nfc_sdk_common.h" 22bc2ed2b3Sopenharmony_ci#include "system_ability_definition.h" 23bc2ed2b3Sopenharmony_ci#include "taginfo.h" 24bc2ed2b3Sopenharmony_ci#include "nfc_permission_checker.h" 25bc2ed2b3Sopenharmony_ci 26bc2ed2b3Sopenharmony_cinamespace OHOS { 27bc2ed2b3Sopenharmony_cinamespace NFC { 28bc2ed2b3Sopenharmony_ciconst int USER_ID = 100; 29bc2ed2b3Sopenharmony_cistatic AppDataParser g_appDataParser; 30bc2ed2b3Sopenharmony_ci/** Tag type of tag app metadata name */ 31bc2ed2b3Sopenharmony_cistatic const std::string KEY_TAG_TECH = "tag-tech"; 32bc2ed2b3Sopenharmony_cistd::mutex g_appListInitMutex = {}; 33bc2ed2b3Sopenharmony_cisptr<BundleMgrDeathRecipient> bundleMgrDeathRecipient_(new (std::nothrow) BundleMgrDeathRecipient()); 34bc2ed2b3Sopenharmony_ci 35bc2ed2b3Sopenharmony_civoid BundleMgrDeathRecipient::OnRemoteDied([[maybe_unused]] const wptr<IRemoteObject> &remote) 36bc2ed2b3Sopenharmony_ci{ 37bc2ed2b3Sopenharmony_ci InfoLog("bundleMgrService dead"); 38bc2ed2b3Sopenharmony_ci}; 39bc2ed2b3Sopenharmony_ci 40bc2ed2b3Sopenharmony_ciAppDataParser::AppDataParser() 41bc2ed2b3Sopenharmony_ci{ 42bc2ed2b3Sopenharmony_ci g_tagAppAndTechMap.clear(); 43bc2ed2b3Sopenharmony_ci g_hceAppAndAidMap.clear(); 44bc2ed2b3Sopenharmony_ci} 45bc2ed2b3Sopenharmony_ci 46bc2ed2b3Sopenharmony_ciAppDataParser::~AppDataParser() 47bc2ed2b3Sopenharmony_ci{ 48bc2ed2b3Sopenharmony_ci} 49bc2ed2b3Sopenharmony_ci 50bc2ed2b3Sopenharmony_ciAppDataParser& AppDataParser::GetInstance() 51bc2ed2b3Sopenharmony_ci{ 52bc2ed2b3Sopenharmony_ci return g_appDataParser; 53bc2ed2b3Sopenharmony_ci} 54bc2ed2b3Sopenharmony_ci 55bc2ed2b3Sopenharmony_cisptr<AppExecFwk::IBundleMgr> AppDataParser::GetBundleMgrProxy() 56bc2ed2b3Sopenharmony_ci{ 57bc2ed2b3Sopenharmony_ci sptr<ISystemAbilityManager> systemAbilityManager = 58bc2ed2b3Sopenharmony_ci SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); 59bc2ed2b3Sopenharmony_ci if (!systemAbilityManager) { 60bc2ed2b3Sopenharmony_ci ErrorLog("GetBundleMgrProxy, systemAbilityManager is null"); 61bc2ed2b3Sopenharmony_ci return nullptr; 62bc2ed2b3Sopenharmony_ci } 63bc2ed2b3Sopenharmony_ci sptr<IRemoteObject> remoteObject = systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID); 64bc2ed2b3Sopenharmony_ci if (!remoteObject) { 65bc2ed2b3Sopenharmony_ci ErrorLog("GetBundleMgrProxy, remoteObject is null"); 66bc2ed2b3Sopenharmony_ci return nullptr; 67bc2ed2b3Sopenharmony_ci } 68bc2ed2b3Sopenharmony_ci sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = iface_cast<AppExecFwk::IBundleMgr>(remoteObject); 69bc2ed2b3Sopenharmony_ci bundleMgrProxy->AsObject()->AddDeathRecipient(bundleMgrDeathRecipient_); 70bc2ed2b3Sopenharmony_ci return bundleMgrProxy; 71bc2ed2b3Sopenharmony_ci} 72bc2ed2b3Sopenharmony_ci 73bc2ed2b3Sopenharmony_cibool AppDataParser::HandleAppAddOrChangedEvent(std::shared_ptr<EventFwk::CommonEventData> data) 74bc2ed2b3Sopenharmony_ci{ 75bc2ed2b3Sopenharmony_ci if (data == nullptr) { 76bc2ed2b3Sopenharmony_ci ErrorLog("HandleAppAddOrChangedEvent, invalid data."); 77bc2ed2b3Sopenharmony_ci return false; 78bc2ed2b3Sopenharmony_ci } 79bc2ed2b3Sopenharmony_ci ElementName element = data->GetWant().GetElement(); 80bc2ed2b3Sopenharmony_ci std::string bundleName = element.GetBundleName(); 81bc2ed2b3Sopenharmony_ci if (bundleName.empty()) { 82bc2ed2b3Sopenharmony_ci ErrorLog("HandleAppAddOrChangedEvent, invaid bundleName."); 83bc2ed2b3Sopenharmony_ci return false; 84bc2ed2b3Sopenharmony_ci } 85bc2ed2b3Sopenharmony_ci DebugLog("HandleAppAddOrChangedEvent bundlename: %{public}s", bundleName.c_str()); 86bc2ed2b3Sopenharmony_ci bool tag = UpdateAppListInfo(element, KITS::ACTION_TAG_FOUND); 87bc2ed2b3Sopenharmony_ci bool host = UpdateAppListInfo(element, KITS::ACTION_HOST_APDU_SERVICE); 88bc2ed2b3Sopenharmony_ci bool offHost = UpdateAppListInfo(element, KITS::ACTION_OFF_HOST_APDU_SERVICE); 89bc2ed2b3Sopenharmony_ci return tag || host || offHost; 90bc2ed2b3Sopenharmony_ci} 91bc2ed2b3Sopenharmony_ci 92bc2ed2b3Sopenharmony_cibool AppDataParser::HandleAppRemovedEvent(std::shared_ptr<EventFwk::CommonEventData> data) 93bc2ed2b3Sopenharmony_ci{ 94bc2ed2b3Sopenharmony_ci if (data == nullptr) { 95bc2ed2b3Sopenharmony_ci ErrorLog("HandleAppRemovedEvent, invalid data."); 96bc2ed2b3Sopenharmony_ci return false; 97bc2ed2b3Sopenharmony_ci } 98bc2ed2b3Sopenharmony_ci ElementName element = data->GetWant().GetElement(); 99bc2ed2b3Sopenharmony_ci std::string bundleName = element.GetBundleName(); 100bc2ed2b3Sopenharmony_ci if (bundleName.empty()) { 101bc2ed2b3Sopenharmony_ci ErrorLog("HandleAppRemovedEvent, invalid bundleName."); 102bc2ed2b3Sopenharmony_ci return false; 103bc2ed2b3Sopenharmony_ci } 104bc2ed2b3Sopenharmony_ci DebugLog("HandleAppRemovedEvent, bundleName %{public}s tag size %{public}zu, hce size %{public}zu", 105bc2ed2b3Sopenharmony_ci bundleName.c_str(), 106bc2ed2b3Sopenharmony_ci g_tagAppAndTechMap.size(), 107bc2ed2b3Sopenharmony_ci g_hceAppAndAidMap.size()); 108bc2ed2b3Sopenharmony_ci bool tag = RemoveTagAppInfo(element); 109bc2ed2b3Sopenharmony_ci bool hce = RemoveHceAppInfo(element); 110bc2ed2b3Sopenharmony_ci bool offHost = RemoveOffHostAppInfo(element); 111bc2ed2b3Sopenharmony_ci return tag || hce || offHost; 112bc2ed2b3Sopenharmony_ci} 113bc2ed2b3Sopenharmony_ci 114bc2ed2b3Sopenharmony_cibool AppDataParser::VerifyHapPermission(const std::string bundleName, const std::string action) 115bc2ed2b3Sopenharmony_ci{ 116bc2ed2b3Sopenharmony_ci std::string permissionNfc; 117bc2ed2b3Sopenharmony_ci OHOS::Security::AccessToken::AccessTokenID tokenID; 118bc2ed2b3Sopenharmony_ci std::map<std::string, std::string> permissionMap = { 119bc2ed2b3Sopenharmony_ci {KITS::ACTION_TAG_FOUND, TAG_PERM}, 120bc2ed2b3Sopenharmony_ci {KITS::ACTION_HOST_APDU_SERVICE, CARD_EMU_PERM}, 121bc2ed2b3Sopenharmony_ci {KITS::ACTION_OFF_HOST_APDU_SERVICE, CARD_EMU_PERM} 122bc2ed2b3Sopenharmony_ci }; 123bc2ed2b3Sopenharmony_ci std::map<std::string, std::string>::iterator it = permissionMap.find(action.c_str()); 124bc2ed2b3Sopenharmony_ci if (it != permissionMap.end()) { 125bc2ed2b3Sopenharmony_ci permissionNfc = it->second; 126bc2ed2b3Sopenharmony_ci } else { 127bc2ed2b3Sopenharmony_ci ErrorLog("VerifyHapPermission, action no in map!"); 128bc2ed2b3Sopenharmony_ci return false; 129bc2ed2b3Sopenharmony_ci } 130bc2ed2b3Sopenharmony_ci tokenID= OHOS::Security::AccessToken::AccessTokenKit::GetHapTokenID(USER_ID, bundleName, 0); 131bc2ed2b3Sopenharmony_ci int result = OHOS::Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenID, permissionNfc); 132bc2ed2b3Sopenharmony_ci if (result != OHOS::Security::AccessToken::PERMISSION_GRANTED) { 133bc2ed2b3Sopenharmony_ci ErrorLog("bundleName %{public}s no permission %{public}s", bundleName.c_str(), permissionNfc.c_str()); 134bc2ed2b3Sopenharmony_ci return false; 135bc2ed2b3Sopenharmony_ci } 136bc2ed2b3Sopenharmony_ci return true; 137bc2ed2b3Sopenharmony_ci} 138bc2ed2b3Sopenharmony_ci 139bc2ed2b3Sopenharmony_civoid AppDataParser::QueryAbilityInfos(const std::string action, std::vector<AbilityInfo> &abilityInfos, 140bc2ed2b3Sopenharmony_ci std::vector<ExtensionAbilityInfo> &extensionInfos) 141bc2ed2b3Sopenharmony_ci{ 142bc2ed2b3Sopenharmony_ci sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = GetBundleMgrProxy(); 143bc2ed2b3Sopenharmony_ci if (bundleMgrProxy == nullptr) { 144bc2ed2b3Sopenharmony_ci ErrorLog("QueryAbilityInfos, bundleMgrProxy is nullptr."); 145bc2ed2b3Sopenharmony_ci return; 146bc2ed2b3Sopenharmony_ci } 147bc2ed2b3Sopenharmony_ci AAFwk::Want want; 148bc2ed2b3Sopenharmony_ci want.SetAction(action); 149bc2ed2b3Sopenharmony_ci if (KITS::ACTION_TAG_FOUND == action) { 150bc2ed2b3Sopenharmony_ci // only tag action have uris 151bc2ed2b3Sopenharmony_ci want.SetType("*/*"); 152bc2ed2b3Sopenharmony_ci } 153bc2ed2b3Sopenharmony_ci 154bc2ed2b3Sopenharmony_ci bool withDefault = false; 155bc2ed2b3Sopenharmony_ci bool findDefaultApp = false; 156bc2ed2b3Sopenharmony_ci auto abilityInfoFlag = AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_DEFAULT 157bc2ed2b3Sopenharmony_ci | AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_SKILL_URI 158bc2ed2b3Sopenharmony_ci | AppExecFwk::AbilityInfoFlag::GET_ABILITY_INFO_WITH_METADATA; 159bc2ed2b3Sopenharmony_ci if (!bundleMgrProxy->ImplicitQueryInfos(want, abilityInfoFlag, USER_ID, withDefault, 160bc2ed2b3Sopenharmony_ci abilityInfos, extensionInfos, findDefaultApp)) { 161bc2ed2b3Sopenharmony_ci WarnLog("QueryAbilityInfos, query none for action %{public}s", action.c_str()); 162bc2ed2b3Sopenharmony_ci return; 163bc2ed2b3Sopenharmony_ci } 164bc2ed2b3Sopenharmony_ci} 165bc2ed2b3Sopenharmony_ci 166bc2ed2b3Sopenharmony_cibool AppDataParser::UpdateAppListInfo(ElementName &element, const std::string action) 167bc2ed2b3Sopenharmony_ci{ 168bc2ed2b3Sopenharmony_ci if (action.compare(KITS::ACTION_TAG_FOUND) != 0 && action.compare(KITS::ACTION_HOST_APDU_SERVICE) != 0 && 169bc2ed2b3Sopenharmony_ci action != KITS::ACTION_OFF_HOST_APDU_SERVICE) { 170bc2ed2b3Sopenharmony_ci DebugLog("UpdateAppListInfo, ignore action = %{public}s", action.c_str()); 171bc2ed2b3Sopenharmony_ci return false; 172bc2ed2b3Sopenharmony_ci } 173bc2ed2b3Sopenharmony_ci std::string bundleName = element.GetBundleName(); 174bc2ed2b3Sopenharmony_ci if (!VerifyHapPermission(bundleName, action)) { 175bc2ed2b3Sopenharmony_ci DebugLog("Hap have no permission for action = %{public}s", action.c_str()); 176bc2ed2b3Sopenharmony_ci return false; 177bc2ed2b3Sopenharmony_ci } 178bc2ed2b3Sopenharmony_ci 179bc2ed2b3Sopenharmony_ci // query the applications infos that're matched with the acitons. 180bc2ed2b3Sopenharmony_ci std::vector<AbilityInfo> abilityInfos; 181bc2ed2b3Sopenharmony_ci std::vector<ExtensionAbilityInfo> extensionAbilityInfos; 182bc2ed2b3Sopenharmony_ci QueryAbilityInfos(action, abilityInfos, extensionAbilityInfos); 183bc2ed2b3Sopenharmony_ci for (auto& abilityInfo : abilityInfos) { 184bc2ed2b3Sopenharmony_ci if (bundleName.empty() || bundleName.compare(abilityInfo.bundleName) != 0) { 185bc2ed2b3Sopenharmony_ci continue; 186bc2ed2b3Sopenharmony_ci } 187bc2ed2b3Sopenharmony_ci ElementName hapElement(abilityInfo.deviceId, abilityInfo.bundleName, abilityInfo.name, 188bc2ed2b3Sopenharmony_ci abilityInfo.moduleName); 189bc2ed2b3Sopenharmony_ci if (action.compare(KITS::ACTION_TAG_FOUND) == 0) { 190bc2ed2b3Sopenharmony_ci UpdateTagAppList(abilityInfo, hapElement); 191bc2ed2b3Sopenharmony_ci } 192bc2ed2b3Sopenharmony_ci if (action.compare(KITS::ACTION_HOST_APDU_SERVICE) == 0) { 193bc2ed2b3Sopenharmony_ci UpdateHceAppList(abilityInfo, hapElement); 194bc2ed2b3Sopenharmony_ci } 195bc2ed2b3Sopenharmony_ci if (action.compare(KITS::ACTION_OFF_HOST_APDU_SERVICE) == 0) { 196bc2ed2b3Sopenharmony_ci UpdateOffHostAppList(abilityInfo, hapElement); 197bc2ed2b3Sopenharmony_ci } 198bc2ed2b3Sopenharmony_ci } 199bc2ed2b3Sopenharmony_ci return true; 200bc2ed2b3Sopenharmony_ci} 201bc2ed2b3Sopenharmony_ci 202bc2ed2b3Sopenharmony_cibool AppDataParser::InitAppListByAction(const std::string action) 203bc2ed2b3Sopenharmony_ci{ 204bc2ed2b3Sopenharmony_ci // query the applications infos that're matched with the acitons. 205bc2ed2b3Sopenharmony_ci std::vector<AbilityInfo> abilityInfos; 206bc2ed2b3Sopenharmony_ci std::vector<ExtensionAbilityInfo> extensionAbilityInfos; 207bc2ed2b3Sopenharmony_ci QueryAbilityInfos(action, abilityInfos, extensionAbilityInfos); 208bc2ed2b3Sopenharmony_ci if (KITS::ACTION_TAG_FOUND.compare(action) == 0) { 209bc2ed2b3Sopenharmony_ci for (auto& tagAbilityInfo : abilityInfos) { 210bc2ed2b3Sopenharmony_ci ElementName element(tagAbilityInfo.deviceId, tagAbilityInfo.bundleName, tagAbilityInfo.name, 211bc2ed2b3Sopenharmony_ci tagAbilityInfo.moduleName); 212bc2ed2b3Sopenharmony_ci UpdateTagAppList(tagAbilityInfo, element); 213bc2ed2b3Sopenharmony_ci } 214bc2ed2b3Sopenharmony_ci } else if (KITS::ACTION_HOST_APDU_SERVICE.compare(action) == 0) { 215bc2ed2b3Sopenharmony_ci for (auto& hceAbilityInfo : abilityInfos) { 216bc2ed2b3Sopenharmony_ci ElementName element(hceAbilityInfo.deviceId, hceAbilityInfo.bundleName, hceAbilityInfo.name, 217bc2ed2b3Sopenharmony_ci hceAbilityInfo.moduleName); 218bc2ed2b3Sopenharmony_ci UpdateHceAppList(hceAbilityInfo, element); 219bc2ed2b3Sopenharmony_ci } 220bc2ed2b3Sopenharmony_ci } else if (KITS::ACTION_OFF_HOST_APDU_SERVICE.compare(action) == 0) { 221bc2ed2b3Sopenharmony_ci for (auto& offHostAbilityInfo : abilityInfos) { 222bc2ed2b3Sopenharmony_ci ElementName element(offHostAbilityInfo.deviceId, offHostAbilityInfo.bundleName, offHostAbilityInfo.name, 223bc2ed2b3Sopenharmony_ci offHostAbilityInfo.moduleName); 224bc2ed2b3Sopenharmony_ci UpdateOffHostAppList(offHostAbilityInfo, element); 225bc2ed2b3Sopenharmony_ci } 226bc2ed2b3Sopenharmony_ci } else { 227bc2ed2b3Sopenharmony_ci WarnLog("InitAppListByAction,unknown action = %{public}s", action.c_str()); 228bc2ed2b3Sopenharmony_ci } 229bc2ed2b3Sopenharmony_ci return true; 230bc2ed2b3Sopenharmony_ci} 231bc2ed2b3Sopenharmony_ci 232bc2ed2b3Sopenharmony_cibool AppDataParser::IsMatchedByBundleName(ElementName &src, ElementName &target) 233bc2ed2b3Sopenharmony_ci{ 234bc2ed2b3Sopenharmony_ci if (src.GetBundleName().compare(target.GetBundleName()) == 0) { 235bc2ed2b3Sopenharmony_ci return true; 236bc2ed2b3Sopenharmony_ci } 237bc2ed2b3Sopenharmony_ci return false; 238bc2ed2b3Sopenharmony_ci} 239bc2ed2b3Sopenharmony_ci 240bc2ed2b3Sopenharmony_ciElementName AppDataParser::GetMatchedTagKeyElement(ElementName &element) 241bc2ed2b3Sopenharmony_ci{ 242bc2ed2b3Sopenharmony_ci ElementName emptyElement; 243bc2ed2b3Sopenharmony_ci std::vector<TagAppTechInfo>::iterator iter; 244bc2ed2b3Sopenharmony_ci for (iter = g_tagAppAndTechMap.begin(); iter != g_tagAppAndTechMap.end(); ++iter) { 245bc2ed2b3Sopenharmony_ci if (IsMatchedByBundleName(element, (*iter).element)) { 246bc2ed2b3Sopenharmony_ci return (*iter).element; 247bc2ed2b3Sopenharmony_ci } 248bc2ed2b3Sopenharmony_ci } 249bc2ed2b3Sopenharmony_ci return emptyElement; 250bc2ed2b3Sopenharmony_ci} 251bc2ed2b3Sopenharmony_ci 252bc2ed2b3Sopenharmony_ciElementName AppDataParser::GetMatchedHceKeyElement(ElementName &element) 253bc2ed2b3Sopenharmony_ci{ 254bc2ed2b3Sopenharmony_ci ElementName emptyElement; 255bc2ed2b3Sopenharmony_ci std::vector<HceAppAidInfo>::iterator iter; 256bc2ed2b3Sopenharmony_ci for (iter = g_hceAppAndAidMap.begin(); iter != g_hceAppAndAidMap.end(); ++iter) { 257bc2ed2b3Sopenharmony_ci if (IsMatchedByBundleName(element, (*iter).element)) { 258bc2ed2b3Sopenharmony_ci return (*iter).element; 259bc2ed2b3Sopenharmony_ci } 260bc2ed2b3Sopenharmony_ci } 261bc2ed2b3Sopenharmony_ci return emptyElement; 262bc2ed2b3Sopenharmony_ci} 263bc2ed2b3Sopenharmony_ci 264bc2ed2b3Sopenharmony_civoid AppDataParser::UpdateTagAppList(AbilityInfo &abilityInfo, ElementName &element) 265bc2ed2b3Sopenharmony_ci{ 266bc2ed2b3Sopenharmony_ci if (!GetMatchedTagKeyElement(element).GetBundleName().empty()) { 267bc2ed2b3Sopenharmony_ci WarnLog("UpdateTagAppList, rm duplicated app %{public}s", element.GetBundleName().c_str()); 268bc2ed2b3Sopenharmony_ci RemoveTagAppInfo(element); 269bc2ed2b3Sopenharmony_ci } 270bc2ed2b3Sopenharmony_ci std::vector<std::string> valueList; 271bc2ed2b3Sopenharmony_ci for (auto& data : abilityInfo.metadata) { 272bc2ed2b3Sopenharmony_ci if (KEY_TAG_TECH.compare(data.name) == 0) { 273bc2ed2b3Sopenharmony_ci valueList.emplace_back(data.value); 274bc2ed2b3Sopenharmony_ci DebugLog("UpdateTagAppList from metadata, push tech %{public}s", data.value.c_str()); 275bc2ed2b3Sopenharmony_ci } 276bc2ed2b3Sopenharmony_ci } 277bc2ed2b3Sopenharmony_ci for (auto& data : abilityInfo.metaData.customizeData) { 278bc2ed2b3Sopenharmony_ci if (KEY_TAG_TECH.compare(data.name) == 0) { 279bc2ed2b3Sopenharmony_ci valueList.emplace_back(data.value); 280bc2ed2b3Sopenharmony_ci DebugLog("UpdateTagAppList from customizeData, push tech %{public}s", data.value.c_str()); 281bc2ed2b3Sopenharmony_ci } 282bc2ed2b3Sopenharmony_ci } 283bc2ed2b3Sopenharmony_ci for (auto& uri : abilityInfo.skillUri) { 284bc2ed2b3Sopenharmony_ci if (uri.type.empty()) { 285bc2ed2b3Sopenharmony_ci continue; 286bc2ed2b3Sopenharmony_ci } 287bc2ed2b3Sopenharmony_ci // format example: "type": "tag-tech/NfcA" 288bc2ed2b3Sopenharmony_ci auto pos = uri.type.find("/"); 289bc2ed2b3Sopenharmony_ci if (pos == std::string::npos) { 290bc2ed2b3Sopenharmony_ci ErrorLog("UpdateTagAppList from skillUri, separator not found %{public}s", uri.type.c_str()); 291bc2ed2b3Sopenharmony_ci continue; 292bc2ed2b3Sopenharmony_ci } 293bc2ed2b3Sopenharmony_ci std::string tech = uri.type.substr(0, pos); 294bc2ed2b3Sopenharmony_ci if (KEY_TAG_TECH.compare(tech) != 0) { 295bc2ed2b3Sopenharmony_ci ErrorLog("UpdateTagAppList KEY_TAG_TECH for %{public}s", tech.c_str()); 296bc2ed2b3Sopenharmony_ci continue; 297bc2ed2b3Sopenharmony_ci } 298bc2ed2b3Sopenharmony_ci std::string nfcType = uri.type.substr(pos + 1, uri.type.size()); 299bc2ed2b3Sopenharmony_ci if (std::find(valueList.begin(), valueList.end(), nfcType) == valueList.end()) { 300bc2ed2b3Sopenharmony_ci valueList.emplace_back(nfcType); 301bc2ed2b3Sopenharmony_ci DebugLog("UpdateTagAppList from skillUri, push tech %{public}s", nfcType.c_str()); 302bc2ed2b3Sopenharmony_ci } 303bc2ed2b3Sopenharmony_ci } 304bc2ed2b3Sopenharmony_ci 305bc2ed2b3Sopenharmony_ci if (valueList.empty()) { 306bc2ed2b3Sopenharmony_ci DebugLog("UpdateTagAppList, ignore for app %{public}s %{public}s", element.GetBundleName().c_str(), 307bc2ed2b3Sopenharmony_ci element.GetAbilityName().c_str()); 308bc2ed2b3Sopenharmony_ci return; 309bc2ed2b3Sopenharmony_ci } 310bc2ed2b3Sopenharmony_ci 311bc2ed2b3Sopenharmony_ci TagAppTechInfo tagAppTechInfo; 312bc2ed2b3Sopenharmony_ci tagAppTechInfo.element = element; 313bc2ed2b3Sopenharmony_ci tagAppTechInfo.tech = valueList; 314bc2ed2b3Sopenharmony_ci g_tagAppAndTechMap.push_back(tagAppTechInfo); 315bc2ed2b3Sopenharmony_ci DebugLog("UpdateTagAppList, push for app %{public}s %{public}s", element.GetBundleName().c_str(), 316bc2ed2b3Sopenharmony_ci element.GetAbilityName().c_str()); 317bc2ed2b3Sopenharmony_ci} 318bc2ed2b3Sopenharmony_ci 319bc2ed2b3Sopenharmony_civoid AppDataParser::UpdateHceAppList(AbilityInfo &abilityInfo, ElementName &element) 320bc2ed2b3Sopenharmony_ci{ 321bc2ed2b3Sopenharmony_ci if (!GetMatchedHceKeyElement(element).GetBundleName().empty()) { 322bc2ed2b3Sopenharmony_ci WarnLog("UpdateHceAppList, rm duplicated app %{public}s", element.GetBundleName().c_str()); 323bc2ed2b3Sopenharmony_ci RemoveHceAppInfo(element); 324bc2ed2b3Sopenharmony_ci } 325bc2ed2b3Sopenharmony_ci std::vector<AidInfo> customDataAidList; 326bc2ed2b3Sopenharmony_ci AidInfo customDataAid; 327bc2ed2b3Sopenharmony_ci for (auto& data : abilityInfo.metadata) { 328bc2ed2b3Sopenharmony_ci if ((KITS::KEY_PAYMENT_AID.compare(data.name) == 0) || (KITS::KEY_OHTER_AID.compare(data.name) == 0)) { 329bc2ed2b3Sopenharmony_ci customDataAid.name = data.name; 330bc2ed2b3Sopenharmony_ci customDataAid.value = data.value; 331bc2ed2b3Sopenharmony_ci customDataAidList.emplace_back(customDataAid); 332bc2ed2b3Sopenharmony_ci DebugLog("UpdateHceAppList from metadata, push aid %{public}s", data.value.c_str()); 333bc2ed2b3Sopenharmony_ci } 334bc2ed2b3Sopenharmony_ci } 335bc2ed2b3Sopenharmony_ci for (auto& data : abilityInfo.metaData.customizeData) { 336bc2ed2b3Sopenharmony_ci if ((KITS::KEY_PAYMENT_AID.compare(data.name) == 0) || (KITS::KEY_OHTER_AID.compare(data.name) == 0)) { 337bc2ed2b3Sopenharmony_ci customDataAid.name = data.name; 338bc2ed2b3Sopenharmony_ci customDataAid.value = data.value; 339bc2ed2b3Sopenharmony_ci customDataAidList.emplace_back(customDataAid); 340bc2ed2b3Sopenharmony_ci DebugLog("UpdateHceAppList from customizeData, push aid %{public}s", data.value.c_str()); 341bc2ed2b3Sopenharmony_ci } 342bc2ed2b3Sopenharmony_ci } 343bc2ed2b3Sopenharmony_ci if (customDataAidList.empty()) { 344bc2ed2b3Sopenharmony_ci DebugLog("UpdateHceAppList, ignore for app %{public}s %{public}s", element.GetBundleName().c_str(), 345bc2ed2b3Sopenharmony_ci element.GetAbilityName().c_str()); 346bc2ed2b3Sopenharmony_ci return; 347bc2ed2b3Sopenharmony_ci } 348bc2ed2b3Sopenharmony_ci HceAppAidInfo hceAppAidInfo; 349bc2ed2b3Sopenharmony_ci hceAppAidInfo.element = element; 350bc2ed2b3Sopenharmony_ci hceAppAidInfo.iconId = abilityInfo.iconId; 351bc2ed2b3Sopenharmony_ci hceAppAidInfo.labelId = abilityInfo.labelId; 352bc2ed2b3Sopenharmony_ci hceAppAidInfo.customDataAid = customDataAidList; 353bc2ed2b3Sopenharmony_ci g_hceAppAndAidMap.push_back(hceAppAidInfo); 354bc2ed2b3Sopenharmony_ci DebugLog("UpdateHceAppList, push for app %{public}s %{public}s", element.GetBundleName().c_str(), 355bc2ed2b3Sopenharmony_ci element.GetAbilityName().c_str()); 356bc2ed2b3Sopenharmony_ci} 357bc2ed2b3Sopenharmony_ci 358bc2ed2b3Sopenharmony_civoid AppDataParser::UpdateOffHostAppList(AbilityInfo &abilityInfo, ElementName &element) 359bc2ed2b3Sopenharmony_ci{ 360bc2ed2b3Sopenharmony_ci if (HaveMatchedOffHostKeyElement(element)) { 361bc2ed2b3Sopenharmony_ci WarnLog("UpdateOffHostAppList, rm duplicated app %{public}s", element.GetBundleName().c_str()); 362bc2ed2b3Sopenharmony_ci RemoveOffHostAppInfo(element); 363bc2ed2b3Sopenharmony_ci } 364bc2ed2b3Sopenharmony_ci HceAppAidInfo offHostAppAidInfo; 365bc2ed2b3Sopenharmony_ci offHostAppAidInfo.element = element; 366bc2ed2b3Sopenharmony_ci offHostAppAidInfo.iconId = abilityInfo.iconId; 367bc2ed2b3Sopenharmony_ci offHostAppAidInfo.labelId = abilityInfo.labelId; 368bc2ed2b3Sopenharmony_ci g_offHostAppAndAidMap.push_back(offHostAppAidInfo); 369bc2ed2b3Sopenharmony_ci DebugLog("UpdateOffHostAppList, push for app %{public}s %{public}s", element.GetBundleName().c_str(), 370bc2ed2b3Sopenharmony_ci element.GetAbilityName().c_str()); 371bc2ed2b3Sopenharmony_ci} 372bc2ed2b3Sopenharmony_ci 373bc2ed2b3Sopenharmony_cibool AppDataParser::HaveMatchedOffHostKeyElement(ElementName &element) 374bc2ed2b3Sopenharmony_ci{ 375bc2ed2b3Sopenharmony_ci std::vector<HceAppAidInfo>::iterator iter; 376bc2ed2b3Sopenharmony_ci for (iter = g_offHostAppAndAidMap.begin(); iter != g_offHostAppAndAidMap.end(); ++iter) { 377bc2ed2b3Sopenharmony_ci if (IsMatchedByBundleName(element, (*iter).element)) { 378bc2ed2b3Sopenharmony_ci return true; 379bc2ed2b3Sopenharmony_ci } 380bc2ed2b3Sopenharmony_ci } 381bc2ed2b3Sopenharmony_ci return false; 382bc2ed2b3Sopenharmony_ci} 383bc2ed2b3Sopenharmony_ci 384bc2ed2b3Sopenharmony_cibool AppDataParser::RemoveTagAppInfo(ElementName &element) 385bc2ed2b3Sopenharmony_ci{ 386bc2ed2b3Sopenharmony_ci ElementName keyElement = GetMatchedTagKeyElement(element); 387bc2ed2b3Sopenharmony_ci if (keyElement.GetBundleName().empty()) { 388bc2ed2b3Sopenharmony_ci WarnLog("RemoveTagAppInfo, keyElement is none, ignore it."); 389bc2ed2b3Sopenharmony_ci return false; 390bc2ed2b3Sopenharmony_ci } 391bc2ed2b3Sopenharmony_ci DebugLog("RemoveTagAppInfo, request app %{public}s", keyElement.GetBundleName().c_str()); 392bc2ed2b3Sopenharmony_ci std::vector<TagAppTechInfo>::iterator iter; 393bc2ed2b3Sopenharmony_ci for (iter = g_tagAppAndTechMap.begin(); iter != g_tagAppAndTechMap.end(); ++iter) { 394bc2ed2b3Sopenharmony_ci // compare only bundle name to remote the app. 395bc2ed2b3Sopenharmony_ci if (IsMatchedByBundleName(element, (*iter).element)) { 396bc2ed2b3Sopenharmony_ci DebugLog("RemoveTagAppInfo, erase app %{public}s", keyElement.GetBundleName().c_str()); 397bc2ed2b3Sopenharmony_ci g_tagAppAndTechMap.erase(iter); 398bc2ed2b3Sopenharmony_ci return true; 399bc2ed2b3Sopenharmony_ci } 400bc2ed2b3Sopenharmony_ci } 401bc2ed2b3Sopenharmony_ci return false; 402bc2ed2b3Sopenharmony_ci} 403bc2ed2b3Sopenharmony_ci 404bc2ed2b3Sopenharmony_cibool AppDataParser::RemoveHceAppInfo(ElementName &element) 405bc2ed2b3Sopenharmony_ci{ 406bc2ed2b3Sopenharmony_ci ElementName keyElement = GetMatchedHceKeyElement(element); 407bc2ed2b3Sopenharmony_ci if (keyElement.GetBundleName().empty()) { 408bc2ed2b3Sopenharmony_ci WarnLog("RemoveHceAppInfo, keyElement is none, ignore it."); 409bc2ed2b3Sopenharmony_ci return false; 410bc2ed2b3Sopenharmony_ci } 411bc2ed2b3Sopenharmony_ci DebugLog("RemoveHceAppInfo, app %{public}s", keyElement.GetBundleName().c_str()); 412bc2ed2b3Sopenharmony_ci std::vector<HceAppAidInfo>::iterator iter; 413bc2ed2b3Sopenharmony_ci for (iter = g_hceAppAndAidMap.begin(); iter != g_hceAppAndAidMap.end(); ++iter) { 414bc2ed2b3Sopenharmony_ci // compare only bundle name to remote the app. 415bc2ed2b3Sopenharmony_ci if (IsMatchedByBundleName(element, (*iter).element)) { 416bc2ed2b3Sopenharmony_ci DebugLog("RemoveHceAppInfo, erase app %{public}s", keyElement.GetBundleName().c_str()); 417bc2ed2b3Sopenharmony_ci g_hceAppAndAidMap.erase(iter); 418bc2ed2b3Sopenharmony_ci return true; 419bc2ed2b3Sopenharmony_ci } 420bc2ed2b3Sopenharmony_ci } 421bc2ed2b3Sopenharmony_ci return false; 422bc2ed2b3Sopenharmony_ci} 423bc2ed2b3Sopenharmony_ci 424bc2ed2b3Sopenharmony_cibool AppDataParser::RemoveOffHostAppInfo(ElementName &element) 425bc2ed2b3Sopenharmony_ci{ 426bc2ed2b3Sopenharmony_ci if (!HaveMatchedOffHostKeyElement(element)) { 427bc2ed2b3Sopenharmony_ci WarnLog("RemoveOffHostAppInfo, keyElement is none, ignore it."); 428bc2ed2b3Sopenharmony_ci return false; 429bc2ed2b3Sopenharmony_ci } 430bc2ed2b3Sopenharmony_ci 431bc2ed2b3Sopenharmony_ci DebugLog("RemoveOffHostAppInfo, app %{public}s", element.GetBundleName().c_str()); 432bc2ed2b3Sopenharmony_ci std::vector<HceAppAidInfo>::iterator iter; 433bc2ed2b3Sopenharmony_ci for (iter = g_offHostAppAndAidMap.begin(); iter != g_offHostAppAndAidMap.end(); ++iter) { 434bc2ed2b3Sopenharmony_ci // compare only bundle name to remote the app. 435bc2ed2b3Sopenharmony_ci if (IsMatchedByBundleName(element, (*iter).element)) { 436bc2ed2b3Sopenharmony_ci DebugLog("RemoveOffHostAppInfo, erase app %{public}s", element.GetBundleName().c_str()); 437bc2ed2b3Sopenharmony_ci g_offHostAppAndAidMap.erase(iter); 438bc2ed2b3Sopenharmony_ci return true; 439bc2ed2b3Sopenharmony_ci } 440bc2ed2b3Sopenharmony_ci } 441bc2ed2b3Sopenharmony_ci return false; 442bc2ed2b3Sopenharmony_ci} 443bc2ed2b3Sopenharmony_ci 444bc2ed2b3Sopenharmony_civoid AppDataParser::InitAppList() 445bc2ed2b3Sopenharmony_ci{ 446bc2ed2b3Sopenharmony_ci std::lock_guard<std::mutex> lock(g_appListInitMutex); 447bc2ed2b3Sopenharmony_ci if (appListInitDone_) { 448bc2ed2b3Sopenharmony_ci WarnLog("InitAppList: already done"); 449bc2ed2b3Sopenharmony_ci return; 450bc2ed2b3Sopenharmony_ci } 451bc2ed2b3Sopenharmony_ci sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = GetBundleMgrProxy(); 452bc2ed2b3Sopenharmony_ci if (!bundleMgrProxy) { 453bc2ed2b3Sopenharmony_ci ErrorLog("InitAppList, bundleMgrProxy is nullptr."); 454bc2ed2b3Sopenharmony_ci appListInitDone_ = false; 455bc2ed2b3Sopenharmony_ci return; 456bc2ed2b3Sopenharmony_ci } 457bc2ed2b3Sopenharmony_ci InfoLog("InitAppListByAction start"); 458bc2ed2b3Sopenharmony_ci InitAppListByAction(KITS::ACTION_TAG_FOUND); 459bc2ed2b3Sopenharmony_ci InitAppListByAction(KITS::ACTION_HOST_APDU_SERVICE); 460bc2ed2b3Sopenharmony_ci InitAppListByAction(KITS::ACTION_OFF_HOST_APDU_SERVICE); 461bc2ed2b3Sopenharmony_ci InfoLog("InitAppList, tag size %{public}zu, hce size %{public}zu, off host app %{public}zu", 462bc2ed2b3Sopenharmony_ci g_tagAppAndTechMap.size(), g_hceAppAndAidMap.size(), g_offHostAppAndAidMap.size()); 463bc2ed2b3Sopenharmony_ci appListInitDone_ = true; 464bc2ed2b3Sopenharmony_ci} 465bc2ed2b3Sopenharmony_ci 466bc2ed2b3Sopenharmony_cistd::vector<ElementName> AppDataParser::GetDispatchTagAppsByTech(std::vector<int> discTechList) 467bc2ed2b3Sopenharmony_ci{ 468bc2ed2b3Sopenharmony_ci std::vector<ElementName> elements; 469bc2ed2b3Sopenharmony_ci for (size_t i = 0; i < discTechList.size(); i++) { 470bc2ed2b3Sopenharmony_ci std::string discStrTech = KITS::TagInfo::GetStringTech(discTechList[i]); 471bc2ed2b3Sopenharmony_ci DebugLog("GetDispatchTagAppsByTech, tag size = %{public}zu", g_tagAppAndTechMap.size()); 472bc2ed2b3Sopenharmony_ci if (discStrTech.empty()) { 473bc2ed2b3Sopenharmony_ci continue; 474bc2ed2b3Sopenharmony_ci } 475bc2ed2b3Sopenharmony_ci 476bc2ed2b3Sopenharmony_ci // parse for all installed app that can handle this technology. 477bc2ed2b3Sopenharmony_ci std::vector<TagAppTechInfo>::iterator iter; 478bc2ed2b3Sopenharmony_ci for (iter = g_tagAppAndTechMap.begin(); iter != g_tagAppAndTechMap.end(); ++iter) { 479bc2ed2b3Sopenharmony_ci bool appExisted = false; 480bc2ed2b3Sopenharmony_ci for (auto item : elements) { 481bc2ed2b3Sopenharmony_ci if (IsMatchedByBundleName(item, (*iter).element)) { 482bc2ed2b3Sopenharmony_ci appExisted = true; 483bc2ed2b3Sopenharmony_ci break; 484bc2ed2b3Sopenharmony_ci } 485bc2ed2b3Sopenharmony_ci } 486bc2ed2b3Sopenharmony_ci if (appExisted) { 487bc2ed2b3Sopenharmony_ci continue; 488bc2ed2b3Sopenharmony_ci } 489bc2ed2b3Sopenharmony_ci 490bc2ed2b3Sopenharmony_ci std::vector<std::string> vectorTech = (*iter).tech; 491bc2ed2b3Sopenharmony_ci for (size_t i = 0; i < vectorTech.size(); i++) { 492bc2ed2b3Sopenharmony_ci DebugLog("GetDispatchTagAppsByTech, cmp tech %{public}s vs %{public}s", 493bc2ed2b3Sopenharmony_ci discStrTech.c_str(), vectorTech[i].c_str()); 494bc2ed2b3Sopenharmony_ci if (discStrTech.compare(vectorTech[i]) == 0) { 495bc2ed2b3Sopenharmony_ci elements.push_back((*iter).element); 496bc2ed2b3Sopenharmony_ci break; 497bc2ed2b3Sopenharmony_ci } 498bc2ed2b3Sopenharmony_ci } 499bc2ed2b3Sopenharmony_ci } 500bc2ed2b3Sopenharmony_ci } 501bc2ed2b3Sopenharmony_ci return elements; 502bc2ed2b3Sopenharmony_ci} 503bc2ed2b3Sopenharmony_ci 504bc2ed2b3Sopenharmony_ci#ifdef VENDOR_APPLICATIONS_ENABLED 505bc2ed2b3Sopenharmony_cistd::vector<ElementName> AppDataParser::GetVendorDispatchTagAppsByTech(std::vector<int>& discTechList) 506bc2ed2b3Sopenharmony_ci{ 507bc2ed2b3Sopenharmony_ci std::vector<ElementName> elements {}; 508bc2ed2b3Sopenharmony_ci std::vector<AAFwk::Want> hceAppList {}; 509bc2ed2b3Sopenharmony_ci if (queryApplicationByVendor_ == nullptr) { 510bc2ed2b3Sopenharmony_ci ErrorLog("AppDataParser::GetVendorDispatchTagAppsByTech queryApplicationByVendor_ is nullptr."); 511bc2ed2b3Sopenharmony_ci return std::vector<ElementName>(); 512bc2ed2b3Sopenharmony_ci } 513bc2ed2b3Sopenharmony_ci queryApplicationByVendor_->OnQueryAppInfo(KEY_TAG_APP, discTechList, hceAppList, elements); 514bc2ed2b3Sopenharmony_ci return elements; 515bc2ed2b3Sopenharmony_ci} 516bc2ed2b3Sopenharmony_ci 517bc2ed2b3Sopenharmony_civoid AppDataParser::RegQueryApplicationCb(sptr<IQueryAppInfoCallback> callback) 518bc2ed2b3Sopenharmony_ci{ 519bc2ed2b3Sopenharmony_ci queryApplicationByVendor_ = callback; 520bc2ed2b3Sopenharmony_ci} 521bc2ed2b3Sopenharmony_ci 522bc2ed2b3Sopenharmony_civoid AppDataParser::RegCardEmulationNotifyCb(sptr<IOnCardEmulationNotifyCb> callback) 523bc2ed2b3Sopenharmony_ci{ 524bc2ed2b3Sopenharmony_ci onCardEmulationNotify_ = callback; 525bc2ed2b3Sopenharmony_ci} 526bc2ed2b3Sopenharmony_ci 527bc2ed2b3Sopenharmony_cisptr<IOnCardEmulationNotifyCb> AppDataParser::GetNotifyCardEmulationCallback() const 528bc2ed2b3Sopenharmony_ci{ 529bc2ed2b3Sopenharmony_ci return onCardEmulationNotify_; 530bc2ed2b3Sopenharmony_ci} 531bc2ed2b3Sopenharmony_ci#endif 532bc2ed2b3Sopenharmony_ci 533bc2ed2b3Sopenharmony_civoid AppDataParser::GetHceAppsByAid(const std::string& aid, std::vector<AppDataParser::HceAppAidInfo>& hceApps) 534bc2ed2b3Sopenharmony_ci{ 535bc2ed2b3Sopenharmony_ci for (const HceAppAidInfo& appAidInfo : g_hceAppAndAidMap) { 536bc2ed2b3Sopenharmony_ci for (const AidInfo& aidInfo : appAidInfo.customDataAid) { 537bc2ed2b3Sopenharmony_ci if (aid == aidInfo.value) { 538bc2ed2b3Sopenharmony_ci hceApps.push_back(appAidInfo); 539bc2ed2b3Sopenharmony_ci break; 540bc2ed2b3Sopenharmony_ci } 541bc2ed2b3Sopenharmony_ci } 542bc2ed2b3Sopenharmony_ci } 543bc2ed2b3Sopenharmony_ci} 544bc2ed2b3Sopenharmony_ci 545bc2ed2b3Sopenharmony_ci#ifdef VENDOR_APPLICATIONS_ENABLED 546bc2ed2b3Sopenharmony_civoid AppDataParser::GetHceAppsFromVendor(std::vector<HceAppAidInfo> &hceApps) 547bc2ed2b3Sopenharmony_ci{ 548bc2ed2b3Sopenharmony_ci if (queryApplicationByVendor_ == nullptr) { 549bc2ed2b3Sopenharmony_ci WarnLog("AppDataParser::GetHceApps queryApplicationByVendor_ is nullptr."); 550bc2ed2b3Sopenharmony_ci return; 551bc2ed2b3Sopenharmony_ci } 552bc2ed2b3Sopenharmony_ci std::vector<int> techList {}; 553bc2ed2b3Sopenharmony_ci std::vector<AAFwk::Want> vendorHceAppAndAidList {}; 554bc2ed2b3Sopenharmony_ci std::vector<AppExecFwk::ElementName> elementNameList {}; 555bc2ed2b3Sopenharmony_ci queryApplicationByVendor_->OnQueryAppInfo(KEY_HCE_APP, techList, vendorHceAppAndAidList, elementNameList); 556bc2ed2b3Sopenharmony_ci if (vendorHceAppAndAidList.size() != 0) { 557bc2ed2b3Sopenharmony_ci for (auto appAidInfoWant : vendorHceAppAndAidList) { 558bc2ed2b3Sopenharmony_ci std::shared_ptr<HceAppAidInfo> appAidInfo = std::make_shared<HceAppAidInfo>(); 559bc2ed2b3Sopenharmony_ci appAidInfo->element = appAidInfoWant.GetElement(); 560bc2ed2b3Sopenharmony_ci const std::string KEY_OTHER_AID = "other-aid"; 561bc2ed2b3Sopenharmony_ci const std::string KEY_PAYMENT_AID = "payment-aid"; 562bc2ed2b3Sopenharmony_ci std::vector<std::string> otherAidList = appAidInfoWant.GetStringArrayParam(KEY_OTHER_AID); 563bc2ed2b3Sopenharmony_ci std::vector<std::string> paymentAidList = appAidInfoWant.GetStringArrayParam(KEY_PAYMENT_AID); 564bc2ed2b3Sopenharmony_ci for (std::string otherAid : otherAidList) { 565bc2ed2b3Sopenharmony_ci std::shared_ptr<AidInfo> aidInfo = std::make_shared<AidInfo>(); 566bc2ed2b3Sopenharmony_ci aidInfo->name = KEY_OTHER_AID; 567bc2ed2b3Sopenharmony_ci aidInfo->value = otherAid; 568bc2ed2b3Sopenharmony_ci appAidInfo->customDataAid.push_back(*aidInfo); 569bc2ed2b3Sopenharmony_ci } 570bc2ed2b3Sopenharmony_ci for (std::string paymentAid : paymentAidList) { 571bc2ed2b3Sopenharmony_ci std::shared_ptr<AidInfo> aidInfo = std::make_shared<AidInfo>(); 572bc2ed2b3Sopenharmony_ci aidInfo->name = KEY_PAYMENT_AID; 573bc2ed2b3Sopenharmony_ci aidInfo->value = paymentAid; 574bc2ed2b3Sopenharmony_ci appAidInfo->customDataAid.push_back(*aidInfo); 575bc2ed2b3Sopenharmony_ci } 576bc2ed2b3Sopenharmony_ci hceApps.push_back(*appAidInfo); 577bc2ed2b3Sopenharmony_ci } 578bc2ed2b3Sopenharmony_ci } 579bc2ed2b3Sopenharmony_ci} 580bc2ed2b3Sopenharmony_ci 581bc2ed2b3Sopenharmony_civoid AppDataParser::GetPaymentAbilityInfosFromVendor(std::vector<AbilityInfo> &paymentAbilityInfos) 582bc2ed2b3Sopenharmony_ci{ 583bc2ed2b3Sopenharmony_ci std::vector<HceAppAidInfo> hceApps; 584bc2ed2b3Sopenharmony_ci std::set<std::string> bundleNames; 585bc2ed2b3Sopenharmony_ci GetHceAppsFromVendor(hceApps); 586bc2ed2b3Sopenharmony_ci DebugLog("The hceApps len %{public}lu", hceApps.size()); 587bc2ed2b3Sopenharmony_ci sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = GetBundleMgrProxy(); 588bc2ed2b3Sopenharmony_ci if (bundleMgrProxy == nullptr) { 589bc2ed2b3Sopenharmony_ci ErrorLog("bundleMgrProxy is nullptr!"); 590bc2ed2b3Sopenharmony_ci return; 591bc2ed2b3Sopenharmony_ci } 592bc2ed2b3Sopenharmony_ci for (auto& appAidInfo : hceApps) { 593bc2ed2b3Sopenharmony_ci DebugLog("The bundlename : %{public}s", appAidInfo.element.GetBundleName().c_str()); 594bc2ed2b3Sopenharmony_ci if (appAidInfo.element.GetBundleName().empty() || !IsPaymentApp(appAidInfo)) { 595bc2ed2b3Sopenharmony_ci continue; 596bc2ed2b3Sopenharmony_ci } 597bc2ed2b3Sopenharmony_ci if (bundleNames.count(appAidInfo.element.GetBundleName()) > 0) { 598bc2ed2b3Sopenharmony_ci DebugLog("The bundlename : %{public}s is in the bundleNames", appAidInfo.element.GetBundleName().c_str()); 599bc2ed2b3Sopenharmony_ci continue; 600bc2ed2b3Sopenharmony_ci } 601bc2ed2b3Sopenharmony_ci bundleNames.insert(appAidInfo.element.GetBundleName()); 602bc2ed2b3Sopenharmony_ci AbilityInfo ability; 603bc2ed2b3Sopenharmony_ci ability.name = appAidInfo.element.GetAbilityName(); 604bc2ed2b3Sopenharmony_ci ability.bundleName = appAidInfo.element.GetBundleName(); 605bc2ed2b3Sopenharmony_ci AppExecFwk::BundleInfo bundleInfo{}; 606bc2ed2b3Sopenharmony_ci int32_t bundleInfoFlag = static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_ABILITY) | 607bc2ed2b3Sopenharmony_ci static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_HAP_MODULE) | 608bc2ed2b3Sopenharmony_ci static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_APPLICATION); 609bc2ed2b3Sopenharmony_ci if (bundleMgrProxy == nullptr) { 610bc2ed2b3Sopenharmony_ci ErrorLog("bundleMgrProxy is nullptr!"); 611bc2ed2b3Sopenharmony_ci break; 612bc2ed2b3Sopenharmony_ci } 613bc2ed2b3Sopenharmony_ci bundleMgrProxy->GetBundleInfoV9( 614bc2ed2b3Sopenharmony_ci ability.bundleName, bundleInfoFlag, bundleInfo, AppExecFwk::Constants::START_USERID); 615bc2ed2b3Sopenharmony_ci DebugLog("The bundlename : %{public}s,the labelId : %{public}d,the iconId : %{public}d", 616bc2ed2b3Sopenharmony_ci appAidInfo.element.GetBundleName().c_str(), 617bc2ed2b3Sopenharmony_ci bundleInfo.applicationInfo.labelId, 618bc2ed2b3Sopenharmony_ci bundleInfo.applicationInfo.iconId); 619bc2ed2b3Sopenharmony_ci if (bundleInfo.applicationInfo.labelId != 0 && bundleInfo.applicationInfo.iconId != 0) { 620bc2ed2b3Sopenharmony_ci ability.labelId = bundleInfo.applicationInfo.labelId; 621bc2ed2b3Sopenharmony_ci ability.iconId = bundleInfo.applicationInfo.iconId; 622bc2ed2b3Sopenharmony_ci paymentAbilityInfos.push_back(ability); 623bc2ed2b3Sopenharmony_ci } 624bc2ed2b3Sopenharmony_ci } 625bc2ed2b3Sopenharmony_ci} 626bc2ed2b3Sopenharmony_ci 627bc2ed2b3Sopenharmony_cibool AppDataParser::IsHceAppFromVendor(const ElementName &elementName) 628bc2ed2b3Sopenharmony_ci{ 629bc2ed2b3Sopenharmony_ci std::vector<HceAppAidInfo> hceApps; 630bc2ed2b3Sopenharmony_ci GetHceAppsFromVendor(hceApps); 631bc2ed2b3Sopenharmony_ci for (auto &app : hceApps) { 632bc2ed2b3Sopenharmony_ci if (app.element.GetBundleName() == elementName.GetBundleName() && 633bc2ed2b3Sopenharmony_ci app.element.GetAbilityName() == elementName.GetAbilityName()) { 634bc2ed2b3Sopenharmony_ci return true; 635bc2ed2b3Sopenharmony_ci } 636bc2ed2b3Sopenharmony_ci } 637bc2ed2b3Sopenharmony_ci return false; 638bc2ed2b3Sopenharmony_ci} 639bc2ed2b3Sopenharmony_ci#endif 640bc2ed2b3Sopenharmony_cibool AppDataParser::IsBundleInstalled(const std::string &bundleName) 641bc2ed2b3Sopenharmony_ci{ 642bc2ed2b3Sopenharmony_ci sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = GetBundleMgrProxy(); 643bc2ed2b3Sopenharmony_ci if (bundleMgrProxy == nullptr) { 644bc2ed2b3Sopenharmony_ci ErrorLog("bundleMgrProxy is nullptr!"); 645bc2ed2b3Sopenharmony_ci return false; 646bc2ed2b3Sopenharmony_ci } 647bc2ed2b3Sopenharmony_ci if (bundleName.empty()) { 648bc2ed2b3Sopenharmony_ci ErrorLog("bundle name is empty"); 649bc2ed2b3Sopenharmony_ci return false; 650bc2ed2b3Sopenharmony_ci } 651bc2ed2b3Sopenharmony_ci AppExecFwk::BundleInfo bundleInfo; 652bc2ed2b3Sopenharmony_ci bool result = bundleMgrProxy->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, 653bc2ed2b3Sopenharmony_ci bundleInfo, USER_ID); 654bc2ed2b3Sopenharmony_ci ErrorLog("get bundle %{public}s result %{public}d ", bundleName.c_str(), result); 655bc2ed2b3Sopenharmony_ci return result; 656bc2ed2b3Sopenharmony_ci} 657bc2ed2b3Sopenharmony_civoid AppDataParser::GetHceApps(std::vector<HceAppAidInfo> &hceApps) 658bc2ed2b3Sopenharmony_ci{ 659bc2ed2b3Sopenharmony_ci for (const HceAppAidInfo &appAidInfo : g_hceAppAndAidMap) { 660bc2ed2b3Sopenharmony_ci hceApps.push_back(appAidInfo); 661bc2ed2b3Sopenharmony_ci } 662bc2ed2b3Sopenharmony_ci#ifdef VENDOR_APPLICATIONS_ENABLED 663bc2ed2b3Sopenharmony_ci GetHceAppsFromVendor(hceApps); 664bc2ed2b3Sopenharmony_ci#endif 665bc2ed2b3Sopenharmony_ci} 666bc2ed2b3Sopenharmony_ci 667bc2ed2b3Sopenharmony_cibool AppDataParser::IsPaymentApp(const AppDataParser::HceAppAidInfo &hceAppInfo) 668bc2ed2b3Sopenharmony_ci{ 669bc2ed2b3Sopenharmony_ci for (const AppDataParser::AidInfo &aidInfo : hceAppInfo.customDataAid) { 670bc2ed2b3Sopenharmony_ci if (KITS::KEY_PAYMENT_AID == aidInfo.name) { 671bc2ed2b3Sopenharmony_ci return true; 672bc2ed2b3Sopenharmony_ci } 673bc2ed2b3Sopenharmony_ci } 674bc2ed2b3Sopenharmony_ci return false; 675bc2ed2b3Sopenharmony_ci} 676bc2ed2b3Sopenharmony_ci 677bc2ed2b3Sopenharmony_cibool AppDataParser::IsHceApp(const ElementName &elementName) 678bc2ed2b3Sopenharmony_ci{ 679bc2ed2b3Sopenharmony_ci for (const AppDataParser::HceAppAidInfo &appAidInfo : g_hceAppAndAidMap) { 680bc2ed2b3Sopenharmony_ci if (appAidInfo.element.GetBundleName() == elementName.GetBundleName() && 681bc2ed2b3Sopenharmony_ci appAidInfo.element.GetAbilityName() == elementName.GetAbilityName()) { 682bc2ed2b3Sopenharmony_ci return true; 683bc2ed2b3Sopenharmony_ci } 684bc2ed2b3Sopenharmony_ci } 685bc2ed2b3Sopenharmony_ci#ifdef VENDOR_APPLICATIONS_ENABLED 686bc2ed2b3Sopenharmony_ci return IsHceAppFromVendor(elementName); 687bc2ed2b3Sopenharmony_ci#else 688bc2ed2b3Sopenharmony_ci return false; 689bc2ed2b3Sopenharmony_ci#endif 690bc2ed2b3Sopenharmony_ci} 691bc2ed2b3Sopenharmony_ci 692bc2ed2b3Sopenharmony_civoid AppDataParser::GetPaymentAbilityInfos(std::vector<AbilityInfo> &paymentAbilityInfos) 693bc2ed2b3Sopenharmony_ci{ 694bc2ed2b3Sopenharmony_ci if (!appListInitDone_) { 695bc2ed2b3Sopenharmony_ci InfoLog("bundleMgr is null, try to init again."); 696bc2ed2b3Sopenharmony_ci InitAppList(); 697bc2ed2b3Sopenharmony_ci } 698bc2ed2b3Sopenharmony_ci for (const AppDataParser::HceAppAidInfo &appAidInfo : g_hceAppAndAidMap) { 699bc2ed2b3Sopenharmony_ci if (!IsPaymentApp(appAidInfo)) { 700bc2ed2b3Sopenharmony_ci continue; 701bc2ed2b3Sopenharmony_ci } 702bc2ed2b3Sopenharmony_ci AbilityInfo ability; 703bc2ed2b3Sopenharmony_ci ability.name = appAidInfo.element.GetAbilityName(); 704bc2ed2b3Sopenharmony_ci ability.bundleName = appAidInfo.element.GetBundleName(); 705bc2ed2b3Sopenharmony_ci ability.labelId = appAidInfo.labelId; 706bc2ed2b3Sopenharmony_ci ability.iconId = appAidInfo.iconId; 707bc2ed2b3Sopenharmony_ci InfoLog("The bundlename : %{public}s,the labelId : %{public}d,the iconId : %{public}d", 708bc2ed2b3Sopenharmony_ci ability.bundleName.c_str(), ability.labelId, ability.iconId); 709bc2ed2b3Sopenharmony_ci paymentAbilityInfos.push_back(ability); 710bc2ed2b3Sopenharmony_ci } 711bc2ed2b3Sopenharmony_ci 712bc2ed2b3Sopenharmony_ci for (const AppDataParser::HceAppAidInfo &appAidInfo : g_offHostAppAndAidMap) { 713bc2ed2b3Sopenharmony_ci AbilityInfo ability; 714bc2ed2b3Sopenharmony_ci ability.name = appAidInfo.element.GetAbilityName(); 715bc2ed2b3Sopenharmony_ci ability.bundleName = appAidInfo.element.GetBundleName(); 716bc2ed2b3Sopenharmony_ci ability.labelId = appAidInfo.labelId; 717bc2ed2b3Sopenharmony_ci ability.iconId = appAidInfo.iconId; 718bc2ed2b3Sopenharmony_ci InfoLog("The bundlename : %{public}s,the labelId : %{public}d,the iconId : %{public}d", 719bc2ed2b3Sopenharmony_ci ability.bundleName.c_str(), ability.labelId, ability.iconId); 720bc2ed2b3Sopenharmony_ci paymentAbilityInfos.push_back(ability); 721bc2ed2b3Sopenharmony_ci } 722bc2ed2b3Sopenharmony_ci#ifdef VENDOR_APPLICATIONS_ENABLED 723bc2ed2b3Sopenharmony_ci GetPaymentAbilityInfosFromVendor(paymentAbilityInfos); 724bc2ed2b3Sopenharmony_ci#endif 725bc2ed2b3Sopenharmony_ci} 726bc2ed2b3Sopenharmony_ci 727bc2ed2b3Sopenharmony_cibool AppDataParser::GetBundleInfo(AppExecFwk::BundleInfo &bundleInfo, const std::string &bundleName) 728bc2ed2b3Sopenharmony_ci{ 729bc2ed2b3Sopenharmony_ci if (bundleName.empty()) { 730bc2ed2b3Sopenharmony_ci InfoLog("sim bundle name is empty."); 731bc2ed2b3Sopenharmony_ci return false; 732bc2ed2b3Sopenharmony_ci } 733bc2ed2b3Sopenharmony_ci sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = GetBundleMgrProxy(); 734bc2ed2b3Sopenharmony_ci if (bundleMgrProxy == nullptr) { 735bc2ed2b3Sopenharmony_ci ErrorLog("bundleMgrProxy is nullptr."); 736bc2ed2b3Sopenharmony_ci return false; 737bc2ed2b3Sopenharmony_ci } 738bc2ed2b3Sopenharmony_ci bool result = bundleMgrProxy->GetBundleInfo(bundleName, AppExecFwk::BundleFlag::GET_BUNDLE_DEFAULT, 739bc2ed2b3Sopenharmony_ci bundleInfo, USER_ID); 740bc2ed2b3Sopenharmony_ci InfoLog("get bundle %{public}s result %{public}d ", bundleName.c_str(), result); 741bc2ed2b3Sopenharmony_ci if (!result) { 742bc2ed2b3Sopenharmony_ci ErrorLog("get bundle %{public}s failed ", bundleName.c_str()); 743bc2ed2b3Sopenharmony_ci return false; 744bc2ed2b3Sopenharmony_ci } 745bc2ed2b3Sopenharmony_ci return true; 746bc2ed2b3Sopenharmony_ci} 747bc2ed2b3Sopenharmony_ci 748bc2ed2b3Sopenharmony_cibool AppDataParser::IsSystemApp(uint32_t uid) 749bc2ed2b3Sopenharmony_ci{ 750bc2ed2b3Sopenharmony_ci sptr<AppExecFwk::IBundleMgr> bundleMgrProxy = GetBundleMgrProxy(); 751bc2ed2b3Sopenharmony_ci if (bundleMgrProxy == nullptr) { 752bc2ed2b3Sopenharmony_ci ErrorLog(" bundleMgrProxy is nullptr."); 753bc2ed2b3Sopenharmony_ci return false; 754bc2ed2b3Sopenharmony_ci } 755bc2ed2b3Sopenharmony_ci return bundleMgrProxy->CheckIsSystemAppByUid(uid); 756bc2ed2b3Sopenharmony_ci} 757bc2ed2b3Sopenharmony_ci 758bc2ed2b3Sopenharmony_cistd::string AppDataParser::GetBundleNameByUid(uint32_t uid) 759bc2ed2b3Sopenharmony_ci{ 760bc2ed2b3Sopenharmony_ci auto bundleMgr = GetBundleMgrProxy(); 761bc2ed2b3Sopenharmony_ci if (bundleMgr == nullptr) { 762bc2ed2b3Sopenharmony_ci ErrorLog("bundleMgr is nullptr."); 763bc2ed2b3Sopenharmony_ci return std::string(); 764bc2ed2b3Sopenharmony_ci } 765bc2ed2b3Sopenharmony_ci std::string bundleName; 766bc2ed2b3Sopenharmony_ci int ret = bundleMgr->GetNameForUid(uid, bundleName); 767bc2ed2b3Sopenharmony_ci if (ret == ERR_OK) { 768bc2ed2b3Sopenharmony_ci return bundleName; 769bc2ed2b3Sopenharmony_ci } else { 770bc2ed2b3Sopenharmony_ci ErrorLog("GetNameForUid failed, ret = %{public}d.", ret); 771bc2ed2b3Sopenharmony_ci return std::string(); 772bc2ed2b3Sopenharmony_ci } 773bc2ed2b3Sopenharmony_ci} 774bc2ed2b3Sopenharmony_ci} // namespace NFC 775bc2ed2b3Sopenharmony_ci} // namespace OHOS 776