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_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 bool IsPluginAvailable(); 60 void InsertTokenToMap(int32_t userId, const std::vector<uint8_t> &token); 61 bool GetTokenFromMap(int32_t userId, std::vector<uint8_t> &token); 62 void RemoveTokenFromMap(int32_t userId); 63 ErrCode GetAccountStatus(const DomainAccountInfo &info, DomainAccountStatus &status); 64 ErrCode RegisterAccountStatusListener(const sptr<IDomainAccountCallback> &listener); 65 ErrCode UnregisterAccountStatusListener(const sptr<IDomainAccountCallback> &listener); 66 void NotifyDomainAccountEvent( 67 int32_t userId, DomainAccountEvent event, DomainAccountStatus status, const DomainAccountInfo &info); 68 ErrCode GetDomainAccountInfoByUserId(int32_t userId, DomainAccountInfo &domainInfo); 69 ErrCode AddServerConfig(const std::string &paremters, DomainServerConfig &config); 70 ErrCode RemoveServerConfig(const std::string &configId); 71 ErrCode UpdateServerConfig(const std::string &configId, const std::string &paremters, DomainServerConfig &config); 72 ErrCode GetServerConfig(const std::string &configId, DomainServerConfig &config); 73 ErrCode GetAllServerConfigs(std::vector<DomainServerConfig> &configs); 74 ErrCode GetAccountServerConfig(const DomainAccountInfo &info, DomainServerConfig &config); 75 void LoaderLib(const std::string &path, const std::string &libName); 76 void CloseLib(); 77 ErrCode UpdateAccountInfo(const DomainAccountInfo &oldAccountInfo, const DomainAccountInfo &newAccountInfo); 78 ErrCode GetAccountPolicy(const DomainAccountInfo &info, std::string &policy); 79 80 private: 81 InnerDomainAccountManager(); 82 ~InnerDomainAccountManager(); 83 DISALLOW_COPY_AND_MOVE(InnerDomainAccountManager); 84 void StartIsAccountTokenValid(const sptr<IDomainAccountPlugin> &plugin, const AccountSA::DomainAccountInfo &info, 85 const std::vector<uint8_t> &token, const sptr<IDomainAccountCallback> &callback); 86 void StartGetDomainAccountInfo(const sptr<IDomainAccountPlugin> &plugin, 87 const GetDomainAccountInfoOptions &options, const sptr<IDomainAccountCallback> &callback); 88 void StartOnAccountUnBound(const sptr<IDomainAccountPlugin> &plugin, const DomainAccountInfo &info, 89 const sptr<IDomainAccountCallback> &callback); 90 void StartOnAccountBound(const sptr<IDomainAccountPlugin> &plugin, const DomainAccountInfo &info, 91 const int32_t localId, const sptr<IDomainAccountCallback> &callback); 92 ErrCode StartGetAccessToken(const sptr<IDomainAccountPlugin> &plugin, const std::vector<uint8_t> &accountToken, 93 const DomainAccountInfo &info, const GetAccessTokenOptions &option, 94 const sptr<IDomainAccountCallback> &callback); 95 ErrCode StartHasDomainAccount(const sptr<IDomainAccountPlugin> &plugin, const GetDomainAccountInfoOptions &options, 96 const sptr<IDomainAccountCallback> &callback); 97 ErrCode StartAuth(const sptr<IDomainAccountPlugin> &plugin, const DomainAccountInfo &info, 98 const std::vector<uint8_t> &password, const sptr<IDomainAccountCallback> &callback, AuthMode authMode); 99 sptr<IRemoteObject::DeathRecipient> GetDeathRecipient(); 100 ErrCode InnerAuth(int32_t userId, const std::vector<uint8_t> &authData, 101 const sptr<IDomainAccountCallback> &callback, AuthMode authMode); 102 ErrCode CheckUserToken(const std::vector<uint8_t> &token, bool &isValid, const DomainAccountInfo &info); 103 ErrCode PluginAuth(const DomainAccountInfo &info, const std::vector<uint8_t> &password, 104 DomainAuthResult &resultParcel); 105 ErrCode PluginGetDomainAccountInfo(const GetDomainAccountInfoOptions &options, 106 DomainAccountInfo &resultParcel); 107 ErrCode PluginAuthWithPopup(const DomainAccountInfo &info, DomainAuthResult &resultParcel); 108 ErrCode PluginAuthToken(const DomainAccountInfo &info, const std::vector<uint8_t> &authData, 109 DomainAuthResult &resultParcel); 110 ErrCode PluginGetAuthStatusInfo(const DomainAccountInfo &info, AuthStatusInfo &resultParcel); 111 ErrCode PluginBindAccount(const DomainAccountInfo &info, const int32_t localId, DomainAuthResult &resultParcel); 112 ErrCode PluginUnBindAccount(const DomainAccountInfo &info, DomainAuthResult &resultParcel); 113 ErrCode PluginIsAccountTokenValid(const DomainAccountInfo &info, const std::vector<uint8_t> &token, 114 int32_t &isValid); 115 ErrCode PluginGetAccessToken(const GetAccessTokenOptions &option, 116 const std::vector<uint8_t> &token, const DomainAccountInfo &info, DomainAuthResult &resultParcel); 117 ErrCode PluginUpdateAccountInfo(const DomainAccountInfo &oldAccountInfo, 118 const DomainAccountInfo &newAccountInfo); 119 120 private: 121 int32_t callingUid_ = -1; 122 std::mutex mutex_; 123 std::mutex libMutex_; 124 sptr<IRemoteObject::DeathRecipient> deathRecipient_; 125 sptr<IDomainAccountPlugin> plugin_; 126 std::map<PluginMethodEnum, void*> methodMap_; 127 void* libHandle_ = nullptr; 128 std::map<int32_t, std::vector<uint8_t>> userTokenMap_; 129 }; 130 131 class CheckUserTokenCallback final : public DomainAccountCallback { 132 public: 133 void OnResult(int32_t result, Parcel &parcel) override; 134 bool GetValidity(); 135 void WaitForCallbackResult(); 136 void NotifyCallbackEnd(); 137 138 private: 139 bool isValid_ = false; 140 mutable std::mutex lock_; 141 std::condition_variable condition_; 142 bool threadInSleep_ = true; 143 }; 144 145 class InnerDomainAuthCallback final: public DomainAccountCallbackStub { 146 public: 147 InnerDomainAuthCallback(int32_t userId, const sptr<IDomainAccountCallback> &callback); 148 virtual ~InnerDomainAuthCallback(); 149 void OnResult(const int32_t errCode, Parcel &parcel) override; 150 151 private: 152 int32_t userId_; 153 sptr<IDomainAccountCallback> callback_; 154 }; 155 156 class UpdateAccountInfoCallback final : public DomainAccountCallback { 157 public: 158 void OnResult(int32_t result, Parcel &parcel) override; 159 int32_t GetResult(); 160 void WaitForCallbackResult(); 161 DomainAccountInfo GetAccountInfo(); 162 163 private: 164 int32_t result_ = -1; 165 mutable std::mutex lock_; 166 std::condition_variable condition_; 167 bool threadInSleep_ = true; 168 DomainAccountInfo accountInfo_; 169 }; 170 } // namespace AccountSA 171 } // namespace OHOS 172 #endif // OS_ACCOUNT_SERVICES_DOMAIN_ACCOUNT_INCLUDE_INNER_DOMAIN_ACCOUNT_MANAGER_H 173