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 ¶)
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 ¶, 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