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_exec.h"
17
18 #include <string>
19 #include <vector>
20
21 #include <napi/native_api.h>
22 #include <securec.h>
23
24 #include "context_key.h"
25 #include "event_list.h"
26 #include "napi_utils.h"
27 #include "netstack_common_utils.h"
28 #include "netstack_log.h"
29 #include "socket_error.h"
30 #include "tls_socket_server.h"
31
32 namespace OHOS {
33 namespace NetStack {
34 namespace TlsSocketServer {
35 namespace {
36 constexpr const char *CERTIFICATA_DATA = "data";
37 constexpr const char *CERTIFICATA_ENCODING_FORMAT = "encodingFormat";
38 constexpr const int SYSTEM_INTERNAL_ERROR_CODE = 2300002;
39 const std::string SYSTEM_INTERNAL_ERROR_MESSAGE = "system internal error";
40 } // namespace
ExecGetCertificate(TlsSocket::GetCertificateContext * context)41 bool TLSSocketServerExec::ExecGetCertificate(TlsSocket::GetCertificateContext *context)
42 {
43 auto manager = context->GetSharedManager();
44 if (manager == nullptr) {
45 NETSTACK_LOGE("manager is nullptr");
46 return false;
47 }
48 std::shared_lock<std::shared_mutex> lock(manager->GetDataMutex());
49 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
50 if (tlsSocketServer == nullptr) {
51 NETSTACK_LOGE("ExecGetCertificate tlsSocketServer is null");
52 context->SetError(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND,
53 TlsSocket::MakeErrorMessage(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND));
54 return false;
55 }
56 tlsSocketServer->GetCertificate([&context](int32_t errorNumber, const TlsSocket::X509CertRawData &cert) {
57 context->localCert_ = cert;
58 context->errorNumber_ = errorNumber;
59 if (errorNumber != TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS) {
60 context->SetError(errorNumber, TlsSocket::MakeErrorMessage(errorNumber));
61 }
62 });
63 return context->errorNumber_ == TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS;
64 }
65
ExecListen(TlsSocket::TLSListenContext * context)66 bool TLSSocketServerExec::ExecListen(TlsSocket::TLSListenContext *context)
67 {
68 auto manager = context->GetSharedManager();
69 if (manager == nullptr) {
70 NETSTACK_LOGE("manager is nullptr");
71 return false;
72 }
73 std::unique_lock<std::shared_mutex> lock(manager->GetDataMutex());
74 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
75 if (tlsSocketServer == nullptr) {
76 tlsSocketServer = new TLSSocketServer();
77 }
78 if (manager->GetData() == nullptr) {
79 manager->SetData(tlsSocketServer);
80 }
81 lock.unlock();
82 tlsSocketServer->Listen(context->connectOptions_, [&context](int32_t errorNumber) {
83 context->errorNumber_ = errorNumber;
84 if (errorNumber != TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS) {
85 context->SetError(errorNumber, TlsSocket::MakeErrorMessage(errorNumber));
86 }
87 });
88 return context->errorNumber_ == TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS;
89 }
90
ExecGetCipherSuites(ServerGetCipherSuitesContext * context)91 bool TLSSocketServerExec::ExecGetCipherSuites(ServerGetCipherSuitesContext *context)
92 {
93 auto manager = context->GetSharedManager();
94 if (manager == nullptr) {
95 NETSTACK_LOGE("manager is nullptr");
96 return false;
97 }
98 std::shared_lock<std::shared_mutex> lock(manager->GetDataMutex());
99 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
100 if (tlsSocketServer == nullptr) {
101 NETSTACK_LOGE("ExecGetCipherSuites tlsSocketServer is null");
102 context->SetError(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND,
103 MakeErrorMessage(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND));
104 return false;
105 }
106 tlsSocketServer->GetCipherSuite(context->clientId_,
107 [&context](int32_t errorNumber, const std::vector<std::string> &suite) {
108 context->cipherSuites_ = suite;
109 context->errorNumber_ = errorNumber;
110 if (errorNumber != TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS) {
111 context->SetError(errorNumber, TlsSocket::MakeErrorMessage(errorNumber));
112 }
113 });
114 return context->errorNumber_ == TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS;
115 }
116
ExecGetRemoteCertificate(ServerGetRemoteCertificateContext * context)117 bool TLSSocketServerExec::ExecGetRemoteCertificate(ServerGetRemoteCertificateContext *context)
118 {
119 auto manager = context->GetSharedManager();
120 if (manager == nullptr) {
121 NETSTACK_LOGE("manager is nullptr");
122 return false;
123 }
124 std::shared_lock<std::shared_mutex> lock(manager->GetDataMutex());
125 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
126 if (tlsSocketServer == nullptr) {
127 NETSTACK_LOGE("ExecGetRemoteCertificate tlsSocketServer is null");
128 context->SetError(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND,
129 TlsSocket::MakeErrorMessage(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND));
130 return false;
131 }
132 tlsSocketServer->GetRemoteCertificate(
133 context->clientId_, [&context](int32_t errorNumber, const TlsSocket::X509CertRawData &cert) {
134 context->remoteCert_ = cert;
135 context->errorNumber_ = errorNumber;
136 if (errorNumber != TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS) {
137 context->SetError(errorNumber, TlsSocket::MakeErrorMessage(errorNumber));
138 }
139 });
140 return context->errorNumber_ == TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS;
141 }
142
ExecGetProtocol(TlsSocket::GetProtocolContext * context)143 bool TLSSocketServerExec::ExecGetProtocol(TlsSocket::GetProtocolContext *context)
144 {
145 auto manager = context->GetSharedManager();
146 if (manager == nullptr) {
147 NETSTACK_LOGE("manager is nullptr");
148 return false;
149 }
150 std::shared_lock<std::shared_mutex> lock(manager->GetDataMutex());
151 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
152 if (tlsSocketServer == nullptr) {
153 NETSTACK_LOGE("ExecGetProtocol tlsSocketServer is null");
154 context->SetError(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND,
155 TlsSocket::MakeErrorMessage(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND));
156 return false;
157 }
158 tlsSocketServer->GetProtocol([&context](int32_t errorNumber, const std::string &protocol) {
159 context->protocol_ = protocol;
160 context->errorNumber_ = errorNumber;
161 if (errorNumber != TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS) {
162 context->SetError(errorNumber, TlsSocket::MakeErrorMessage(errorNumber));
163 }
164 });
165 return context->errorNumber_ == TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS;
166 }
167
ExecGetSignatureAlgorithms(ServerGetSignatureAlgorithmsContext * context)168 bool TLSSocketServerExec::ExecGetSignatureAlgorithms(ServerGetSignatureAlgorithmsContext *context)
169 {
170 auto manager = context->GetSharedManager();
171 if (manager == nullptr) {
172 NETSTACK_LOGE("manager is nullptr");
173 return false;
174 }
175 std::shared_lock<std::shared_mutex> lock(manager->GetDataMutex());
176 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
177 if (tlsSocketServer == nullptr) {
178 NETSTACK_LOGE("ExecGetSignatureAlgorithms tlsSocketServer is null");
179 context->SetError(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND,
180 TlsSocket::MakeErrorMessage(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND));
181 return false;
182 }
183 tlsSocketServer->GetSignatureAlgorithms(
184 context->clientId_, [&context](int32_t errorNumber, const std::vector<std::string> &algorithms) {
185 context->signatureAlgorithms_ = algorithms;
186 context->errorNumber_ = errorNumber;
187 if (errorNumber != TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS) {
188 context->SetError(errorNumber, TlsSocket::MakeErrorMessage(errorNumber));
189 }
190 });
191 return context->errorNumber_ == TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS;
192 }
193
ExecSend(TLSServerSendContext * context)194 bool TLSSocketServerExec::ExecSend(TLSServerSendContext *context)
195 {
196 auto manager = context->GetSharedManager();
197 if (manager == nullptr) {
198 NETSTACK_LOGE("manager is nullptr");
199 return false;
200 }
201 std::shared_lock<std::shared_mutex> lock(manager->GetDataMutex());
202 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
203 if (tlsSocketServer == nullptr) {
204 NETSTACK_LOGE("ExecSend tlsSocketServer is null");
205 context->SetError(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND,
206 TlsSocket::MakeErrorMessage(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND));
207 return false;
208 }
209 TLSServerSendOptions tcpSendOptions;
210 int client_id = context->clientId_;
211 tcpSendOptions.SetSocket(client_id);
212 tcpSendOptions.SetSendData(context->m_sendData);
213 tlsSocketServer->Send(tcpSendOptions, [&context](int32_t errorNumber) {
214 context->errorNumber_ = errorNumber;
215 if (errorNumber != TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS) {
216 context->SetError(errorNumber, TlsSocket::MakeErrorMessage(errorNumber));
217 }
218 });
219 return context->errorNumber_ == TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS;
220 }
221
ExecClose(TLSServerCloseContext * context)222 bool TLSSocketServerExec::ExecClose(TLSServerCloseContext *context)
223 {
224 auto manager = context->GetSharedManager();
225 if (manager == nullptr) {
226 NETSTACK_LOGE("manager is nullptr");
227 return false;
228 }
229 std::shared_lock<std::shared_mutex> lock(manager->GetDataMutex());
230 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
231 if (tlsSocketServer == nullptr) {
232 NETSTACK_LOGE("ExecClose tlsSocketServer is null");
233 context->SetError(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND,
234 TlsSocket::MakeErrorMessage(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND));
235 return false;
236 }
237 tlsSocketServer->Close(context->clientId_, [&context](int32_t errorNumber) {
238 context->errorNumber_ = errorNumber;
239 if (errorNumber != TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS) {
240 context->SetError(errorNumber, TlsSocket::MakeErrorMessage(errorNumber));
241 }
242 });
243 return context->errorNumber_ == TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS;
244 }
245
ExecStop(TlsSocket::TLSNapiContext * context)246 bool TLSSocketServerExec::ExecStop(TlsSocket::TLSNapiContext *context)
247 {
248 auto manager = context->GetSharedManager();
249 if (manager == nullptr) {
250 NETSTACK_LOGE("manager is nullptr");
251 return false;
252 }
253 if (!CommonUtils::HasInternetPermission()) {
254 context->SetError(PERMISSION_DENIED_CODE,
255 TlsSocket::MakeErrorMessage(PERMISSION_DENIED_CODE));
256 return false;
257 }
258 std::unique_lock<std::shared_mutex> lock(manager->GetDataMutex());
259 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
260 if (tlsSocketServer == nullptr) {
261 NETSTACK_LOGE("ExecClose tlsSocketServer is null");
262 context->SetError(TlsSocket::TlsSocketError::SYSTEM_INTERNAL_ERROR,
263 TlsSocket::MakeErrorMessage(TlsSocket::TlsSocketError::SYSTEM_INTERNAL_ERROR));
264 return false;
265 }
266 tlsSocketServer->Stop([&context](int32_t errorNumber) {
267 context->errorNumber_ = errorNumber;
268 if (errorNumber != TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS) {
269 context->SetError(errorNumber, TlsSocket::MakeErrorMessage(errorNumber));
270 }
271 });
272 return context->errorNumber_ == TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS;
273 }
274
ExecGetRemoteAddress(ServerTLSGetRemoteAddressContext * context)275 bool TLSSocketServerExec::ExecGetRemoteAddress(ServerTLSGetRemoteAddressContext *context)
276 {
277 auto manager = context->GetSharedManager();
278 if (manager == nullptr) {
279 NETSTACK_LOGE("manager is nullptr");
280 return false;
281 }
282 std::shared_lock<std::shared_mutex> lock(manager->GetDataMutex());
283 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
284 if (tlsSocketServer == nullptr) {
285 NETSTACK_LOGE("ExecGetRemoteAddress tlsSocketServer is null");
286 context->SetError(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND,
287 TlsSocket::MakeErrorMessage(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND));
288 return false;
289 }
290 tlsSocketServer->GetRemoteAddress(context->clientId_,
291 [&context](int32_t errorNumber, const Socket::NetAddress address) {
292 context->address_ = address;
293 context->errorNumber_ = errorNumber;
294 if (errorNumber != TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS) {
295 context->SetError(errorNumber, TlsSocket::MakeErrorMessage(errorNumber));
296 }
297 });
298 return context->errorNumber_ == TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS;
299 }
300
ExecGetLocalAddress(TLSServerGetLocalAddressContext * context)301 bool TLSSocketServerExec::ExecGetLocalAddress(TLSServerGetLocalAddressContext *context)
302 {
303 if (context == nullptr) {
304 NETSTACK_LOGE("context is nullptr");
305 return false;
306 }
307 auto manager = context->GetSharedManager();
308 if (manager == nullptr) {
309 NETSTACK_LOGE("manager is nullptr");
310 context->SetNeedThrowException(true);
311 context->SetError(SYSTEM_INTERNAL_ERROR_CODE, SYSTEM_INTERNAL_ERROR_MESSAGE);
312 return false;
313 }
314 std::shared_lock<std::shared_mutex> lock(manager->GetDataMutex());
315 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
316 if (tlsSocketServer == nullptr) {
317 NETSTACK_LOGE("ExecGetRemoteAddress tlsSocketServer is null");
318 context->SetError(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND,
319 TlsSocket::MakeErrorMessage(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND));
320 return false;
321 }
322 struct sockaddr_storage addr{};
323 socklen_t addrLen = sizeof(addr);
324 if (getsockname(tlsSocketServer->GetListenSocketFd(), (struct sockaddr *)&addr, &addrLen) < 0) {
325 context->SetErrorCode(errno);
326 return false;
327 }
328
329 char ipStr[INET6_ADDRSTRLEN] = {0};
330 Socket::NetAddress localAddress;
331 if (addr.ss_family == AF_INET) {
332 auto *addr_in = (struct sockaddr_in *)&addr;
333 inet_ntop(AF_INET, &addr_in->sin_addr, ipStr, sizeof(ipStr));
334 localAddress.SetFamilyBySaFamily(AF_INET);
335 localAddress.SetRawAddress(ipStr);
336 localAddress.SetPort(ntohs(addr_in->sin_port));
337 tlsSocketServer->SetLocalAddress(localAddress);
338 } else if (addr.ss_family == AF_INET6) {
339 auto *addr_in6 = (struct sockaddr_in6 *)&addr;
340 inet_ntop(AF_INET6, &addr_in6->sin6_addr, ipStr, sizeof(ipStr));
341 localAddress.SetFamilyBySaFamily(AF_INET6);
342 localAddress.SetRawAddress(ipStr);
343 localAddress.SetPort(ntohs(addr_in6->sin6_port));
344 tlsSocketServer->SetLocalAddress(localAddress);
345 }
346 return true;
347 }
348
ExecConnectionGetLocalAddress(TLSConnectionGetLocalAddressContext * context)349 bool TLSSocketServerExec::ExecConnectionGetLocalAddress(TLSConnectionGetLocalAddressContext *context)
350 {
351 if (context == nullptr) {
352 NETSTACK_LOGE("context is nullptr");
353 return false;
354 }
355 auto manager = context->GetSharedManager();
356 if (manager == nullptr) {
357 NETSTACK_LOGE("manager is nullptr");
358 context->SetNeedThrowException(true);
359 context->SetError(SYSTEM_INTERNAL_ERROR_CODE, SYSTEM_INTERNAL_ERROR_MESSAGE);
360 return false;
361 }
362 std::shared_lock<std::shared_mutex> lock(manager->GetDataMutex());
363 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
364 if (tlsSocketServer == nullptr) {
365 NETSTACK_LOGE("ExecGetRemoteAddress tlsSocketServer is null");
366 context->SetError(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND,
367 TlsSocket::MakeErrorMessage(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND));
368 return false;
369 }
370 tlsSocketServer->GetLocalAddress(context->clientId_,
371 [&context](int32_t errorNumber, const Socket::NetAddress address) {
372 context->localAddress_ = address;
373 context->errorNumber_ = errorNumber;
374 if (errorNumber != TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS) {
375 context->SetError(errorNumber, TlsSocket::MakeErrorMessage(errorNumber));
376 }
377 });
378 return context->errorNumber_ == TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS;
379 }
380
ExecGetState(TlsSocket::TLSGetStateContext * context)381 bool TLSSocketServerExec::ExecGetState(TlsSocket::TLSGetStateContext *context)
382 {
383 auto manager = context->GetSharedManager();
384 if (manager == nullptr) {
385 NETSTACK_LOGE("manager is nullptr");
386 context->state_.SetIsClose(true);
387 return true;
388 }
389 std::shared_lock<std::shared_mutex> lock(manager->GetDataMutex());
390 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
391 if (tlsSocketServer == nullptr) {
392 NETSTACK_LOGE("ExecGetState tlsSocketServer is null");
393 return true;
394 }
395 tlsSocketServer->GetState([&context](int32_t errorNumber, const Socket::SocketStateBase state) {
396 context->state_ = state;
397 context->errorNumber_ = errorNumber;
398 if (errorNumber != TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS) {
399 context->SetError(errorNumber, TlsSocket::MakeErrorMessage(errorNumber));
400 }
401 });
402 return context->errorNumber_ == TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS;
403 }
404
ExecSetExtraOptions(TlsSocket::TLSSetExtraOptionsContext * context)405 bool TLSSocketServerExec::ExecSetExtraOptions(TlsSocket::TLSSetExtraOptionsContext *context)
406 {
407 auto manager = context->GetSharedManager();
408 if (manager == nullptr) {
409 NETSTACK_LOGE("manager is nullptr");
410 return false;
411 }
412 std::shared_lock<std::shared_mutex> lock(manager->GetDataMutex());
413 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
414 if (tlsSocketServer == nullptr) {
415 NETSTACK_LOGE("ExecSetExtraOptions tlsSocketServer is null");
416 context->SetError(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND,
417 TlsSocket::MakeErrorMessage(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND));
418 return false;
419 }
420 tlsSocketServer->SetExtraOptions(context->options_, [&context](int32_t errorNumber) {
421 context->errorNumber_ = errorNumber;
422 if (errorNumber != TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS) {
423 context->SetError(errorNumber, TlsSocket::MakeErrorMessage(errorNumber));
424 }
425 });
426 return context->errorNumber_ == TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS;
427 }
428
GetCertificateCallback(TlsSocket::GetCertificateContext * context)429 napi_value TLSSocketServerExec::GetCertificateCallback(TlsSocket::GetCertificateContext *context)
430 {
431 void *data = nullptr;
432 napi_value arrayBuffer = NapiUtils::CreateArrayBuffer(context->GetEnv(), context->localCert_.data.Length(), &data);
433 if (data != nullptr && arrayBuffer != nullptr) {
434 if (memcpy_s(data, context->localCert_.data.Length(),
435 reinterpret_cast<const uint8_t *>(context->localCert_.data.Data()),
436 context->localCert_.data.Length()) != EOK) {
437 NETSTACK_LOGE("memcpy_s failed!");
438 return NapiUtils::GetUndefined(context->GetEnv());
439 }
440 }
441 napi_value outData = nullptr;
442 napi_create_typedarray(context->GetEnv(), napi_uint8_array, context->localCert_.data.Length(), arrayBuffer, 0,
443 &outData);
444 napi_value obj = NapiUtils::CreateObject(context->GetEnv());
445 if (NapiUtils::GetValueType(context->GetEnv(), obj) != napi_object) {
446 return NapiUtils::GetUndefined(context->GetEnv());
447 }
448 NapiUtils::SetNamedProperty(context->GetEnv(), obj, CERTIFICATA_DATA, outData);
449 NapiUtils::SetInt32Property(context->GetEnv(), obj, CERTIFICATA_ENCODING_FORMAT,
450 context->localCert_.encodingFormat);
451 return obj;
452 }
453
ListenCallback(TlsSocket::TLSListenContext * context)454 napi_value TLSSocketServerExec::ListenCallback(TlsSocket::TLSListenContext *context)
455 {
456 context->EmitSharedManager(EVENT_LISTENING, std::make_pair(NapiUtils::GetUndefined(context->GetEnv()),
457 NapiUtils::GetUndefined(context->GetEnv())));
458 return NapiUtils::GetUndefined(context->GetEnv());
459 }
460
GetCipherSuitesCallback(ServerGetCipherSuitesContext * context)461 napi_value TLSSocketServerExec::GetCipherSuitesCallback(ServerGetCipherSuitesContext *context)
462 {
463 napi_value cipherSuites = NapiUtils::CreateArray(context->GetEnv(), 0);
464 int index = 0;
465 for (const auto &cipher : context->cipherSuites_) {
466 napi_value cipherSuite = NapiUtils::CreateStringUtf8(context->GetEnv(), cipher);
467 NapiUtils::SetArrayElement(context->GetEnv(), cipherSuites, index++, cipherSuite);
468 }
469 return cipherSuites;
470 }
471
GetRemoteCertificateCallback(ServerGetRemoteCertificateContext * context)472 napi_value TLSSocketServerExec::GetRemoteCertificateCallback(ServerGetRemoteCertificateContext *context)
473 {
474 napi_value obj = nullptr;
475 if (context->remoteCert_.data.Length() > 0 && context->remoteCert_.data.Data() != nullptr) {
476 void *data = nullptr;
477 napi_value arrayBuffer =
478 NapiUtils::CreateArrayBuffer(context->GetEnv(), context->remoteCert_.data.Length(), &data);
479 if (data != nullptr && arrayBuffer != nullptr) {
480 if (memcpy_s(data, context->remoteCert_.data.Length(),
481 reinterpret_cast<const uint8_t *>(context->remoteCert_.data.Data()),
482 context->remoteCert_.data.Length()) != EOK) {
483 NETSTACK_LOGE("memcpy_s failed!");
484 return NapiUtils::GetUndefined(context->GetEnv());
485 }
486 }
487 napi_value outData = nullptr;
488 napi_create_typedarray(context->GetEnv(), napi_uint8_array, context->remoteCert_.data.Length(), arrayBuffer, 0,
489 &outData);
490 obj = NapiUtils::CreateObject(context->GetEnv());
491 if (NapiUtils::GetValueType(context->GetEnv(), obj) != napi_object) {
492 return NapiUtils::GetUndefined(context->GetEnv());
493 }
494 NapiUtils::SetNamedProperty(context->GetEnv(), obj, CERTIFICATA_DATA, outData);
495 NapiUtils::SetInt32Property(context->GetEnv(), obj, CERTIFICATA_ENCODING_FORMAT,
496 context->remoteCert_.encodingFormat);
497 }
498 return obj;
499 }
500
GetProtocolCallback(TlsSocket::GetProtocolContext * context)501 napi_value TLSSocketServerExec::GetProtocolCallback(TlsSocket::GetProtocolContext *context)
502 {
503 return NapiUtils::CreateStringUtf8(context->GetEnv(), context->protocol_);
504 }
505
GetSignatureAlgorithmsCallback(ServerGetSignatureAlgorithmsContext * context)506 napi_value TLSSocketServerExec::GetSignatureAlgorithmsCallback(ServerGetSignatureAlgorithmsContext *context)
507 {
508 napi_value signatureAlgorithms = NapiUtils::CreateArray(context->GetEnv(), 0);
509 int index = 0;
510 for (const auto &algorithm : context->signatureAlgorithms_) {
511 napi_value signatureAlgorithm = NapiUtils::CreateStringUtf8(context->GetEnv(), algorithm);
512 NapiUtils::SetArrayElement(context->GetEnv(), signatureAlgorithms, index++, signatureAlgorithm);
513 }
514 return signatureAlgorithms;
515 }
516
SendCallback(TLSServerSendContext * context)517 napi_value TLSSocketServerExec::SendCallback(TLSServerSendContext *context)
518 {
519 context->EmitSharedManager(EVENT_LISTENING, std::make_pair(NapiUtils::GetUndefined(context->GetEnv()),
520 NapiUtils::GetUndefined(context->GetEnv())));
521 return NapiUtils::GetUndefined(context->GetEnv());
522 }
523
CloseCallback(TLSServerCloseContext * context)524 napi_value TLSSocketServerExec::CloseCallback(TLSServerCloseContext *context)
525 {
526 context->EmitSharedManager(EVENT_CLOSE, std::make_pair(NapiUtils::GetUndefined(context->GetEnv()),
527 NapiUtils::GetUndefined(context->GetEnv())));
528 return NapiUtils::GetUndefined(context->GetEnv());
529 }
530
StopCallback(TlsSocket::TLSNapiContext * context)531 napi_value TLSSocketServerExec::StopCallback(TlsSocket::TLSNapiContext *context)
532 {
533 return NapiUtils::GetUndefined(context->GetEnv());
534 }
535
GetStateCallback(TlsSocket::TLSGetStateContext * context)536 napi_value TLSSocketServerExec::GetStateCallback(TlsSocket::TLSGetStateContext *context)
537 {
538 napi_value obj = NapiUtils::CreateObject(context->GetEnv());
539 if (NapiUtils::GetValueType(context->GetEnv(), obj) != napi_object) {
540 return NapiUtils::GetUndefined(context->GetEnv());
541 }
542 NapiUtils::SetBooleanProperty(context->GetEnv(), obj, KEY_IS_BOUND, context->state_.IsBound());
543 NapiUtils::SetBooleanProperty(context->GetEnv(), obj, KEY_IS_CLOSE, context->state_.IsClose());
544 NapiUtils::SetBooleanProperty(context->GetEnv(), obj, KEY_IS_CONNECTED, context->state_.IsConnected());
545 return obj;
546 }
547
GetRemoteAddressCallback(ServerTLSGetRemoteAddressContext * context)548 napi_value TLSSocketServerExec::GetRemoteAddressCallback(ServerTLSGetRemoteAddressContext *context)
549 {
550 napi_value obj = NapiUtils::CreateObject(context->GetEnv());
551 if (NapiUtils::GetValueType(context->GetEnv(), obj) != napi_object) {
552 return NapiUtils::GetUndefined(context->GetEnv());
553 }
554 NapiUtils::SetStringPropertyUtf8(context->GetEnv(), obj, KEY_ADDRESS, context->address_.GetAddress());
555 NapiUtils::SetUint32Property(context->GetEnv(), obj, KEY_FAMILY, context->address_.GetJsValueFamily());
556 NapiUtils::SetUint32Property(context->GetEnv(), obj, KEY_PORT, context->address_.GetPort());
557 return obj;
558 }
559
GetLocalAddressCallback(TLSServerGetLocalAddressContext * context)560 napi_value TLSSocketServerExec::GetLocalAddressCallback(TLSServerGetLocalAddressContext *context)
561 {
562 napi_value obj = NapiUtils::CreateObject(context->GetEnv());
563 if (NapiUtils::GetValueType(context->GetEnv(), obj) != napi_object) {
564 return NapiUtils::GetUndefined(context->GetEnv());
565 }
566 auto manager = context->GetSharedManager();
567 if (manager == nullptr) {
568 NETSTACK_LOGE("manager is nullptr");
569 return obj;
570 }
571 std::shared_lock<std::shared_mutex> lock(manager->GetDataMutex());
572 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
573 if (tlsSocketServer == nullptr) {
574 NETSTACK_LOGE("get localAddress callback tlsSocketServer is null");
575 return obj;
576 }
577 auto env = context->GetEnv();
578 NapiUtils::SetStringPropertyUtf8(env, obj, KEY_ADDRESS, tlsSocketServer->GetLocalAddress().GetAddress());
579 NapiUtils::SetUint32Property(env, obj, KEY_FAMILY, tlsSocketServer->GetLocalAddress().GetJsValueFamily());
580 NapiUtils::SetUint32Property(env, obj, KEY_PORT, tlsSocketServer->GetLocalAddress().GetPort());
581 return obj;
582 }
583
GetConnectionLocalAddressCallback(TLSConnectionGetLocalAddressContext * context)584 napi_value TLSSocketServerExec::GetConnectionLocalAddressCallback(TLSConnectionGetLocalAddressContext *context)
585 {
586 napi_value obj = NapiUtils::CreateObject(context->GetEnv());
587 if (NapiUtils::GetValueType(context->GetEnv(), obj) != napi_object) {
588 return NapiUtils::GetUndefined(context->GetEnv());
589 }
590 auto env = context->GetEnv();
591 NapiUtils::SetStringPropertyUtf8(env, obj, KEY_ADDRESS, context->localAddress_.GetAddress());
592 NapiUtils::SetUint32Property(env, obj, KEY_FAMILY, context->localAddress_.GetJsValueFamily());
593 NapiUtils::SetUint32Property(env, obj, KEY_PORT, context->localAddress_.GetPort());
594 return obj;
595 }
596
SetExtraOptionsCallback(TlsSocket::TLSSetExtraOptionsContext * context)597 napi_value TLSSocketServerExec::SetExtraOptionsCallback(TlsSocket::TLSSetExtraOptionsContext *context)
598 {
599 return NapiUtils::GetUndefined(context->GetEnv());
600 }
601
ExecConnectionSend(TLSServerSendContext * context)602 bool TLSSocketServerExec::ExecConnectionSend(TLSServerSendContext *context)
603 {
604 auto manager = context->GetSharedManager();
605 if (manager == nullptr) {
606 NETSTACK_LOGE("manager is nullptr");
607 return false;
608 }
609 std::shared_lock<std::shared_mutex> lock(manager->GetDataMutex());
610 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
611 if (tlsSocketServer == nullptr) {
612 NETSTACK_LOGE("ExecSend tlsSocketServer is null");
613 context->SetError(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND,
614 TlsSocket::MakeErrorMessage(TlsSocket::TlsSocketError::TLS_ERR_NO_BIND));
615 return false;
616 }
617 TLSServerSendOptions tcpSendOptions;
618 int client_id = context->clientId_;
619
620 tcpSendOptions.SetSocket(client_id);
621 tcpSendOptions.SetSendData(context->m_sendData);
622 tlsSocketServer->Send(tcpSendOptions, [&context](int32_t errorNumber) {
623 context->errorNumber_ = errorNumber;
624 if (errorNumber != TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS) {
625 context->SetError(errorNumber, TlsSocket::MakeErrorMessage(errorNumber));
626 }
627 });
628 return context->errorNumber_ == TlsSocket::TlsSocketError::TLSSOCKET_SUCCESS;
629 }
630
ConnectionSendCallback(TLSServerSendContext * context)631 napi_value TLSSocketServerExec::ConnectionSendCallback(TLSServerSendContext *context)
632 {
633 return NapiUtils::GetUndefined(context->GetEnv());
634 }
635 } // namespace TlsSocketServer
636 } // namespace NetStack
637 } // namespace OHOS
638