1 /*
2 * Copyright (c) 2022-2023 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_builder.h"
16
17 #include <mutex>
18
19 #include "nocopyable.h"
20
21 #include "iam_common_defines.h"
22 #include "iam_logger.h"
23 #include "iam_ptr.h"
24
25 #define LOG_TAG "USER_AUTH_SA"
26
27 namespace OHOS {
28 namespace UserIam {
29 namespace UserAuth {
30 using Builder = ScheduleNode::Builder;
31
ScheduleNodeBuilder(const std::shared_ptr<ResourceNode> & collector,const std::shared_ptr<ResourceNode> & verifier)32 ScheduleNodeBuilder::ScheduleNodeBuilder(const std::shared_ptr<ResourceNode> &collector,
33 const std::shared_ptr<ResourceNode> &verifier)
34 : collector_(collector),
35 verifier_(verifier)
36 {
37 if (collector) {
38 info_.authType = collector->GetAuthType();
39 }
40 info_.endAfterFirstFail = false;
41 }
42
SetScheduleId(uint64_t scheduleId)43 std::shared_ptr<Builder> ScheduleNodeBuilder::SetScheduleId(uint64_t scheduleId)
44 {
45 info_.scheduleId = scheduleId;
46 return shared_from_this();
47 }
48
SetAccessTokenId(uint32_t tokenId)49 std::shared_ptr<Builder> ScheduleNodeBuilder::SetAccessTokenId(uint32_t tokenId)
50 {
51 info_.tokenId = tokenId;
52 return shared_from_this();
53 }
54
SetCollectorTokenId(uint32_t collectorTokenId)55 std::shared_ptr<Builder> ScheduleNodeBuilder::SetCollectorTokenId(uint32_t collectorTokenId)
56 {
57 info_.collectorTokenId = collectorTokenId;
58 return shared_from_this();
59 }
60
SetPinSubType(PinSubType pinSubType)61 std::shared_ptr<Builder> ScheduleNodeBuilder::SetPinSubType(PinSubType pinSubType)
62 {
63 info_.pinSubType = pinSubType;
64 return shared_from_this();
65 }
66
SetTemplateIdList(const std::vector<uint64_t> & templateIdList)67 std::shared_ptr<Builder> ScheduleNodeBuilder::SetTemplateIdList(const std::vector<uint64_t> &templateIdList)
68 {
69 info_.templateIdList = templateIdList;
70 return shared_from_this();
71 }
72
SetAuthType(AuthType authType)73 std::shared_ptr<Builder> ScheduleNodeBuilder::SetAuthType(AuthType authType)
74 {
75 info_.authType = authType;
76 return shared_from_this();
77 }
78
SetExecutorMatcher(uint32_t executorMatcher)79 std::shared_ptr<Builder> ScheduleNodeBuilder::SetExecutorMatcher(uint32_t executorMatcher)
80 {
81 info_.executorMatcher = executorMatcher;
82 return shared_from_this();
83 }
84
SetScheduleMode(ScheduleMode scheduleMode)85 std::shared_ptr<Builder> ScheduleNodeBuilder::SetScheduleMode(ScheduleMode scheduleMode)
86 {
87 info_.scheduleMode = scheduleMode;
88 return shared_from_this();
89 }
90
SetScheduleCallback(const std::shared_ptr<ScheduleNodeCallback> & callback)91 std::shared_ptr<Builder> ScheduleNodeBuilder::SetScheduleCallback(const std::shared_ptr<ScheduleNodeCallback> &callback)
92 {
93 info_.callback = callback;
94 return shared_from_this();
95 }
96
SetExpiredTime(uint32_t ms)97 std::shared_ptr<Builder> ScheduleNodeBuilder::SetExpiredTime(uint32_t ms)
98 {
99 info_.expiredTime = ms;
100 return shared_from_this();
101 }
102
SetThreadHandler(const std::shared_ptr<ThreadHandler> & threadHandler)103 std::shared_ptr<Builder> ScheduleNodeBuilder::SetThreadHandler(const std::shared_ptr<ThreadHandler> &threadHandler)
104 {
105 info_.threadHandler = threadHandler;
106 return shared_from_this();
107 }
108
SetEndAfterFirstFail(const bool endAfterFirstFail)109 std::shared_ptr<Builder> ScheduleNodeBuilder::SetEndAfterFirstFail(const bool endAfterFirstFail)
110 {
111 info_.endAfterFirstFail = endAfterFirstFail;
112 return shared_from_this();
113 }
114
SetCollectorMessage(const std::vector<uint8_t> & message)115 std::shared_ptr<Builder> ScheduleNodeBuilder::SetCollectorMessage(const std::vector<uint8_t> &message)
116 {
117 info_.collectorMessage = message;
118 return shared_from_this();
119 }
120
SetVerifierMessage(const std::vector<uint8_t> & message)121 std::shared_ptr<Builder> ScheduleNodeBuilder::SetVerifierMessage(const std::vector<uint8_t> &message)
122 {
123 info_.verifierMessage = message;
124 return shared_from_this();
125 }
126
SetAuthIntent(int32_t authIntent)127 std::shared_ptr<Builder> ScheduleNodeBuilder::SetAuthIntent(int32_t authIntent)
128 {
129 info_.authIntent = authIntent;
130 return shared_from_this();
131 }
132
SetUserId(int32_t userId)133 std::shared_ptr<Builder> ScheduleNodeBuilder::SetUserId(int32_t userId)
134 {
135 info_.userId = userId;
136 return shared_from_this();
137 }
138
Build()139 std::shared_ptr<ScheduleNode> ScheduleNodeBuilder::Build()
140 {
141 if (!CheckParameters()) {
142 IAM_LOGE("checkParameters error");
143 return nullptr;
144 }
145 IAM_LOGI("scheduleNode builder start to build");
146 info_.collector = collector_;
147 info_.verifier = verifier_;
148 return Common::MakeShared<ScheduleNodeImpl>(info_);
149 }
150
CheckParameters() const151 bool ScheduleNodeBuilder::CheckParameters() const
152 {
153 if (collector_ && collector_->GetAuthType() != info_.authType) {
154 IAM_LOGE("authType mismatch");
155 return false;
156 }
157 return true;
158 }
159
CheckExecutors(const std::shared_ptr<ResourceNode> & collector,const std::shared_ptr<ResourceNode> & verifier)160 bool ScheduleNodeBuilder::CheckExecutors(const std::shared_ptr<ResourceNode> &collector,
161 const std::shared_ptr<ResourceNode> &verifier)
162 {
163 if (!collector) {
164 IAM_LOGE("collector not set");
165 return false;
166 }
167
168 if (!verifier) {
169 IAM_LOGE("verifier not set");
170 return false;
171 }
172
173 if (collector->GetAuthType() != verifier->GetAuthType()) {
174 IAM_LOGE("collector_ && verifier authtype mismatch");
175 return false;
176 }
177
178 if (collector->GetExecutorMatcher() != verifier->GetExecutorMatcher()) {
179 IAM_LOGE("executorType mismatch");
180 return false;
181 }
182
183 // all in one
184 if (collector == verifier && collector->GetExecutorRole() == ALL_IN_ONE) {
185 return true;
186 }
187
188 if (collector->GetExecutorRole() == COLLECTOR && verifier->GetExecutorRole() == VERIFIER) {
189 return true;
190 }
191
192 IAM_LOGE("executor role type mismatch");
193 return false;
194 }
195
New(const std::shared_ptr<ResourceNode> & collector,const std::shared_ptr<ResourceNode> & verifier)196 std::shared_ptr<Builder> Builder::New(const std::shared_ptr<ResourceNode> &collector,
197 const std::shared_ptr<ResourceNode> &verifier)
198 {
199 auto result = ScheduleNodeBuilder::CheckExecutors(collector, verifier);
200 if (!result) {
201 IAM_LOGE("checkExecutors failed");
202 return nullptr;
203 }
204
205 return Common::MakeShared<ScheduleNodeBuilder>(collector, verifier);
206 }
207 } // namespace UserAuth
208 } // namespace UserIam
209 } // namespace OHOS
210