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