• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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 #include "tlssocket_module.h"
17 
18 #include <initializer_list>
19 #include <napi/native_common.h>
20 
21 #include "common_context.h"
22 #include "event_manager.h"
23 #include "module_template.h"
24 #include "monitor.h"
25 #include "napi_utils.h"
26 #include "netstack_log.h"
27 #include "tls.h"
28 #include "tls_bind_context.h"
29 #include "tls_connect_context.h"
30 #include "tls_extra_context.h"
31 #include "tls_napi_context.h"
32 #include "tls_send_context.h"
33 #include "tls_init_context.h"
34 #include "tlssocket_async_work.h"
35 #ifndef CROSS_PLATFORM
36 #include "hi_app_event_report.h"
37 #endif
38 
39 namespace OHOS {
40 namespace NetStack {
41 namespace TlsSocket {
42 namespace {
43 static constexpr const char *PROTOCOL_TLSV13 = "TLSv13";
44 static constexpr const char *PROTOCOL_TLSV12 = "TLSv12";
45 
Finalize(napi_env,void * data,void *)46 void Finalize(napi_env, void *data, void *)
47 {
48     NETSTACK_LOGI("tls socket is finalized");
49     auto sharedManager = reinterpret_cast<std::shared_ptr<EventManager> *>(data);
50     delete sharedManager;
51 }
52 } // namespace
53 
GetCertificate(napi_env env,napi_callback_info info)54 napi_value TLSSocketModuleExports::TLSSocket::GetCertificate(napi_env env, napi_callback_info info)
55 {
56     return ModuleTemplate::InterfaceWithSharedManager<GetCertificateContext>(env, info, FUNCTION_GET_CERTIFICATE,
57         nullptr, TLSSocketAsyncWork::ExecGetCertificate, TLSSocketAsyncWork::GetCertificateCallback);
58 }
59 
GetProtocol(napi_env env,napi_callback_info info)60 napi_value TLSSocketModuleExports::TLSSocket::GetProtocol(napi_env env, napi_callback_info info)
61 {
62     return ModuleTemplate::InterfaceWithSharedManager<GetCipherSuitesContext>(env, info, FUNCTION_GET_PROTOCOL,
63         nullptr, TLSSocketAsyncWork::ExecGetProtocol, TLSSocketAsyncWork::GetProtocolCallback);
64 }
65 
Connect(napi_env env,napi_callback_info info)66 napi_value TLSSocketModuleExports::TLSSocket::Connect(napi_env env, napi_callback_info info)
67 {
68     return ModuleTemplate::InterfaceWithSharedManager<TLSConnectContext>(
69         env, info, FUNCTION_CONNECT, nullptr, TLSSocketAsyncWork::ExecConnect, TLSSocketAsyncWork::ConnectCallback);
70 }
71 
GetCipherSuites(napi_env env,napi_callback_info info)72 napi_value TLSSocketModuleExports::TLSSocket::GetCipherSuites(napi_env env, napi_callback_info info)
73 {
74     return ModuleTemplate::InterfaceWithSharedManager<GetCipherSuitesContext>(env, info, FUNCTION_GET_CIPHER_SUITE,
75         nullptr, TLSSocketAsyncWork::ExecGetCipherSuites, TLSSocketAsyncWork::GetCipherSuitesCallback);
76 }
77 
GetRemoteCertificate(napi_env env,napi_callback_info info)78 napi_value TLSSocketModuleExports::TLSSocket::GetRemoteCertificate(napi_env env, napi_callback_info info)
79 {
80     return ModuleTemplate::InterfaceWithSharedManager<GetRemoteCertificateContext>(env, info,
81         FUNCTION_GET_REMOTE_CERTIFICATE, nullptr, TLSSocketAsyncWork::ExecGetRemoteCertificate,
82         TLSSocketAsyncWork::GetRemoteCertificateCallback);
83 }
84 
GetSignatureAlgorithms(napi_env env,napi_callback_info info)85 napi_value TLSSocketModuleExports::TLSSocket::GetSignatureAlgorithms(napi_env env, napi_callback_info info)
86 {
87     return ModuleTemplate::InterfaceWithSharedManager<GetSignatureAlgorithmsContext>(
88         env, info, FUNCTION_GET_SIGNATURE_ALGORITHMS, nullptr, TLSSocketAsyncWork::ExecGetSignatureAlgorithms,
89         TLSSocketAsyncWork::GetSignatureAlgorithmsCallback);
90 }
91 
Send(napi_env env,napi_callback_info info)92 napi_value TLSSocketModuleExports::TLSSocket::Send(napi_env env, napi_callback_info info)
93 {
94     return ModuleTemplate::InterfaceWithSharedManager<TLSSendContext>(env, info, FUNCTION_SEND, nullptr,
95         TLSSocketAsyncWork::ExecSend, TLSSocketAsyncWork::SendCallback);
96 }
97 
Close(napi_env env,napi_callback_info info)98 napi_value TLSSocketModuleExports::TLSSocket::Close(napi_env env, napi_callback_info info)
99 {
100     return ModuleTemplate::InterfaceWithSharedManager<TLSNapiContext>(env, info,
101         FUNCTION_CLOSE, nullptr, TLSSocketAsyncWork::ExecClose,
102         TLSSocketAsyncWork::CloseCallback);
103 }
104 
Bind(napi_env env,napi_callback_info info)105 napi_value TLSSocketModuleExports::TLSSocket::Bind(napi_env env, napi_callback_info info)
106 {
107     return ModuleTemplate::InterfaceWithSharedManager<TLSBindContext>(env, info, FUNCTION_BIND, nullptr,
108         TLSSocketAsyncWork::ExecBind, TLSSocketAsyncWork::BindCallback);
109 }
110 
GetState(napi_env env,napi_callback_info info)111 napi_value TLSSocketModuleExports::TLSSocket::GetState(napi_env env, napi_callback_info info)
112 {
113     return ModuleTemplate::InterfaceWithSharedManager<TLSGetStateContext>(
114         env, info, FUNCTION_GET_STATE, nullptr, TLSSocketAsyncWork::ExecGetState, TLSSocketAsyncWork::GetStateCallback);
115 }
116 
GetRemoteAddress(napi_env env,napi_callback_info info)117 napi_value TLSSocketModuleExports::TLSSocket::GetRemoteAddress(napi_env env, napi_callback_info info)
118 {
119     return ModuleTemplate::InterfaceWithSharedManager<TLSGetRemoteAddressContext>(env, info,
120         FUNCTION_GET_REMOTE_ADDRESS, nullptr, TLSSocketAsyncWork::ExecGetRemoteAddress,
121         TLSSocketAsyncWork::GetRemoteAddressCallback);
122 }
123 
GetLocalAddress(napi_env env,napi_callback_info info)124 napi_value TLSSocketModuleExports::TLSSocket::GetLocalAddress(napi_env env, napi_callback_info info)
125 {
126     return ModuleTemplate::InterfaceWithSharedManager<TLSGetLocalAddressContext>(env, info, FUNCTION_GET_LOCAL_ADDRESS,
127         nullptr, TLSSocketAsyncWork::ExecGetLocalAddress, TLSSocketAsyncWork::GetLocalAddressCallback);
128 }
129 
SetExtraOptions(napi_env env,napi_callback_info info)130 napi_value TLSSocketModuleExports::TLSSocket::SetExtraOptions(napi_env env, napi_callback_info info)
131 {
132     return ModuleTemplate::InterfaceWithSharedManager<TLSSetExtraOptionsContext>(env, info, FUNCTION_BIND, nullptr,
133                                                                 TLSSocketAsyncWork::ExecSetExtraOptions,
134                                                                 TLSSocketAsyncWork::SetExtraOptionsCallback);
135 }
136 
On(napi_env env,napi_callback_info info)137 napi_value TLSSocketModuleExports::TLSSocket::On(napi_env env, napi_callback_info info)
138 {
139     return DelayedSingleton<Monitor>::GetInstance()->On(env, info);
140 }
141 
Off(napi_env env,napi_callback_info info)142 napi_value TLSSocketModuleExports::TLSSocket::Off(napi_env env, napi_callback_info info)
143 {
144     return DelayedSingleton<Monitor>::GetInstance()->Off(env, info);
145 }
146 
GetSocketFd(napi_env env,napi_callback_info info)147 napi_value TLSSocketModuleExports::TLSSocket::GetSocketFd(napi_env env, napi_callback_info info)
148 {
149     return ModuleTemplate::InterfaceWithSharedManager<TLSGetSocketFdContext>(env, info, FUNCTION_GET_SOCKET_FD, nullptr,
150                                                             TLSSocketAsyncWork::ExecGetSocketFd,
151                                                             TLSSocketAsyncWork::GetSocketFdCallback);
152 }
153 
DefineTLSSocketClass(napi_env env,napi_value exports)154 void TLSSocketModuleExports::DefineTLSSocketClass(napi_env env, napi_value exports)
155 {
156     std::initializer_list<napi_property_descriptor> functions = {
157         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_CERTIFICATE, TLSSocket::GetCertificate),
158         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_REMOTE_CERTIFICATE, TLSSocket::GetRemoteCertificate),
159         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_SIGNATURE_ALGORITHMS, TLSSocket::GetSignatureAlgorithms),
160         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_PROTOCOL, TLSSocket::GetProtocol),
161         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_CONNECT, TLSSocket::Connect),
162         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_CIPHER_SUITE, TLSSocket::GetCipherSuites),
163         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_SEND, TLSSocket::Send),
164         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_CLOSE, TLSSocket::Close),
165         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_BIND, TLSSocket::Bind),
166         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_STATE, TLSSocket::GetState),
167         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_REMOTE_ADDRESS, TLSSocket::GetRemoteAddress),
168         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_LOCAL_ADDRESS, TLSSocket::GetLocalAddress),
169         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_SET_EXTRA_OPTIONS, TLSSocket::SetExtraOptions),
170         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_ON, TLSSocket::On),
171         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_OFF, TLSSocket::Off),
172         DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_SOCKET_FD, TLSSocket::GetSocketFd),
173     };
174     ModuleTemplate::DefineClass(env, exports, functions, INTERFACE_TLS_SOCKET);
175 }
176 
InitProtocol(napi_env env,napi_value exports)177 void TLSSocketModuleExports::InitProtocol(napi_env env, napi_value exports)
178 {
179     std::initializer_list<napi_property_descriptor> properties = {
180         DECLARE_NAPI_STATIC_PROPERTY(PROTOCOL_TLSV12, NapiUtils::CreateStringUtf8(env, PROTOCOL_TLS_V12)),
181         DECLARE_NAPI_STATIC_PROPERTY(PROTOCOL_TLSV13, NapiUtils::CreateStringUtf8(env, PROTOCOL_TLS_V13)),
182     };
183 
184     napi_value protocol = NapiUtils::CreateObject(env);
185     NapiUtils::DefineProperties(env, protocol, properties);
186     NapiUtils::SetNamedProperty(env, exports, INTERFACE_PROTOCOL, protocol);
187 }
188 
ConstructTLSSocketInstance(napi_env env,napi_callback_info info)189 napi_value TLSSocketModuleExports::ConstructTLSSocketInstance(napi_env env, napi_callback_info info)
190 {
191     #ifndef CROSS_PLATFORM
192     HiAppEventReport hiAppEventReport("NetworkKit", "TLSSocketConstructTLSSocketInstance");
193     #endif
194     napi_value result = ModuleTemplate::NewInstanceWithSharedManager(env, info, INTERFACE_TLS_SOCKET, Finalize);
195     if (result == nullptr) {
196         return nullptr;
197     }
198 
199     size_t paramsCount = MAX_PARAM_NUM;
200     napi_value params[MAX_PARAM_NUM] = {nullptr};
201     NAPI_CALL(env, napi_get_cb_info(env, info, &paramsCount, params, nullptr, nullptr));
202     if (paramsCount == 0) {
203         return result;
204     }
205 
206     std::shared_ptr<EventManager> *sharedManager = nullptr;
207     auto napiRet = napi_unwrap(env, result, reinterpret_cast<void **>(&sharedManager));
208     if (napiRet != napi_ok) {
209         NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet);
210         return nullptr;
211     }
212     std::shared_ptr<EventManager> manager = nullptr;
213     if (sharedManager != nullptr && *sharedManager != nullptr) {
214         manager = *sharedManager;
215     }
216 
217     auto context = new TLSInitContext(env, manager);
218     if (context == nullptr) {
219         NETSTACK_LOGE("new TLSInitContext failed, no enough memory");
220         return nullptr;
221     }
222 
223     context->ParseParams(params, paramsCount);
224     if (context->IsParseOK()) {
225         TLSSocketAsyncWork::ExecInit(env, (void *)context);
226     }
227 
228     if (context->IsNeedThrowException()) { // only api9 or later need throw exception.
229         napi_throw_error(env, std::to_string(context->GetErrorCode()).c_str(), context->GetErrorMessage().c_str());
230         delete context;
231         return nullptr;
232     }
233 
234     delete context;
235     #ifndef CROSS_PLATFORM
236     hiAppEventReport.ReportSdkEvent(RESULT_SUCCESS, ERR_NONE);
237     #endif
238     return result;
239 }
240 
InitTLSSocketProperties(napi_env env,napi_value exports)241 void TLSSocketModuleExports::InitTLSSocketProperties(napi_env env, napi_value exports)
242 {
243     std::initializer_list<napi_property_descriptor> properties = {
244         DECLARE_NAPI_FUNCTION(FUNCTION_CONSTRUCTOR_TLS_SOCKET_INSTANCE, ConstructTLSSocketInstance),
245     };
246     NapiUtils::DefineProperties(env, exports, properties);
247 }
248 
InitTLSSocketModule(napi_env env,napi_value exports)249 napi_value TLSSocketModuleExports::InitTLSSocketModule(napi_env env, napi_value exports)
250 {
251     DefineTLSSocketClass(env, exports);
252     InitTLSSocketProperties(env, exports);
253     InitProtocol(env, exports);
254     return exports;
255 }
256 } // namespace TlsSocket
257 } // namespace NetStack
258 } // namespace OHOS
259