1c2b37d2cSopenharmony_ci/*
2c2b37d2cSopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3c2b37d2cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c2b37d2cSopenharmony_ci * you may not use this file except in compliance with the License.
5c2b37d2cSopenharmony_ci * You may obtain a copy of the License at
6c2b37d2cSopenharmony_ci *
7c2b37d2cSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c2b37d2cSopenharmony_ci *
9c2b37d2cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c2b37d2cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c2b37d2cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c2b37d2cSopenharmony_ci * See the License for the specific language governing permissions and
13c2b37d2cSopenharmony_ci * limitations under the License.
14c2b37d2cSopenharmony_ci */
15c2b37d2cSopenharmony_ci
16c2b37d2cSopenharmony_ci#ifndef OS_ACCOUNT_SERVICES_ACCOUNTMGR_INCLUDE_OHOS_ACCOUNT_MANAGER_H
17c2b37d2cSopenharmony_ci#define OS_ACCOUNT_SERVICES_ACCOUNTMGR_INCLUDE_OHOS_ACCOUNT_MANAGER_H
18c2b37d2cSopenharmony_ci
19c2b37d2cSopenharmony_ci#include <map>
20c2b37d2cSopenharmony_ci#include <mutex>
21c2b37d2cSopenharmony_ci#include <string>
22c2b37d2cSopenharmony_ci#ifdef HAS_CES_PART
23c2b37d2cSopenharmony_ci#include "account_event_subscribe.h"
24c2b37d2cSopenharmony_ci#endif // HAS_CES_PART
25c2b37d2cSopenharmony_ci#include "account_info.h"
26c2b37d2cSopenharmony_ci#include "account_state_machine.h"
27c2b37d2cSopenharmony_ci#include "idistributed_account_subscribe.h"
28c2b37d2cSopenharmony_ci#include "iinner_os_account_manager.h"
29c2b37d2cSopenharmony_ci#include "ohos_account_data_deal.h"
30c2b37d2cSopenharmony_ci
31c2b37d2cSopenharmony_cinamespace OHOS {
32c2b37d2cSopenharmony_cinamespace AccountSA {
33c2b37d2cSopenharmony_ci#ifndef ACCOUNT_TEST
34c2b37d2cSopenharmony_ciconst std::string ACCOUNT_CFG_DIR_ROOT_PATH = "/data/service/el1/public/account/";
35c2b37d2cSopenharmony_ci#else
36c2b37d2cSopenharmony_ciconst std::string ACCOUNT_CFG_DIR_ROOT_PATH = "/data/service/el1/public/account/test/";
37c2b37d2cSopenharmony_ci#endif // ACCOUNT_TEST
38c2b37d2cSopenharmony_ci
39c2b37d2cSopenharmony_ci
40c2b37d2cSopenharmony_ciclass OhosAccountManager;
41c2b37d2cSopenharmony_ciusing OhosAccountEventFunc = std::function<ErrCode(const std::int32_t, const OhosAccountInfo &, const std::string &)>;
42c2b37d2cSopenharmony_ci/**
43c2b37d2cSopenharmony_ci * Ohos account manager
44c2b37d2cSopenharmony_ci */
45c2b37d2cSopenharmony_ciclass OhosAccountManager {
46c2b37d2cSopenharmony_cipublic:
47c2b37d2cSopenharmony_ci    static OhosAccountManager &GetInstance();
48c2b37d2cSopenharmony_ci    /**
49c2b37d2cSopenharmony_ci     * Get current ohos account information.
50c2b37d2cSopenharmony_ci     *
51c2b37d2cSopenharmony_ci     * @return current account information.
52c2b37d2cSopenharmony_ci     */
53c2b37d2cSopenharmony_ci    AccountInfo GetCurrentOhosAccountInfo();
54c2b37d2cSopenharmony_ci
55c2b37d2cSopenharmony_ci    /**
56c2b37d2cSopenharmony_ci     * Get ohos account information by local userId.
57c2b37d2cSopenharmony_ci     *
58c2b37d2cSopenharmony_ci     * @param userId target local account id
59c2b37d2cSopenharmony_ci     * @return ohos account info which is bound to the local userId.
60c2b37d2cSopenharmony_ci     */
61c2b37d2cSopenharmony_ci    ErrCode GetAccountInfoByUserId(std::int32_t userId, AccountInfo &info);
62c2b37d2cSopenharmony_ci
63c2b37d2cSopenharmony_ci    /**
64c2b37d2cSopenharmony_ci     * Subscribe distributed account event by type.
65c2b37d2cSopenharmony_ci     *
66c2b37d2cSopenharmony_ci     * @param type event type
67c2b37d2cSopenharmony_ci     * @param eventListener event listener
68c2b37d2cSopenharmony_ci     * @return subscribe resule.
69c2b37d2cSopenharmony_ci     */
70c2b37d2cSopenharmony_ci    ErrCode SubscribeDistributedAccountEvent(const DISTRIBUTED_ACCOUNT_SUBSCRIBE_TYPE type,
71c2b37d2cSopenharmony_ci        const sptr<IRemoteObject> &eventListener);
72c2b37d2cSopenharmony_ci
73c2b37d2cSopenharmony_ci    /**
74c2b37d2cSopenharmony_ci     * Unsubscribe distributed account event by type.
75c2b37d2cSopenharmony_ci     *
76c2b37d2cSopenharmony_ci     * @param type event type
77c2b37d2cSopenharmony_ci     * @param eventListener event listener
78c2b37d2cSopenharmony_ci     * @return unsubscribe resule.
79c2b37d2cSopenharmony_ci     */
80c2b37d2cSopenharmony_ci    ErrCode UnsubscribeDistributedAccountEvent(const DISTRIBUTED_ACCOUNT_SUBSCRIBE_TYPE type,
81c2b37d2cSopenharmony_ci        const sptr<IRemoteObject> &eventListener);
82c2b37d2cSopenharmony_ci
83c2b37d2cSopenharmony_ci    /**
84c2b37d2cSopenharmony_ci     * Get current account state.
85c2b37d2cSopenharmony_ci     *
86c2b37d2cSopenharmony_ci     * @return current account state id.
87c2b37d2cSopenharmony_ci     */
88c2b37d2cSopenharmony_ci    int GetCurrentOhosAccountState();
89c2b37d2cSopenharmony_ci
90c2b37d2cSopenharmony_ci    /**
91c2b37d2cSopenharmony_ci     * Init ohos account manager.
92c2b37d2cSopenharmony_ci     *
93c2b37d2cSopenharmony_ci     */
94c2b37d2cSopenharmony_ci    bool OnInitialize();
95c2b37d2cSopenharmony_ci
96c2b37d2cSopenharmony_ci    /**
97c2b37d2cSopenharmony_ci     * Process an account event.
98c2b37d2cSopenharmony_ci     *
99c2b37d2cSopenharmony_ci     * @param curOhosAccount current ohos account info
100c2b37d2cSopenharmony_ci     * @param eventStr ohos account state change event
101c2b37d2cSopenharmony_ci     * @return true if the processing was completed, otherwise false
102c2b37d2cSopenharmony_ci     */
103c2b37d2cSopenharmony_ci    bool HandleEvent(AccountInfo &curOhosAccount, const std::string &eventStr);
104c2b37d2cSopenharmony_ci
105c2b37d2cSopenharmony_ci    /**
106c2b37d2cSopenharmony_ci     * login ohos (for distributed network) account.
107c2b37d2cSopenharmony_ci     *
108c2b37d2cSopenharmony_ci     * @param userId target local account id.
109c2b37d2cSopenharmony_ci     * @param ohosAccountInfo ohos account information
110c2b37d2cSopenharmony_ci     * @param eventStr ohos account state change event
111c2b37d2cSopenharmony_ci     * @return true if the processing was completed, otherwise false
112c2b37d2cSopenharmony_ci     */
113c2b37d2cSopenharmony_ci    ErrCode LoginOhosAccount(const int32_t userId, const OhosAccountInfo &ohosAccountInfo, const std::string &eventStr);
114c2b37d2cSopenharmony_ci
115c2b37d2cSopenharmony_ci    /**
116c2b37d2cSopenharmony_ci     * logout ohos (for distributed network) account.
117c2b37d2cSopenharmony_ci     *
118c2b37d2cSopenharmony_ci     * @param userId target local account id.
119c2b37d2cSopenharmony_ci     * @param ohosAccountInfo ohos account information
120c2b37d2cSopenharmony_ci     * @param eventStr ohos account state change event
121c2b37d2cSopenharmony_ci     * @return true if the processing was completed, otherwise false
122c2b37d2cSopenharmony_ci     */
123c2b37d2cSopenharmony_ci    ErrCode LogoutOhosAccount(const int32_t userId, const OhosAccountInfo &ohosAccountInfo,
124c2b37d2cSopenharmony_ci                              const std::string &eventStr);
125c2b37d2cSopenharmony_ci
126c2b37d2cSopenharmony_ci    /**
127c2b37d2cSopenharmony_ci     * logoff ohos (for distributed network) account.
128c2b37d2cSopenharmony_ci     *
129c2b37d2cSopenharmony_ci     * @param userId target local account id.
130c2b37d2cSopenharmony_ci     * @param ohosAccountInfo ohos account information
131c2b37d2cSopenharmony_ci     * @param eventStr ohos account state change event
132c2b37d2cSopenharmony_ci     * @return true if the processing was completed, otherwise false
133c2b37d2cSopenharmony_ci     */
134c2b37d2cSopenharmony_ci    ErrCode LogoffOhosAccount(const int32_t userId, const OhosAccountInfo &ohosAccountInfo,
135c2b37d2cSopenharmony_ci                              const std::string &eventStr);
136c2b37d2cSopenharmony_ci
137c2b37d2cSopenharmony_ci    /**
138c2b37d2cSopenharmony_ci     * Handle token_invalid event of ohos (for distributed network) account .
139c2b37d2cSopenharmony_ci     *
140c2b37d2cSopenharmony_ci     * @param userId target local account id.
141c2b37d2cSopenharmony_ci     * @param ohosAccountInfo ohos account information
142c2b37d2cSopenharmony_ci     * @param eventStr ohos account state change event
143c2b37d2cSopenharmony_ci     * @return true if the processing was completed, otherwise false
144c2b37d2cSopenharmony_ci     */
145c2b37d2cSopenharmony_ci    ErrCode HandleOhosAccountTokenInvalidEvent(
146c2b37d2cSopenharmony_ci        const int32_t userId, const OhosAccountInfo &ohosAccountInfo, const std::string &eventStr);
147c2b37d2cSopenharmony_ci
148c2b37d2cSopenharmony_ci    /**
149c2b37d2cSopenharmony_ci     * Handle device account switch event.
150c2b37d2cSopenharmony_ci     *
151c2b37d2cSopenharmony_ci     * @param None
152c2b37d2cSopenharmony_ci     * @return None
153c2b37d2cSopenharmony_ci     */
154c2b37d2cSopenharmony_ci    void HandleDevAccountSwitchEvent();
155c2b37d2cSopenharmony_ci
156c2b37d2cSopenharmony_ci    /**
157c2b37d2cSopenharmony_ci     * Ohos account state change.
158c2b37d2cSopenharmony_ci     *
159c2b37d2cSopenharmony_ci     * @param name ohos account name
160c2b37d2cSopenharmony_ci     * @param uid ohos account uid
161c2b37d2cSopenharmony_ci     * @param eventStr ohos account state change event
162c2b37d2cSopenharmony_ci     * @return true if the processing was completed, otherwise false
163c2b37d2cSopenharmony_ci     */
164c2b37d2cSopenharmony_ci    ErrCode OhosAccountStateChange(const std::string &name, const std::string &uid, const std::string &eventStr);
165c2b37d2cSopenharmony_ci
166c2b37d2cSopenharmony_ci    /**
167c2b37d2cSopenharmony_ci     * Ohos account state change.
168c2b37d2cSopenharmony_ci     *
169c2b37d2cSopenharmony_ci     * @param ohosAccountInfo ohos account information
170c2b37d2cSopenharmony_ci     * @param eventStr ohos account state change event
171c2b37d2cSopenharmony_ci     * @return true if the processing was completed, otherwise false
172c2b37d2cSopenharmony_ci     */
173c2b37d2cSopenharmony_ci    ErrCode OhosAccountStateChange(
174c2b37d2cSopenharmony_ci        const int32_t userId, const OhosAccountInfo &ohosAccountInfo, const std::string &eventStr);
175c2b37d2cSopenharmony_ci
176c2b37d2cSopenharmony_ciprivate:
177c2b37d2cSopenharmony_ci    bool isInit_ = false;
178c2b37d2cSopenharmony_ci    OhosAccountManager();
179c2b37d2cSopenharmony_ci    DISALLOW_COPY_AND_MOVE(OhosAccountManager);
180c2b37d2cSopenharmony_ci    IDistributedAccountSubscribe &subscribeManager_;
181c2b37d2cSopenharmony_ci
182c2b37d2cSopenharmony_ci    /**
183c2b37d2cSopenharmony_ci     * Account state machine.
184c2b37d2cSopenharmony_ci     */
185c2b37d2cSopenharmony_ci    std::unique_ptr<AccountStateMachine> accountState_{};
186c2b37d2cSopenharmony_ci
187c2b37d2cSopenharmony_ci    /**
188c2b37d2cSopenharmony_ci     * Deal with file storage.
189c2b37d2cSopenharmony_ci     */
190c2b37d2cSopenharmony_ci    std::unique_ptr<OhosAccountDataDeal> dataDealer_{};
191c2b37d2cSopenharmony_ci
192c2b37d2cSopenharmony_ci    /**
193c2b37d2cSopenharmony_ci     * event mapper.
194c2b37d2cSopenharmony_ci     */
195c2b37d2cSopenharmony_ci    std::map<std::string, ACCOUNT_INNER_EVENT_TYPE> eventMap_;
196c2b37d2cSopenharmony_ci
197c2b37d2cSopenharmony_ci    /**
198c2b37d2cSopenharmony_ci     * mutex lock for synchronization.
199c2b37d2cSopenharmony_ci     */
200c2b37d2cSopenharmony_ci    std::mutex mgrMutex_;
201c2b37d2cSopenharmony_ci    std::mutex initMutex_;
202c2b37d2cSopenharmony_ci
203c2b37d2cSopenharmony_ci    /**
204c2b37d2cSopenharmony_ci     * build event mapper.
205c2b37d2cSopenharmony_ci     */
206c2b37d2cSopenharmony_ci    void BuildEventsMapper();
207c2b37d2cSopenharmony_ci
208c2b37d2cSopenharmony_ci    /**
209c2b37d2cSopenharmony_ci     * Config current account config.
210c2b37d2cSopenharmony_ci     *
211c2b37d2cSopenharmony_ci     * @param ohosAccountInfo target ohos account information.
212c2b37d2cSopenharmony_ci     * @return true if success.
213c2b37d2cSopenharmony_ci     */
214c2b37d2cSopenharmony_ci    bool SaveOhosAccountInfo(AccountInfo &ohosAccountInfo) const;
215c2b37d2cSopenharmony_ci
216c2b37d2cSopenharmony_ci    /**
217c2b37d2cSopenharmony_ci     * Clear current account config.
218c2b37d2cSopenharmony_ci     * @param curOhosAccountInfo current ohos account info.
219c2b37d2cSopenharmony_ci     * @param clrStatus account status.
220c2b37d2cSopenharmony_ci     */
221c2b37d2cSopenharmony_ci    bool ClearOhosAccount(AccountInfo &curOhosAccountInfo, std::int32_t clrStatus = ACCOUNT_STATE_UNBOUND) const;
222c2b37d2cSopenharmony_ci
223c2b37d2cSopenharmony_ci    /**
224c2b37d2cSopenharmony_ci     * Check whether the ohos account can be bound to the current user or not
225c2b37d2cSopenharmony_ci     * @return true if can.
226c2b37d2cSopenharmony_ci     */
227c2b37d2cSopenharmony_ci    bool CheckOhosAccountCanBind(const AccountInfo &currAccountInfo,
228c2b37d2cSopenharmony_ci        const OhosAccountInfo &newOhosAccountInfo, const std::string &newOhosUid) const;
229c2b37d2cSopenharmony_ci
230c2b37d2cSopenharmony_ci    /**
231c2b37d2cSopenharmony_ci     * Get current ohos account info and check whether input information match or not
232c2b37d2cSopenharmony_ci     * @return true if matches.
233c2b37d2cSopenharmony_ci     */
234c2b37d2cSopenharmony_ci    bool GetCurOhosAccountAndCheckMatch(AccountInfo &curOhosAccountInfo,
235c2b37d2cSopenharmony_ci                                        const std::string &inputName,
236c2b37d2cSopenharmony_ci                                        const std::string &inputUid,
237c2b37d2cSopenharmony_ci                                        const std::int32_t callingUserId) const;
238c2b37d2cSopenharmony_ci
239c2b37d2cSopenharmony_ci    /**
240c2b37d2cSopenharmony_ci     * event function map
241c2b37d2cSopenharmony_ci     */
242c2b37d2cSopenharmony_ci    std::map<std::string, OhosAccountEventFunc> eventFuncMap_;
243c2b37d2cSopenharmony_ci#ifdef HAS_CES_PART
244c2b37d2cSopenharmony_ci    void OnPackageRemoved(const std::int32_t callingUid);
245c2b37d2cSopenharmony_ci    bool CreateCommonEventSubscribe();
246c2b37d2cSopenharmony_ci    std::shared_ptr<AccountEventSubscriber> accountEventSubscribe_{};
247c2b37d2cSopenharmony_ci#endif // HAS_CES_PART
248c2b37d2cSopenharmony_ci};
249c2b37d2cSopenharmony_ci}  // namespace AccountSA
250c2b37d2cSopenharmony_ci}  // namespace OHOS
251c2b37d2cSopenharmony_ci
252c2b37d2cSopenharmony_ci#endif  // OS_ACCOUNT_SERVICES_ACCOUNTMGR_INCLUDE_OHOS_ACCOUNT_MANAGER_H
253