1 /*
2  * Copyright (c) 2022-2024 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 #ifndef OS_ACCOUNT_SERVICES_ACCOUNTMGR_INCLUDE_ACCOUNT_IAM_CALLBACK_H
17 #define OS_ACCOUNT_SERVICES_ACCOUNTMGR_INCLUDE_ACCOUNT_IAM_CALLBACK_H
18 
19 #include <map>
20 #include <vector>
21 #include "account_file_operator.h"
22 #include "account_iam_info.h"
23 #include "domain_account_callback.h"
24 #include "iaccount_iam_callback.h"
25 #include "iremote_object.h"
26 
27 namespace OHOS {
28 namespace AccountSA {
29 class AuthCallbackDeathRecipient : public IRemoteObject::DeathRecipient {
30 public:
31     AuthCallbackDeathRecipient() = default;
32     ~AuthCallbackDeathRecipient() override = default;
33 
34     void SetContextId(uint16_t context);
35     void OnRemoteDied(const wptr<IRemoteObject> &remote) override;
36 
37 private:
38     uint64_t contextId_ = 0;
39 };
40 
41 class AuthCallback : public AuthenticationCallback {
42 public:
43     AuthCallback(uint32_t userId, uint64_t credentialId, AuthType authType, const sptr<IIDMCallback> &callback);
44     AuthCallback(uint32_t userId, uint64_t credentialId, AuthType authType,
45         bool isRemoteAuth, const sptr<IIDMCallback> &callback);
46     virtual ~AuthCallback() = default;
47 
48     void SetDeathRecipient(const sptr<AuthCallbackDeathRecipient> &deathRecipient);
49     void OnAcquireInfo(int32_t module, uint32_t acquireInfo, const Attributes &extraInfo) override;
50     void OnResult(int32_t result, const Attributes &extraInfo) override;
51 
52 private:
53     ErrCode HandleAuthResult(const Attributes &extraInfo, int32_t accountId, bool &isUpdateVerifiedStatus);
54 
55 private:
56     uint32_t userId_;
57     uint64_t credentialId_;
58     AuthType authType_;
59     bool isRemoteAuth_ = false;
60     sptr<IIDMCallback> innerCallback_ = nullptr;
61     sptr<AuthCallbackDeathRecipient> deathRecipient_ = nullptr;
62 };
63 
64 class IDMCallbackDeathRecipient : public IRemoteObject::DeathRecipient {
65 public:
66     IDMCallbackDeathRecipient(uint32_t userId);
67     void OnRemoteDied(const wptr<IRemoteObject> &remote) override;
68 
69 private:
70     uint32_t userId_ = 0;
71 };
72 
73 class AddCredCallback : public UserIdmClientCallback {
74 public:
75     AddCredCallback(uint32_t userId, const CredentialParameters &credInfo,
76         const sptr<IIDMCallback> &callback);
77     virtual ~AddCredCallback() = default;
78 
79     void SetDeathRecipient(const sptr<IDMCallbackDeathRecipient> &deathRecipient);
80     void OnResult(int32_t result, const Attributes &extraInfo) override;
81     void OnAcquireInfo(int32_t module, uint32_t acquireInfo, const Attributes &extraInfo) override;
82 
83 public:
84     std::mutex mutex_;
85     bool isCalled_ = false;
86     std::condition_variable onResultCondition_;
87 
88 private:
89     std::uint32_t userId_;
90     CredentialParameters credInfo_;
91     sptr<IDMCallbackDeathRecipient> deathRecipient_ = nullptr;
92     sptr<IIDMCallback> innerCallback_ = nullptr;
93 };
94 
95 class UpdateCredCallback : public UserIdmClientCallback {
96 public:
97     UpdateCredCallback(uint32_t userId, const CredentialParameters &credInfo,
98         const sptr<IIDMCallback> &callback);
99     virtual ~UpdateCredCallback() = default;
100 
101     void SetDeathRecipient(const sptr<IDMCallbackDeathRecipient> &deathRecipient);
102     void OnResult(int32_t result, const Attributes &extraInfo) override;
103     void OnAcquireInfo(int32_t module, uint32_t acquireInfo, const Attributes &extraInfo) override;
104 
105 private:
106     void InnerOnResult(int32_t result, const Attributes &extraInfo);
107 
108 public:
109     std::mutex mutex_;
110     bool isCalled_ = false;
111     std::condition_variable onResultCondition_;
112 
113 private:
114     std::uint32_t userId_;
115     CredentialParameters credInfo_;
116     sptr<IDMCallbackDeathRecipient> deathRecipient_ = nullptr;
117     const sptr<IIDMCallback> innerCallback_ = nullptr;
118 };
119 
120 #ifdef HAS_PIN_AUTH_PART
121 class DelUserInputer : public IInputer {
122 public:
123     DelUserInputer() = default;
124     virtual ~DelUserInputer() = default;
125 
126     void OnGetData(int32_t authSubType, std::vector<uint8_t> challenge,
127         std::shared_ptr<IInputerData> inputerData) override;
128 };
129 
130 class DelUserCallback : public UserIdmClientCallback {
131 public:
132     DelUserCallback(uint32_t userId, const sptr<IIDMCallback> &callback);
133     virtual ~DelUserCallback();
134 
135     void OnResult(int32_t result, const Attributes &extraInfo) override;
136     void OnAcquireInfo(int32_t module, uint32_t acquireInfo, const Attributes &extraInfo) override {};
137 
138 private:
139     void InnerOnResult(int32_t result, const Attributes &extraInfo);
140 
141 public:
142     std::mutex mutex_;
143     bool isCalled_ = false;
144     std::condition_variable onResultCondition_;
145 
146 private:
147     std::uint32_t userId_;
148     const sptr<IIDMCallback> innerCallback_ = nullptr;
149 };
150 #endif // HAS_PIN_AUTH_PART
151 
152 struct UpdateCredInfo {
153     uint64_t credentialId = 0;
154     uint64_t secureUid = 0;
155     std::vector<uint8_t> token;
156     std::vector<uint8_t> newSecret;
157     std::vector<uint8_t> oldSecret;
158 };
159 
160 class CommitCredUpdateCallback : public UserIdmClientCallback {
161 public:
162     CommitCredUpdateCallback(int32_t userId, const UpdateCredInfo &extraUpdateInfo, const sptr<IIDMCallback> &callback);
163     virtual ~CommitCredUpdateCallback() = default;
164 
165     void OnResult(int32_t result, const Attributes &extraInfo) override;
166     void OnAcquireInfo(int32_t module, uint32_t acquireInfo, const Attributes &extraInfo) override;
167 
168 private:
169     void InnerOnResult(int32_t result, const Attributes &extraInfo);
170 
171 public:
172     std::mutex mutex_;
173     bool isCalled_ = false;
174     std::condition_variable onResultCondition_;
175 
176 private:
177     int32_t userId_;
178     UpdateCredInfo extraUpdateInfo_;
179     sptr<IIDMCallback> innerCallback_ = nullptr;
180 };
181 
182 class DelCredCallback : public UserIdmClientCallback {
183 public:
184     DelCredCallback(int32_t userId, bool isPIN, std::vector<uint8_t> token, const sptr<IIDMCallback> &callback);
185     virtual ~DelCredCallback() = default;
186 
187     void OnResult(int32_t result, const Attributes &extraInfo) override;
188     void OnAcquireInfo(int32_t module, uint32_t acquireInfo, const Attributes &extraInfo) override;
189 
190 private:
191     int32_t userId_;
192     bool isPIN_;
193     std::vector<uint8_t> token_;
194     sptr<IIDMCallback> innerCallback_ = nullptr;
195 };
196 
197 class GetCredInfoCallbackWrapper : public GetCredentialInfoCallback {
198 public:
199     GetCredInfoCallbackWrapper(int32_t userId, int32_t authType, const sptr<IGetCredInfoCallback> &callback);
200     virtual ~GetCredInfoCallbackWrapper() = default;
201 
202     void OnCredentialInfo(const std::vector<CredentialInfo> &infoList) override;
203 
204 private:
205     int32_t userId_;
206     int32_t authType_;
207     sptr<IGetCredInfoCallback> innerCallback_ = nullptr;
208 };
209 
210 class GetPropCallbackWrapper : public GetPropCallback {
211 public:
212     GetPropCallbackWrapper(int32_t userId, const sptr<IGetSetPropCallback> &callback);
213     virtual ~GetPropCallbackWrapper() = default;
214 
215     void OnResult(int32_t result, const Attributes &extraInfo) override;
216 
217 private:
218     int32_t userId_;
219     sptr<IGetSetPropCallback> innerCallback_;
220 };
221 
222 class SetPropCallbackWrapper : public SetPropCallback {
223 public:
224     SetPropCallbackWrapper(int32_t userId, const sptr<IGetSetPropCallback> &callback);
225     virtual ~SetPropCallbackWrapper() = default;
226 
227     void OnResult(int32_t result, const Attributes &extraInfo) override;
228 
229 private:
230     int32_t userId_;
231     sptr<IGetSetPropCallback> innerCallback_;
232 };
233 
234 class GetSecUserInfoCallbackWrapper : public GetSecUserInfoCallback {
235 public:
236     GetSecUserInfoCallbackWrapper(AuthType authType, const sptr<IGetEnrolledIdCallback> &callback);
237     virtual ~GetSecUserInfoCallbackWrapper() = default;
238 
239     void OnSecUserInfo(const SecUserInfo &info) override;
240 
241 private:
242     AuthType authType_;
243     sptr<IGetEnrolledIdCallback> innerCallback_;
244 };
245 
246 class GetSecureUidCallback final : public GetSecUserInfoCallback {
247 public:
248     GetSecureUidCallback(int32_t userId);
249 
250     void OnSecUserInfo(const SecUserInfo &info) override;
251 
252 public:
253     int32_t userId_;
254     uint64_t secureUid_ = 0;
255     bool isCalled_ = false;
256     std::mutex secureMtx_;
257     std::condition_variable secureCv_;
258 };
259 
260 class PrepareRemoteAuthCallbackWrapper : public PrepareRemoteAuthCallback {
261 public:
262     PrepareRemoteAuthCallbackWrapper(const sptr<IPreRemoteAuthCallback> &callback);
263     virtual ~PrepareRemoteAuthCallbackWrapper() = default;
264 
265     void OnResult(int32_t result) override;
266 
267 private:
268     sptr<IPreRemoteAuthCallback> innerCallback_;
269 };
270 
271 class GetDomainAuthStatusInfoCallback final : public DomainAccountCallback {
272 public:
273     GetDomainAuthStatusInfoCallback(const GetPropertyRequest &request, const sptr<IGetSetPropCallback> &callback);
274 
275     void OnResult(int32_t result, Parcel &parcel) override;
276 
277 private:
278     GetPropertyRequest request_;
279     sptr<IGetSetPropCallback> innerCallback_;
280 };
281 }  // namespace AccountSA
282 }  // namespace OHOS
283 #endif  // OS_ACCOUNT_SERVICES_ACCOUNTMGR_INCLUDE_ACCOUNT_IAM_CALLBACK_H
284