• 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     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