X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/8c6fa3fbaccc22127280bf77a48fab5a3ee0716e..46b0747592074017ff0ea4b33d4a7194235886e5:/stargazer/users_impl.h diff --git a/stargazer/users_impl.h b/stargazer/users_impl.h new file mode 100644 index 00000000..a2e332e7 --- /dev/null +++ b/stargazer/users_impl.h @@ -0,0 +1,199 @@ +/* + * 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 + */ + +/* +$Revision: 1.31 $ +$Date: 2010/10/07 20:04:48 $ +$Author: faust $ +*/ + + +#ifndef USERS_IMPL_H +#define USERS_IMPL_H + +#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" + +const int userDeleteDelayTime = 120; + +typedef std::list::iterator user_iter; +typedef std::list::const_iterator const_user_iter; + +class USERS_IMPL; +//----------------------------------------------------------------------------- +struct USER_TO_DEL { +USER_TO_DEL() + : iter(), + delTime(0) +{} + +std::list::iterator iter; +time_t delTime; +}; +//----------------------------------------------------------------------------- +class USERS_IMPL : private NONCOPYABLE, public USERS { + friend class PROPERTY_NOTIFER_IP_BEFORE; + friend class PROPERTY_NOTIFER_IP_AFTER; + +public: + USERS_IMPL(SETTINGS_IMPL * s, STORE * store, + TARIFFS * tariffs, SERVICES & svcs, + const ADMIN * sysAdmin); + virtual ~USERS_IMPL(); + + int FindByName(const std::string & login, USER_PTR * user); + int FindByName(const std::string & login, CONST_USER_PTR * user) const; + + bool Exists(const std::string & login) const; + + bool TariffInUse(const std::string & tariffName) const; + + void AddNotifierUserAdd(NOTIFIER_BASE *); + void DelNotifierUserAdd(NOTIFIER_BASE *); + + void AddNotifierUserDel(NOTIFIER_BASE *); + void DelNotifierUserDel(NOTIFIER_BASE *); + + void AddNotifierUserAdd(NOTIFIER_BASE *); + void DelNotifierUserAdd(NOTIFIER_BASE *); + + void AddNotifierUserDel(NOTIFIER_BASE *); + void DelNotifierUserDel(NOTIFIER_BASE *); + + int Add(const std::string & login, const ADMIN * admin); + void Del(const std::string & login, const ADMIN * admin); + + bool Authorize(const std::string & login, uint32_t ip, + uint32_t enabledDirs, const AUTH * auth); + bool Unauthorize(const std::string & login, + const AUTH * auth, + const std::string & reason = std::string()); + + int ReadUsers(); + size_t Count() const { return users.size(); } + + int FindByIPIdx(uint32_t ip, USER_PTR * user) const; + int FindByIPIdx(uint32_t ip, USER_IMPL ** user) const; + bool IsIPInIndex(uint32_t ip) const; + bool IsIPInUse(uint32_t ip, const std::string & login, CONST_USER_PTR * user) const; + + int OpenSearch(); + int SearchNext(int handler, USER_PTR * user); + int SearchNext(int handler, USER_IMPL ** user); + int CloseSearch(int handler); + + int Start(); + int Stop(); + +private: + USERS_IMPL(const USERS_IMPL & rvalue); + USERS_IMPL & operator=(const USERS_IMPL & 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; + + SETTINGS_IMPL * settings; + TARIFFS * tariffs; + SERVICES & m_services; + STORE * store; + const ADMIN * sysAdmin; + STG_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; +}; +//----------------------------------------------------------------------------- +/*inline +void PROPERTY_NOTIFER_IP_BEFORE::Notify(const uint32_t & oldValue, + const uint32_t &) +{ +if (!oldValue) + return; + +//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; + +//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