//! \addtogroup HTTPServer
//! \~\file pihttpserverbasicauth.h
//! \brief HTTP server with per-route HTTP Basic authentication
//! \~english HTTP server with per-route HTTP Basic authentication
//! \~russian HTTP-сервер с HTTP Basic-аутентификацией по маршрутам
/*
PIP - Platform Independent Primitives
HTTP server with per-route HTTP Basic authentication
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see .
*/
#ifndef PIHTTPSERVERBASICAUTH_H
#define PIHTTPSERVERBASICAUTH_H
#include "pihttpserverprotected.h"
//! \~\ingroup HTTPServer
//! \~\brief
//! \~english Protected HTTP server that checks the \c Authorization header with the Basic scheme
//! and an external credential validator.
//! \~russian Защищенный HTTP-сервер, проверяющий заголовок \c Authorization со схемой Basic
//! и внешним валидатором учетных данных.
class PIP_HTTP_SERVER_EXPORT PIHTTPServerBasicAuth: public PIHTTPServerProtected {
PIOBJECT_SUBCLASS(PIHTTPServerBasicAuth, PIHTTPServerProtected)
public:
//! \~english Creates a Basic-auth server with the default realm.
//! \~russian Создает сервер Basic-аутентификации с realm по умолчанию.
PIHTTPServerBasicAuth();
//! \~english Destroys the server.
//! \~russian Удаляет сервер.
virtual ~PIHTTPServerBasicAuth() = default;
//! \~english Sets the credential validator: receives the parsed Basic-auth login and pass and
//! returns the \c AuthInfo of the request. The access is denied when the validator returns
//! an \c AuthInfo with \c authorized \c false.
//! \~russian Устанавливает валидатор учетных данных: получает разобранного логин и пароль
//! Basic-аутентификации и возвращает \c AuthInfo запроса. Доступ запрещается, когда валидатор
//! возвращает \c AuthInfo с \c authorized \c false.
void setBasicAuthCallback(std::function c) { callback_auth = std::move(c); }
//! \~english Sets the realm used in the \c WWW-Authenticate challenge (default \c "Restricted").
//! \~russian Устанавливает realm, используемый в challenge \c WWW-Authenticate (по умолчанию \c "Restricted").
void setRealm(const PIString & r) { auth_realm = r; }
//! \~english Returns the realm used in the \c WWW-Authenticate challenge.
//! \~russian Возвращает realm, используемый в challenge \c WWW-Authenticate.
const PIString & realm() const { return auth_realm; }
//! \~english Returns whether a credential validator is set.
//! \~russian Возвращает, установлен ли валидатор учетных данных.
bool hasBasicAuthCallback() const { return static_cast(callback_auth); }
protected:
//! \~english Parses the Basic-scheme \c Authorization header and resolves the user with the
//! credential validator set by \a setBasicAuthCallback().
//! \~russian Разбирает заголовок \c Authorization со схемой Basic и разрешает пользователя
//! валидатором учетных данных, установленным \a setBasicAuthCallback().
PIHTTP::AuthInfo authenticate(const PIHTTP::MessageConst & request) override;
//! \~english Reply produced when \a authenticate() denies access:
//! \c 401 Unauthorized with a \c WWW-Authenticate header advertising the Basic scheme.
//! \~russian Ответ, создаваемый при отказе \a authenticate():
//! \c 401 Unauthorized с заголовком \c WWW-Authenticate, объявляющим схему Basic.
PIHTTP::MessageMutable accessDeniedReply(const PIHTTP::MessageConst & request) override;
private:
std::function callback_auth;
PIString auth_realm;
};
#endif