2021-03-05 14:57:16 +00:00
|
|
|
#pragma once
|
|
|
|
|
2021-08-01 14:12:34 +00:00
|
|
|
#include <Common/SettingsChanges.h>
|
2021-11-01 14:03:20 +00:00
|
|
|
#include <Access/Common/AuthenticationData.h>
|
2021-03-05 14:57:16 +00:00
|
|
|
#include <Interpreters/ClientInfo.h>
|
2021-08-01 14:12:34 +00:00
|
|
|
#include <Interpreters/Context_fwd.h>
|
2021-03-05 14:57:16 +00:00
|
|
|
|
|
|
|
#include <chrono>
|
|
|
|
#include <memory>
|
|
|
|
#include <optional>
|
|
|
|
|
|
|
|
namespace Poco::Net { class SocketAddress; }
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
class Credentials;
|
2021-11-01 14:03:20 +00:00
|
|
|
class AuthenticationData;
|
2021-03-05 14:57:16 +00:00
|
|
|
struct NamedSessionData;
|
|
|
|
class NamedSessionsStorage;
|
2021-08-01 14:12:34 +00:00
|
|
|
struct User;
|
|
|
|
using UserPtr = std::shared_ptr<const User>;
|
2021-03-05 14:57:16 +00:00
|
|
|
class SessionLog;
|
2021-03-05 14:57:16 +00:00
|
|
|
|
|
|
|
/** Represents user-session from the server perspective,
|
|
|
|
* basically it is just a smaller subset of Context API, simplifies Context management.
|
|
|
|
*
|
|
|
|
* Holds session context, facilitates acquisition of NamedSession and proper creation of query contexts.
|
|
|
|
*/
|
|
|
|
class Session
|
|
|
|
{
|
|
|
|
public:
|
2021-08-19 14:09:44 +00:00
|
|
|
/// Stops using named sessions. The method must be called at the server shutdown.
|
|
|
|
static void shutdownNamedSessions();
|
2021-03-05 14:57:16 +00:00
|
|
|
|
2022-03-28 13:25:47 +00:00
|
|
|
Session(const ContextPtr & global_context_, ClientInfo::Interface interface_, bool is_secure = false);
|
2021-08-01 14:12:34 +00:00
|
|
|
~Session();
|
2021-03-05 14:57:16 +00:00
|
|
|
|
2021-10-20 09:45:32 +00:00
|
|
|
Session(const Session &&) = delete;
|
2022-01-16 05:12:55 +00:00
|
|
|
Session & operator=(const Session &&) = delete;
|
2021-03-05 14:57:16 +00:00
|
|
|
Session(const Session &) = delete;
|
2022-01-16 05:12:55 +00:00
|
|
|
Session & operator=(const Session &) = delete;
|
2021-03-05 14:57:16 +00:00
|
|
|
|
2021-08-01 14:12:34 +00:00
|
|
|
/// Provides information about the authentication type of a specified user.
|
2021-11-01 14:03:20 +00:00
|
|
|
AuthenticationType getAuthenticationType(const String & user_name) const;
|
2021-08-24 07:09:13 +00:00
|
|
|
|
2021-03-05 14:57:16 +00:00
|
|
|
/// Same as getAuthenticationType, but adds LoginFailure event in case of error.
|
2021-11-01 14:03:20 +00:00
|
|
|
AuthenticationType getAuthenticationTypeOrLogInFailure(const String & user_name) const;
|
2021-03-05 14:57:16 +00:00
|
|
|
|
2021-08-01 14:12:34 +00:00
|
|
|
/// Sets the current user, checks the credentials and that the specified address is allowed to connect from.
|
|
|
|
/// The function throws an exception if there is no such user or password is wrong.
|
|
|
|
void authenticate(const String & user_name, const String & password, const Poco::Net::SocketAddress & address);
|
|
|
|
void authenticate(const Credentials & credentials_, const Poco::Net::SocketAddress & address_);
|
2021-03-05 14:57:16 +00:00
|
|
|
|
2022-05-17 16:22:52 +00:00
|
|
|
/// Special method for authentication through "interserver secret" without a user
|
|
|
|
void authenticateInterserverFake();
|
|
|
|
|
|
|
|
/// Writes a row about login failure into session log (if enabled)
|
|
|
|
void onAuthenticationFailure(const Credentials & credentials_, const Exception & e);
|
|
|
|
|
2021-08-01 14:12:34 +00:00
|
|
|
/// Returns a reference to session ClientInfo.
|
|
|
|
ClientInfo & getClientInfo();
|
|
|
|
const ClientInfo & getClientInfo() const;
|
2021-03-05 14:57:16 +00:00
|
|
|
|
2021-08-01 14:12:34 +00:00
|
|
|
/// Makes a session context, can be used one or zero times.
|
|
|
|
/// The function also assigns an user to this context.
|
|
|
|
ContextMutablePtr makeSessionContext();
|
2021-03-05 14:57:16 +00:00
|
|
|
ContextMutablePtr makeSessionContext(const String & session_name_, std::chrono::steady_clock::duration timeout_, bool session_check_);
|
2021-08-01 14:12:34 +00:00
|
|
|
ContextMutablePtr sessionContext() { return session_context; }
|
|
|
|
ContextPtr sessionContext() const { return session_context; }
|
2021-03-05 14:57:16 +00:00
|
|
|
|
2021-08-01 14:12:34 +00:00
|
|
|
/// Makes a query context, can be used multiple times, with or without makeSession() called earlier.
|
|
|
|
/// The query context will be created from a copy of a session context if it exists, or from a copy of
|
|
|
|
/// a global context otherwise. In the latter case the function also assigns an user to this context.
|
|
|
|
ContextMutablePtr makeQueryContext() const { return makeQueryContext(getClientInfo()); }
|
|
|
|
ContextMutablePtr makeQueryContext(const ClientInfo & query_client_info) const;
|
|
|
|
ContextMutablePtr makeQueryContext(ClientInfo && query_client_info) const;
|
2021-03-05 14:57:16 +00:00
|
|
|
|
2021-10-10 14:32:01 +00:00
|
|
|
/// Releases the currently used session ID so it becomes available for reuse by another session.
|
|
|
|
void releaseSessionID();
|
|
|
|
|
2021-08-01 14:12:34 +00:00
|
|
|
private:
|
2021-03-05 14:57:16 +00:00
|
|
|
std::shared_ptr<SessionLog> getSessionLog() const;
|
2021-08-01 14:12:34 +00:00
|
|
|
ContextMutablePtr makeQueryContextImpl(const ClientInfo * client_info_to_copy, ClientInfo * client_info_to_move) const;
|
2021-03-05 14:57:16 +00:00
|
|
|
|
2021-03-05 14:57:16 +00:00
|
|
|
mutable bool notified_session_log_about_login = false;
|
2021-10-30 14:51:58 +00:00
|
|
|
const UUID auth_id;
|
2021-08-01 14:12:34 +00:00
|
|
|
const ContextPtr global_context;
|
2021-11-03 13:14:40 +00:00
|
|
|
const ClientInfo::Interface interface;
|
2021-03-05 14:57:16 +00:00
|
|
|
|
2021-08-01 14:12:34 +00:00
|
|
|
/// ClientInfo that will be copied to a session context when it's created.
|
|
|
|
std::optional<ClientInfo> prepared_client_info;
|
2021-03-05 14:57:16 +00:00
|
|
|
|
2021-08-01 14:12:34 +00:00
|
|
|
mutable UserPtr user;
|
|
|
|
std::optional<UUID> user_id;
|
2022-05-17 16:22:52 +00:00
|
|
|
bool is_internal_interserver_query = false;
|
2021-03-05 14:57:16 +00:00
|
|
|
|
|
|
|
ContextMutablePtr session_context;
|
2021-08-01 14:12:34 +00:00
|
|
|
mutable bool query_context_created = false;
|
|
|
|
|
2021-03-05 14:57:16 +00:00
|
|
|
std::shared_ptr<NamedSessionData> named_session;
|
2021-08-01 14:12:34 +00:00
|
|
|
bool named_session_created = false;
|
2021-10-19 12:54:28 +00:00
|
|
|
|
|
|
|
Poco::Logger * log = nullptr;
|
2021-03-05 14:57:16 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|