1 /*
2 * Copyright (C) 2024 Huawei Device 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 <string>
16 #include <utility>
17 #include "ability_filter.h"
18 #include "bundle_info_query.h"
19 #include "app_domain_verify_hilog.h"
20
21 namespace OHOS::AppDomainVerify {
22 using Skill = OHOS::AppExecFwk::Skill;
23
24 class BundleAbilityFilterImpl : public AbilityFilter {
25 public:
BundleAbilityFilterImpl(std::string bundleName)26 explicit BundleAbilityFilterImpl(std::string bundleName) : bundleName_(std::move(bundleName))
27 {
28 Init();
29 }
Filter(const FilterInfo & info)30 bool Filter(const FilterInfo& info) override
31 {
32 Want urlWant;
33 urlWant.SetUri(info.url);
34 urlWant.AddEntity(ENTITY_BROWSER);
35 urlWant.SetAction(ACTION_VIEW_DATA);
36
37 auto matchedAbility = std::find_if(
38 abilityInfos_.cbegin(), abilityInfos_.cend(), [&urlWant](const AbilityInfo& abilityInfo) {
39 APP_DOMAIN_VERIFY_HILOGD(
40 APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "abilityInfo:%{private}s", abilityInfo.name.c_str());
41 auto skills = abilityInfo.skills;
42 auto matchedSkill = std::find_if(skills.cbegin(), skills.cend(),
43 [&urlWant](const Skill& skill) { return skill.domainVerify && skill.Match(urlWant); });
44
45 return matchedSkill != skills.cend();
46 });
47
48 return matchedAbility != abilityInfos_.cend();
49 }
Init()50 void Init()
51 {
52 BundleInfoQuery::GetBundleAbilityInfos(bundleName_, abilityInfos_);
53 APP_DOMAIN_VERIFY_HILOGD(APP_DOMAIN_VERIFY_MGR_MODULE_SERVICE, "abilityInfos size:%zu", abilityInfos_.size());
54 }
55
56 private:
57 std::vector<AbilityInfo> abilityInfos_;
58 std::string bundleName_;
59 };
Create(const std::string & bundleName)60 std::shared_ptr<AbilityFilter> AbilityFilter::Create(const std::string& bundleName)
61 {
62 return std::make_shared<BundleAbilityFilterImpl>(bundleName);
63 }
64 }