• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "schedule_node_helper.h"
16 
17 #include <cinttypes>
18 
19 #include "iam_logger.h"
20 #include "resource_node_pool.h"
21 
22 #define LOG_LABEL UserIam::Common::LABEL_USER_AUTH_SA
23 namespace OHOS {
24 namespace UserIam {
25 namespace UserAuth {
BuildFromHdi(const std::vector<HdiScheduleInfo> & infos,std::shared_ptr<ScheduleNodeCallback> callback,std::vector<std::shared_ptr<ScheduleNode>> & nodes)26 bool ScheduleNodeHelper::BuildFromHdi(const std::vector<HdiScheduleInfo> &infos,
27     std::shared_ptr<ScheduleNodeCallback> callback, std::vector<std::shared_ptr<ScheduleNode>> &nodes)
28 {
29     NodeOptionalPara para;
30     return BuildFromHdi(infos, callback, nodes, para);
31 }
32 
BuildFromHdi(const std::vector<HdiScheduleInfo> & infos,std::shared_ptr<ScheduleNodeCallback> callback,std::vector<std::shared_ptr<ScheduleNode>> & nodes,const NodeOptionalPara & para)33 bool ScheduleNodeHelper::BuildFromHdi(const std::vector<HdiScheduleInfo> &infos,
34     std::shared_ptr<ScheduleNodeCallback> callback, std::vector<std::shared_ptr<ScheduleNode>> &nodes,
35     const NodeOptionalPara &para)
36 {
37     std::vector<std::shared_ptr<ScheduleNode>> outputs;
38 
39     for (const auto &info : infos) {
40         std::shared_ptr<ScheduleNode> node;
41         if (!ScheduleInfoToScheduleNode(info, node, para, callback)) {
42             IAM_LOGE("ScheduleInfoToScheduleNode error");
43             return false;
44         }
45         outputs.push_back(node);
46     }
47 
48     nodes.swap(outputs);
49     return true;
50 }
51 
ScheduleInfoToScheduleNode(const HdiScheduleInfo & info,std::shared_ptr<ScheduleNode> & node,const NodeOptionalPara & para,const std::shared_ptr<ScheduleNodeCallback> & callback)52 bool ScheduleNodeHelper::ScheduleInfoToScheduleNode(const HdiScheduleInfo &info, std::shared_ptr<ScheduleNode> &node,
53     const NodeOptionalPara &para, const std::shared_ptr<ScheduleNodeCallback> &callback)
54 {
55     if (info.executors.empty()) {
56         IAM_LOGE("executors empty");
57         return false;
58     }
59     std::shared_ptr<ResourceNode> collector;
60     std::shared_ptr<ResourceNode> verifier;
61 
62     if (!ScheduleInfoToExecutors(info, collector, verifier)) {
63         IAM_LOGE("ScheduleInfoToExecutors error");
64         return false;
65     }
66 
67     auto builder = ScheduleNode::Builder::New(collector, verifier);
68     if (builder == nullptr) {
69         IAM_LOGE("invalid builder");
70         return false;
71     }
72     if (para.tokenId.has_value()) {
73         builder->SetAccessTokenId(para.tokenId.value());
74     }
75     node = builder->SetAuthType(static_cast<AuthType>(info.authType))
76                ->SetExecutorMatcher(info.executorMatcher)
77                ->SetScheduleId(info.scheduleId)
78                ->SetTemplateIdList(info.templateIds)
79                ->SetScheduleMode(static_cast<ScheduleMode>(info.scheduleMode))
80                ->SetExpiredTime(para.expire.value_or(0))
81                ->SetPinSubType(para.pinSubType.value_or(PinSubType::PIN_MAX))
82                ->SetScheduleCallback(callback)
83                ->Build();
84     if (node == nullptr) {
85         IAM_LOGE("builder failed");
86         return false;
87     }
88     return true;
89 }
90 
ScheduleInfoToExecutors(const HdiScheduleInfo & info,std::shared_ptr<ResourceNode> & collector,std::shared_ptr<ResourceNode> & verifier)91 bool ScheduleNodeHelper::ScheduleInfoToExecutors(const HdiScheduleInfo &info, std::shared_ptr<ResourceNode> &collector,
92     std::shared_ptr<ResourceNode> &verifier)
93 {
94     for (const auto &executor : info.executors) {
95         auto resource = ResourceNodePool::Instance().Select(executor.executorIndex).lock();
96         if (resource == nullptr) {
97             IAM_LOGI("invalid executorId ****%{public}hx", static_cast<uint16_t>(executor.executorIndex));
98             return false;
99         }
100         switch (resource->GetExecutorRole()) {
101             case COLLECTOR: {
102                 collector = resource;
103                 break;
104             }
105             case VERIFIER: {
106                 verifier = resource;
107                 break;
108             }
109             case ALL_IN_ONE: {
110                 collector = resource;
111                 verifier = resource;
112                 break;
113             }
114             default: {
115                 IAM_LOGE("invalid executor role");
116                 break;
117             }
118         }
119     }
120     if (collector == nullptr) {
121         IAM_LOGE("invalid executor collector");
122         return false;
123     }
124     if (verifier == nullptr) {
125         IAM_LOGE("invalid executor verifier");
126         return false;
127     }
128     return true;
129 }
130 } // namespace UserAuth
131 } // namespace UserIam
132 } // namespace OHOS