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