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