userver: userver/server/handlers/auth/digest/standalone_checker.hpp Source File
Loading...
Searching...
No Matches
standalone_checker.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/server/handlers/auth/digest/standalone_checker.hpp
4/// @brief @copybrief server::handlers::auth::digest::AuthStandaloneCheckerBase
5
6#include <chrono>
7#include <cstdint>
8#include <functional>
9#include <random>
10#include <string_view>
11
12#include <userver/cache/expirable_lru_cache.hpp>
13#include <userver/concurrent/mpsc_queue.hpp>
14#include <userver/concurrent/variable.hpp>
15#include <userver/crypto/hash.hpp>
16#include <userver/rcu/rcu_map.hpp>
17#include <userver/server/handlers/auth/digest/auth_checker_base.hpp>
18#include <userver/server/handlers/auth/digest/auth_checker_settings.hpp>
19#include <userver/server/handlers/auth/digest/directives_parser.hpp>
20#include <userver/server/handlers/auth/digest/nonce_cache_settings_component.hpp>
21#include <userver/server/http/http_request.hpp>
22#include <userver/server/http/http_response.hpp>
23#include <userver/server/http/http_status.hpp>
24#include <userver/server/request/request_context.hpp>
25
26USERVER_NAMESPACE_BEGIN
27
28namespace server::handlers::auth::digest {
29
30struct NonceInfo final {
31 NonceInfo();
32 NonceInfo(const std::string& nonce, TimePoint expiration_time, std::int64_t nonce_count);
33 std::string nonce;
34 TimePoint expiration_time;
35 std::int64_t nonce_count;
36};
37
38/// @ingroup userver_base_classes
39///
40/// @brief Class for digest authentication checker. Implements a stand-alone
41/// digest-authentication logic.
43public:
44 AuthStandaloneCheckerBase(
45 const AuthCheckerSettings& digest_settings,
46 std::string&& realm,
47 const SecdistConfig& secdist_config,
48 const NonceCacheSettings& nonce_cache_settings
49 );
50
51 /// @brief Compatibility overload accepting nonce-cache geometry directly.
53 const AuthCheckerSettings& digest_settings,
54 std::string&& realm,
55 const SecdistConfig& secdist_config,
56 std::size_t ways,
57 std::size_t way_size
58 );
59
60 [[nodiscard]] bool SupportsUserAuth() const noexcept override { return true; }
61
62 std::optional<UserData> FetchUserData(const std::string& username) const override;
64 const std::string& username,
65 const std::string& nonce,
66 std::int64_t nonce_count,
67 TimePoint nonce_creation_time
68 ) const override;
69
70 void PushUnnamedNonce(std::string nonce) const override;
71 std::optional<TimePoint> GetUnnamedNonceCreationTime(const std::string& nonce) const override;
72
73 virtual std::optional<UserData::HA1> GetHA1(std::string_view username) const = 0;
74
75private:
76 using NonceCache = cache::ExpirableLruCache<std::string, TimePoint>;
77 // potentially we store ALL user's data
78 // great chance to occupy large block of memory
79 mutable rcu::RcuMap<std::string, concurrent::Variable<NonceInfo>> user_data_;
80 // cache for "unnamed" nonces,
81 // i.e initial nonces not tied to any user
82 mutable NonceCache unnamed_nonces_;
83};
84
85} // namespace server::handlers::auth::digest
86
87USERVER_NAMESPACE_END