MySQL 9.3.0
Source Code Documentation
session_manager.h
Go to the documentation of this file.
1/*
2 Copyright (c) 2021, 2025, Oracle and/or its affiliates.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License, version 2.0,
6 as published by the Free Software Foundation.
7
8 This program is designed to work with certain software (including
9 but not limited to OpenSSL) that is licensed under separate terms,
10 as designated in a particular file or component or in included license
11 documentation. The authors of MySQL hereby grant you an additional
12 permission to link the program and your derivative works with the
13 separately licensed software that they have either included with
14 the program or referenced in the documentation.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 */
25
26#ifndef ROUTER_SRC_REST_MRS_SRC_MRS_REST_SESSION_MANAGER_H_
27#define ROUTER_SRC_REST_MRS_SRC_MRS_REST_SESSION_MANAGER_H_
28
29#include <chrono>
30#include <memory>
31#include <mutex>
32#include <optional>
33#include <type_traits>
34#include <vector>
35
38
39namespace mrs {
40
41// The following timeout constants are expressed in minutes.
42const uint64_t k_maximum_expire_timeout{43200};
43const uint64_t k_maximum_inactivity_timeout{43200};
44const uint64_t k_defulat_expire_timeout{15};
45
46namespace http {
47
49 public:
51 using SessionId = std::string;
52 using system_clock = std::chrono::system_clock;
55
57 public:
59 std::optional<minutes> inactivity_timeout{};
60 };
61
63
64 class Session {
65 public:
67 public:
68 virtual ~SessionData() = default;
70 };
71
72 enum State {
78 };
79
80 public:
81 Session(const SessionId id, const AuthorizationHandlerId &authorization,
82 const std::string &holder_name);
83
84 template <typename Derived>
85 Derived *get_data() const {
87
88 return dynamic_cast<Derived *>(data_.get());
89 }
90
91 void set_data(SessionData *data) {
92 data_.reset(data);
93 data_->internal_session = this;
94 }
95
96 void set_data(std::unique_ptr<SessionData> &&data) {
97 data_ = std::move(data);
98 data_->internal_session = this;
99 }
100
103 }
104
105 const SessionId &get_session_id() const { return id_; }
106
107 const std::string &get_holder_name() const { return holder_name_; }
108
109 system_clock::time_point get_access_time() const { return access_time_; }
110 system_clock::time_point get_create_time() const { return create_time_; }
111
112 system_clock::time_point update_access_time() {
113 return access_time_ = system_clock::now();
114 }
115
116 bool has_access_timeout(system_clock::duration timeout) const {
117 return access_time_ + timeout <= system_clock::now();
118 }
119
120 bool is_expired(system_clock::duration timeout) const {
121 return create_time_ + timeout <= system_clock::now();
122 }
123
124 bool generate_token{false};
126 std::optional<std::string> users_on_complete_url_redirection;
128 std::string handler_name;
131 std::string proto;
132 std::string host;
133
134 private:
135 std::unique_ptr<SessionData> data_;
137 system_clock::time_point access_time_;
138 system_clock::time_point create_time_;
140 std::string holder_name_;
141 };
142
143 using SessionPtr = std::shared_ptr<Session>;
144
145 public:
147
148 void configure(const Configuration &config);
149
153 const std::string &holder_name);
154 SessionPtr new_session(const SessionId &session_id);
155
156 template <class Generator>
157 void set_unique_session_secondary_id(Session *session, const Generator &g) {
158 std::lock_guard<std::mutex> lck{mutex_};
159 std::string id;
160 do {
161 id = g();
163
164 session->handler_secondary_id = id;
165 }
166
167 void remove_session(const Session::SessionData *session_data);
168 bool remove_session(const SessionPtr &session);
169 bool remove_session(const SessionId session);
170 void remove_timeouted();
171
172 private:
173 bool remove_session_impl(const Session *session);
174 // Methods with postfix "_impl" at end of method name, marks that the methods
175 // doesn't use mutexes, thus it should be used after locking `mutex_` object.
178
181 void remove_inactive_impl(const system_clock::time_point &now);
182 void remove_expired_impl(const system_clock::time_point &now);
183
184 std::vector<SessionPtr> sessions_;
185 std::mutex mutex_;
186 system_clock::time_point oldest_inactive_session_;
187 system_clock::time_point oldest_session_;
189};
190
191} // namespace http
192} // namespace mrs
193
194#endif // ROUTER_SRC_REST_MRS_SRC_MRS_REST_SESSION_MANAGER_H_
Definition: session_manager.h:56
minutes expire_timeout
Definition: session_manager.h:58
std::optional< minutes > inactivity_timeout
Definition: session_manager.h:59
Definition: session_manager.h:66
Session * internal_session
Definition: session_manager.h:69
Definition: session_manager.h:64
std::unique_ptr< SessionData > data_
Definition: session_manager.h:135
bool generate_token
Definition: session_manager.h:124
Derived * get_data() const
Definition: session_manager.h:85
system_clock::time_point get_create_time() const
Definition: session_manager.h:110
system_clock::time_point update_access_time()
Definition: session_manager.h:112
AuthorizationHandlerId get_authorization_handler_id() const
Definition: session_manager.h:101
std::string users_on_complete_timeout
Definition: session_manager.h:127
system_clock::time_point create_time_
Definition: session_manager.h:138
std::string host
Definition: session_manager.h:132
const std::string & get_holder_name() const
Definition: session_manager.h:107
State
Definition: session_manager.h:72
@ kUserVerified
Definition: session_manager.h:77
@ kWaitingForCode
Definition: session_manager.h:74
@ kUninitialized
Definition: session_manager.h:73
@ kTokenVerified
Definition: session_manager.h:76
@ kGettingTokken
Definition: session_manager.h:75
system_clock::time_point access_time_
Definition: session_manager.h:137
bool is_expired(system_clock::duration timeout) const
Definition: session_manager.h:120
State state
Definition: session_manager.h:125
std::string holder_name_
Definition: session_manager.h:140
SessionId id_
Definition: session_manager.h:136
const SessionId & get_session_id() const
Definition: session_manager.h:105
void set_data(SessionData *data)
Definition: session_manager.h:91
Session(const SessionId id, const AuthorizationHandlerId &authorization, const std::string &holder_name)
Definition: session_manager.cc:43
void set_data(std::unique_ptr< SessionData > &&data)
Definition: session_manager.h:96
bool has_access_timeout(system_clock::duration timeout) const
Definition: session_manager.h:116
AuthorizationHandlerId authorization_handler_id_
Definition: session_manager.h:139
std::string handler_secondary_id
Definition: session_manager.h:129
AuthUser user
Definition: session_manager.h:130
std::optional< std::string > users_on_complete_url_redirection
Definition: session_manager.h:126
system_clock::time_point get_access_time() const
Definition: session_manager.h:109
std::string handler_name
Definition: session_manager.h:128
std::string proto
Definition: session_manager.h:131
Definition: session_manager.h:48
system_clock::time_point oldest_session_
Definition: session_manager.h:187
std::chrono::system_clock system_clock
Definition: session_manager.h:52
std::string SessionId
Definition: session_manager.h:51
system_clock::time_point oldest_inactive_session_
Definition: session_manager.h:186
Allocation
Definition: session_manager.h:62
@ OnlyExisting
Definition: session_manager.h:62
@ CreateWhenNotExisting
Definition: session_manager.h:62
std::chrono::minutes minutes
Definition: session_manager.h:54
SessionPtr get_session_handler_specific_id_impl(const SessionId &id)
Definition: session_manager.cc:138
std::shared_ptr< Session > SessionPtr
Definition: session_manager.h:143
bool remove_session_impl(const Session *session)
Definition: session_manager.cc:124
void remove_timeouted()
Definition: session_manager.cc:110
void remove_expired_impl(const system_clock::time_point &now)
Definition: session_manager.cc:202
SessionManager()
Definition: session_manager.cc:52
void remove_session(const Session::SessionData *session_data)
Definition: session_manager.cc:115
SessionPtr new_session(const AuthorizationHandlerId id, const std::string &holder_name)
Definition: session_manager.cc:61
mrs::database::entry::UniversalId AuthorizationHandlerId
Definition: session_manager.h:53
std::mutex mutex_
Definition: session_manager.h:185
SessionPtr get_session_secondary_id(const SessionId &id)
Definition: session_manager.cc:77
void remove_timeouted_impl()
Definition: session_manager.cc:172
SessionPtr get_session_impl(const SessionId &id)
Definition: session_manager.cc:151
void set_unique_session_secondary_id(Session *session, const Generator &g)
Definition: session_manager.h:157
void remove_inactive_impl(const system_clock::time_point &now)
Definition: session_manager.cc:180
void configure(const Configuration &config)
Definition: session_manager.cc:56
mrs::database::entry::AuthUser AuthUser
Definition: session_manager.h:50
Configuration config_
Definition: session_manager.h:188
std::vector< SessionPtr > sessions_
Definition: session_manager.h:184
SessionId generate_session_id_impl()
Definition: session_manager.cc:163
SessionPtr get_session(const SessionId &id)
Definition: session_manager.cc:84
Definition: connection.h:55
static bool timeout(bool(*wait_condition)())
Timeout function.
Definition: log0meb.cc:498
std::chrono::minutes minutes
Definition: authorize_manager.cc:70
mrs::database::entry::AuthUser AuthUser
Definition: scram_handler.cc:54
ValueType value(const std::optional< ValueType > &v)
Definition: gtid.h:83
SessionManager::SessionPtr SessionPtr
Definition: session_manager.cc:41
Definition: authorize_manager.h:48
const uint64_t k_maximum_expire_timeout
Definition: session_manager.h:42
const uint64_t k_maximum_inactivity_timeout
Definition: session_manager.h:43
const uint64_t k_defulat_expire_timeout
Definition: session_manager.h:44
mrs::database::entry::UniversalId UniversalId
Definition: universal_id.h:33
unsigned long id[MAX_DEAD]
Definition: xcom_base.cc:510