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