X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/641204dfbdb9fc870cdd2e7f9e3169a44693e7bf..5dfab5bea026e33031d041b233c73e196469b4ac:/projects/stargazer/plugins/authorization/inetaccess/inetaccess.h?ds=sidebyside diff --git a/projects/stargazer/plugins/authorization/inetaccess/inetaccess.h b/projects/stargazer/plugins/authorization/inetaccess/inetaccess.h index 0e194db6..a5ce8aaf 100644 --- a/projects/stargazer/plugins/authorization/inetaccess/inetaccess.h +++ b/projects/stargazer/plugins/authorization/inetaccess/inetaccess.h @@ -17,50 +17,44 @@ /* * Author : Boris Mikhailenko */ +#pragma once + +#include "stg/auth.h" +#include "stg/store.h" +#include "stg/module_settings.h" +#include "stg/notifer.h" +#include "stg/user_ips.h" +#include "stg/user.h" +#include "stg/users.h" +#include "stg/user_property.h" +#include "stg/ia_packets.h" +#include "stg/blowfish.h" +#include "stg/logger.h" +#include "stg/utime.h" +#include "stg/logger.h" -/* - $Revision: 1.34 $ - $Date: 2010/09/10 06:39:19 $ - $Author: faust $ - */ - -#ifndef INETACCESS_H -#define INETACCESS_H - -#include -#include #include #include +#include #include #include +#include #include #include +#include +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" +#include +#pragma GCC diagnostic pop -#include "os_int.h" -#include "base_auth.h" -#include "base_store.h" -#include "notifer.h" -#include "user_ips.h" -#include "../../../user.h" -#include "../../../users.h" -#include "ia_packets.h" -#include "blowfish.h" -#include "stg_logger.h" -#include "utime.h" - -using namespace std; - -extern "C" BASE_PLUGIN * GetPlugin(); - -#define IA_PROTO_VER (6) +#include //#define IA_DEBUG (1) //#define IA_PHASE_DEBUG (1) class AUTH_IA; //----------------------------------------------------------------------------- -enum FREEMB -{ +enum FREEMB { freeMb0 = 0, freeMb1, freeMb2, @@ -85,8 +79,7 @@ enum FREEMB freeMbNone = 101 }; //----------------------------------------------------------------------------- -class IA_PHASE -{ +class IA_PHASE { public: IA_PHASE(); ~IA_PHASE(); @@ -95,15 +88,14 @@ public: void SetPhase2(); void SetPhase3(); void SetPhase4(); - void SetPhase5(); int GetPhase() const; void UpdateTime(); const UTIME & GetTime() const; #ifdef IA_PHASE_DEBUG - void SetUserLogin(const string & login); - void SetLogFileName(const string & logFileName); + void SetUserLogin(const std::string & login); + void SetLogFileName(const std::string & logFileName); #endif private: @@ -112,159 +104,196 @@ private: #ifdef IA_PHASE_DEBUG void WritePhaseChange(int newPhase); - string log; - string login; + std::string log; + std::string login; FILE * flog; #endif }; //----------------------------------------------------------------------------- -struct IA_USER -{ +struct IA_USER { + using ConstUserPtr = const STG::User*; IA_USER() + : user(NULL), + lastSendAlive(0), + rnd(static_cast(random())), + port(0), + protoVer(0), + password("NO PASSWORD") { - //phase = 1; - //phaseTime = 0; - lastSendAlive = 0; - rnd = random(); - port = 0; - password = "NO PASSWORD"; - // +++ Preparing CTX +++ - unsigned char keyL[PASSWD_LEN]; // ðÁÒÏÌØ ÄÌÑ ÛÉÆÒÏ×ËÉ - memset(keyL, 0, PASSWD_LEN); - strncpy((char *)keyL, password.c_str(), PASSWD_LEN); - Blowfish_Init(&ctx, keyL, PASSWD_LEN); - // --- Preparing CTX --- - #ifdef IA_DEBUG - aliveSent = false; - #endif - }; + char keyL[PASSWD_LEN]; + memset(keyL, 0, PASSWD_LEN); + strncpy(keyL, password.c_str(), PASSWD_LEN); + Blowfish_Init(&ctx, keyL, PASSWD_LEN); + + #ifdef IA_DEBUG + aliveSent = false; + #endif + } IA_USER(const IA_USER & u) + : login(u.login), + user(u.user), + phase(u.phase), + lastSendAlive(u.lastSendAlive), + rnd(u.rnd), + port(u.port), + ctx(), + messagesToSend(u.messagesToSend), + protoVer(u.protoVer), + password(u.password) + { + #ifdef IA_DEBUG + aliveSent = u.aliveSent; + #endif + memcpy(&ctx, &u.ctx, sizeof(BLOWFISH_CTX)); + } + + IA_USER(const std::string & l, + ConstUserPtr u, + uint16_t p, + int ver) + : login(l), + user(u), + lastSendAlive(0), + rnd(static_cast(random())), + port(p), + messagesToSend(), + protoVer(ver), + password(user->GetProperties().password.Get()) { - user = u.user; - phase = u.phase; - //phaseTime = u.phaseTime; - lastSendAlive = u.lastSendAlive; - rnd = u.rnd; - password = u.password; - protoVer = u.protoVer; - port = u.port; - #ifdef IA_DEBUG - aliveSent = u.aliveSent; - #endif - memcpy(&ctx, &u.ctx, sizeof(BLOWFISH_CTX)); - }; - - user_iter user; - //int phase; - //UTIME phaseTime; + char keyL[PASSWD_LEN]; + memset(keyL, 0, PASSWD_LEN); + strncpy(keyL, password.c_str(), PASSWD_LEN); + Blowfish_Init(&ctx, keyL, PASSWD_LEN); + + #ifdef IA_DEBUG + aliveSent = false; + #endif + } + + std::string login; + ConstUserPtr user; IA_PHASE phase; UTIME lastSendAlive; uint32_t rnd; uint16_t port; BLOWFISH_CTX ctx; - list messagesToSend; + std::vector messagesToSend; int protoVer; - string password; + std::string password; #ifdef IA_DEBUG bool aliveSent; #endif + +private: + IA_USER & operator=(const IA_USER & rvalue); }; //----------------------------------------------------------------------------- -class AUTH_IA_SETTINGS -{ +class AUTH_IA_SETTINGS { public: AUTH_IA_SETTINGS(); - virtual ~AUTH_IA_SETTINGS() {}; - const string& GetStrError() const { return errorStr; }; - int ParseSettings(const MODULE_SETTINGS & s); - int GetUserDelay() const { return userDelay; }; - int GetUserTimeout() const { return userTimeout; }; - int GetUserPort() const { return port; }; - FREEMB GetFreeMbShowType() const { return freeMbShowType; }; + virtual ~AUTH_IA_SETTINGS() {} + const std::string & GetStrError() const { return errorStr; } + int ParseSettings(const STG::ModuleSettings & s); + UTIME GetUserDelay() const { return UTIME(userDelay); } + UTIME GetUserTimeout() const { return UTIME(userTimeout); } + uint16_t GetUserPort() const { return port; } + FREEMB GetFreeMbShowType() const { return freeMbShowType; } + bool LogProtocolErrors() const { return logProtocolErrors; } private: - int ParseIntInRange(const string & str, int min, int max, int * val); int userDelay; int userTimeout; uint16_t port; - string errorStr; + std::string errorStr; FREEMB freeMbShowType; + bool logProtocolErrors; }; //----------------------------------------------------------------------------- -class AUTH_IA :public BASE_AUTH -{ +class AUTH_IA; +using UserPtr = STG::User*; +//----------------------------------------------------------------------------- +class DEL_USER_NOTIFIER: public STG::NotifierBase { public: - AUTH_IA(); - virtual ~AUTH_IA(); + explicit DEL_USER_NOTIFIER(AUTH_IA & a) : auth(a) {} + virtual ~DEL_USER_NOTIFIER() {} + + void Notify(const UserPtr & user); +private: + DEL_USER_NOTIFIER(const DEL_USER_NOTIFIER & rvalue); + DEL_USER_NOTIFIER & operator=(const DEL_USER_NOTIFIER & rvalue); - void SetUsers(USERS * u) { users = u; }; - void SetTariffs(TARIFFS *){}; - void SetAdmins(ADMINS *){}; - void SetTraffcounter(TRAFFCOUNTER *){}; - void SetStore(BASE_STORE *){}; - void SetStgSettings(const SETTINGS * s) { stgSettings = s; }; - void SetSettings(const MODULE_SETTINGS & s) { settings = s; }; - int ParseSettings(); + AUTH_IA & auth; +}; +//----------------------------------------------------------------------------- +class AUTH_IA : public STG::Auth { +friend class DEL_USER_NOTIFIER; +public: + AUTH_IA(); + ~AUTH_IA() override; - int Start(); - int Stop(); - int Reload() { return 0; }; - bool IsRunning() { return isRunningRunTimeouter || isRunningRun; }; + void SetUsers(STG::Users * u) override { users = u; } + void SetStgSettings(const STG::Settings * s) override { stgSettings = s; } + void SetSettings(const STG::ModuleSettings & s) override { settings = s; } + int ParseSettings() override; - const string & GetStrError() const { return errorStr; }; - const string GetVersion() const { return "InetAccess authorization plugin v.1.4"; }; - uint16_t GetStartPosition() const { return 50; }; - uint16_t GetStopPosition() const { return 50; }; + int Start() override; + int Stop() override; + int Reload(const STG::ModuleSettings & ms) override; + bool IsRunning() override { return isRunningRunTimeouter || isRunningRun; } - void DelUser(user_iter u); + const std::string & GetStrError() const override { return errorStr; } + std::string GetVersion() const override { return "InetAccess authorization plugin v.1.4"; } + uint16_t GetStartPosition() const override { return 30; } + uint16_t GetStopPosition() const override { return 30; } - int SendMessage(const STG_MSG & msg, uint32_t ip) const; + int SendMessage(const STG::Message & msg, uint32_t ip) const override; private: - static void * Run(void *); - static void * RunTimeouter(void * d); + AUTH_IA(const AUTH_IA & rvalue); + AUTH_IA & operator=(const AUTH_IA & rvalue); + + void Run(std::stop_token token); + void RunTimeouter(std::stop_token token); int PrepareNet(); int FinalizeNet(); + void DelUser(UserPtr u); int RecvData(char * buffer, int bufferSize); - int CheckHeader(const char * buffer, int * protoVer); - int PacketProcessor(char * buff, int dataLen, uint32_t sip, uint16_t sport, int protoVer, user_iter * user); + int CheckHeader(const char * buffer, uint32_t sip, int * protoVer); + int PacketProcessor(void * buff, size_t dataLen, uint32_t sip, uint16_t sport, int protoVer, UserPtr user); - int Process_CONN_SYN_6(CONN_SYN_6 * connSyn, IA_USER * iaUser, user_iter * user, uint32_t sip); - int Process_CONN_SYN_7(CONN_SYN_7 * connSyn, IA_USER * iaUser, user_iter * user, uint32_t sip); - int Process_CONN_SYN_8(CONN_SYN_8 * connSyn, IA_USER * iaUser, user_iter * user, uint32_t sip); + int Process_CONN_SYN_6(CONN_SYN_6 * connSyn, IA_USER * iaUser, uint32_t sip); + int Process_CONN_SYN_7(CONN_SYN_7 * connSyn, IA_USER * iaUser, uint32_t sip); + int Process_CONN_SYN_8(CONN_SYN_8 * connSyn, IA_USER * iaUser, uint32_t sip); - int Process_CONN_ACK_6(CONN_ACK_6 * connAck, IA_USER * iaUser, user_iter * user, uint32_t sip); - int Process_CONN_ACK_7(CONN_ACK_7 * connAck, IA_USER * iaUser, user_iter * user, uint32_t sip); - int Process_CONN_ACK_8(CONN_ACK_8 * connAck, IA_USER * iaUser, user_iter * user, uint32_t sip); + int Process_CONN_ACK_6(CONN_ACK_6 * connAck, IA_USER * iaUser, uint32_t sip); + int Process_CONN_ACK_7(CONN_ACK_7 * connAck, IA_USER * iaUser, uint32_t sip); + int Process_CONN_ACK_8(CONN_ACK_8 * connAck, IA_USER * iaUser, uint32_t sip); - int Process_ALIVE_ACK_6(ALIVE_ACK_6 * aliveAck, IA_USER * iaUser, user_iter * user, uint32_t sip); - int Process_ALIVE_ACK_7(ALIVE_ACK_7 * aliveAck, IA_USER * iaUser, user_iter * user, uint32_t sip); - int Process_ALIVE_ACK_8(ALIVE_ACK_8 * aliveAck, IA_USER * iaUser, user_iter * user, uint32_t sip); + int Process_ALIVE_ACK_6(ALIVE_ACK_6 * aliveAck, IA_USER * iaUser, uint32_t sip); + int Process_ALIVE_ACK_7(ALIVE_ACK_7 * aliveAck, IA_USER * iaUser, uint32_t sip); + int Process_ALIVE_ACK_8(ALIVE_ACK_8 * aliveAck, IA_USER * iaUser, uint32_t sip); - int Process_DISCONN_SYN_6(DISCONN_SYN_6 * disconnSyn, IA_USER * iaUser, user_iter * user, uint32_t sip); - int Process_DISCONN_SYN_7(DISCONN_SYN_7 * disconnSyn, IA_USER * iaUser, user_iter * user, uint32_t sip); - int Process_DISCONN_SYN_8(DISCONN_SYN_8 * disconnSyn, IA_USER * iaUser, user_iter * user, uint32_t sip); + int Process_DISCONN_SYN_6(DISCONN_SYN_6 * disconnSyn, IA_USER * iaUser, uint32_t sip); + int Process_DISCONN_SYN_7(DISCONN_SYN_7 * disconnSyn, IA_USER * iaUser, uint32_t sip); + int Process_DISCONN_SYN_8(DISCONN_SYN_8 * disconnSyn, IA_USER * iaUser, uint32_t sip); int Process_DISCONN_ACK_6(DISCONN_ACK_6 * disconnSyn, IA_USER * iaUser, - user_iter * user, uint32_t sip, - map::iterator it); + std::map::iterator it); int Process_DISCONN_ACK_7(DISCONN_ACK_7 * disconnSyn, IA_USER * iaUser, - user_iter * user, uint32_t sip, - map::iterator it); + std::map::iterator it); int Process_DISCONN_ACK_8(DISCONN_ACK_8 * disconnSyn, IA_USER * iaUser, - user_iter * user, uint32_t sip, - map::iterator it); + std::map::iterator it); - int Send_CONN_SYN_ACK_6(IA_USER * iaUser, user_iter * user, uint32_t sip); - int Send_CONN_SYN_ACK_7(IA_USER * iaUser, user_iter * user, uint32_t sip); - int Send_CONN_SYN_ACK_8(IA_USER * iaUser, user_iter * user, uint32_t sip); + int Send_CONN_SYN_ACK_6(IA_USER * iaUser, uint32_t sip); + int Send_CONN_SYN_ACK_7(IA_USER * iaUser, uint32_t sip); + int Send_CONN_SYN_ACK_8(IA_USER * iaUser, uint32_t sip); int Send_ALIVE_SYN_6(IA_USER * iaUser, uint32_t sip); int Send_ALIVE_SYN_7(IA_USER * iaUser, uint32_t sip); @@ -274,43 +303,35 @@ private: int Send_DISCONN_SYN_ACK_7(IA_USER * iaUser, uint32_t sip); int Send_DISCONN_SYN_ACK_8(IA_USER * iaUser, uint32_t sip); - int Send_FIN_6(IA_USER * iaUser, uint32_t sip, map::iterator it); - int Send_FIN_7(IA_USER * iaUser, uint32_t sip, map::iterator it); - int Send_FIN_8(IA_USER * iaUser, uint32_t sip, map::iterator it); + int Send_FIN_6(IA_USER * iaUser, uint32_t sip, std::map::iterator it); + int Send_FIN_7(IA_USER * iaUser, uint32_t sip, std::map::iterator it); + int Send_FIN_8(IA_USER * iaUser, uint32_t sip, std::map::iterator it); int Timeouter(); - void InitEncrypt(BLOWFISH_CTX * ctx, const string & password); - void Decrypt(BLOWFISH_CTX * ctx, char * dst, const char * src, int len8); - void Encrypt(BLOWFISH_CTX * ctx, char * dst, const char * src, int len8); - - int SendError(uint32_t ip, uint16_t port, int protoVer, const string & text); - int Send(uint32_t ip, uint16_t port, const char * buffer, int len); - int RealSendMessage6(const STG_MSG & msg, uint32_t ip, IA_USER & user); - int RealSendMessage7(const STG_MSG & msg, uint32_t ip, IA_USER & user); - int RealSendMessage8(const STG_MSG & msg, uint32_t ip, IA_USER & user); - - bool WaitPackets(int sd) const; + int SendError(uint32_t ip, uint16_t port, int protoVer, const std::string & text); + int Send(uint32_t ip, uint16_t port, const void* buffer, size_t len); + int RealSendMessage6(const STG::Message & msg, uint32_t ip, IA_USER & user); + int RealSendMessage7(const STG::Message & msg, uint32_t ip, IA_USER & user); + int RealSendMessage8(const STG::Message & msg, uint32_t ip, IA_USER & user); BLOWFISH_CTX ctxS; //for loginS - mutable string errorStr; + mutable std::string errorStr; AUTH_IA_SETTINGS iaSettings; - MODULE_SETTINGS settings; - - bool nonstop; + STG::ModuleSettings settings; bool isRunningRun; bool isRunningRunTimeouter; - USERS * users; - const SETTINGS * stgSettings; + STG::Users * users; + const STG::Settings * stgSettings; - mutable map ip2user; + mutable std::map ip2user; - pthread_t recvThread; - pthread_t timeouterThread; - mutable pthread_mutex_t mutex; + std::jthread m_thread; + std::jthread m_timeouterThread; + mutable std::mutex m_mutex; int listenSocket; @@ -325,41 +346,33 @@ private: FIN_6 fin6; FIN_8 fin8; - map packetTypes; - - STG_LOGGER & WriteServLog; + std::map packetTypes; uint32_t enabledDirs; - class DEL_USER_NONIFIER: public NOTIFIER_BASE - { - public: - DEL_USER_NONIFIER(AUTH_IA & a) : auth(a) {}; - virtual ~DEL_USER_NONIFIER(){}; + DEL_USER_NOTIFIER onDelUserNotifier; - void Notify(const user_iter & user) - { - auth.DelUser(user); - } + STG::PluginLogger logger; + friend class UnauthorizeUser; +}; +//----------------------------------------------------------------------------- +class UnauthorizeUser : std::unary_function &, void> { + public: + explicit UnauthorizeUser(AUTH_IA * a) : auth(a) {} + UnauthorizeUser(const UnauthorizeUser & rvalue) : auth(rvalue.auth) {} + void operator()(const std::pair & p) + { + auth->users->Unauthorize(p.second.user->GetLogin(), auth); + } private: - AUTH_IA & auth; - } onDelUserNotifier; - - class UnauthorizeUser : std::unary_function &, void> { - public: - UnauthorizeUser(AUTH_IA * a) : auth(a) {}; - void operator()(const std::pair & p) - { - p.second.user->Unauthorize(auth); - } - private: - AUTH_IA * auth; - }; + UnauthorizeUser & operator=(const UnauthorizeUser & rvalue); + AUTH_IA * auth; }; //----------------------------------------------------------------------------- - -#endif - - +inline +void DEL_USER_NOTIFIER::Notify(const UserPtr & user) +{ + auth.DelUser(user); +}