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