112 lines
5.2 KiB
C++
112 lines
5.2 KiB
C++
#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<http::auth::User> doAuth(const std::string &username, const std::string &password, const server::Request &req, server::Reply &rep);
|
||
|
||
std::vector<std::shared_ptr<User>> users;
|
||
|
||
std::shared_ptr<User> 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
|