X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/becf6dfe4fe2ecd43792aa53a302c5866483f306..296c906e2689b9b5dc26d2f2d3e1e2d9e1662d3b:/projects/stargazer/users_impl.h diff --git a/projects/stargazer/users_impl.h b/projects/stargazer/users_impl.h index 424958da..07c0e8ab 100644 --- a/projects/stargazer/users_impl.h +++ b/projects/stargazer/users_impl.h @@ -18,181 +18,140 @@ * Author : Boris Mikhailenko */ -/* -$Revision: 1.31 $ -$Date: 2010/10/07 20:04:48 $ -$Author: faust $ -*/ - +#pragma once -#ifndef USERS_H -#define USERS_H +#include "settings_impl.h" +#include "user_impl.h" +#include "stg/store.h" +#include "stg/users.h" +#include "stg/user.h" +#include "stg/tariffs.h" +#include "stg/logger.h" +#include "stg/noncopyable.h" -#include - -#include #include #include #include #include +#include +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" +#include +#pragma GCC diagnostic pop +#include +#include -#include "os_int.h" - -#include "settings.h" -#include "user.h" -#include "tariffs.h" -#include "stg_logger.h" -#include "notifer.h" -#include "actions.h" -#include "noncopyable.h" -#include "eventloop.h" +namespace STG +{ const int userDeleteDelayTime = 120; -using namespace std; -class USERS; -//----------------------------------------------------------------------------- -class PROPERTY_NOTIFER_IP_BEFORE: public PROPERTY_NOTIFIER_BASE -{ -public: - PROPERTY_NOTIFER_IP_BEFORE(USERS & us, user_iter u) : users(us), user(u) {}; - void Notify(const uint32_t & oldValue, const uint32_t & newValue); - user_iter GetUser() const { return user; }; -private: - USERS & users; - user_iter user; -}; -//----------------------------------------------------------------------------- -class PROPERTY_NOTIFER_IP_AFTER: public PROPERTY_NOTIFIER_BASE -{ -public: - PROPERTY_NOTIFER_IP_AFTER(USERS & us, user_iter u) : users(us), user(u) {}; - void Notify(const uint32_t & oldValue, const uint32_t & newValue); - user_iter GetUser() const { return user; }; -private: - USERS & users; - user_iter user; -}; +typedef std::list::iterator user_iter; +typedef std::list::const_iterator const_user_iter; + //----------------------------------------------------------------------------- -struct USER_TO_DEL -{ +struct USER_TO_DEL { USER_TO_DEL() : iter(), delTime(0) -{}; +{} -list::iterator iter; +std::list::iterator iter; time_t delTime; }; //----------------------------------------------------------------------------- -class USERS : private NONCOPYABLE - { - friend class PROPERTY_NOTIFER_IP_BEFORE; - friend class PROPERTY_NOTIFER_IP_AFTER; - -public: - USERS(SETTINGS * s, BASE_STORE * store, TARIFFS * tariffs, const ADMIN & sysAdmin); - ~USERS(); +class UsersImpl : public Users +{ + public: + using UserImplPtr = UserImpl*; - int FindByName(const string & login, user_iter * user) const; - int FindByID(int id, user_iter * user); + UsersImpl(SettingsImpl * s, Store * store, + Tariffs * tariffs, Services & svcs, + const Admin& sysAdmin); - bool TariffInUse(const string & tariffName); + int FindByName(const std::string & login, UserPtr * user) override; + int FindByName(const std::string & login, ConstUserPtr * user) const override; + bool Exists(const std::string & login) const override; - void AddNotifierUserAdd(NOTIFIER_BASE *); - void DelNotifierUserAdd(NOTIFIER_BASE *); + bool TariffInUse(const std::string & tariffName) const override; - void AddNotifierUserDel(NOTIFIER_BASE *); - void DelNotifierUserDel(NOTIFIER_BASE *); + template + auto onImplAdd(F&& f) { return m_onAddImplCallbacks.add(std::forward(f)); } + template + auto onImplDel(F&& f) { return m_onDelImplCallbacks.add(std::forward(f)); } - int Add(const string & login, const ADMIN & admin); - void Del(const string & login, const ADMIN & admin); + int Add(const std::string & login, const Admin * admin) override; + void Del(const std::string & login, const Admin * admin) override; - int ReadUsers(); - int GetUserNum(); + bool Authorize(const std::string & login, uint32_t ip, + uint32_t enabledDirs, const Auth * auth) override; + bool Unauthorize(const std::string & login, + const Auth * auth, + const std::string & reason) override; - int FindByIPIdx(uint32_t ip, user_iter * user); + int ReadUsers() override; + size_t Count() const override { return users.size(); } - int OpenSearch(); - int SearchNext(int handler, user_iter * u); - int CloseSearch(int handler); + int FindByIPIdx(uint32_t ip, UserPtr * user) const override; + int FindByIPIdx(uint32_t ip, UserImpl ** user) const; + bool IsIPInIndex(uint32_t ip) const override; + bool IsIPInUse(uint32_t ip, const std::string & login, ConstUserPtr * user) const override; - int Start(); - int Stop(); + unsigned int OpenSearch() override; + int SearchNext(int handler, UserPtr * user) override; + int SearchNext(int handler, UserImpl ** user); + int CloseSearch(int handler) override; -private: - void AddToIPIdx(user_iter); - void DelFromIPIdx(uint32_t ip); + int Start() override; + int Stop() override; - int FindByNameNonLock(const string & login, user_iter * user) const; - int FindByIDNonLock(int id, user_iter * user); + private: + UsersImpl(const UsersImpl & rvalue); + UsersImpl & operator=(const UsersImpl & rvalue); - void RealDelUser(); - void ProcessActions(); + void AddToIPIdx(user_iter user); + void DelFromIPIdx(uint32_t ip); + bool FindByIPIdx(uint32_t ip, user_iter & iter) const; - void SetUserNotifiers(user_iter user); - void UnSetUserNotifiers(user_iter user); + bool FindByNameNonLock(const std::string & login, user_iter * user); + bool FindByNameNonLock(const std::string & login, const_user_iter * user) const; - void AddUserIntoIndexes(user_iter user); - void DelUserFromIndexes(user_iter user); + void RealDelUser(); + void ProcessActions(); - static void * Run(void *); - void NewMinute(const struct tm & t); - void NewDay(const struct tm & t); - void DayResetTraff(const struct tm & t); + void AddUserIntoIndexes(user_iter user); + void DelUserFromIndexes(user_iter user); - bool TimeToWriteDetailStat(const struct tm & t); + void Run(std::stop_token token); + void NewMinute(const struct tm & t); + void NewDay(const struct tm & t); + void DayResetTraff(const struct tm & t); - list users; - list usersToDelete; - list userIPNotifiersBefore; - list userIPNotifiersAfter; + bool TimeToWriteDetailStat(const struct tm & t); - map ipIndex; - map loginIndex; + std::list users; + std::list usersToDelete; - SETTINGS * settings; - TARIFFS * tariffs; - BASE_STORE * store; - const ADMIN sysAdmin; - STG_LOGGER & WriteServLog; + std::map ipIndex; + std::map loginIndex; - bool nonstop; - bool isRunning; + SettingsImpl * settings; + Tariffs * m_tariffs; + Services & m_services; + Store * m_store; + const Admin& m_sysAdmin; + Logger & WriteServLog; - mutable pthread_mutex_t mutex; - pthread_t thread; - mutable unsigned int handle; + bool isRunning; - mutable map searchDescriptors; + mutable std::mutex m_mutex; + std::jthread m_thread; + mutable unsigned int handle; - set *> onAddNotifiers; - set *> onDelNotifiers; - }; -//----------------------------------------------------------------------------- -inline -void PROPERTY_NOTIFER_IP_BEFORE::Notify(const uint32_t & oldValue, - const uint32_t &) -{ -if (!oldValue) - return; + mutable std::map searchDescriptors; -//EVENT_LOOP_SINGLETON::GetInstance().Enqueue(users, &USERS::DelFromIPIdx, oldValue); -// Using explicit call to assure that index is valid, because fast reconnect with delayed call can result in authorization error -users.DelFromIPIdx(oldValue); -} -//----------------------------------------------------------------------------- -inline -void PROPERTY_NOTIFER_IP_AFTER::Notify(const uint32_t &, - const uint32_t & newValue) -{ -if (!newValue) - return; + Subscriptions m_onAddImplCallbacks; + Subscriptions m_onDelImplCallbacks; +}; -//EVENT_LOOP_SINGLETON::GetInstance().Enqueue(users, &USERS::AddToIPIdx, user); -// Using explicit call to assure that index is valid, because fast reconnect with delayed call can result in authorization error -users.AddToIPIdx(user); } -//----------------------------------------------------------------------------- -#endif -