From bad7b4f2d19f95b278fdcb3056be01cae9af1dbb Mon Sep 17 00:00:00 2001 From: alpine Date: Sat, 13 Jun 2020 22:27:52 +0200 Subject: Client. Message encryption. Packet handler. Disconnect event handler. --- server/src/client/client.cpp | 27 +++++++++++++++++++++ server/src/client/client.h | 57 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 server/src/client/client.cpp create mode 100644 server/src/client/client.h (limited to 'server/src/client') diff --git a/server/src/client/client.cpp b/server/src/client/client.cpp new file mode 100644 index 0000000..4c458c8 --- /dev/null +++ b/server/src/client/client.cpp @@ -0,0 +1,27 @@ +#include "../include.h" +#include "../util/io.h" +#include "client.h" + +bool tcp::client::init_ssl(SSL_CTX *server_ctx) { + m_ssl = SSL_new(server_ctx); + if (!m_ssl) { + io::logger->error("failed to create ssl on client {}.", m_ip); + return false; + } + + int ret = SSL_set_fd(m_ssl, m_socket); + if (ret <= 0) { + io::logger->error("failed to set descriptor on client {}.", m_ip); + return false; + } + + ret = SSL_accept(m_ssl); + if (ret <= 0) { + int err = SSL_get_error(m_ssl, ret); + io::logger->error("client {} failed to accept ssl, return code {}", m_ip, + err); + return false; + } + + return true; +} \ No newline at end of file diff --git a/server/src/client/client.h b/server/src/client/client.h new file mode 100644 index 0000000..5242ae7 --- /dev/null +++ b/server/src/client/client.h @@ -0,0 +1,57 @@ +#pragma once +#include "../server/packet.h" + +namespace tcp { +constexpr uint8_t client_version = 0; + +class client { + int m_socket; + SSL *m_ssl; + + time_t m_time; + + std::string m_ip; + std::array m_uid; + public: + client() : m_socket{-1} {}; + client(const int &socket, const std::string_view ip) + : m_socket{std::move(socket)}, m_ip{ip}, m_ssl{nullptr} { + + } + ~client() = default; + + bool init_ssl(SSL_CTX *server_ctx); + + void cleanup() { + close(m_socket); + SSL_shutdown(m_ssl); + SSL_free(m_ssl); + } + + int write(void *data, size_t size) { + return SSL_write(m_ssl, data, size); + } + + int read(void *data, size_t size) { + return SSL_read(m_ssl, data, size); + } + + bool set_uid(const std::string_view uid_str) { + const size_t uid_str_len = uid_str.size(); + if (uid_str_len != tcp::uid_len) { + io::logger->error("packet uid len mismatch!"); + return false; + } + + for (size_t i = 0; i < uid_len; ++i) { + m_uid[i] = uid_str[i]; + } + + return true; + } + + int &get_socket() { return m_socket; } + auto &get_ip() { return m_ip; } + auto &get_uid() { return m_uid; } +}; +}; // namespace tcp \ No newline at end of file -- cgit v1.2.3