#ifndef RESOURCES_H #define RESOURCES_H #include "../server/resource.h" namespace http::auth { /** * Класс пользователя, содержит логин/хеш_пароля/настройки пользователя/права. * Хеш пароля представляется в виде строки */ class User { private: uint32_t perms{}; public: const std::string username; std::string passwordHash; /** * Конструктор пользователя. По-умолчанию пользователь создается без прав, их нужно задать отдельной функцией. * @param username Имя пользователя, он же - логин. * @param passwordHash Хеш sha256 пароля пользователя. Если передать пустой, то пароль будет сгенерирован такой же, как и имя пользователя. */ explicit User(const std::string& username, const std::string& passwordHash = ""); /** * Конструктор пользователя с указанными правами. Аналогично первому конструктору. * @param username Имя пользователя, он же - логин. * @param passwordHash Хеш sha256 пароля пользователя. Если передать пустой, то пароль будет сгенерирован такой же, как и имя пользователя. * @param perms Права пользователя */ explicit User(const std::string& username, const std::string& passwordHash, uint32_t perms); /** * Проверить пароль на соответствие хешу * @param pass * @return */ bool checkPassword(const std::string& pass) const; /** * Установка пароля * @param pass строка с исходным паролем */ void setPassword(const std::string& pass); static constexpr uint32_t SUPERUSER = 0x0001; static constexpr uint32_t WATCH_STATISTICS = 0x0002; // мониторинг модема static constexpr uint32_t RESET_PACKET_STATISTICS = 0x0004; // сброс статистики пакетов static constexpr uint32_t WATCH_SETTINGS = 0x0008; // просмотр настроек , если недоступно, то вкладки с настройками не будет static constexpr uint32_t EDIT_SETTINGS = 0x0010; // редактирование настроек, установка параметров модулятора/демодулятора/dma/cinc static constexpr uint32_t UPDATE_FIRMWARE = 0x0020; // обновление прошивки static constexpr uint32_t SETUP_QOS = 0x0040; // управление профилем QoS static constexpr uint32_t DEVELOPER = 0x0080; // использование функций для разработчиков /** * Проверить, что у пользователя есть нужное право. Если это суперпользователь, то у него по умолчанию все права есть. * @param p набор прав, из констант данного класса. * @return */ bool checkPremisions(uint32_t p) const; void setPremisions(uint32_t p); void resetPremisions(uint32_t p); ~User(); }; /** * Класс аутентификации. Управляет всеми сессиями, создает новые при логине, удаляет при логауте. * @note Класс устанавливает заголовок 'Set-Cookie' в ответе, и этот заголовок должен дойти до пользователя! */ class AuthProvider { void updateSessionHook(); public: AuthProvider(); /** * Авторизовать пользователя. * * @param req * @param rep * @return true, в случае успешной авторизации */ std::shared_ptr doAuth(const std::string &username, const std::string &password, const server::Request &req, server::Reply &rep); std::vector> users; std::shared_ptr getSession(const server::Request &req, server::Reply &rep); ~AuthProvider(); }; class AuthRequiredResource final: public resource::BasicResource { public: explicit AuthRequiredResource(const std::string& path, AuthProvider& provider, resource::respGenerator generator); explicit AuthRequiredResource(const std::string& path, AuthProvider& provider, uint32_t perms, resource::respGenerator generator); void handle(const server::Request &req, server::Reply &rep) override; ~AuthRequiredResource() override; private: AuthProvider& provider_; resource::respGenerator generator_; uint32_t perms; }; } #endif //RESOURCES_H