1 /*
2  * Copyright (c) 2023 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_INTERFACES_KITS_NAPI_DOMAIN_ACCOUNT_INCLUDE_NAPI_DOMAIN_ACCOUNT_MANAGER_H
17 #define OS_ACCOUNT_INTERFACES_KITS_NAPI_DOMAIN_ACCOUNT_INCLUDE_NAPI_DOMAIN_ACCOUNT_MANAGER_H
18 
19 #include "domain_account_callback.h"
20 #include "domain_account_common.h"
21 #include "domain_account_plugin.h"
22 #include "get_access_token_callback.h"
23 #include "napi/native_api.h"
24 #include "napi_account_common.h"
25 
26 namespace OHOS {
27 namespace AccountJsKit {
28 namespace {
29 const int32_t INVALID_PARAMETER = -1;
30 }
31 
32 struct JsDomainPlugin {
33     napi_ref auth = nullptr;
34     napi_ref authWithPopup = nullptr;
35     napi_ref authWithToken = nullptr;
36     napi_ref getAuthStatusInfo = nullptr;
37     napi_ref getDomainAccountInfo = nullptr;
38     napi_ref onAccountBound = nullptr;
39     napi_ref onAccountUnbound = nullptr;
40     napi_ref isAccountTokenValid = nullptr;
41     napi_ref getAccessToken = nullptr;
42 };
43 
44 struct HasDomainAccountAsyncContext : public CommonAsyncContext {
HasDomainAccountAsyncContextHasDomainAccountAsyncContext45     HasDomainAccountAsyncContext(napi_env napiEnv) : CommonAsyncContext(napiEnv) {};
46     AccountSA::DomainAccountInfo domainInfo;
47     bool isHasDomainAccount = false;
48 };
49 
50 struct UpdateAccountTokenAsyncContext : public CommonAsyncContext {
UpdateAccountTokenAsyncContextUpdateAccountTokenAsyncContext51     UpdateAccountTokenAsyncContext(napi_env napiEnv) : CommonAsyncContext(napiEnv) {};
52     AccountSA::DomainAccountInfo domainInfo;
53     std::vector<uint8_t> token;
54 };
55 
56 struct IsAuthenticationExpiredAsyncContext : public CommonAsyncContext {
IsAuthenticationExpiredAsyncContextIsAuthenticationExpiredAsyncContext57     IsAuthenticationExpiredAsyncContext(napi_env napiEnv) : CommonAsyncContext(napiEnv) {};
58     AccountSA::DomainAccountInfo domainInfo;
59     bool isExpired = false;
60 };
61 
62 struct GetAccessTokenAsyncContext : public CommonAsyncContext {
GetAccessTokenAsyncContextGetAccessTokenAsyncContext63     GetAccessTokenAsyncContext(napi_env napiEnv) : CommonAsyncContext(napiEnv) {};
64     AccountSA::DomainAccountInfo domainInfo;
65     AAFwk::WantParams getTokenParams;
66     std::vector<uint8_t> accessToken;
67 };
68 
69 struct GetAccountInfoAsyncContext : public CommonAsyncContext {
GetAccountInfoAsyncContextGetAccountInfoAsyncContext70     GetAccountInfoAsyncContext(napi_env napiEnv) : CommonAsyncContext(napiEnv) {};
71     AccountSA::DomainAccountInfo domainInfo;
72     AAFwk::WantParams getAccountInfoParams;
73 };
74 
75 struct UpdateAccountInfoAsyncContext : public CommonAsyncContext {
UpdateAccountInfoAsyncContextUpdateAccountInfoAsyncContext76     UpdateAccountInfoAsyncContext(napi_env napiEnv) : CommonAsyncContext(napiEnv) {};
77     AccountSA::DomainAccountInfo oldAccountInfo;
78     AccountSA::DomainAccountInfo newAccountInfo;
79 };
80 
81 struct JsDomainPluginParam : public CommonAsyncContext {
JsDomainPluginParamJsDomainPluginParam82     JsDomainPluginParam(napi_env napiEnv) : CommonAsyncContext(napiEnv) {};
83     napi_ref func = nullptr;
84     AccountSA::DomainAccountInfo domainAccountInfo;
85     std::shared_ptr<AccountSA::DomainAccountCallback> callback = nullptr;
86     AccountSA::GetAccessTokenOptions option;
87     ThreadLockInfo *lockInfo = nullptr;
88     int32_t userId = 0;
89     AccountSA::AuthMode authMode = AccountSA::AUTH_INVALID_MODE;
90     std::vector<uint8_t> authData;
91     std::string accountId = "";
92     int32_t remainingTimes = INVALID_PARAMETER;
93     int32_t freezingTime = INVALID_PARAMETER;
94     int32_t callingUid = INVALID_PARAMETER;
95 };
96 
97 class NapiDomainAccountPlugin final: public AccountSA::DomainAccountPlugin {
98 public:
99     NapiDomainAccountPlugin(napi_env env, const JsDomainPlugin &jsPlugin);
100     ~NapiDomainAccountPlugin();
101     void Auth(const AccountSA::DomainAccountInfo &info, const std::vector<uint8_t> &credential,
102         const std::shared_ptr<AccountSA::DomainAccountCallback> &callback) override;
103     void AuthWithPopup(const AccountSA::DomainAccountInfo &info,
104         const std::shared_ptr<AccountSA::DomainAccountCallback> &callback) override;
105     void AuthWithToken(const AccountSA::DomainAccountInfo &info, const std::vector<uint8_t> &token,
106         const std::shared_ptr<AccountSA::DomainAccountCallback> &callback) override;
107     void GetAuthStatusInfo(const AccountSA::DomainAccountInfo &info,
108         const std::shared_ptr<AccountSA::DomainAccountCallback> &callback) override;
109     void GetDomainAccountInfo(const AccountSA::GetDomainAccountInfoOptions &options,
110         const std::shared_ptr<AccountSA::DomainAccountCallback> &callback) override;
111     void OnAccountBound(const AccountSA::DomainAccountInfo &info, const int32_t localId,
112         const std::shared_ptr<AccountSA::DomainAccountCallback> &callback) override;
113     void OnAccountUnBound(const AccountSA::DomainAccountInfo &info,
114         const std::shared_ptr<AccountSA::DomainAccountCallback> &callback) override;
115     void IsAccountTokenValid(const AccountSA::DomainAccountInfo &info, const std::vector<uint8_t> &token,
116         const std::shared_ptr<AccountSA::DomainAccountCallback> &callback) override;
117     void GetAccessToken(const AccountSA::DomainAccountInfo &domainInfo, const std::vector<uint8_t> &accountToken,
118         const AccountSA::GetAccessTokenOptions &option,
119         const std::shared_ptr<AccountSA::DomainAccountCallback> &callback) override;
120 
121 private:
122     void AuthCommon(AccountSA::AuthMode authMode, const AccountSA::DomainAccountInfo &info,
123         const std::vector<uint8_t> &authData, const std::shared_ptr<AccountSA::DomainAccountCallback> &callback);
124 
125 private:
126     napi_env env_;
127     JsDomainPlugin jsPlugin_;
128     ThreadLockInfo lockInfo_;
129 };
130 
131 class NapiHasDomainInfoCallback final : public AccountSA::DomainAccountCallback {
132 public:
133     NapiHasDomainInfoCallback(napi_env env, napi_ref callbackRef, napi_deferred deferred);
134     void OnResult(const int32_t errCode, Parcel &parcel) override;
135 
136 private:
137     AccountJsKit::ThreadLockInfo lockInfo_;
138     napi_env env_;
139     napi_ref callbackRef_ = nullptr;
140     napi_deferred deferred_ = nullptr;
141 };
142 
143 class NapiGetAccessTokenCallback final : public AccountSA::GetAccessTokenCallback {
144 public:
145     NapiGetAccessTokenCallback(napi_env env, napi_ref callbackRef, napi_deferred deferred);
146     void OnResult(const int32_t errCode, const std::vector<uint8_t> &accessToken) override;
147 
148 private:
149     AccountJsKit::ThreadLockInfo lockInfo_;
150     napi_env env_ = nullptr;
151     napi_ref callbackRef_ = nullptr;
152     napi_deferred deferred_ = nullptr;
153 };
154 
155 class NapiGetAccountInfoCallback final : public AccountSA::DomainAccountCallback {
156 public:
157     NapiGetAccountInfoCallback(napi_env env, napi_ref callbackRef, napi_deferred deferred);
158     void OnResult(int32_t errCode, Parcel &parcel) override;
159 
160 private:
161     AccountJsKit::ThreadLockInfo lockInfo_;
162     napi_env env_ = nullptr;
163     napi_ref callbackRef_ = nullptr;
164     napi_deferred deferred_ = nullptr;
165 };
166 
167 class NapiDomainAccountManager {
168 public:
169     static napi_value Init(napi_env env, napi_value exports);
170 
171 private:
172     static napi_value JsConstructor(napi_env env, napi_callback_info cbInfo);
173     static napi_value RegisterPlugin(napi_env env, napi_callback_info cbInfo);
174     static napi_value UnregisterPlugin(napi_env env, napi_callback_info cbInfo);
175     static napi_value Auth(napi_env env, napi_callback_info cbInfo);
176     static napi_value AuthWithPopup(napi_env env, napi_callback_info cbInfo);
177     static napi_value HasAccount(napi_env env, napi_callback_info cbInfo);
178     static napi_value UpdateAccountToken(napi_env env, napi_callback_info cbInfo);
179     static napi_value IsAuthenticationExpired(napi_env env, napi_callback_info cbInfo);
180     static napi_value GetAccessToken(napi_env env, napi_callback_info cbInfo);
181     static napi_value GetDomainAccountInfo(napi_env env, napi_callback_info cbInfo);
182     static napi_value UpdateAccountInfo(napi_env env, napi_callback_info cbInfo);
183 };
184 }  // namespace AccountJsKit
185 }  // namespace OHOS
186 #endif  // OS_ACCOUNT_INTERFACES_KITS_NAPI_DOMAIN_ACCOUNT_INCLUDE_NAPI_DOMAIN_ACCOUNT_MANAGER_H