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