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