• 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_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