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