1 /*
2 * Copyright (c) 2022-2025 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 "account_iam_callback_service.h"
17
18 #include "account_error_no.h"
19 #include "account_iam_client.h"
20 #include "account_log_wrapper.h"
21 #include "domain_account_client.h"
22
23 namespace OHOS {
24 namespace AccountSA {
IDMCallbackService(int32_t userId,const std::shared_ptr<IDMCallback> & callback)25 IDMCallbackService::IDMCallbackService(int32_t userId, const std::shared_ptr<IDMCallback> &callback)
26 : userId_(userId), callback_(callback)
27 {}
28
~IDMCallbackService()29 IDMCallbackService::~IDMCallbackService()
30 {
31 if (!isCalled_ && (callback_ != nullptr)) {
32 ACCOUNT_LOGW("No valid result returned because system exception");
33 Attributes emptyAttributes;
34 callback_->OnResult(ERR_ACCOUNT_ZIDL_ACCOUNT_SERVICE_ERROR, emptyAttributes);
35 }
36 }
37
OnAcquireInfo(int32_t module,uint32_t acquireInfo,const std::vector<uint8_t> & extraInfoBuffer)38 ErrCode IDMCallbackService::OnAcquireInfo(
39 int32_t module, uint32_t acquireInfo, const std::vector<uint8_t>& extraInfoBuffer)
40 {
41 if (callback_ == nullptr) {
42 ACCOUNT_LOGE("callback is nullptr");
43 return ERR_INVALID_VALUE;
44 }
45 Attributes extraInfo(extraInfoBuffer);
46 callback_->OnAcquireInfo(module, acquireInfo, extraInfo);
47 return ERR_OK;
48 }
49
OnResult(int32_t resultCode,const std::vector<uint8_t> & extraInfoBuffer)50 ErrCode IDMCallbackService::OnResult(int32_t resultCode, const std::vector<uint8_t>& extraInfoBuffer)
51 {
52 isCalled_ = true;
53 if (callback_ == nullptr) {
54 ACCOUNT_LOGE("callback is nullptr");
55 return ERR_INVALID_VALUE;
56 }
57 if (resultCode != 0) {
58 ACCOUNT_LOGE("idm operation failure, localId: %{public}d", userId_);
59 }
60 Attributes extraInfo(extraInfoBuffer);
61 callback_->OnResult(resultCode, extraInfo);
62 return ERR_OK;
63 }
64
GetCredInfoCallbackService(const std::shared_ptr<GetCredInfoCallback> & callback)65 GetCredInfoCallbackService::GetCredInfoCallbackService(const std::shared_ptr<GetCredInfoCallback> &callback)
66 : callback_(callback)
67 {}
68
~GetCredInfoCallbackService()69 GetCredInfoCallbackService::~GetCredInfoCallbackService()
70 {
71 if (!isCalled_ && (callback_ != nullptr)) {
72 ACCOUNT_LOGW("No valid result returned because system exception");
73 std::vector<CredentialInfo> emptyInfoList;
74 callback_->OnCredentialInfo(ERR_ACCOUNT_ZIDL_ACCOUNT_SERVICE_ERROR, emptyInfoList);
75 }
76 }
77
OnCredentialInfo(int32_t resultCode,const std::vector<CredentialInfoIam> & infoList)78 ErrCode GetCredInfoCallbackService::OnCredentialInfo(int32_t resultCode, const std::vector<CredentialInfoIam>& infoList)
79 {
80 isCalled_ = true;
81 if (callback_ == nullptr) {
82 ACCOUNT_LOGE("callback is nullptr");
83 return ERR_INVALID_VALUE;
84 }
85 auto convertedInfoList = ConvertToCredentialInfoList(infoList);
86 callback_->OnCredentialInfo(resultCode, convertedInfoList);
87 return ERR_OK;
88 }
89
GetSetPropCallbackService(const std::shared_ptr<GetSetPropCallback> & callback)90 GetSetPropCallbackService::GetSetPropCallbackService(const std::shared_ptr<GetSetPropCallback> &callback)
91 : callback_(callback)
92 {}
93
~GetSetPropCallbackService()94 GetSetPropCallbackService::~GetSetPropCallbackService()
95 {
96 if (!isCalled_ && (callback_ != nullptr)) {
97 ACCOUNT_LOGW("No valid result returned because system exception");
98 Attributes emptyAttributes;
99 callback_->OnResult(ERR_ACCOUNT_ZIDL_ACCOUNT_SERVICE_ERROR, emptyAttributes);
100 }
101 }
102
OnResult(int32_t resultCode,const std::vector<uint8_t> & extraInfoBuffer)103 ErrCode GetSetPropCallbackService::OnResult(int32_t resultCode, const std::vector<uint8_t>& extraInfoBuffer)
104 {
105 isCalled_ = true;
106 if (callback_ == nullptr) {
107 ACCOUNT_LOGE("callback is nullptr");
108 return ERR_INVALID_VALUE;
109 }
110 Attributes extraInfo(extraInfoBuffer);
111 callback_->OnResult(resultCode, extraInfo);
112 return ERR_OK;
113 }
114
GetEnrolledIdCallbackService(const std::shared_ptr<GetEnrolledIdCallback> & callback)115 GetEnrolledIdCallbackService::GetEnrolledIdCallbackService(const std::shared_ptr<GetEnrolledIdCallback> &callback)
116 : callback_(callback)
117 {}
118
~GetEnrolledIdCallbackService()119 GetEnrolledIdCallbackService::~GetEnrolledIdCallbackService()
120 {
121 if (!isCalled_ && (callback_ != nullptr)) {
122 ACCOUNT_LOGW("No valid result returned because system exception");
123 uint64_t enrolledId = 0;
124 callback_->OnEnrolledId(ERR_ACCOUNT_ZIDL_ACCOUNT_SERVICE_ERROR, enrolledId);
125 }
126 }
127
OnEnrolledId(int32_t resultCode,uint64_t enrolledId)128 ErrCode GetEnrolledIdCallbackService::OnEnrolledId(int32_t resultCode, uint64_t enrolledId)
129 {
130 isCalled_ = true;
131 if (callback_ == nullptr) {
132 ACCOUNT_LOGE("Callback is nullptr");
133 return ERR_INVALID_VALUE;
134 }
135 callback_->OnEnrolledId(resultCode, enrolledId);
136 return ERR_OK;
137 }
138
PreRemoteAuthCallbackService(const std::shared_ptr<PreRemoteAuthCallback> & callback)139 PreRemoteAuthCallbackService::PreRemoteAuthCallbackService(
140 const std::shared_ptr<PreRemoteAuthCallback> &callback) : callback_(callback)
141 {}
142
~PreRemoteAuthCallbackService()143 PreRemoteAuthCallbackService::~PreRemoteAuthCallbackService()
144 {
145 if (!isCalled_ && (callback_ != nullptr)) {
146 ACCOUNT_LOGW("No valid result returned because system exception");
147 callback_->OnResult(ERR_ACCOUNT_ZIDL_ACCOUNT_SERVICE_ERROR);
148 }
149 }
150
OnResult(int32_t resultCode)151 ErrCode PreRemoteAuthCallbackService::OnResult(int32_t resultCode)
152 {
153 isCalled_ = true;
154 if (callback_ == nullptr) {
155 ACCOUNT_LOGE("Callback is nullptr.");
156 return ERR_INVALID_VALUE;
157 }
158 callback_->OnResult(resultCode);
159 return ERR_OK;
160 }
161
DomainAuthCallbackAdapter(const std::shared_ptr<IDMCallback> & callback)162 DomainAuthCallbackAdapter::DomainAuthCallbackAdapter(
163 const std::shared_ptr<IDMCallback> &callback) : callback_(callback)
164 {}
165
OnResult(const int32_t errCode,Parcel & parcel)166 void DomainAuthCallbackAdapter::OnResult(const int32_t errCode, Parcel &parcel)
167 {
168 if (callback_ == nullptr) {
169 ACCOUNT_LOGE("callback is nullptr");
170 return;
171 }
172 Attributes attr;
173 std::shared_ptr<DomainAuthResult> authResult(DomainAuthResult::Unmarshalling(parcel));
174 if (authResult == nullptr) {
175 ACCOUNT_LOGE("authResult is nullptr");
176 callback_->OnResult(ERR_ACCOUNT_COMMON_READ_PARCEL_ERROR, attr);
177 return;
178 }
179 attr.SetUint8ArrayValue(Attributes::AttributeKey::ATTR_SIGNATURE, (*authResult).token);
180 attr.SetInt32Value(Attributes::AttributeKey::ATTR_REMAIN_TIMES, (*authResult).authStatusInfo.remainingTimes);
181 attr.SetInt32Value(Attributes::AttributeKey::ATTR_FREEZING_TIME, (*authResult).authStatusInfo.freezingTime);
182 callback_->OnResult(errCode, attr);
183 }
184
185 #ifdef HAS_PIN_AUTH_PART
DomainCredentialRecipient(int32_t userId,const std::shared_ptr<IDMCallback> & callback)186 DomainCredentialRecipient::DomainCredentialRecipient(int32_t userId, const std::shared_ptr<IDMCallback> &callback)
187 : userId_(userId), idmCallback_(callback)
188 {}
189
~DomainCredentialRecipient()190 DomainCredentialRecipient::~DomainCredentialRecipient()
191 {}
192
OnSetData(int32_t authSubType,std::vector<uint8_t> data)193 void DomainCredentialRecipient::OnSetData(int32_t authSubType, std::vector<uint8_t> data)
194 {
195 auto callback = std::make_shared<DomainAuthCallbackAdapter>(idmCallback_);
196 ErrCode errCode = DomainAccountClient::GetInstance().AuthUser(userId_, data, callback);
197 if (errCode != ERR_OK) {
198 ACCOUNT_LOGE("Failed to auth for domain account, errCode=%{public}d", errCode);
199 Parcel emptyParcel;
200 AccountSA::DomainAuthResult emptyResult;
201 if (!emptyResult.Marshalling(emptyParcel)) {
202 ACCOUNT_LOGE("authResult Marshalling failed");
203 callback->OnResult(ERR_ACCOUNT_COMMON_WRITE_PARCEL_ERROR, emptyParcel);
204 return;
205 }
206 callback->OnResult(errCode, emptyParcel);
207 }
208 }
209
IAMInputer(int32_t userId,const std::shared_ptr<IInputer> & inputer)210 IAMInputer::IAMInputer(int32_t userId, const std::shared_ptr<IInputer> &inputer)
211 : userId_(userId), innerInputer_(inputer)
212 {}
213
OnGetData(int32_t authSubType,std::vector<uint8_t> challenge,std::shared_ptr<IInputerData> inputerData)214 void IAMInputer::OnGetData(int32_t authSubType, std::vector<uint8_t> challenge,
215 std::shared_ptr<IInputerData> inputerData)
216 {
217 ACCOUNT_LOGI("AuthSubType: %{public}d", authSubType);
218 if (authSubType == 0) {
219 authSubType = AccountIAMClient::GetInstance().GetAuthSubType(userId_);
220 }
221 if (innerInputer_ == nullptr) {
222 ACCOUNT_LOGE("innerInputer_ is nullptr");
223 return;
224 }
225 innerInputer_->OnGetData(authSubType, challenge, inputerData);
226 }
227 #endif
228 } // namespace AccountSA
229 } // namespace OHOS
230