1 | #pragma once |
2 | #include <Common/config.h> |
3 | #include <Poco/Net/TCPServerConnection.h> |
4 | #include <Common/getFQDNOrHostName.h> |
5 | #include <Core/MySQLProtocol.h> |
6 | #include "IServer.h" |
7 | |
8 | #if USE_POCO_NETSSL |
9 | #include <Poco/Net/SecureStreamSocket.h> |
10 | #endif |
11 | |
12 | namespace DB |
13 | { |
14 | /// Handler for MySQL wire protocol connections. Allows to connect to ClickHouse using MySQL client. |
15 | class MySQLHandler : public Poco::Net::TCPServerConnection |
16 | { |
17 | public: |
18 | MySQLHandler(IServer & server_, const Poco::Net::StreamSocket & socket_, bool ssl_enabled, size_t connection_id_); |
19 | |
20 | void run() final; |
21 | |
22 | private: |
23 | /// Enables SSL, if client requested. |
24 | void finishHandshake(MySQLProtocol::HandshakeResponse &); |
25 | |
26 | void comQuery(ReadBuffer & payload); |
27 | |
28 | void comFieldList(ReadBuffer & payload); |
29 | |
30 | void comPing(); |
31 | |
32 | void comInitDB(ReadBuffer & payload); |
33 | |
34 | void authenticate(const String & user_name, const String & auth_plugin_name, const String & auth_response); |
35 | |
36 | virtual void authPluginSSL(); |
37 | virtual void finishHandshakeSSL(size_t packet_size, char * buf, size_t pos, std::function<void(size_t)> read_bytes, MySQLProtocol::HandshakeResponse & packet); |
38 | |
39 | IServer & server; |
40 | |
41 | protected: |
42 | Poco::Logger * log; |
43 | |
44 | Context connection_context; |
45 | |
46 | std::shared_ptr<MySQLProtocol::PacketSender> packet_sender; |
47 | |
48 | private: |
49 | size_t connection_id = 0; |
50 | |
51 | size_t server_capability_flags = 0; |
52 | size_t client_capability_flags = 0; |
53 | |
54 | protected: |
55 | std::unique_ptr<MySQLProtocol::Authentication::IPlugin> auth_plugin; |
56 | |
57 | std::shared_ptr<ReadBuffer> in; |
58 | std::shared_ptr<WriteBuffer> out; |
59 | |
60 | bool secure_connection = false; |
61 | |
62 | private: |
63 | static const String show_table_status_replacement_query; |
64 | }; |
65 | |
66 | #if USE_SSL && USE_POCO_NETSSL |
67 | class MySQLHandlerSSL : public MySQLHandler |
68 | { |
69 | public: |
70 | MySQLHandlerSSL(IServer & server_, const Poco::Net::StreamSocket & socket_, bool ssl_enabled, size_t connection_id_, RSA & public_key_, RSA & private_key_); |
71 | |
72 | private: |
73 | void authPluginSSL() override; |
74 | void finishHandshakeSSL(size_t packet_size, char * buf, size_t pos, std::function<void(size_t)> read_bytes, MySQLProtocol::HandshakeResponse & packet) override; |
75 | |
76 | RSA & public_key; |
77 | RSA & private_key; |
78 | std::shared_ptr<Poco::Net::SecureStreamSocket> ss; |
79 | }; |
80 | #endif |
81 | |
82 | } |
83 | |