• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "tlssocketserver_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_server.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_server_close_context.h"
33 #include "tls_server_napi_context.h"
34 #include "tls_server_send_context.h"
35 #include "tlssocketserver_async_work.h"
36 
37 namespace OHOS {
38 namespace NetStack {
39 namespace TlsSocketServer {
40 namespace {
41 static constexpr const char *PROTOCOL_TLSV13 = "TLSv13";
42 static constexpr const char *PROTOCOL_TLSV12 = "TLSv12";
43 
Finalize(napi_env,void * data,void *)44 void Finalize(napi_env, void *data, void *)
45 {
46     NETSTACK_LOGI("tls socket server is finalized");
47     auto sharedManager = reinterpret_cast<std::shared_ptr<EventManager> *>(data);
48     delete sharedManager;
49 }
50 } // namespace
51 
GetCertificate(napi_env env,napi_callback_info info)52 napi_value TLSSocketServerModuleExports::TLSSocketServer::GetCertificate(napi_env env, napi_callback_info info)
53 {
54     return ModuleTemplate::InterfaceWithSharedManager<TlsSocket::GetCertificateContext>(
55         env, info, FUNCTION_GET_CERTIFICATE, nullptr, TLSSocketServerAsyncWork::ExecGetCertificate,
56         TLSSocketServerAsyncWork::GetCertificateCallback);
57 }
58 
GetProtocol(napi_env env,napi_callback_info info)59 napi_value TLSSocketServerModuleExports::TLSSocketServer::GetProtocol(napi_env env, napi_callback_info info)
60 {
61     return ModuleTemplate::InterfaceWithSharedManager<TlsSocket::GetProtocolContext>(env, info, FUNCTION_GET_PROTOCOL,
62         nullptr, TLSSocketServerAsyncWork::ExecGetProtocol, TLSSocketServerAsyncWork::GetProtocolCallback);
63 }
64 
Listen(napi_env env,napi_callback_info info)65 napi_value TLSSocketServerModuleExports::TLSSocketServer::Listen(napi_env env, napi_callback_info info)
66 {
67     return ModuleTemplate::InterfaceWithSharedManager<TlsSocket::TLSListenContext>(env, info, FUNCTION_LISTEN, nullptr,
68                                                                   TLSSocketServerAsyncWork::ExecListen,
69                                                                   TLSSocketServerAsyncWork::ListenCallback);
70 }
71 
Send(napi_env env,napi_callback_info info)72 napi_value TLSSocketServerModuleExports::TLSSocketConnection::Send(napi_env env, napi_callback_info info)
73 {
74     return ModuleTemplate::InterfaceWithSharedManager<TLSServerSendContext>(
75         env, info, FUNCTION_SEND,
76         [](napi_env theEnv, napi_value thisVal, TLSServerSendContext *context) -> bool {
77             context->clientId_ = NapiUtils::GetInt32Property(theEnv, thisVal, PROPERTY_CLIENT_ID);
78             return true;
79         },
80         TLSSocketServerAsyncWork::ExecSend, TLSSocketServerAsyncWork::SendCallback);
81 }
82 
Close(napi_env env,napi_callback_info info)83 napi_value TLSSocketServerModuleExports::TLSSocketConnection::Close(napi_env env, napi_callback_info info)
84 {
85     return ModuleTemplate::InterfaceWithSharedManager<TLSServerCloseContext>(
86         env, info, FUNCTION_CLOSE,
87         [](napi_env theEnv, napi_value thisVal, TLSServerCloseContext *context) -> bool {
88             context->clientId_ = NapiUtils::GetInt32Property(theEnv, thisVal, PROPERTY_CLIENT_ID);
89             return true;
90         },
91         TLSSocketServerAsyncWork::ExecClose, TLSSocketServerAsyncWork::CloseCallback);
92 }
93 
GetRemoteAddress(napi_env env,napi_callback_info info)94 napi_value TLSSocketServerModuleExports::TLSSocketConnection::GetRemoteAddress(napi_env env, napi_callback_info info)
95 {
96     return ModuleTemplate::InterfaceWithSharedManager<ServerTLSGetRemoteAddressContext>(
97         env, info, FUNCTION_GET_REMOTE_ADDRESS,
98         [](napi_env theEnv, napi_value thisVal, ServerTLSGetRemoteAddressContext *context) -> bool {
99             context->clientId_ = NapiUtils::GetInt32Property(theEnv, thisVal, PROPERTY_CLIENT_ID);
100             return true;
101         },
102         TLSSocketServerAsyncWork::ExecGetRemoteAddress, TLSSocketServerAsyncWork::GetRemoteAddressCallback);
103 }
104 
GetLocalAddress(napi_env env,napi_callback_info info)105 napi_value TLSSocketServerModuleExports::TLSSocketConnection::GetLocalAddress(napi_env env, napi_callback_info info)
106 {
107     return ModuleTemplate::InterfaceWithSharedManager<TLSServerGetLocalAddressContext>(
108         env, info, FUNCTION_GET_LOCAL_ADDRESS,
109         [](napi_env theEnv, napi_value thisVal, TLSServerGetLocalAddressContext *context) -> bool {
110             context->clientId_ = NapiUtils::GetInt32Property(theEnv, thisVal, PROPERTY_CLIENT_ID);
111             return true;
112         },
113         TLSSocketServerAsyncWork::ExecConnectionGetLocalAddress,
114             TLSSocketServerAsyncWork::GetConnectionLocalAddressCallback);
115 }
116 
GetRemoteCertificate(napi_env env,napi_callback_info info)117 napi_value TLSSocketServerModuleExports::TLSSocketConnection::GetRemoteCertificate(napi_env env,
118                                                                                    napi_callback_info info)
119 {
120     return ModuleTemplate::InterfaceWithSharedManager<ServerGetRemoteCertificateContext>(
121         env, info, FUNCTION_GET_REMOTE_CERTIFICATE,
122         [](napi_env theEnv, napi_value thisVal, ServerGetRemoteCertificateContext *context) -> bool {
123             context->clientId_ = NapiUtils::GetInt32Property(theEnv, thisVal, PROPERTY_CLIENT_ID);
124             return true;
125         },
126         TLSSocketServerAsyncWork::ExecGetRemoteCertificate, TLSSocketServerAsyncWork::GetRemoteCertificateCallback);
127 }
128 
GetCipherSuites(napi_env env,napi_callback_info info)129 napi_value TLSSocketServerModuleExports::TLSSocketConnection::GetCipherSuites(napi_env env, napi_callback_info info)
130 {
131     return ModuleTemplate::InterfaceWithSharedManager<ServerGetCipherSuitesContext>(
132         env, info, FUNCTION_GET_CIPHER_SUITE,
133         [](napi_env theEnv, napi_value thisVal, ServerGetCipherSuitesContext *context) -> bool {
134             context->clientId_ = NapiUtils::GetInt32Property(theEnv, thisVal, PROPERTY_CLIENT_ID);
135             return true;
136         },
137         TLSSocketServerAsyncWork::ExecGetCipherSuites, TLSSocketServerAsyncWork::GetCipherSuitesCallback);
138 }
139 
GetSignatureAlgorithms(napi_env env,napi_callback_info info)140 napi_value TLSSocketServerModuleExports::TLSSocketConnection::GetSignatureAlgorithms(napi_env env,
141                                                                                      napi_callback_info info)
142 {
143     return ModuleTemplate::InterfaceWithSharedManager<ServerGetSignatureAlgorithmsContext>(
144         env, info, FUNCTION_GET_SIGNATURE_ALGORITHMS,
145         [](napi_env theEnv, napi_value thisVal, ServerGetSignatureAlgorithmsContext *context) -> bool {
146             context->clientId_ = NapiUtils::GetInt32Property(theEnv, thisVal, PROPERTY_CLIENT_ID);
147             return true;
148         },
149         TLSSocketServerAsyncWork::ExecGetSignatureAlgorithms, TLSSocketServerAsyncWork::GetSignatureAlgorithmsCallback);
150 }
151 
On(napi_env env,napi_callback_info info)152 napi_value TLSSocketServerModuleExports::TLSSocketConnection::On(napi_env env, napi_callback_info info)
153 {
154     return DelayedSingleton<MonitorServer>::GetInstance()->ConnectionOn(env, info);
155 }
156 
Off(napi_env env,napi_callback_info info)157 napi_value TLSSocketServerModuleExports::TLSSocketConnection::Off(napi_env env, napi_callback_info info)
158 {
159     return DelayedSingleton<MonitorServer>::GetInstance()->ConnectionOff(env, info);
160 }
161 
GetCertificate(napi_env env,napi_callback_info info)162 napi_value TLSSocketServerModuleExports::TLSSocketConnection::GetCertificate(napi_env env, napi_callback_info info)
163 {
164     return ModuleTemplate::InterfaceWithSharedManager<TlsSocket::GetCertificateContext>(
165         env, info, FUNCTION_GET_CERTIFICATE, nullptr, TLSSocketServerAsyncWork::ExecGetCertificate,
166         TLSSocketServerAsyncWork::GetCertificateCallback);
167 }
168 
GetState(napi_env env,napi_callback_info info)169 napi_value TLSSocketServerModuleExports::TLSSocketServer::GetState(napi_env env, napi_callback_info info)
170 {
171     return ModuleTemplate::InterfaceWithSharedManager<TlsSocket::TLSGetStateContext>(env, info, FUNCTION_GET_STATE,
172         nullptr, TLSSocketServerAsyncWork::ExecGetState, TLSSocketServerAsyncWork::GetStateCallback);
173 }
174 
GetLocalAddress(napi_env env,napi_callback_info info)175 napi_value TLSSocketServerModuleExports::TLSSocketServer::GetLocalAddress(napi_env env, napi_callback_info info)
176 {
177     return ModuleTemplate::InterfaceWithSharedManager<TLSServerGetLocalAddressContext>(
178         env, info, FUNCTION_GET_LOCAL_ADDRESS, nullptr, TLSSocketServerAsyncWork::ExecGetLocalAddress,
179         TLSSocketServerAsyncWork::GetLocalAddressCallback);
180 }
181 
SetExtraOptions(napi_env env,napi_callback_info info)182 napi_value TLSSocketServerModuleExports::TLSSocketServer::SetExtraOptions(napi_env env, napi_callback_info info)
183 {
184     return ModuleTemplate::InterfaceWithSharedManager<TlsSocket::TLSSetExtraOptionsContext>(
185         env, info, FUNCTION_SET_EXTRA_OPTIONS, nullptr, TLSSocketServerAsyncWork::ExecSetExtraOptions,
186         TLSSocketServerAsyncWork::SetExtraOptionsCallback);
187 }
188 
On(napi_env env,napi_callback_info info)189 napi_value TLSSocketServerModuleExports::TLSSocketServer::On(napi_env env, napi_callback_info info)
190 {
191     return DelayedSingleton<MonitorServer>::GetInstance()->On(env, info);
192 }
193 
Off(napi_env env,napi_callback_info info)194 napi_value TLSSocketServerModuleExports::TLSSocketServer::Off(napi_env env, napi_callback_info info)
195 {
196     return DelayedSingleton<MonitorServer>::GetInstance()->Off(env, info);
197 }
198 
DefineTLSSocketServerClass(napi_env env,napi_value exports)199 void TLSSocketServerModuleExports::DefineTLSSocketServerClass(napi_env env, napi_value exports)
200 {
201     std::initializer_list<napi_property_descriptor> functions = {
202         DECLARE_NAPI_FUNCTION(TLSSocketServer::FUNCTION_LISTEN, TLSSocketServer::Listen),
203         DECLARE_NAPI_FUNCTION(TLSSocketServer::FUNCTION_GET_STATE, TLSSocketServer::GetState),
204         DECLARE_NAPI_FUNCTION(TLSSocketServer::FUNCTION_GET_LOCAL_ADDRESS, TLSSocketServer::GetLocalAddress),
205         DECLARE_NAPI_FUNCTION(TLSSocketServer::FUNCTION_SET_EXTRA_OPTIONS, TLSSocketServer::SetExtraOptions),
206         DECLARE_NAPI_FUNCTION(TLSSocketServer::FUNCTION_ON, TLSSocketServer::On),
207         DECLARE_NAPI_FUNCTION(TLSSocketServer::FUNCTION_OFF, TLSSocketServer::Off),
208         DECLARE_NAPI_FUNCTION(TLSSocketServer::FUNCTION_GET_CERTIFICATE, TLSSocketServer::GetCertificate),
209         DECLARE_NAPI_FUNCTION(TLSSocketServer::FUNCTION_GET_PROTOCOL, TLSSocketServer::GetProtocol),
210     };
211     ModuleTemplate::DefineClass(env, exports, functions, INTERFACE_TLS_SOCKET_SERVER);
212 }
213 
InitProtocol(napi_env env,napi_value exports)214 void TLSSocketServerModuleExports::InitProtocol(napi_env env, napi_value exports)
215 {
216     std::initializer_list<napi_property_descriptor> properties = {
217         DECLARE_NAPI_STATIC_PROPERTY(PROTOCOL_TLSV12, NapiUtils::CreateStringUtf8(env, TlsSocket::PROTOCOL_TLS_V12)),
218         DECLARE_NAPI_STATIC_PROPERTY(PROTOCOL_TLSV13, NapiUtils::CreateStringUtf8(env, TlsSocket::PROTOCOL_TLS_V13)),
219     };
220 
221     napi_value protocol = NapiUtils::CreateObject(env);
222     NapiUtils::DefineProperties(env, protocol, properties);
223     NapiUtils::SetNamedProperty(env, exports, INTERFACE_PROTOCOL, protocol);
224 }
225 
DefineTLSSocketConnectionClass(napi_env env,napi_value exports)226 void TlsSocketServer::TLSSocketServerModuleExports::DefineTLSSocketConnectionClass(napi_env env, napi_value exports)
227 {
228     std::initializer_list<napi_property_descriptor> functions = {
229         DECLARE_NAPI_FUNCTION(TLSSocketConnection::FUNCTION_GET_CERTIFICATE, TLSSocketConnection::GetCertificate),
230         DECLARE_NAPI_FUNCTION(TLSSocketConnection::FUNCTION_GET_REMOTE_CERTIFICATE,
231                               TLSSocketConnection::GetRemoteCertificate),
232         DECLARE_NAPI_FUNCTION(TLSSocketConnection::FUNCTION_GET_SIGNATURE_ALGORITHMS,
233                               TLSSocketConnection::GetSignatureAlgorithms),
234         DECLARE_NAPI_FUNCTION(TLSSocketConnection::FUNCTION_GET_CIPHER_SUITE, TLSSocketConnection::GetCipherSuites),
235         DECLARE_NAPI_FUNCTION(TLSSocketConnection::FUNCTION_SEND, TLSSocketConnection::Send),
236         DECLARE_NAPI_FUNCTION(TLSSocketConnection::FUNCTION_CLOSE, TLSSocketConnection::Close),
237         DECLARE_NAPI_FUNCTION(TLSSocketConnection::FUNCTION_GET_REMOTE_ADDRESS, TLSSocketConnection::GetRemoteAddress),
238         DECLARE_NAPI_FUNCTION(TLSSocketConnection::FUNCTION_GET_LOCAL_ADDRESS, TLSSocketConnection::GetLocalAddress),
239         DECLARE_NAPI_FUNCTION(TLSSocketConnection::FUNCTION_ON, TLSSocketConnection::On),
240         DECLARE_NAPI_FUNCTION(TLSSocketConnection::FUNCTION_OFF, TLSSocketConnection::Off),
241     };
242     ModuleTemplate::DefineClass(env, exports, functions, INTERFACE_TLS_SOCKET_SERVER_CONNECTION);
243 }
244 
ConstructTLSSocketServerInstance(napi_env env,napi_callback_info info)245 napi_value TLSSocketServerModuleExports::ConstructTLSSocketServerInstance(napi_env env, napi_callback_info info)
246 {
247     return ModuleTemplate::NewInstanceWithSharedManager(env, info, INTERFACE_TLS_SOCKET_SERVER, Finalize);
248 }
249 
InitTLSSocketServerProperties(napi_env env,napi_value exports)250 void TLSSocketServerModuleExports::InitTLSSocketServerProperties(napi_env env, napi_value exports)
251 {
252     std::initializer_list<napi_property_descriptor> properties = {
253         DECLARE_NAPI_FUNCTION(FUNCTION_CONSTRUCTOR_TLS_SOCKET_SERVER_INSTANCE, ConstructTLSSocketServerInstance),
254     };
255     NapiUtils::DefineProperties(env, exports, properties);
256 }
257 
InitTLSSocketServerModule(napi_env env,napi_value exports)258 napi_value TLSSocketServerModuleExports::InitTLSSocketServerModule(napi_env env, napi_value exports)
259 {
260     DefineTLSSocketServerClass(env, exports);
261     DefineTLSSocketConnectionClass(env, exports);
262     InitTLSSocketServerProperties(env, exports);
263     InitProtocol(env, exports);
264     return exports;
265 }
266 
267 } // namespace TlsSocketServer
268 } // namespace NetStack
269 } // namespace OHOS
270