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.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_send_context.h"
33 #include "tls_init_context.h"
34 #include "tlssocket_async_work.h"
35 #ifndef CROSS_PLATFORM
36 #include "hi_app_event_report.h"
37 #endif
38
39 namespace OHOS {
40 namespace NetStack {
41 namespace TlsSocket {
42 namespace {
43 static constexpr const char *PROTOCOL_TLSV13 = "TLSv13";
44 static constexpr const char *PROTOCOL_TLSV12 = "TLSv12";
45
Finalize(napi_env,void * data,void *)46 void Finalize(napi_env, void *data, void *)
47 {
48 NETSTACK_LOGI("tls socket is finalized");
49 auto sharedManager = reinterpret_cast<std::shared_ptr<EventManager> *>(data);
50 delete sharedManager;
51 }
52 } // namespace
53
GetCertificate(napi_env env,napi_callback_info info)54 napi_value TLSSocketModuleExports::TLSSocket::GetCertificate(napi_env env, napi_callback_info info)
55 {
56 return ModuleTemplate::InterfaceWithSharedManager<GetCertificateContext>(env, info, FUNCTION_GET_CERTIFICATE,
57 nullptr, TLSSocketAsyncWork::ExecGetCertificate, TLSSocketAsyncWork::GetCertificateCallback);
58 }
59
GetProtocol(napi_env env,napi_callback_info info)60 napi_value TLSSocketModuleExports::TLSSocket::GetProtocol(napi_env env, napi_callback_info info)
61 {
62 return ModuleTemplate::InterfaceWithSharedManager<GetCipherSuitesContext>(env, info, FUNCTION_GET_PROTOCOL,
63 nullptr, TLSSocketAsyncWork::ExecGetProtocol, TLSSocketAsyncWork::GetProtocolCallback);
64 }
65
Connect(napi_env env,napi_callback_info info)66 napi_value TLSSocketModuleExports::TLSSocket::Connect(napi_env env, napi_callback_info info)
67 {
68 return ModuleTemplate::InterfaceWithSharedManager<TLSConnectContext>(
69 env, info, FUNCTION_CONNECT, nullptr, TLSSocketAsyncWork::ExecConnect, TLSSocketAsyncWork::ConnectCallback);
70 }
71
GetCipherSuites(napi_env env,napi_callback_info info)72 napi_value TLSSocketModuleExports::TLSSocket::GetCipherSuites(napi_env env, napi_callback_info info)
73 {
74 return ModuleTemplate::InterfaceWithSharedManager<GetCipherSuitesContext>(env, info, FUNCTION_GET_CIPHER_SUITE,
75 nullptr, TLSSocketAsyncWork::ExecGetCipherSuites, TLSSocketAsyncWork::GetCipherSuitesCallback);
76 }
77
GetRemoteCertificate(napi_env env,napi_callback_info info)78 napi_value TLSSocketModuleExports::TLSSocket::GetRemoteCertificate(napi_env env, napi_callback_info info)
79 {
80 return ModuleTemplate::InterfaceWithSharedManager<GetRemoteCertificateContext>(env, info,
81 FUNCTION_GET_REMOTE_CERTIFICATE, nullptr, TLSSocketAsyncWork::ExecGetRemoteCertificate,
82 TLSSocketAsyncWork::GetRemoteCertificateCallback);
83 }
84
GetSignatureAlgorithms(napi_env env,napi_callback_info info)85 napi_value TLSSocketModuleExports::TLSSocket::GetSignatureAlgorithms(napi_env env, napi_callback_info info)
86 {
87 return ModuleTemplate::InterfaceWithSharedManager<GetSignatureAlgorithmsContext>(
88 env, info, FUNCTION_GET_SIGNATURE_ALGORITHMS, nullptr, TLSSocketAsyncWork::ExecGetSignatureAlgorithms,
89 TLSSocketAsyncWork::GetSignatureAlgorithmsCallback);
90 }
91
Send(napi_env env,napi_callback_info info)92 napi_value TLSSocketModuleExports::TLSSocket::Send(napi_env env, napi_callback_info info)
93 {
94 return ModuleTemplate::InterfaceWithSharedManager<TLSSendContext>(env, info, FUNCTION_SEND, nullptr,
95 TLSSocketAsyncWork::ExecSend, TLSSocketAsyncWork::SendCallback);
96 }
97
Close(napi_env env,napi_callback_info info)98 napi_value TLSSocketModuleExports::TLSSocket::Close(napi_env env, napi_callback_info info)
99 {
100 return ModuleTemplate::InterfaceWithSharedManager<TLSNapiContext>(env, info,
101 FUNCTION_CLOSE, nullptr, TLSSocketAsyncWork::ExecClose,
102 TLSSocketAsyncWork::CloseCallback);
103 }
104
Bind(napi_env env,napi_callback_info info)105 napi_value TLSSocketModuleExports::TLSSocket::Bind(napi_env env, napi_callback_info info)
106 {
107 return ModuleTemplate::InterfaceWithSharedManager<TLSBindContext>(env, info, FUNCTION_BIND, nullptr,
108 TLSSocketAsyncWork::ExecBind, TLSSocketAsyncWork::BindCallback);
109 }
110
GetState(napi_env env,napi_callback_info info)111 napi_value TLSSocketModuleExports::TLSSocket::GetState(napi_env env, napi_callback_info info)
112 {
113 return ModuleTemplate::InterfaceWithSharedManager<TLSGetStateContext>(
114 env, info, FUNCTION_GET_STATE, nullptr, TLSSocketAsyncWork::ExecGetState, TLSSocketAsyncWork::GetStateCallback);
115 }
116
GetRemoteAddress(napi_env env,napi_callback_info info)117 napi_value TLSSocketModuleExports::TLSSocket::GetRemoteAddress(napi_env env, napi_callback_info info)
118 {
119 return ModuleTemplate::InterfaceWithSharedManager<TLSGetRemoteAddressContext>(env, info,
120 FUNCTION_GET_REMOTE_ADDRESS, nullptr, TLSSocketAsyncWork::ExecGetRemoteAddress,
121 TLSSocketAsyncWork::GetRemoteAddressCallback);
122 }
123
GetLocalAddress(napi_env env,napi_callback_info info)124 napi_value TLSSocketModuleExports::TLSSocket::GetLocalAddress(napi_env env, napi_callback_info info)
125 {
126 return ModuleTemplate::InterfaceWithSharedManager<TLSGetLocalAddressContext>(env, info, FUNCTION_GET_LOCAL_ADDRESS,
127 nullptr, TLSSocketAsyncWork::ExecGetLocalAddress, TLSSocketAsyncWork::GetLocalAddressCallback);
128 }
129
SetExtraOptions(napi_env env,napi_callback_info info)130 napi_value TLSSocketModuleExports::TLSSocket::SetExtraOptions(napi_env env, napi_callback_info info)
131 {
132 return ModuleTemplate::InterfaceWithSharedManager<TLSSetExtraOptionsContext>(env, info, FUNCTION_BIND, nullptr,
133 TLSSocketAsyncWork::ExecSetExtraOptions,
134 TLSSocketAsyncWork::SetExtraOptionsCallback);
135 }
136
On(napi_env env,napi_callback_info info)137 napi_value TLSSocketModuleExports::TLSSocket::On(napi_env env, napi_callback_info info)
138 {
139 return DelayedSingleton<Monitor>::GetInstance()->On(env, info);
140 }
141
Off(napi_env env,napi_callback_info info)142 napi_value TLSSocketModuleExports::TLSSocket::Off(napi_env env, napi_callback_info info)
143 {
144 return DelayedSingleton<Monitor>::GetInstance()->Off(env, info);
145 }
146
GetSocketFd(napi_env env,napi_callback_info info)147 napi_value TLSSocketModuleExports::TLSSocket::GetSocketFd(napi_env env, napi_callback_info info)
148 {
149 return ModuleTemplate::InterfaceWithSharedManager<TLSGetSocketFdContext>(env, info, FUNCTION_GET_SOCKET_FD, nullptr,
150 TLSSocketAsyncWork::ExecGetSocketFd,
151 TLSSocketAsyncWork::GetSocketFdCallback);
152 }
153
DefineTLSSocketClass(napi_env env,napi_value exports)154 void TLSSocketModuleExports::DefineTLSSocketClass(napi_env env, napi_value exports)
155 {
156 std::initializer_list<napi_property_descriptor> functions = {
157 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_CERTIFICATE, TLSSocket::GetCertificate),
158 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_REMOTE_CERTIFICATE, TLSSocket::GetRemoteCertificate),
159 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_SIGNATURE_ALGORITHMS, TLSSocket::GetSignatureAlgorithms),
160 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_PROTOCOL, TLSSocket::GetProtocol),
161 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_CONNECT, TLSSocket::Connect),
162 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_CIPHER_SUITE, TLSSocket::GetCipherSuites),
163 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_SEND, TLSSocket::Send),
164 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_CLOSE, TLSSocket::Close),
165 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_BIND, TLSSocket::Bind),
166 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_STATE, TLSSocket::GetState),
167 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_REMOTE_ADDRESS, TLSSocket::GetRemoteAddress),
168 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_LOCAL_ADDRESS, TLSSocket::GetLocalAddress),
169 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_SET_EXTRA_OPTIONS, TLSSocket::SetExtraOptions),
170 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_ON, TLSSocket::On),
171 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_OFF, TLSSocket::Off),
172 DECLARE_NAPI_FUNCTION(TLSSocket::FUNCTION_GET_SOCKET_FD, TLSSocket::GetSocketFd),
173 };
174 ModuleTemplate::DefineClass(env, exports, functions, INTERFACE_TLS_SOCKET);
175 }
176
InitProtocol(napi_env env,napi_value exports)177 void TLSSocketModuleExports::InitProtocol(napi_env env, napi_value exports)
178 {
179 std::initializer_list<napi_property_descriptor> properties = {
180 DECLARE_NAPI_STATIC_PROPERTY(PROTOCOL_TLSV12, NapiUtils::CreateStringUtf8(env, PROTOCOL_TLS_V12)),
181 DECLARE_NAPI_STATIC_PROPERTY(PROTOCOL_TLSV13, NapiUtils::CreateStringUtf8(env, PROTOCOL_TLS_V13)),
182 };
183
184 napi_value protocol = NapiUtils::CreateObject(env);
185 NapiUtils::DefineProperties(env, protocol, properties);
186 NapiUtils::SetNamedProperty(env, exports, INTERFACE_PROTOCOL, protocol);
187 }
188
ConstructTLSSocketInstance(napi_env env,napi_callback_info info)189 napi_value TLSSocketModuleExports::ConstructTLSSocketInstance(napi_env env, napi_callback_info info)
190 {
191 #ifndef CROSS_PLATFORM
192 HiAppEventReport hiAppEventReport("NetworkKit", "TLSSocketConstructTLSSocketInstance");
193 #endif
194 napi_value result = ModuleTemplate::NewInstanceWithSharedManager(env, info, INTERFACE_TLS_SOCKET, Finalize);
195 if (result == nullptr) {
196 return nullptr;
197 }
198
199 size_t paramsCount = MAX_PARAM_NUM;
200 napi_value params[MAX_PARAM_NUM] = {nullptr};
201 NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, nullptr, nullptr));
202 if (paramsCount == 0) {
203 return result;
204 }
205
206 std::shared_ptr<EventManager> *sharedManager = nullptr;
207 auto napiRet = napi_unwrap(env, result, reinterpret_cast<void **>(&sharedManager));
208 if (napiRet != napi_ok) {
209 NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet);
210 return nullptr;
211 }
212 std::shared_ptr<EventManager> manager = nullptr;
213 if (sharedManager != nullptr && *sharedManager != nullptr) {
214 manager = *sharedManager;
215 }
216
217 auto context = new TLSInitContext(env, manager);
218 if (context == nullptr) {
219 NETSTACK_LOGE("new TLSInitContext failed, no enough memory");
220 return nullptr;
221 }
222
223 context->ParseParams(params, paramsCount);
224 if (context->IsParseOK()) {
225 TLSSocketAsyncWork::ExecInit(env, (void *)context);
226 }
227
228 if (context->IsNeedThrowException()) { // only api9 or later need throw exception.
229 napi_throw_error(env, std::to_string(context->GetErrorCode()).c_str(), context->GetErrorMessage().c_str());
230 delete context;
231 return nullptr;
232 }
233
234 delete context;
235 #ifndef CROSS_PLATFORM
236 hiAppEventReport.ReportSdkEvent(RESULT_SUCCESS, ERR_NONE);
237 #endif
238 return result;
239 }
240
InitTLSSocketProperties(napi_env env,napi_value exports)241 void TLSSocketModuleExports::InitTLSSocketProperties(napi_env env, napi_value exports)
242 {
243 std::initializer_list<napi_property_descriptor> properties = {
244 DECLARE_NAPI_FUNCTION(FUNCTION_CONSTRUCTOR_TLS_SOCKET_INSTANCE, ConstructTLSSocketInstance),
245 };
246 NapiUtils::DefineProperties(env, exports, properties);
247 }
248
InitTLSSocketModule(napi_env env,napi_value exports)249 napi_value TLSSocketModuleExports::InitTLSSocketModule(napi_env env, napi_value exports)
250 {
251 DefineTLSSocketClass(env, exports);
252 InitTLSSocketProperties(env, exports);
253 InitProtocol(env, exports);
254 return exports;
255 }
256 } // namespace TlsSocket
257 } // namespace NetStack
258 } // namespace OHOS
259