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