9#include <botan/tls_session_manager_hybrid.h>
11#include <botan/assert.h>
19 const std::shared_ptr<Credentials_Manager>& credentials_manager,
20 const std::shared_ptr<RandomNumberGenerator>& rng,
21 bool prefer_tickets) :
23 m_stateful(std::move(stateful)),
24 m_stateless(credentials_manager, rng),
25 m_prefer_tickets(prefer_tickets) {
30 const std::optional<Session_ID>&
id,
31 bool tls12_no_ticket) {
32 auto create_ticket = [&]() -> std::optional<Session_Handle> {
37 auto ticket_handle = m_stateless.establish(session,
id,
false );
39 ticket_handle->is_ticket(),
40 "Session_Manager_Stateless produced unexpected Session_Handle");
44 auto create_id = [&] {
49 id_handle.has_value(), id_handle->is_id(),
"Session_Manager_In_Memory produced unexpected Session_Handle");
53 std::function preferred = create_ticket;
54 std::function fallback = create_id;
56 if(!m_prefer_tickets) {
57 std::swap(preferred, fallback);
60 if(
auto result = preferred()) {
70 std::reference_wrapper<Session_Manager> preferred = m_stateless;
71 std::reference_wrapper<Session_Manager> fallback = *m_stateful;
73 if(!m_prefer_tickets) {
74 std::swap(preferred, fallback);
77 if(
auto session = preferred.get().retrieve(handle, callbacks, policy)) {
81 return fallback.get().retrieve(handle, callbacks, policy);
85 return m_stateless.emits_session_tickets() || m_stateful->emits_session_tickets();
#define BOTAN_ASSERT_NONNULL(ptr)
#define BOTAN_ASSERT_IMPLICATION(expr1, expr2, msg)
#define BOTAN_ASSERT(expr, assertion_made)
bool is_pre_tls_13() const
Protocol_Version version() const
Helper class to embody a session handle in all protocol versions.
std::optional< Session > retrieve(const Session_Handle &handle, Callbacks &callbacks, const Policy &policy) override
Retrieves a specific session given a handle.
std::optional< Session > retrieve_one(const Session_Handle &handle) override
Internal retrieval function for a single session.
bool emits_session_tickets() override
Session_Manager_Hybrid(std::unique_ptr< Session_Manager > stateful_manager, const std::shared_ptr< Credentials_Manager > &credentials_manager, const std::shared_ptr< RandomNumberGenerator > &rng, bool prefer_tickets=true)
std::vector< Session_with_Handle > find_some(const Server_Information &info, size_t max_sessions_hint) override
Internal retrieval function to find sessions to resume.
std::optional< Session_Handle > establish(const Session &session, const std::optional< Session_ID > &id=std::nullopt, bool tls12_no_ticket=false) override
Save a new Session and assign a Session_Handle (TLS Server)
BOTAN_FUTURE_EXPLICIT Session_Manager(const std::shared_ptr< RandomNumberGenerator > &rng)