Commit 0877eff4 authored by Sergei Golubchik's avatar Sergei Golubchik

thd_rnd service

parent 6305533d
...@@ -219,6 +219,12 @@ extern struct thd_autoinc_service_st { ...@@ -219,6 +219,12 @@ extern struct thd_autoinc_service_st {
} *thd_autoinc_service; } *thd_autoinc_service;
void thd_get_autoinc(const void* thd, void thd_get_autoinc(const void* thd,
unsigned long* off, unsigned long* inc); unsigned long* off, unsigned long* inc);
extern struct thd_rnd_service_st {
double (*thd_rnd_ptr)(void* thd);
void (*thd_c_r_p_ptr)(void* thd, char *to, size_t length);
} *thd_rnd_service;
double thd_rnd(void* thd);
void thd_create_random_password(void* thd, char *to, size_t length);
extern struct thd_error_context_service_st { extern struct thd_error_context_service_st {
const char *(*thd_get_error_message_func)(const void* thd); const char *(*thd_get_error_message_func)(const void* thd);
unsigned int (*thd_get_error_number_func)(const void* thd); unsigned int (*thd_get_error_number_func)(const void* thd);
......
...@@ -219,6 +219,12 @@ extern struct thd_autoinc_service_st { ...@@ -219,6 +219,12 @@ extern struct thd_autoinc_service_st {
} *thd_autoinc_service; } *thd_autoinc_service;
void thd_get_autoinc(const void* thd, void thd_get_autoinc(const void* thd,
unsigned long* off, unsigned long* inc); unsigned long* off, unsigned long* inc);
extern struct thd_rnd_service_st {
double (*thd_rnd_ptr)(void* thd);
void (*thd_c_r_p_ptr)(void* thd, char *to, size_t length);
} *thd_rnd_service;
double thd_rnd(void* thd);
void thd_create_random_password(void* thd, char *to, size_t length);
extern struct thd_error_context_service_st { extern struct thd_error_context_service_st {
const char *(*thd_get_error_message_func)(const void* thd); const char *(*thd_get_error_message_func)(const void* thd);
unsigned int (*thd_get_error_number_func)(const void* thd); unsigned int (*thd_get_error_number_func)(const void* thd);
......
...@@ -219,6 +219,12 @@ extern struct thd_autoinc_service_st { ...@@ -219,6 +219,12 @@ extern struct thd_autoinc_service_st {
} *thd_autoinc_service; } *thd_autoinc_service;
void thd_get_autoinc(const void* thd, void thd_get_autoinc(const void* thd,
unsigned long* off, unsigned long* inc); unsigned long* off, unsigned long* inc);
extern struct thd_rnd_service_st {
double (*thd_rnd_ptr)(void* thd);
void (*thd_c_r_p_ptr)(void* thd, char *to, size_t length);
} *thd_rnd_service;
double thd_rnd(void* thd);
void thd_create_random_password(void* thd, char *to, size_t length);
extern struct thd_error_context_service_st { extern struct thd_error_context_service_st {
const char *(*thd_get_error_message_func)(const void* thd); const char *(*thd_get_error_message_func)(const void* thd);
unsigned int (*thd_get_error_number_func)(const void* thd); unsigned int (*thd_get_error_number_func)(const void* thd);
......
...@@ -219,6 +219,12 @@ extern struct thd_autoinc_service_st { ...@@ -219,6 +219,12 @@ extern struct thd_autoinc_service_st {
} *thd_autoinc_service; } *thd_autoinc_service;
void thd_get_autoinc(const void* thd, void thd_get_autoinc(const void* thd,
unsigned long* off, unsigned long* inc); unsigned long* off, unsigned long* inc);
extern struct thd_rnd_service_st {
double (*thd_rnd_ptr)(void* thd);
void (*thd_c_r_p_ptr)(void* thd, char *to, size_t length);
} *thd_rnd_service;
double thd_rnd(void* thd);
void thd_create_random_password(void* thd, char *to, size_t length);
extern struct thd_error_context_service_st { extern struct thd_error_context_service_st {
const char *(*thd_get_error_message_func)(const void* thd); const char *(*thd_get_error_message_func)(const void* thd);
unsigned int (*thd_get_error_number_func)(const void* thd); unsigned int (*thd_get_error_number_func)(const void* thd);
......
...@@ -219,6 +219,12 @@ extern struct thd_autoinc_service_st { ...@@ -219,6 +219,12 @@ extern struct thd_autoinc_service_st {
} *thd_autoinc_service; } *thd_autoinc_service;
void thd_get_autoinc(const void* thd, void thd_get_autoinc(const void* thd,
unsigned long* off, unsigned long* inc); unsigned long* off, unsigned long* inc);
extern struct thd_rnd_service_st {
double (*thd_rnd_ptr)(void* thd);
void (*thd_c_r_p_ptr)(void* thd, char *to, size_t length);
} *thd_rnd_service;
double thd_rnd(void* thd);
void thd_create_random_password(void* thd, char *to, size_t length);
extern struct thd_error_context_service_st { extern struct thd_error_context_service_st {
const char *(*thd_get_error_message_func)(const void* thd); const char *(*thd_get_error_message_func)(const void* thd);
unsigned int (*thd_get_error_number_func)(const void* thd); unsigned int (*thd_get_error_number_func)(const void* thd);
......
#ifndef MYSQL_SERVICE_THD_RND_INCLUDED
/* Copyright (C) 2017 MariaDB Corporation
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, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
/**
@file
This service provides access to the thd-local random number generator.
It's preferrable over the global one, because concurrent threads
can generate random numbers without fighting each other over the access
to the shared rnd state.
*/
#ifdef __cplusplus
extern "C" {
#endif
#ifndef MYSQL_ABI_CHECK
#include <stdlib.h>
#endif
extern struct thd_rnd_service_st {
double (*thd_rnd_ptr)(MYSQL_THD thd);
void (*thd_c_r_p_ptr)(MYSQL_THD thd, char *to, size_t length);
} *thd_rnd_service;
#ifdef MYSQL_DYNAMIC_PLUGIN
#define thd_rnd(A) thd_rnd_service->thd_rnd_ptr(A)
#define thd_create_random_password(A,B,C) thd_rnd_service->thd_c_r_p_ptr(A,B,C)
#else
double thd_rnd(MYSQL_THD thd);
/**
Generate string of printable random characters of requested length.
@param to[out] Buffer for generation; must be at least length+1 bytes
long; result string is always null-terminated
@param length[in] How many random characters to put in buffer
*/
void thd_create_random_password(MYSQL_THD thd, char *to, size_t length);
#endif
#ifdef __cplusplus
}
#endif
#define MYSQL_SERVICE_THD_RND_INCLUDED
#endif
...@@ -32,6 +32,7 @@ extern "C" { ...@@ -32,6 +32,7 @@ extern "C" {
#include <mysql/service_base64.h> #include <mysql/service_base64.h>
#include <mysql/service_logger.h> #include <mysql/service_logger.h>
#include <mysql/service_thd_autoinc.h> #include <mysql/service_thd_autoinc.h>
#include <mysql/service_thd_rnd.h>
#include <mysql/service_thd_error_context.h> #include <mysql/service_thd_error_context.h>
#include <mysql/service_thd_specifics.h> #include <mysql/service_thd_specifics.h>
#include <mysql/service_encryption.h> #include <mysql/service_encryption.h>
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#define VERSION_wsrep 0x0201 #define VERSION_wsrep 0x0201
#define VERSION_logger 0x0100 #define VERSION_logger 0x0100
#define VERSION_base64 0x0100 #define VERSION_base64 0x0100
#define VERSION_thd_rnd 0x0100
#define VERSION_thd_autoinc 0x0100 #define VERSION_thd_autoinc 0x0100
#define VERSION_thd_error_context 0x0100 #define VERSION_thd_error_context 0x0100
#define VERSION_thd_specifics 0x0100 #define VERSION_thd_specifics 0x0100
......
...@@ -22,6 +22,7 @@ SET(MYSQLSERVICES_SOURCES ...@@ -22,6 +22,7 @@ SET(MYSQLSERVICES_SOURCES
thd_timezone_service.c thd_timezone_service.c
thd_autoinc_service.c thd_autoinc_service.c
thd_error_context_service.c thd_error_context_service.c
thd_rnd_service.c
thd_specifics_service.c thd_specifics_service.c
progress_report_service.c progress_report_service.c
debug_sync_service.c debug_sync_service.c
......
/* Copyright (C) 2017 MariaDB Corporation
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, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
#include <service_versions.h>
SERVICE_VERSION thd_rnd_service= (void *) VERSION_thd_rnd;
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
The new authentication is performed in following manner: The new authentication is performed in following manner:
SERVER: public_seed=create_random_string() SERVER: public_seed=thd_create_random_password()
send(public_seed) send(public_seed)
CLIENT: recv(public_seed) CLIENT: recv(public_seed)
...@@ -278,6 +278,7 @@ void make_password_from_salt_323(char *to, const ulong *salt) ...@@ -278,6 +278,7 @@ void make_password_from_salt_323(char *to, const ulong *salt)
**************** MySQL 4.1.1 authentication routines ************* **************** MySQL 4.1.1 authentication routines *************
*/ */
#if MYSQL_VERSION_ID < 0x100200
/** /**
Generate string of printable random characters of requested length. Generate string of printable random characters of requested length.
...@@ -296,6 +297,9 @@ void create_random_string(char *to, uint length, ...@@ -296,6 +297,9 @@ void create_random_string(char *to, uint length,
*to= (char) (my_rnd(rand_st)*94+33); *to= (char) (my_rnd(rand_st)*94+33);
*to= '\0'; *to= '\0';
} }
#else
#error
#endif
/* Character to use as version identifier for version 4.1 */ /* Character to use as version identifier for version 4.1 */
......
...@@ -11313,7 +11313,7 @@ static bool send_server_handshake_packet(MPVIO_EXT *mpvio, ...@@ -11313,7 +11313,7 @@ static bool send_server_handshake_packet(MPVIO_EXT *mpvio,
native_password_plugin will have to send it in a separate packet, native_password_plugin will have to send it in a separate packet,
adding one more round trip. adding one more round trip.
*/ */
create_random_string(thd->scramble, SCRAMBLE_LENGTH, &thd->rand); thd_create_random_password(thd, thd->scramble, SCRAMBLE_LENGTH);
data= thd->scramble; data= thd->scramble;
} }
data_len= SCRAMBLE_LENGTH; data_len= SCRAMBLE_LENGTH;
...@@ -12671,7 +12671,7 @@ static int native_password_authenticate(MYSQL_PLUGIN_VIO *vio, ...@@ -12671,7 +12671,7 @@ static int native_password_authenticate(MYSQL_PLUGIN_VIO *vio,
/* generate the scramble, or reuse the old one */ /* generate the scramble, or reuse the old one */
if (thd->scramble[SCRAMBLE_LENGTH]) if (thd->scramble[SCRAMBLE_LENGTH])
{ {
create_random_string(thd->scramble, SCRAMBLE_LENGTH, &thd->rand); thd_create_random_password(thd, thd->scramble, SCRAMBLE_LENGTH);
/* and send it to the client */ /* and send it to the client */
if (mpvio->write_packet(mpvio, (uchar*)thd->scramble, SCRAMBLE_LENGTH + 1)) if (mpvio->write_packet(mpvio, (uchar*)thd->scramble, SCRAMBLE_LENGTH + 1))
DBUG_RETURN(CR_AUTH_HANDSHAKE); DBUG_RETURN(CR_AUTH_HANDSHAKE);
...@@ -12755,7 +12755,7 @@ static int old_password_authenticate(MYSQL_PLUGIN_VIO *vio, ...@@ -12755,7 +12755,7 @@ static int old_password_authenticate(MYSQL_PLUGIN_VIO *vio,
/* generate the scramble, or reuse the old one */ /* generate the scramble, or reuse the old one */
if (thd->scramble[SCRAMBLE_LENGTH]) if (thd->scramble[SCRAMBLE_LENGTH])
{ {
create_random_string(thd->scramble, SCRAMBLE_LENGTH, &thd->rand); thd_create_random_password(thd, thd->scramble, SCRAMBLE_LENGTH);
/* and send it to the client */ /* and send it to the client */
if (mpvio->write_packet(mpvio, (uchar*)thd->scramble, SCRAMBLE_LENGTH + 1)) if (mpvio->write_packet(mpvio, (uchar*)thd->scramble, SCRAMBLE_LENGTH + 1))
return CR_AUTH_HANDSHAKE; return CR_AUTH_HANDSHAKE;
......
...@@ -4475,6 +4475,28 @@ extern "C" int thd_is_connected(MYSQL_THD thd) ...@@ -4475,6 +4475,28 @@ extern "C" int thd_is_connected(MYSQL_THD thd)
} }
extern "C" double thd_rnd(MYSQL_THD thd)
{
return my_rnd(&thd->rand);
}
/**
Generate string of printable random characters of requested length.
@param to[out] Buffer for generation; must be at least length+1 bytes
long; result string is always null-terminated
@param length[in] How many random characters to put in buffer
*/
extern "C" void thd_create_random_password(MYSQL_THD thd,
char *to, size_t length)
{
for (char *end= to + length; to < end; to++)
*to= (char) (my_rnd(&thd->rand)*94 + 33);
*to= '\0';
}
#ifdef INNODB_COMPATIBILITY_HOOKS #ifdef INNODB_COMPATIBILITY_HOOKS
extern "C" const struct charset_info_st *thd_charset(MYSQL_THD thd) extern "C" const struct charset_info_st *thd_charset(MYSQL_THD thd)
{ {
......
...@@ -119,6 +119,11 @@ static struct thd_autoinc_service_st thd_autoinc_handler= { ...@@ -119,6 +119,11 @@ static struct thd_autoinc_service_st thd_autoinc_handler= {
thd_get_autoinc thd_get_autoinc
}; };
static struct thd_rnd_service_st thd_rnd_handler= {
thd_rnd,
thd_create_random_password
};
static struct base64_service_st base64_handler= { static struct base64_service_st base64_handler= {
base64_needed_encoded_length, base64_needed_encoded_length,
base64_encode_max_arg_length, base64_encode_max_arg_length,
...@@ -205,6 +210,7 @@ static struct st_service_ref list_of_services[]= ...@@ -205,6 +210,7 @@ static struct st_service_ref list_of_services[]=
{ "my_md5_service", VERSION_my_md5, &my_md5_handler}, { "my_md5_service", VERSION_my_md5, &my_md5_handler},
{ "logger_service", VERSION_logger, &logger_service_handler }, { "logger_service", VERSION_logger, &logger_service_handler },
{ "base64_service", VERSION_base64, &base64_handler }, { "base64_service", VERSION_base64, &base64_handler },
{ "thd_rnd_service", VERSION_thd_rnd, &thd_rnd_handler },
{ "thd_autoinc_service", VERSION_thd_autoinc, &thd_autoinc_handler }, { "thd_autoinc_service", VERSION_thd_autoinc, &thd_autoinc_handler },
{ "wsrep_service", VERSION_wsrep, &wsrep_handler }, { "wsrep_service", VERSION_wsrep, &wsrep_handler },
{ "encryption_service", VERSION_encryption, &encryption_handler }, { "encryption_service", VERSION_encryption, &encryption_handler },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment