X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/4271ab433cd55bbd2612292bcf39e4dc3d7274f1..0907aa4037b12b6b88ee24495d4577a064d4f8db:/projects/stargazer/users_impl.h diff --git a/projects/stargazer/users_impl.h b/projects/stargazer/users_impl.h new file mode 100644 index 00000000..ef5ee0ec --- /dev/null +++ b/projects/stargazer/users_impl.h @@ -0,0 +1,171 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* + * Author : Boris Mikhailenko + */ + +#pragma once + +#include + +#include +#include +#include +#include +#include +#include + +#include "stg/store.h" +#include "stg/users.h" +#include "stg/user.h" +#include "stg/tariffs.h" +#include "stg/logger.h" +#include "stg/notifer.h" +#include "stg/noncopyable.h" +#include "actions.h" +#include "eventloop.h" +#include "settings_impl.h" +#include "user_impl.h" + +namespace STG +{ + +const int userDeleteDelayTime = 120; + +typedef std::list::iterator user_iter; +typedef std::list::const_iterator const_user_iter; + +class UsersImpl; +//----------------------------------------------------------------------------- +struct USER_TO_DEL { +USER_TO_DEL() + : iter(), + delTime(0) +{} + +std::list::iterator iter; +time_t delTime; +}; +//----------------------------------------------------------------------------- +class UsersImpl : public Users { + friend class PROPERTY_NOTIFER_IP_BEFORE; + friend class PROPERTY_NOTIFER_IP_AFTER; + +public: + using UserImplPtr = UserImpl*; + + UsersImpl(SettingsImpl * s, Store * store, + Tariffs * tariffs, Services & svcs, + const Admin& sysAdmin); + virtual ~UsersImpl(); + + 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; + + bool TariffInUse(const std::string & tariffName) const override; + + void AddNotifierUserAdd(NotifierBase *) override; + void DelNotifierUserAdd(NotifierBase *) override; + + void AddNotifierUserDel(NotifierBase *) override; + void DelNotifierUserDel(NotifierBase *) override; + + void AddNotifierUserAdd(NotifierBase *); + void DelNotifierUserAdd(NotifierBase *); + + void AddNotifierUserDel(NotifierBase *); + void DelNotifierUserDel(NotifierBase *); + + int Add(const std::string & login, const Admin * admin) override; + void Del(const std::string & login, const Admin * admin) override; + + 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 ReadUsers() override; + size_t Count() const override { return users.size(); } + + 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 OpenSearch() override; + int SearchNext(int handler, UserPtr * user) override; + int SearchNext(int handler, UserImpl ** user); + int CloseSearch(int handler) override; + + int Start() override; + int Stop() override; + +private: + UsersImpl(const UsersImpl & rvalue); + UsersImpl & operator=(const UsersImpl & rvalue); + + void AddToIPIdx(user_iter user); + void DelFromIPIdx(uint32_t ip); + bool FindByIPIdx(uint32_t ip, user_iter & iter) const; + + int FindByNameNonLock(const std::string & login, user_iter * user); + int FindByNameNonLock(const std::string & login, const_user_iter * user) const; + + void RealDelUser(); + void ProcessActions(); + + void AddUserIntoIndexes(user_iter user); + void DelUserFromIndexes(user_iter user); + + static void * Run(void *); + void NewMinute(const struct tm & t); + void NewDay(const struct tm & t); + void DayResetTraff(const struct tm & t); + + bool TimeToWriteDetailStat(const struct tm & t); + + std::list users; + std::list usersToDelete; + + std::map ipIndex; + std::map loginIndex; + + SettingsImpl * settings; + Tariffs * tariffs; + Services & m_services; + Store * store; + const Admin& sysAdmin; + Logger & WriteServLog; + + bool nonstop; + bool isRunning; + + mutable pthread_mutex_t mutex; + pthread_t thread; + mutable unsigned int handle; + + mutable std::map searchDescriptors; + + std::set*> onAddNotifiers; + std::set*> onDelNotifiers; + std::set*> onAddNotifiersImpl; + std::set*> onDelNotifiersImpl; +}; + +}