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