1 /*
2  * Copyright (c) 2022 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 
16 #include "app_account_authenticator_manager.h"
17 
18 #include <algorithm>
19 #include "account_error_no.h"
20 #include "account_info.h"
21 #include "account_log_wrapper.h"
22 #include "app_account_constants.h"
23 #include "bundle_manager_adapter.h"
24 
25 namespace OHOS {
26 namespace AccountSA {
QueryAbilityInfos(const std::string & owner,int32_t userId,std::vector<AppExecFwk::AbilityInfo> & abilityInfos,std::vector<AppExecFwk::ExtensionAbilityInfo> & extensionInfos)27 static ErrCode QueryAbilityInfos(const std::string &owner, int32_t userId,
28     std::vector<AppExecFwk::AbilityInfo> &abilityInfos,
29     std::vector<AppExecFwk::ExtensionAbilityInfo> &extensionInfos)
30 {
31     AAFwk::Want want;
32     want.SetBundle(owner);
33     want.SetAction(Constants::SYSTEM_ACTION_APP_ACCOUNT_AUTH);
34     bool result = BundleManagerAdapter::GetInstance()->QueryAbilityInfos(
35         want, AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES, userId, abilityInfos);
36     if (!result) {
37         result = BundleManagerAdapter::GetInstance()->QueryExtensionAbilityInfos(
38             want, AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES, userId, extensionInfos);
39     }
40     if (!result) {
41         want.SetAction(Constants::SYSTEM_ACTION_APP_ACCOUNT_OAUTH);
42         result = BundleManagerAdapter::GetInstance()->QueryAbilityInfos(
43             want, AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES, userId, abilityInfos);
44     }
45     if (!result) {
46         result = BundleManagerAdapter::GetInstance()->QueryExtensionAbilityInfos(
47             want, AppExecFwk::BundleFlag::GET_BUNDLE_WITH_ABILITIES, userId, extensionInfos);
48     }
49     if (!result) {
50         ACCOUNT_LOGE("failed to query ability info");
51         return ERR_APPACCOUNT_SERVICE_OAUTH_AUTHENTICATOR_NOT_EXIST;
52     }
53     return ERR_OK;
54 }
55 
GetAuthenticatorInfo(const std::string & owner,int32_t userId,AuthenticatorInfo & info)56 ErrCode AppAccountAuthenticatorManager::GetAuthenticatorInfo(
57     const std::string &owner, int32_t userId, AuthenticatorInfo &info)
58 {
59     std::vector<AppExecFwk::AbilityInfo> abilityInfos;
60     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
61     ErrCode ret = QueryAbilityInfos(owner, userId, abilityInfos, extensionInfos);
62     if (ret != ERR_OK) {
63         return ret;
64     }
65 
66     auto iter = std::find_if(abilityInfos.begin(), abilityInfos.end(),
67         [abilityInfos](AppExecFwk::AbilityInfo abilityInfo) {
68             return ((abilityInfo.type == AppExecFwk::AbilityType::SERVICE) && (abilityInfo.visible));
69         });
70     if (iter != abilityInfos.end()) {
71         info.owner = owner;
72         info.abilityName = iter->name;
73         info.iconId = iter->iconId;
74         info.labelId = iter->labelId;
75         return ERR_OK;
76     }
77 
78     auto iter_extensionInfos = std::find_if(extensionInfos.begin(), extensionInfos.end(),
79         [extensionInfos](AppExecFwk::ExtensionAbilityInfo extensionInfo) {
80             return ((extensionInfo.type == AppExecFwk::ExtensionAbilityType::SERVICE) && (extensionInfo.visible));
81         });
82     if (iter_extensionInfos != extensionInfos.end()) {
83         info.owner = owner;
84         info.abilityName = iter_extensionInfos->name;
85         info.iconId = iter_extensionInfos->iconId;
86         info.labelId = iter_extensionInfos->labelId;
87         return ERR_OK;
88     }
89     return ERR_APPACCOUNT_SERVICE_OAUTH_AUTHENTICATOR_NOT_EXIST;
90 }
91 }  // namespace AccountSA
92 }  // namespace OHOS
93