mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Fix for #2212 (mysql_change_user doesn't work in embedded library)
now it's working include/mysql.h: read_change_user_result 'virtual' method added libmysql/client_settings.h: cli_read_change_user_result interface libmysql/libmysql.c: cli_read_change_user_result implementation libmysqld/lib_sql.cc: emb_read_change_user_result implementation sql-common/client.c: cli_read_change_user_result added to the method's table sql/sql_parse.cc: fixes to make mysql_change_user working in embedded library
This commit is contained in:
@ -575,6 +575,7 @@ typedef struct st_mysql_methods
|
|||||||
void (*free_embedded_thd)(MYSQL *mysql);
|
void (*free_embedded_thd)(MYSQL *mysql);
|
||||||
const char *(*read_statistic)(MYSQL *mysql);
|
const char *(*read_statistic)(MYSQL *mysql);
|
||||||
int (*next_result)(MYSQL *mysql);
|
int (*next_result)(MYSQL *mysql);
|
||||||
|
int (*read_change_user_result)(MYSQL *mysql, char *buff, const char *passwd);
|
||||||
#endif
|
#endif
|
||||||
} MYSQL_METHODS;
|
} MYSQL_METHODS;
|
||||||
|
|
||||||
|
@ -58,6 +58,7 @@ int cli_stmt_execute(MYSQL_STMT *stmt);
|
|||||||
MYSQL_DATA * cli_read_binary_rows(MYSQL_STMT *stmt);
|
MYSQL_DATA * cli_read_binary_rows(MYSQL_STMT *stmt);
|
||||||
int cli_unbuffered_fetch(MYSQL *mysql, char **row);
|
int cli_unbuffered_fetch(MYSQL *mysql, char **row);
|
||||||
const char * cli_read_statistic(MYSQL *mysql);
|
const char * cli_read_statistic(MYSQL *mysql);
|
||||||
|
int cli_read_change_user_result(MYSQL *mysql, char *buff, const char *passwd);
|
||||||
|
|
||||||
#ifdef EMBEDDED_LIBRARY
|
#ifdef EMBEDDED_LIBRARY
|
||||||
int init_embedded_server(int argc, char **argv, char **groups);
|
int init_embedded_server(int argc, char **argv, char **groups);
|
||||||
|
@ -606,13 +606,42 @@ mysql_connect(MYSQL *mysql,const char *host,
|
|||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
Change user and database
|
Change user and database
|
||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
int cli_read_change_user_result(MYSQL *mysql, char *buff, const char *passwd)
|
||||||
|
{
|
||||||
|
NET *net= &mysql->net;
|
||||||
|
ulong pkt_length;
|
||||||
|
|
||||||
|
pkt_length= net_safe_read(mysql);
|
||||||
|
|
||||||
|
if (pkt_length == packet_error)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
if (pkt_length == 1 && net->read_pos[0] == 254 &&
|
||||||
|
mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
By sending this very specific reply server asks us to send scrambled
|
||||||
|
password in old format. The reply contains scramble_323.
|
||||||
|
*/
|
||||||
|
scramble_323(buff, mysql->scramble, passwd);
|
||||||
|
if (my_net_write(net, buff, SCRAMBLE_LENGTH_323 + 1) || net_flush(net))
|
||||||
|
{
|
||||||
|
net->last_errno= CR_SERVER_LOST;
|
||||||
|
strmov(net->sqlstate, unknown_sqlstate);
|
||||||
|
strmov(net->last_error,ER(net->last_errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/* Read what server thinks about out new auth message report */
|
||||||
|
if (net_safe_read(mysql) == packet_error)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
|
my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
|
||||||
const char *passwd, const char *db)
|
const char *passwd, const char *db)
|
||||||
{
|
{
|
||||||
char buff[512],*end=buff;
|
char buff[512],*end=buff;
|
||||||
NET *net= &mysql->net;
|
|
||||||
ulong pkt_length;
|
|
||||||
DBUG_ENTER("mysql_change_user");
|
DBUG_ENTER("mysql_change_user");
|
||||||
|
|
||||||
if (!user)
|
if (!user)
|
||||||
@ -646,31 +675,8 @@ my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
|
|||||||
/* Write authentication package */
|
/* Write authentication package */
|
||||||
simple_command(mysql,COM_CHANGE_USER, buff,(ulong) (end-buff),1);
|
simple_command(mysql,COM_CHANGE_USER, buff,(ulong) (end-buff),1);
|
||||||
|
|
||||||
pkt_length= net_safe_read(mysql);
|
if ((*mysql->methods->read_change_user_result)(mysql, buff, passwd))
|
||||||
|
DBUG_RETURN(1);
|
||||||
if (pkt_length == packet_error)
|
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (pkt_length == 1 && net->read_pos[0] == 254 &&
|
|
||||||
mysql->server_capabilities & CLIENT_SECURE_CONNECTION)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
By sending this very specific reply server asks us to send scrambled
|
|
||||||
password in old format. The reply contains scramble_323.
|
|
||||||
*/
|
|
||||||
scramble_323(buff, mysql->scramble, passwd);
|
|
||||||
if (my_net_write(net, buff, SCRAMBLE_LENGTH_323 + 1) || net_flush(net))
|
|
||||||
{
|
|
||||||
net->last_errno= CR_SERVER_LOST;
|
|
||||||
strmov(net->sqlstate, unknown_sqlstate);
|
|
||||||
strmov(net->last_error,ER(net->last_errno));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
/* Read what server thinks about out new auth message report */
|
|
||||||
if (net_safe_read(mysql) == packet_error)
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Free old connect information */
|
/* Free old connect information */
|
||||||
my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->passwd,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->passwd,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
@ -681,9 +687,6 @@ my_bool STDCALL mysql_change_user(MYSQL *mysql, const char *user,
|
|||||||
mysql->passwd=my_strdup(passwd,MYF(MY_WME));
|
mysql->passwd=my_strdup(passwd,MYF(MY_WME));
|
||||||
mysql->db= db ? my_strdup(db,MYF(MY_WME)) : 0;
|
mysql->db= db ? my_strdup(db,MYF(MY_WME)) : 0;
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
error:
|
|
||||||
DBUG_RETURN(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(HAVE_GETPWUID) && defined(NO_GETPWUID_DECL)
|
#if defined(HAVE_GETPWUID) && defined(NO_GETPWUID_DECL)
|
||||||
|
@ -258,6 +258,13 @@ int emb_next_result(MYSQL *mysql)
|
|||||||
DBUG_RETURN(0); /* No more results */
|
DBUG_RETURN(0); /* No more results */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int emb_read_change_user_result(MYSQL *mysql,
|
||||||
|
char *buff __attribute__((unused)),
|
||||||
|
const char *passwd __attribute__((unused)))
|
||||||
|
{
|
||||||
|
return mysql_errno(mysql);
|
||||||
|
}
|
||||||
|
|
||||||
MYSQL_METHODS embedded_methods=
|
MYSQL_METHODS embedded_methods=
|
||||||
{
|
{
|
||||||
emb_mysql_read_query_result,
|
emb_mysql_read_query_result,
|
||||||
@ -272,7 +279,8 @@ MYSQL_METHODS embedded_methods=
|
|||||||
emb_unbuffered_fetch,
|
emb_unbuffered_fetch,
|
||||||
emb_free_embedded_thd,
|
emb_free_embedded_thd,
|
||||||
emb_read_statistic,
|
emb_read_statistic,
|
||||||
emb_next_result
|
emb_next_result,
|
||||||
|
emb_read_change_user_result
|
||||||
};
|
};
|
||||||
|
|
||||||
C_MODE_END
|
C_MODE_END
|
||||||
|
@ -1421,7 +1421,8 @@ static MYSQL_METHODS client_methods=
|
|||||||
cli_unbuffered_fetch,
|
cli_unbuffered_fetch,
|
||||||
NULL,
|
NULL,
|
||||||
cli_read_statistic,
|
cli_read_statistic,
|
||||||
cli_read_query_result
|
cli_read_query_result,
|
||||||
|
cli_read_change_user_result
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -206,7 +206,21 @@ int check_user(THD *thd, enum enum_server_command command,
|
|||||||
|
|
||||||
#ifdef NO_EMBEDDED_ACCESS_CHECKS
|
#ifdef NO_EMBEDDED_ACCESS_CHECKS
|
||||||
thd->master_access= GLOBAL_ACLS; // Full rights
|
thd->master_access= GLOBAL_ACLS; // Full rights
|
||||||
return 0;
|
/* Change database if necessary: OK or FAIL is sent in mysql_change_db */
|
||||||
|
if (db && db[0])
|
||||||
|
{
|
||||||
|
thd->db= 0;
|
||||||
|
thd->db_length= 0;
|
||||||
|
if (mysql_change_db(thd, db))
|
||||||
|
{
|
||||||
|
if (thd->user_connect)
|
||||||
|
decrease_user_connections(thd->user_connect);
|
||||||
|
DBUG_RETURN(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
send_ok(thd);
|
||||||
|
DBUG_RETURN(0);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
my_bool opt_secure_auth_local;
|
my_bool opt_secure_auth_local;
|
||||||
@ -1282,7 +1296,6 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
send_error(thd); // dump to NET
|
send_error(thd); // dump to NET
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#ifndef EMBEDDED_LIBRARY
|
|
||||||
case COM_CHANGE_USER:
|
case COM_CHANGE_USER:
|
||||||
{
|
{
|
||||||
thd->change_user();
|
thd->change_user();
|
||||||
@ -1301,13 +1314,14 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
uint passwd_len= thd->client_capabilities & CLIENT_SECURE_CONNECTION ?
|
uint passwd_len= thd->client_capabilities & CLIENT_SECURE_CONNECTION ?
|
||||||
*passwd++ : strlen(passwd);
|
*passwd++ : strlen(passwd);
|
||||||
db+= passwd_len + 1;
|
db+= passwd_len + 1;
|
||||||
|
#ifndef EMBEDDED_LIBRARY
|
||||||
/* Small check for incomming packet */
|
/* Small check for incomming packet */
|
||||||
if ((uint) ((uchar*) db - net->read_pos) > packet_length)
|
if ((uint) ((uchar*) db - net->read_pos) > packet_length)
|
||||||
{
|
{
|
||||||
send_error(thd, ER_UNKNOWN_COM_ERROR);
|
send_error(thd, ER_UNKNOWN_COM_ERROR);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
/* Convert database name to utf8 */
|
/* Convert database name to utf8 */
|
||||||
db_buff[copy_and_convert(db_buff, sizeof(db_buff)-1,
|
db_buff[copy_and_convert(db_buff, sizeof(db_buff)-1,
|
||||||
system_charset_info, db, strlen(db),
|
system_charset_info, db, strlen(db),
|
||||||
@ -1358,7 +1372,6 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif /* EMBEDDED_LIBRARY */
|
|
||||||
case COM_EXECUTE:
|
case COM_EXECUTE:
|
||||||
{
|
{
|
||||||
mysql_stmt_execute(thd, packet);
|
mysql_stmt_execute(thd, packet);
|
||||||
|
Reference in New Issue
Block a user