1 /*
2 * Copyright (c) 2021-2022 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 "tlssocket_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.h"
25 #include "napi_utils.h"
26 #include "netstack_log.h"
27 #include "tls_send_context.h"
28 #include "tls_bind_context.h"
29 #include "tls_extra_context.h"
30 #include "tls.h"
31 #include "tls_napi_context.h"
32 #include "tls_connect_context.h"
33 #include "tlssocket_async_work.h"
34
35 namespace OHOS {
36 namespace NetStack {
37 namespace {
38 static constexpr const char *PROTOCOL_TLSV13 = "TLSv13";
39 static constexpr const char *PROTOCOL_TLSV12 = "TLSv12";
40
Finalize(napi_env,void * data,void *)41 void Finalize(napi_env, void *data, void *)
42 {
43 auto manager = reinterpret_cast<EventManager *>(data);
44 if (manager != nullptr) {
45 manager->SetInvalid();
46 }
47 }
48 } // namespace
49
GetCertificate(napi_env env,napi_callback_info info)50 napi_value TLSSocketModuleExports::TLSSocket::GetCertificate(napi_env env, napi_callback_info info)
51 {
52 return ModuleTemplate::Interface<GetCertificateContext>(env, info, FUNCTION_GET_CERTIFICATE, nullptr,
53 TLSSocketAsyncWork::ExecGetCertificate,
54 TLSSocketAsyncWork::GetCertificateCallback);
55 }
56
GetProtocol(napi_env env,napi_callback_info info)57 napi_value TLSSocketModuleExports::TLSSocket::GetProtocol(napi_env env, napi_callback_info info)
58 {
59 return ModuleTemplate::Interface<GetCipherSuitesContext>(env, info, FUNCTION_GET_PROTOCOL, nullptr,
60 TLSSocketAsyncWork::ExecGetProtocol,
61 TLSSocketAsyncWork::GetProtocolCallback);
62 }
63
Connect(napi_env env,napi_callback_info info)64 napi_value TLSSocketModuleExports::TLSSocket::Connect(napi_env env, napi_callback_info info)
65 {
66 return ModuleTemplate::Interface<TLSConnectContext>(
67 env, info, FUNCTION_CONNECT, nullptr, TLSSocketAsyncWork::ExecConnect, TLSSocketAsyncWork::ConnectCallback);
68 }
69
GetCipherSuites(napi_env env,napi_callback_info info)70 napi_value TLSSocketModuleExports::TLSSocket::GetCipherSuites(napi_env env, napi_callback_info info)
71 {
72 return ModuleTemplate::Interface<GetCipherSuitesContext>(env, info, FUNCTION_GET_CIPHER_SUITE, nullptr,
73 TLSSocketAsyncWork::ExecGetCipherSuites,
74 TLSSocketAsyncWork::GetCipherSuitesCallback);
75 }
76
GetRemoteCertificate(napi_env env,napi_callback_info info)77 napi_value TLSSocketModuleExports::TLSSocket::GetRemoteCertificate(napi_env env, napi_callback_info info)
78 {
79 return ModuleTemplate::Interface<GetRemoteCertificateContext>(env, info, FUNCTION_GET_REMOTE_CERTIFICATE, nullptr,
80 TLSSocketAsyncWork::ExecGetRemoteCertificate,
81 TLSSocketAsyncWork::GetRemoteCertificateCallback);
82 }
83
GetSignatureAlgorithms(napi_env env,napi_callback_info info)84 napi_value TLSSocketModuleExports::TLSSocket::GetSignatureAlgorithms(napi_env env, napi_callback_info info)
85 {
86 return ModuleTemplate::Interface<GetSignatureAlgorithmsContext>(
87 env, info, FUNCTION_GET_SIGNATURE_ALGORITHMS, nullptr, TLSSocketAsyncWork::ExecGetSignatureAlgorithms,
88 TLSSocketAsyncWork::GetSignatureAlgorithmsCallback);
89 }
90
Send(napi_env env,napi_callback_info info)91 napi_value TLSSocketModuleExports::TLSSocket::Send(napi_env env, napi_callback_info info)
92 {
93 return ModuleTemplate::Interface<TLSSendContext>(env, info, FUNCTION_SEND, nullptr, TLSSocketAsyncWork::ExecSend,
94 TLSSocketAsyncWork::SendCallback);
95 }
96
Close(napi_env env,napi_callback_info info)97 napi_value TLSSocketModuleExports::TLSSocket::Close(napi_env env, napi_callback_info info)
98 {
99 return ModuleTemplate::Interface<TLSNapiContext>(env, info, FUNCTION_CLOSE, nullptr, TLSSocketAsyncWork::ExecClose,
100 TLSSocketAsyncWork::CloseCallback);
101 }
102
Bind(napi_env env,napi_callback_info info)103 napi_value TLSSocketModuleExports::TLSSocket::Bind(napi_env env, napi_callback_info info)
104 {
105 return ModuleTemplate::Interface<TLSBindContext>(env, info, FUNCTION_BIND, nullptr, TLSSocketAsyncWork::ExecBind,
106 TLSSocketAsyncWork::BindCallback);
107 }
108
GetState(napi_env env,napi_callback_info info)109 napi_value TLSSocketModuleExports::TLSSocket::GetState(napi_env env, napi_callback_info info)
110 {
111 return ModuleTemplate::Interface<TLSGetStateContext>(
112 env, info, FUNCTION_GET_STATE, nullptr, TLSSocketAsyncWork::ExecGetState, TLSSocketAsyncWork::GetStateCallback);
113 }
114
GetRemoteAddress(napi_env env,napi_callback_info info)115 napi_value TLSSocketModuleExports::TLSSocket::GetRemoteAddress(napi_env env, napi_callback_info info)
116 {
117 return ModuleTemplate::Interface<TLSGetRemoteAddressContext>(env, info, FUNCTION_GET_REMOTE_ADDRESS, nullptr,
118 TLSSocketAsyncWork::ExecGetRemoteAddress,
119 TLSSocketAsyncWork::GetRemoteAddressCallback);
120 }
121
SetExtraOptions(napi_env env,napi_callback_info info)122 napi_value TLSSocketModuleExports::TLSSocket::SetExtraOptions(napi_env env, napi_callback_info info)
123 {
124 return ModuleTemplate::Interface<TLSSetExtraOptionsContext>(env, info, FUNCTION_BIND, nullptr,
125 TLSSocketAsyncWork::ExecSetExtraOptions,
126 TLSSocketAsyncWork::SetExtraOptionsCallback);
127 }
128
On(napi_env env,napi_callback_info info)129 napi_value TLSSocketModuleExports::TLSSocket::On(napi_env env, napi_callback_info info)
130 {
131 return DelayedSingleton<Monitor>::GetInstance()->On(env, info);
132 }
133
Off(napi_env env,napi_callback_info info)134 napi_value TLSSocketModuleExports::TLSSocket::Off(napi_env env, napi_callback_info info)
135 {
136 return DelayedSingleton<Monitor>::GetInstance()->Off(env, info);
137 }
138
DefineTLSSocketClass(napi_env env,napi_value exports)139 void TLSSocketModuleExports::DefineTLSSocketClass(napi_env env, napi_value exports)
140 {
141 std::initializer_list<napi_property_descriptor> functions = {
142 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_CERTIFICATE, TLSSocket::GetCertificate),
143 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_REMOTE_CERTIFICATE, TLSSocket::GetRemoteCertificate),
144 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_SIGNATURE_ALGORITHMS, TLSSocket::GetSignatureAlgorithms),
145 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_PROTOCOL, TLSSocket::GetProtocol),
146 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_CONNECT, TLSSocket::Connect),
147 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_CIPHER_SUITE, TLSSocket::GetCipherSuites),
148 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_SEND, TLSSocket::Send),
149 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_CLOSE, TLSSocket::Close),
150 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_BIND, TLSSocket::Bind),
151 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_STATE, TLSSocket::GetState),
152 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_REMOTE_ADDRESS, TLSSocket::GetRemoteAddress),
153 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_SET_EXTRA_OPTIONS, TLSSocket::SetExtraOptions),
154 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_ON, TLSSocket::On),
155 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_OFF, TLSSocket::Off),
156 };
157 ModuleTemplate::DefineClass(env, exports, functions, INTERFACE_TLS_SOCKET);
158 }
159
InitProtocol(napi_env env,napi_value exports)160 void TLSSocketModuleExports::InitProtocol(napi_env env, napi_value exports)
161 {
162 std::initializer_list<napi_property_descriptor> properties = {
163 DECLARE_NAPI_STATIC_PROPERTY(PROTOCOL_TLSV12, NapiUtils::CreateStringUtf8(env, PROTOCOL_TLS_V12)),
164 DECLARE_NAPI_STATIC_PROPERTY(PROTOCOL_TLSV13, NapiUtils::CreateStringUtf8(env, PROTOCOL_TLS_V13)),
165 };
166
167 napi_value protocol = NapiUtils::CreateObject(env);
168 NapiUtils::DefineProperties(env, protocol, properties);
169 NapiUtils::SetNamedProperty(env, exports, INTERFACE_PROTOCOL, protocol);
170 }
171
ConstructTLSSocketInstance(napi_env env,napi_callback_info info)172 napi_value TLSSocketModuleExports::ConstructTLSSocketInstance(napi_env env, napi_callback_info info)
173 {
174 return ModuleTemplate::NewInstance(env, info, INTERFACE_TLS_SOCKET, Finalize);
175 }
176
InitTLSSocketProperties(napi_env env,napi_value exports)177 void TLSSocketModuleExports::InitTLSSocketProperties(napi_env env, napi_value exports)
178 {
179 std::initializer_list<napi_property_descriptor> properties = {
180 DECLARE_NAPI_FUNCTION(FUNCTION_CONSTRUCTOR_TLS_SOCKET_INSTANCE, ConstructTLSSocketInstance),
181 };
182 NapiUtils::DefineProperties(env, exports, properties);
183 }
184
InitTLSSocketModule(napi_env env,napi_value exports)185 napi_value TLSSocketModuleExports::InitTLSSocketModule(napi_env env, napi_value exports)
186 {
187 DefineTLSSocketClass(env, exports);
188 InitTLSSocketProperties(env, exports);
189 InitProtocol(env, exports);
190 return exports;
191 }
192 } // namespace NetStack
193 } // namespace OHOS
194