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