mirror of
https://github.com/debauchee/barrier.git
synced 2025-07-19 01:18:13 +02:00
refactored SecureSocket to use interface #4313
This commit is contained in:
parent
be2b87fd39
commit
141b778477
28 changed files with 484 additions and 158 deletions
|
@ -17,26 +17,42 @@
|
|||
|
||||
#include "SecureSocket.h"
|
||||
|
||||
#include "base/String.h"
|
||||
#include "net/TCPSocket.h"
|
||||
#include "arch/XArch.h"
|
||||
#include "base/Log.h"
|
||||
|
||||
#include <openssl/ssl.h>
|
||||
#include <openssl/err.h>
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
#include <memory>
|
||||
|
||||
//
|
||||
// SecureSocket
|
||||
//
|
||||
|
||||
#define MAX_ERROR_SIZE 65535
|
||||
|
||||
struct Ssl {
|
||||
SSL_CTX* m_context;
|
||||
SSL* m_ssl;
|
||||
};
|
||||
|
||||
SecureSocket::SecureSocket() :
|
||||
m_ready(false),
|
||||
m_errorSize(65535)
|
||||
SecureSocket::SecureSocket(
|
||||
IEventQueue* events,
|
||||
SocketMultiplexer* socketMultiplexer) :
|
||||
TCPSocket(events, socketMultiplexer),
|
||||
m_ready(false)
|
||||
{
|
||||
}
|
||||
|
||||
SecureSocket::SecureSocket(
|
||||
IEventQueue* events,
|
||||
SocketMultiplexer* socketMultiplexer,
|
||||
ArchSocket socket) :
|
||||
TCPSocket(events, socketMultiplexer, socket),
|
||||
m_ready(false)
|
||||
{
|
||||
m_ssl = new Ssl();
|
||||
m_ssl->m_context = NULL;
|
||||
m_ssl->m_ssl = NULL;
|
||||
m_error = new char[m_errorSize];
|
||||
}
|
||||
|
||||
SecureSocket::~SecureSocket()
|
||||
|
@ -51,6 +67,81 @@ SecureSocket::~SecureSocket()
|
|||
delete[] m_error;
|
||||
}
|
||||
|
||||
UInt32
|
||||
SecureSocket::read(void* buffer, UInt32 n)
|
||||
{
|
||||
bool retry = false;
|
||||
int r = 0;
|
||||
if (m_ssl != NULL) {
|
||||
r = SSL_read(m_ssl->m_ssl, buffer, n);
|
||||
retry = checkResult(r);
|
||||
if (retry) {
|
||||
r = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return r > 0 ? (UInt32)r : 0;
|
||||
}
|
||||
|
||||
void
|
||||
SecureSocket::write(const void* buffer, UInt32 n)
|
||||
{
|
||||
bool retry = false;
|
||||
int r = 0;
|
||||
if (m_ssl != NULL) {
|
||||
r = SSL_write(m_ssl->m_ssl, buffer, n);
|
||||
retry = checkResult(r);
|
||||
if (retry) {
|
||||
r = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
SecureSocket::isReady() const
|
||||
{
|
||||
return m_ready;
|
||||
}
|
||||
|
||||
void
|
||||
SecureSocket::connectSecureSocket()
|
||||
{
|
||||
#ifdef SYSAPI_WIN32
|
||||
secureConnect(static_cast<int>(getSocket()->m_socket));
|
||||
#elif SYSAPI_UNIX
|
||||
secureConnect(getSocket()->m_fd);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
SecureSocket::acceptSecureSocket()
|
||||
{
|
||||
#ifdef SYSAPI_WIN32
|
||||
secureAccept(static_cast<int>(getSocket()->m_socket));
|
||||
#elif SYSAPI_UNIX
|
||||
secureAccept(getSocket()->m_fd);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
SecureSocket::initSsl(bool server)
|
||||
{
|
||||
m_ssl = new Ssl();
|
||||
m_ssl->m_context = NULL;
|
||||
m_ssl->m_ssl = NULL;
|
||||
m_error = new char[MAX_ERROR_SIZE];
|
||||
|
||||
initContext(server);
|
||||
}
|
||||
|
||||
void
|
||||
SecureSocket::onConnected()
|
||||
{
|
||||
TCPSocket::onConnected();
|
||||
|
||||
connectSecureSocket();
|
||||
}
|
||||
|
||||
void
|
||||
SecureSocket::initContext(bool server)
|
||||
{
|
||||
|
@ -111,7 +202,7 @@ SecureSocket::createSSL()
|
|||
}
|
||||
|
||||
void
|
||||
SecureSocket::accept(int socket)
|
||||
SecureSocket::secureAccept(int socket)
|
||||
{
|
||||
createSSL();
|
||||
|
||||
|
@ -124,6 +215,7 @@ SecureSocket::accept(int socket)
|
|||
bool retry = checkResult(r);
|
||||
while (retry) {
|
||||
ARCH->sleep(.5f);
|
||||
LOG((CLOG_INFO "secureAccept sleep .5s"));
|
||||
r = SSL_accept(m_ssl->m_ssl);
|
||||
retry = checkResult(r);
|
||||
}
|
||||
|
@ -132,7 +224,7 @@ SecureSocket::accept(int socket)
|
|||
}
|
||||
|
||||
void
|
||||
SecureSocket::connect(int socket)
|
||||
SecureSocket::secureConnect(int socket)
|
||||
{
|
||||
createSSL();
|
||||
|
||||
|
@ -152,38 +244,6 @@ SecureSocket::connect(int socket)
|
|||
showCertificate();
|
||||
}
|
||||
|
||||
size_t
|
||||
SecureSocket::write(const void* buffer, int size)
|
||||
{
|
||||
bool retry = false;
|
||||
int n = 0;
|
||||
if (m_ssl != NULL) {
|
||||
n = SSL_write(m_ssl->m_ssl, buffer, size);
|
||||
retry = checkResult(n);
|
||||
if (retry) {
|
||||
n = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return n > 0 ? n : 0;
|
||||
}
|
||||
|
||||
size_t
|
||||
SecureSocket::read(void* buffer, int size)
|
||||
{
|
||||
bool retry = false;
|
||||
int n = 0;
|
||||
if (m_ssl != NULL) {
|
||||
n = SSL_read(m_ssl->m_ssl, buffer, size);
|
||||
retry = checkResult(n);
|
||||
if (retry) {
|
||||
n = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return n > 0 ? n : 0;
|
||||
}
|
||||
|
||||
void
|
||||
SecureSocket::showCertificate()
|
||||
{
|
||||
|
@ -277,7 +337,7 @@ SecureSocket::getError()
|
|||
bool errorUpdated = false;
|
||||
|
||||
if (e != 0) {
|
||||
ERR_error_string_n(e, m_error, m_errorSize);
|
||||
ERR_error_string_n(e, m_error, MAX_ERROR_SIZE);
|
||||
errorUpdated = true;
|
||||
}
|
||||
else {
|
||||
|
@ -286,9 +346,3 @@ SecureSocket::getError()
|
|||
|
||||
return errorUpdated;
|
||||
}
|
||||
|
||||
bool
|
||||
SecureSocket::isReady()
|
||||
{
|
||||
return m_ready;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue