• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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