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