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
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
OnAcquireInfo(int32_t module,uint32_t acquireInfo,const Attributes & extraInfo)29 void IDMCallbackService::OnAcquireInfo(int32_t module, uint32_t acquireInfo, const Attributes &extraInfo)
30 {
31 if (callback_ == nullptr) {
32 ACCOUNT_LOGE("callback is nullptr");
33 return;
34 }
35 callback_->OnAcquireInfo(module, acquireInfo, extraInfo);
36 }
37
OnResult(int32_t result,const Attributes & extraInfo)38 void IDMCallbackService::OnResult(int32_t result, const Attributes &extraInfo)
39 {
40 if (callback_ == nullptr) {
41 ACCOUNT_LOGE("callback is nullptr");
42 return;
43 }
44 callback_->OnResult(result, extraInfo);
45 AccountIAMClient::GetInstance().ClearCredential(userId_);
46 }
47
GetCredInfoCallbackService(const std::shared_ptr<GetCredInfoCallback> & callback)48 GetCredInfoCallbackService::GetCredInfoCallbackService(const std::shared_ptr<GetCredInfoCallback> &callback)
49 : callback_(callback)
50 {}
51
OnCredentialInfo(const std::vector<CredentialInfo> & infoList)52 void GetCredInfoCallbackService::OnCredentialInfo(const std::vector<CredentialInfo> &infoList)
53 {
54 if (callback_ == nullptr) {
55 ACCOUNT_LOGE("callback is nullptr");
56 return;
57 }
58 callback_->OnCredentialInfo(ERR_OK, infoList);
59 }
60
GetSetPropCallbackService(const std::shared_ptr<GetSetPropCallback> & callback)61 GetSetPropCallbackService::GetSetPropCallbackService(const std::shared_ptr<GetSetPropCallback> &callback)
62 : callback_(callback)
63 {}
64
OnResult(int32_t result,const Attributes & extraInfo)65 void GetSetPropCallbackService::OnResult(int32_t result, const Attributes &extraInfo)
66 {
67 if (callback_ == nullptr) {
68 ACCOUNT_LOGE("callback is nullptr");
69 return;
70 }
71 callback_->OnResult(result, extraInfo);
72 }
73
DomainAuthCallbackAdapter(const std::shared_ptr<IDMCallback> & callback)74 DomainAuthCallbackAdapter::DomainAuthCallbackAdapter(
75 const std::shared_ptr<IDMCallback> &callback) : callback_(callback)
76 {}
77
OnResult(int32_t resultCode,const DomainAuthResult & result)78 void DomainAuthCallbackAdapter::OnResult(int32_t resultCode, const DomainAuthResult &result)
79 {
80 if (callback_ == nullptr) {
81 ACCOUNT_LOGE("callback is nullptr");
82 return;
83 }
84 Attributes attr;
85 attr.SetUint8ArrayValue(Attributes::AttributeKey::ATTR_SIGNATURE, result.token);
86 attr.SetInt32Value(Attributes::AttributeKey::ATTR_REMAIN_TIMES, result.authStatusInfo.remainingTimes);
87 attr.SetInt32Value(Attributes::AttributeKey::ATTR_FREEZING_TIME, result.authStatusInfo.freezingTime);
88 callback_->OnResult(resultCode, attr);
89 }
90
DomainCredentialRecipient(int32_t userId,const std::shared_ptr<IDMCallback> & callback)91 DomainCredentialRecipient::DomainCredentialRecipient(int32_t userId, const std::shared_ptr<IDMCallback> &callback)
92 : userId_(userId), idmCallback_(callback)
93 {}
94
~DomainCredentialRecipient()95 DomainCredentialRecipient::~DomainCredentialRecipient()
96 {}
97
OnSetData(int32_t authSubType,std::vector<uint8_t> data)98 void DomainCredentialRecipient::OnSetData(int32_t authSubType, std::vector<uint8_t> data)
99 {
100 auto callback = std::make_shared<DomainAuthCallbackAdapter>(idmCallback_);
101 if (callback == nullptr) {
102 ACCOUNT_LOGE("fail to create DomainAuthCallbackAdapter");
103 if (idmCallback_ != nullptr) {
104 ACCOUNT_LOGE("idmCallback is nullptr");
105 Attributes attr;
106 idmCallback_->OnResult(ERR_ACCOUNT_COMMON_INSUFFICIENT_MEMORY_ERROR, attr);
107 }
108 return;
109 }
110 ErrCode errCode = DomainAccountClient::GetInstance().AuthUser(userId_, data, callback);
111 if (errCode != ERR_OK) {
112 DomainAuthResult result;
113 callback->OnResult(errCode, result);
114 }
115 }
116
IAMInputerData(int32_t userId,const std::shared_ptr<IInputerData> & inputerData)117 IAMInputerData::IAMInputerData(int32_t userId, const std::shared_ptr<IInputerData> &inputerData)
118 : userId_(userId), innerInputerData_(inputerData)
119 {}
120
~IAMInputerData()121 IAMInputerData::~IAMInputerData()
122 {}
123
OnSetData(int32_t authSubType,std::vector<uint8_t> data)124 void IAMInputerData::OnSetData(int32_t authSubType, std::vector<uint8_t> data)
125 {
126 if (innerInputerData_ == nullptr) {
127 ACCOUNT_LOGE("innerInputerData_ is nullptr");
128 return;
129 }
130 innerInputerData_->OnSetData(authSubType, data);
131 innerInputerData_ = nullptr;
132 AccountIAMClient::GetInstance().SetCredential(userId_, data);
133 }
134
IAMInputer(int32_t userId,const std::shared_ptr<IInputer> & inputer)135 IAMInputer::IAMInputer(int32_t userId, const std::shared_ptr<IInputer> &inputer)
136 : userId_(userId), innerInputer_(inputer)
137 {}
138
~IAMInputer()139 IAMInputer::~IAMInputer()
140 {}
141
OnGetData(int32_t authSubType,std::shared_ptr<IInputerData> inputerData)142 void IAMInputer::OnGetData(int32_t authSubType, std::shared_ptr<IInputerData> inputerData)
143 {
144 if (inputerData == nullptr) {
145 ACCOUNT_LOGE("inputerData is nullptr");
146 return;
147 }
148 IAMState state = AccountIAMClient::GetInstance().GetAccountState(userId_);
149 if (authSubType == 0) {
150 authSubType = AccountIAMClient::GetInstance().GetAuthSubType(userId_);
151 }
152 if (state < AFTER_ADD_CRED) {
153 if (innerInputer_ == nullptr) {
154 ACCOUNT_LOGE("innerInputer_ is nullptr");
155 return;
156 }
157 auto iamInputerData = std::make_shared<IAMInputerData>(userId_, inputerData);
158 innerInputer_->OnGetData(authSubType, iamInputerData);
159 return;
160 }
161 CredentialItem credItem;
162 AccountIAMClient::GetInstance().GetCredential(userId_, credItem);
163 if (state == ROLL_BACK_UPDATE_CRED) {
164 inputerData->OnSetData(authSubType, credItem.oldCredential);
165 } else {
166 inputerData->OnSetData(authSubType, credItem.credential);
167 }
168 }
169
ResetInnerInputer(const std::shared_ptr<IInputer> & inputer)170 void IAMInputer::ResetInnerInputer(const std::shared_ptr<IInputer> &inputer)
171 {
172 innerInputer_ = inputer;
173 }
174 } // namespace AccountSA
175 } // namespace OHOS
176