1 /* 2 * Copyright (c) 2022-2025 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_DOMAIN_ACCOUNT_INCLUDE_INNER_DOMAIN_ACCOUNT_MANAGER_H 17 #define OS_ACCOUNT_SERVICES_DOMAIN_ACCOUNT_INCLUDE_INNER_DOMAIN_ACCOUNT_MANAGER_H 18 19 #include <condition_variable> 20 #include <mutex> 21 #include "domain_account_common.h" 22 #include "domain_account_plugin_death_recipient.h" 23 #include "domain_account_callback.h" 24 #include "domain_account_callback_stub.h" 25 #include "domain_plugin.h" 26 #include "idomain_account_plugin.h" 27 #include "int_wrapper.h" 28 #include "bool_wrapper.h" 29 #include "os_account_info.h" 30 #include "want.h" 31 32 namespace OHOS { 33 namespace AccountSA { 34 class InnerDomainAccountManager { 35 public: 36 static InnerDomainAccountManager &GetInstance(); 37 ErrCode RegisterPlugin(const sptr<IDomainAccountPlugin> &plugin); 38 ErrCode UnregisterPlugin(); 39 ErrCode Auth(const DomainAccountInfo &info, const std::vector<uint8_t> &password, 40 const sptr<IDomainAccountCallback> &callback); 41 ErrCode AuthUser(int32_t userId, const std::vector<uint8_t> &password, 42 const sptr<IDomainAccountCallback> &callback); 43 ErrCode AuthWithPopup(int32_t userId, const sptr<IDomainAccountCallback> &callback); 44 ErrCode AuthWithToken(int32_t userId, const std::vector<uint8_t> &token); 45 ErrCode GetAuthStatusInfo(const DomainAccountInfo &info, const std::shared_ptr<DomainAccountCallback> &callback); 46 ErrCode HasDomainAccount(const DomainAccountInfo &info, const sptr<IDomainAccountCallback> &callback); 47 ErrCode UpdateAccountToken(const DomainAccountInfo &info, const std::vector<uint8_t> &token); 48 ErrCode IsAuthenticationExpired(const DomainAccountInfo &info, bool &isExpired); 49 ErrCode SetAccountPolicy(const DomainAccountInfo &info, const std::string &policy); 50 ErrCode GetAccessToken(const DomainAccountInfo &info, const AAFwk::WantParams ¶meters, 51 const sptr<IDomainAccountCallback> &callback); 52 ErrCode GetDomainAccountInfo(const DomainAccountInfo &info, DomainAccountInfo &result); 53 ErrCode GetDomainAccountInfo(const DomainAccountInfo &info, const sptr<IDomainAccountCallback> &callback); 54 ErrCode OnAccountBound(const DomainAccountInfo &info, const int32_t localId, 55 const std::shared_ptr<DomainAccountCallback> &callback); 56 ErrCode IsAccountTokenValid(const AccountSA::DomainAccountInfo &info, const std::vector<uint8_t> &token, 57 const std::shared_ptr<DomainAccountCallback> &callback); 58 ErrCode OnAccountUnBound(const DomainAccountInfo &info, const std::shared_ptr<DomainAccountCallback> &callback, 59 const int32_t localId); 60 bool IsPluginAvailable(); 61 void InsertTokenToMap(int32_t userId, const std::vector<uint8_t> &token); 62 bool GetTokenFromMap(int32_t userId, std::vector<uint8_t> &token); 63 void RemoveTokenFromMap(int32_t userId); 64 ErrCode GetAccountStatus(const DomainAccountInfo &info, DomainAccountStatus &status); 65 ErrCode RegisterAccountStatusListener(const sptr<IDomainAccountCallback> &listener); 66 ErrCode UnregisterAccountStatusListener(const sptr<IDomainAccountCallback> &listener); 67 void NotifyDomainAccountEvent( 68 int32_t userId, DomainAccountEvent event, DomainAccountStatus status, const DomainAccountInfo &info); 69 ErrCode GetDomainAccountInfoByUserId(int32_t userId, DomainAccountInfo &domainInfo); 70 ErrCode AddServerConfig(const std::string &paremters, DomainServerConfig &config); 71 ErrCode RemoveServerConfig(const std::string &configId); 72 ErrCode UpdateServerConfig(const std::string &configId, const std::string &paremters, DomainServerConfig &config); 73 ErrCode GetServerConfig(const std::string &configId, DomainServerConfig &config); 74 ErrCode GetAllServerConfigs(std::vector<DomainServerConfig> &configs); 75 ErrCode GetAccountServerConfig(const DomainAccountInfo &info, DomainServerConfig &config); 76 ErrCode GetAccountServerConfig(const std::string &accountName, const std::string &configId, 77 DomainServerConfig &config); 78 void LoaderLib(const std::string &path, const std::string &libName); 79 void CloseLib(); 80 ErrCode UpdateAccountInfo(const DomainAccountInfo &oldAccountInfo, const DomainAccountInfo &newAccountInfo); 81 ErrCode GetAccountPolicy(const DomainAccountInfo &info, std::string &policy); 82 ErrCode UnbindDomainAccountSync(const DomainAccountInfo &info, const int32_t localId); 83 ErrCode BindDomainAccountSync(const DomainAccountInfo &info, const int32_t localId); 84 ErrCode GetDomainAccountInfoSync(const int32_t localId, const DomainAccountInfo &info, DomainAccountInfo &fullInfo); 85 86 ErrCode CheckAndRecoverBindDomainForUncomplete(const OsAccountInfo &accountInfo); 87 88 ErrCode BindDomainAccount(const int32_t localId, 89 const DomainAccountInfo &domainInfo, const sptr<IDomainAccountCallback> &callback); 90 ErrCode CleanUnbindDomainAccount(); 91 92 ErrCode CheckOsAccountCanBindDomainAccount(const OsAccountInfo &osAccountInfo); 93 ErrCode CheckDomainAccountCanBindOsAccount(const DomainAccountInfo &domainInfo); 94 private: 95 InnerDomainAccountManager(); 96 ~InnerDomainAccountManager(); 97 DISALLOW_COPY_AND_MOVE(InnerDomainAccountManager); 98 void StartIsAccountTokenValid(const sptr<IDomainAccountPlugin> &plugin, const AccountSA::DomainAccountInfo &info, 99 const std::vector<uint8_t> &token, const sptr<IDomainAccountCallback> &callback); 100 void StartGetDomainAccountInfo(const sptr<IDomainAccountPlugin> &plugin, 101 const GetDomainAccountInfoOptions &options, const sptr<IDomainAccountCallback> &callback); 102 void StartOnAccountUnBound(const sptr<IDomainAccountPlugin> &plugin, const DomainAccountInfo &info, 103 const sptr<IDomainAccountCallback> &callback); 104 void StartOnAccountBound(const sptr<IDomainAccountPlugin> &plugin, const DomainAccountInfo &info, 105 const int32_t localId, const sptr<IDomainAccountCallback> &callback); 106 ErrCode StartGetAccessToken(const sptr<IDomainAccountPlugin> &plugin, const std::vector<uint8_t> &accountToken, 107 const DomainAccountInfo &info, const GetAccessTokenOptions &option, 108 const sptr<IDomainAccountCallback> &callback); 109 ErrCode StartHasDomainAccount(const sptr<IDomainAccountPlugin> &plugin, const GetDomainAccountInfoOptions &options, 110 const sptr<IDomainAccountCallback> &callback); 111 ErrCode StartAuth(const sptr<IDomainAccountPlugin> &plugin, const DomainAccountInfo &info, 112 const std::vector<uint8_t> &password, const sptr<IDomainAccountCallback> &callback, AuthMode authMode); 113 sptr<IRemoteObject::DeathRecipient> GetDeathRecipient(); 114 ErrCode InnerAuth(int32_t userId, const std::vector<uint8_t> &authData, 115 const sptr<IDomainAccountCallback> &callback, AuthMode authMode); 116 ErrCode CheckUserToken(const std::vector<uint8_t> &token, bool &isValid, const DomainAccountInfo &info); 117 ErrCode PluginAuth(const DomainAccountInfo &info, const std::vector<uint8_t> &password, 118 DomainAuthResult &resultParcel); 119 ErrCode PluginGetDomainAccountInfo(const GetDomainAccountInfoOptions &options, 120 DomainAccountInfo &resultParcel); 121 ErrCode PluginAuthWithPopup(const DomainAccountInfo &info, DomainAuthResult &resultParcel); 122 ErrCode PluginAuthToken(const DomainAccountInfo &info, const std::vector<uint8_t> &authData, 123 DomainAuthResult &resultParcel); 124 ErrCode PluginGetAuthStatusInfo(const DomainAccountInfo &info, AuthStatusInfo &resultParcel); 125 ErrCode PluginBindAccount(const DomainAccountInfo &info, const int32_t localId, DomainAuthResult &resultParcel); 126 ErrCode PluginUnBindAccount(const DomainAccountInfo &info, DomainAuthResult &resultParcel, const int32_t localId); 127 ErrCode PluginIsAccountTokenValid(const DomainAccountInfo &info, const std::vector<uint8_t> &token, 128 int32_t &isValid); 129 ErrCode PluginGetAccessToken(const GetAccessTokenOptions &option, 130 const std::vector<uint8_t> &token, const DomainAccountInfo &info, DomainAuthResult &resultParcel); 131 ErrCode PluginUpdateAccountInfo(const DomainAccountInfo &oldAccountInfo, 132 const DomainAccountInfo &newAccountInfo); 133 ErrCode RecoverBindDomainForUncomplete(const OsAccountInfo &osAccountInfo, const DomainAccountInfo &domainInfo); 134 ErrCode BindDomainAccountWork( 135 const int32_t localId, const DomainAccountInfo &domainInfo, const OsAccountInfo &info); 136 137 private: 138 int32_t callingUid_ = -1; 139 std::mutex mutex_; 140 std::mutex libMutex_; 141 sptr<IRemoteObject::DeathRecipient> deathRecipient_; 142 sptr<IDomainAccountPlugin> plugin_; 143 std::map<PluginMethodEnum, void*> methodMap_; 144 void* libHandle_ = nullptr; 145 std::map<int32_t, std::vector<uint8_t>> userTokenMap_; 146 }; 147 148 class CheckUserTokenCallback final : public DomainAccountCallback { 149 public: 150 void OnResult(int32_t result, Parcel &parcel) override; 151 bool GetValidity(); 152 void WaitForCallbackResult(); 153 void NotifyCallbackEnd(); 154 155 private: 156 bool isValid_ = false; 157 mutable std::mutex lock_; 158 std::condition_variable condition_; 159 bool threadInSleep_ = true; 160 }; 161 162 class InnerDomainAuthCallback final: public DomainAccountCallbackStub { 163 public: 164 InnerDomainAuthCallback(int32_t userId, const sptr<IDomainAccountCallback> &callback); 165 virtual ~InnerDomainAuthCallback(); 166 ErrCode OnResult(int32_t errCode, const DomainAccountParcel &domainAccountParcel) override; 167 168 private: 169 int32_t userId_; 170 sptr<IDomainAccountCallback> callback_; 171 }; 172 173 class UpdateAccountInfoCallback final : public DomainAccountCallback { 174 public: 175 void OnResult(int32_t result, Parcel &parcel) override; 176 int32_t GetResult(); 177 void WaitForCallbackResult(); 178 DomainAccountInfo GetAccountInfo(); 179 180 private: 181 int32_t result_ = -1; 182 mutable std::mutex lock_; 183 std::condition_variable condition_; 184 bool threadInSleep_ = true; 185 DomainAccountInfo accountInfo_; 186 }; 187 188 /** 189 * @brief call back for sync call to domain account interface, this class would ignore parcel input. 190 */ 191 class DomainAccountCallbackSync final : public DomainAccountCallback { 192 public: 193 void OnResult(int32_t result, Parcel &parcel) override; 194 int32_t GetResult(); 195 void WaitForCallbackResult(); 196 197 private: 198 int32_t result_ = -1; 199 mutable std::mutex lock_; 200 std::condition_variable condition_; 201 bool isCalled_ = false; 202 }; 203 } // namespace AccountSA 204 } // namespace OHOS 205 #endif // OS_ACCOUNT_SERVICES_DOMAIN_ACCOUNT_INCLUDE_INNER_DOMAIN_ACCOUNT_MANAGER_H 206