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