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