X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/ac6367f5676cd22834de7e38c6b1e493214b52d6..80aca6d78d4ff5d514216fe96c44e2ee75c4e933:/projects/stargazer/plugins/configuration/sgconfig/conn.h diff --git a/projects/stargazer/plugins/configuration/sgconfig/conn.h b/projects/stargazer/plugins/configuration/sgconfig/conn.h index 396e9753..a98e593b 100644 --- a/projects/stargazer/plugins/configuration/sgconfig/conn.h +++ b/projects/stargazer/plugins/configuration/sgconfig/conn.h @@ -18,30 +18,32 @@ * Author : Maxim Mamontov */ -#ifndef __STG_SGCONFIG_CONN_H__ -#define __STG_SGCONFIG_CONN_H__ +#pragma once + +#include "parser.h" + +#include "dumphelpers.h" -#include "stg/os_int.h" #include "stg/const.h" #include #include -#include +#include #include #include -class SETTINGS; -class ADMINS; -class USERS; -class TARIFFS; -class ADMIN; -class BASE_PARSER; - namespace STG { +struct Settings; +struct Admins; +struct Users; +struct Tariffs; +struct Admin; +class PluginLogger; + class DECRYPT_STREAM; class Conn @@ -49,25 +51,28 @@ class Conn public: struct Error : public std::runtime_error { - Error(const std::string& message) : runtime_error(message.c_str()) {} + explicit Error(const std::string& message) : runtime_error(message.c_str()) {} }; - Conn(const SETTINGS & settings, - ADMINS & admins, - USERS & users, - TARIFFS & tariffs, - int sock, const sockaddr_in& addr); + Conn(const BASE_PARSER::REGISTRY & registry, + Admins & admins, int sock, const sockaddr_in& addr, + PluginLogger & logger); ~Conn(); int Sock() const { return m_sock; } - uint32_t IP() const { return *(uint32_t *)(&m_addr.sin_addr); } - uint16_t Port() const { return m_addr.sin_port; } + uint32_t IP() const { return *reinterpret_cast(&m_addr.sin_addr); } + uint16_t Port() const { return ntohs(m_addr.sin_port); } + + std::string endpoint() const { return inet_ntostring(IP()) + ":" + std::to_string(Port()); } bool Read(); bool IsOk() const { return m_state != ERROR; } + bool IsDone() const { return m_state == DONE; } bool IsKeepAlive() const { return m_keepAlive; } + void SetKeepAlive() { m_keepAlive = true; } + private: static const char STG_HEADER[5]; @@ -78,12 +83,11 @@ class Conn static const char OK_LOGINS[5]; static const char ERR_LOGINS[5]; - const SETTINGS & m_settings; - ADMINS & m_admins; - USERS & m_users; - TARIFFS & m_tariffs; + const BASE_PARSER::REGISTRY & m_registry; + + Admins & m_admins; - ADMIN * m_admin; + Admin * m_admin; int m_sock; sockaddr_in m_addr; @@ -93,17 +97,18 @@ class Conn XML_Parser m_xmlParser; - enum { HEADER, LOGIN, CRYPTO_LOGIN, DATA, ERROR } m_state; + enum { HEADER, LOGIN, CRYPTO_LOGIN, DATA, DONE, ERROR } m_state; void * m_buffer; size_t m_bufferSize; - char m_header[sizeof(STG_HEADER)]; - char m_login[ADM_LOGIN_LEN + 1]; - char m_cryptoLogin[ADM_LOGIN_LEN + 1]; + char m_header[sizeof(STG_HEADER) - 1]; // Without \0 + char m_login[ADM_LOGIN_LEN]; // Without \0 + char m_cryptoLogin[ADM_LOGIN_LEN]; // Without \0 char m_data[1024]; STG::DECRYPT_STREAM * m_stream; + PluginLogger & m_logger; - BASE_PARSER * GetParser(const std::string & tag); + BASE_PARSER * GetParser(const std::string & tag) const; bool HandleBuffer(size_t size); @@ -112,6 +117,11 @@ class Conn bool HandleCryptoLogin(); bool HandleData(size_t size); + bool WriteAnswer(const void* buffer, size_t size); + bool WriteResponse(); + + void Log(const char * file, const std::string & message); + struct DataState { DataState(bool f, Conn & c) : final(f), conn(c) {} @@ -119,11 +129,14 @@ class Conn Conn & conn; } m_dataState; +#ifdef DUMPCRYPTO + Dumper m_dumper; +#endif + static bool DataCallback(const void * block, size_t size, void * data); static void ParseXMLStart(void * data, const char * el, const char ** attr); static void ParseXMLEnd(void * data, const char * el); + static bool WriteCallback(const void * block, size_t size, void * data); }; } - -#endif