mysql5/mysql-5.7.27/sql/auth/sql_authentication.h

142 lines
3.8 KiB
C++

#ifndef SQL_AUTHENTICATION_INCLUDED
#define SQL_AUTHENTICATION_INCLUDED
/* Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */
#include "my_global.h" // NO_EMBEDDED_ACCESS_CHECKS
#include "my_thread_local.h" // my_thread_id
#include <mysql/plugin_auth.h> // MYSQL_SERVER_AUTH_INFO
#include "sql_plugin_ref.h" // plugin_ref
/* Forward declarations */
class THD;
typedef struct charset_info_st CHARSET_INFO;
class ACL_USER;
class Protocol_classic;
typedef struct st_net NET;
/* Classes */
class Thd_charset_adapter
{
THD *thd;
public:
Thd_charset_adapter(THD *thd_arg) : thd (thd_arg) {}
bool init_client_charset(uint cs_number);
const CHARSET_INFO *charset();
};
/**
The internal version of what plugins know as MYSQL_PLUGIN_VIO,
basically the context of the authentication session
*/
struct MPVIO_EXT : public MYSQL_PLUGIN_VIO
{
MYSQL_SERVER_AUTH_INFO auth_info;
const ACL_USER *acl_user;
plugin_ref plugin; ///< what plugin we're under
LEX_STRING db; ///< db name from the handshake packet
/** when restarting a plugin this caches the last client reply */
struct {
const char *plugin, *pkt; ///< pointers into NET::buff
uint pkt_len;
} cached_client_reply;
/** this caches the first plugin packet for restart request on the client */
struct {
char *pkt;
uint pkt_len;
} cached_server_packet;
int packets_read, packets_written; ///< counters for send/received packets
/** when plugin returns a failure this tells us what really happened */
enum { SUCCESS, FAILURE, RESTART } status;
/* encapsulation members */
char *scramble;
MEM_ROOT *mem_root;
struct rand_struct *rand;
my_thread_id thread_id;
uint *server_status;
Protocol_classic *protocol;
ulong max_client_packet_length;
char *ip;
char *host;
Thd_charset_adapter *charset_adapter;
LEX_CSTRING acl_user_plugin;
int vio_is_encrypted;
bool can_authenticate();
};
#if defined(HAVE_OPENSSL)
#ifndef HAVE_YASSL
typedef struct rsa_st RSA;
class Rsa_authentication_keys
{
private:
RSA *m_public_key;
RSA *m_private_key;
int m_cipher_len;
char *m_pem_public_key;
void get_key_file_path(char *key, String *key_file_path);
bool read_key_file(RSA **key_ptr, bool is_priv_key, char **key_text_buffer);
public:
Rsa_authentication_keys();
~Rsa_authentication_keys()
{
}
void free_memory();
void *allocate_pem_buffer(size_t buffer_len);
RSA *get_private_key()
{
return m_private_key;
}
RSA *get_public_key()
{
return m_public_key;
}
int get_cipher_length();
bool read_rsa_keys();
const char *get_public_key_as_pem(void)
{
return m_pem_public_key;
}
};
#endif /* HAVE_YASSL */
#endif /* HAVE_OPENSSL */
/* Data Structures */
extern LEX_CSTRING native_password_plugin_name;
extern LEX_CSTRING sha256_password_plugin_name;
extern LEX_CSTRING validate_password_plugin_name;
extern LEX_CSTRING default_auth_plugin_name;
#ifndef NO_EMBEDDED_ACCESS_CHECKS
extern bool allow_all_hosts;
#endif /* NO_EMBEDDED_ACCESS_CHECKS */
extern plugin_ref native_password_plugin;
#endif /* SQL_AUTHENTICATION_INCLUDED */