X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/4271ab433cd55bbd2612292bcf39e4dc3d7274f1..0907aa4037b12b6b88ee24495d4577a064d4f8db:/projects/stargazer/plugins/authorization/ao/ao.h diff --git a/projects/stargazer/plugins/authorization/ao/ao.h b/projects/stargazer/plugins/authorization/ao/ao.h new file mode 100644 index 00000000..dbb2993a --- /dev/null +++ b/projects/stargazer/plugins/authorization/ao/ao.h @@ -0,0 +1,157 @@ +/* + * 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 "stg/auth.h" +#include "stg/module_settings.h" +#include "stg/store.h" +#include "stg/notifer.h" +#include "stg/user_ips.h" +#include "stg/user.h" +#include "stg/logger.h" + +#include +#include +#include + +#include + +namespace STG +{ +struct Users; +} + +class AUTH_AO; + +using UserPtr = STG::User*; +using ConstUserPtr = const STG::User*; + +template +class CHG_BEFORE_NOTIFIER : public STG::PropertyNotifierBase { +public: + CHG_BEFORE_NOTIFIER(AUTH_AO & a, UserPtr u) + : user(u), auth(a) {} + CHG_BEFORE_NOTIFIER(const CHG_BEFORE_NOTIFIER & rvalue) + : user(rvalue.user), auth(rvalue.auth) {} + void Notify(const T & oldValue, const T & newValue); + UserPtr GetUser() const { return user; } + +private: + CHG_BEFORE_NOTIFIER & operator=(const CHG_BEFORE_NOTIFIER & rvalue); + + UserPtr user; + const AUTH_AO & auth; +}; +//----------------------------------------------------------------------------- +template +class CHG_AFTER_NOTIFIER : public STG::PropertyNotifierBase { +public: + CHG_AFTER_NOTIFIER(AUTH_AO & a, UserPtr u) + : user(u), auth(a) {} + CHG_AFTER_NOTIFIER(const CHG_AFTER_NOTIFIER & rvalue) + : user(rvalue.user), auth(rvalue.auth) {} + void Notify(const T & oldValue, const T & newValue); + UserPtr GetUser() const { return user; } + +private: + CHG_AFTER_NOTIFIER & operator=(const CHG_AFTER_NOTIFIER & rvalue); + + UserPtr user; + const AUTH_AO & auth; +}; +//----------------------------------------------------------------------------- +class AUTH_AO : public STG::Auth { +public: + AUTH_AO(); + + void SetUsers(STG::Users * u) override { users = u; } + + int Start() override; + int Stop() override; + int Reload(const STG::ModuleSettings & /*ms*/) override { return 0; } + bool IsRunning() override { return isRunning; } + void SetSettings(const STG::ModuleSettings &) override {} + int ParseSettings() override { return 0; } + const std::string & GetStrError() const override { return errorStr; } + std::string GetVersion() const override; + uint16_t GetStartPosition() const override { return 30; } + uint16_t GetStopPosition() const override { return 30; } + + int SendMessage(const STG::Message & msg, uint32_t ip) const override; + +private: + AUTH_AO(const AUTH_AO & rvalue); + AUTH_AO & operator=(const AUTH_AO & rvalue); + + void AddUser(UserPtr u); + void DelUser(UserPtr u); + + void GetUsers(); + void SetUserNotifiers(UserPtr u); + void UnSetUserNotifiers(UserPtr u); + void UpdateUserAuthorization(ConstUserPtr u) const; + + mutable std::string errorStr; + STG::Users * users; + std::vector userList; + bool isRunning; + STG::ModuleSettings settings; + + std::list > BeforeChgAONotifierList; + std::list > AfterChgAONotifierList; + + std::list > BeforeChgIPNotifierList; + std::list > AfterChgIPNotifierList; + + class ADD_USER_NONIFIER: public STG::NotifierBase { + public: + explicit ADD_USER_NONIFIER(AUTH_AO & a) : auth(a) {} + virtual ~ADD_USER_NONIFIER() {} + void Notify(const UserPtr & user) { auth.AddUser(user); } + + private: + ADD_USER_NONIFIER(const ADD_USER_NONIFIER & rvalue); + ADD_USER_NONIFIER & operator=(const ADD_USER_NONIFIER & rvalue); + + AUTH_AO & auth; + } onAddUserNotifier; + + class DEL_USER_NONIFIER: public STG::NotifierBase { + public: + explicit DEL_USER_NONIFIER(AUTH_AO & a) : auth(a) {} + virtual ~DEL_USER_NONIFIER() {} + void Notify(const UserPtr & user) { auth.DelUser(user); } + + private: + DEL_USER_NONIFIER(const DEL_USER_NONIFIER & rvalue); + DEL_USER_NONIFIER & operator=(const DEL_USER_NONIFIER & rvalue); + + AUTH_AO & auth; + } onDelUserNotifier; + + STG::PluginLogger logger; + + friend class CHG_BEFORE_NOTIFIER; + friend class CHG_AFTER_NOTIFIER; + friend class CHG_BEFORE_NOTIFIER; + friend class CHG_AFTER_NOTIFIER; + +};