Manual merge
This commit is contained in:
commit
f11fc60281
@ -264,4 +264,27 @@ Log_name Pos Event_type Server_id End_log_pos Info
|
|||||||
master-bin.000001 # Query # # use `test`; grant all on *.* to foo@"1.2.3.4"
|
master-bin.000001 # Query # # use `test`; grant all on *.* to foo@"1.2.3.4"
|
||||||
master-bin.000001 # Query # # use `test`; revoke all privileges, grant option from "foo"
|
master-bin.000001 # Query # # use `test`; revoke all privileges, grant option from "foo"
|
||||||
DROP USER foo@"1.2.3.4";
|
DROP USER foo@"1.2.3.4";
|
||||||
|
|
||||||
|
# Bug#27606 GRANT statement should be replicated with DEFINER information
|
||||||
|
stop slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
reset master;
|
||||||
|
reset slave;
|
||||||
|
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||||
|
start slave;
|
||||||
|
GRANT SELECT, INSERT ON mysql.user TO user_bug27606@localhost;
|
||||||
|
SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606';
|
||||||
|
Grantor
|
||||||
|
root@localhost
|
||||||
|
SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606';
|
||||||
|
Grantor
|
||||||
|
root@localhost
|
||||||
|
REVOKE SELECT ON mysql.user FROM user_bug27606@localhost;
|
||||||
|
SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606';
|
||||||
|
Grantor
|
||||||
|
root@localhost
|
||||||
|
SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606';
|
||||||
|
Grantor
|
||||||
|
root@localhost
|
||||||
|
DROP USER user_bug27606@localhost;
|
||||||
"End of test"
|
"End of test"
|
||||||
|
@ -347,4 +347,25 @@ revoke all privileges, grant option from "foo";
|
|||||||
DROP USER foo@"1.2.3.4";
|
DROP USER foo@"1.2.3.4";
|
||||||
-- sync_slave_with_master
|
-- sync_slave_with_master
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # Bug#27606 GRANT statement should be replicated with DEFINER information
|
||||||
|
--connection master
|
||||||
|
--source include/master-slave-reset.inc
|
||||||
|
--connection master
|
||||||
|
GRANT SELECT, INSERT ON mysql.user TO user_bug27606@localhost;
|
||||||
|
|
||||||
|
SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606';
|
||||||
|
sync_slave_with_master;
|
||||||
|
SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606';
|
||||||
|
|
||||||
|
--connection master
|
||||||
|
REVOKE SELECT ON mysql.user FROM user_bug27606@localhost;
|
||||||
|
SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606';
|
||||||
|
sync_slave_with_master;
|
||||||
|
SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606';
|
||||||
|
|
||||||
|
--connection master
|
||||||
|
DROP USER user_bug27606@localhost;
|
||||||
|
|
||||||
|
--source include/master-slave-end.inc
|
||||||
--echo "End of test"
|
--echo "End of test"
|
||||||
|
@ -2332,7 +2332,7 @@ bool Query_log_event::write(IO_CACHE* file)
|
|||||||
start+= 4;
|
start+= 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (thd && thd->is_current_user_used())
|
if (thd && thd->need_binlog_invoker())
|
||||||
{
|
{
|
||||||
LEX_STRING user;
|
LEX_STRING user;
|
||||||
LEX_STRING host;
|
LEX_STRING host;
|
||||||
|
@ -631,7 +631,7 @@ THD::THD()
|
|||||||
thr_lock_info_init(&lock_info); /* safety: will be reset after start */
|
thr_lock_info_init(&lock_info); /* safety: will be reset after start */
|
||||||
|
|
||||||
m_internal_handler= NULL;
|
m_internal_handler= NULL;
|
||||||
current_user_used= FALSE;
|
m_binlog_invoker= FALSE;
|
||||||
memset(&invoker_user, 0, sizeof(invoker_user));
|
memset(&invoker_user, 0, sizeof(invoker_user));
|
||||||
memset(&invoker_host, 0, sizeof(invoker_host));
|
memset(&invoker_host, 0, sizeof(invoker_host));
|
||||||
}
|
}
|
||||||
@ -1336,7 +1336,7 @@ void THD::cleanup_after_query()
|
|||||||
where= THD::DEFAULT_WHERE;
|
where= THD::DEFAULT_WHERE;
|
||||||
/* reset table map for multi-table update */
|
/* reset table map for multi-table update */
|
||||||
table_map_for_update= 0;
|
table_map_for_update= 0;
|
||||||
clean_current_user_used();
|
m_binlog_invoker= FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3467,7 +3467,7 @@ void THD::leave_locked_tables_mode()
|
|||||||
|
|
||||||
void THD::get_definer(LEX_USER *definer)
|
void THD::get_definer(LEX_USER *definer)
|
||||||
{
|
{
|
||||||
set_current_user_used();
|
binlog_invoker();
|
||||||
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
|
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
|
||||||
if (slave_thread && has_invoker())
|
if (slave_thread && has_invoker())
|
||||||
{
|
{
|
||||||
|
@ -2696,9 +2696,8 @@ public:
|
|||||||
}
|
}
|
||||||
void leave_locked_tables_mode();
|
void leave_locked_tables_mode();
|
||||||
int decide_logging_format(TABLE_LIST *tables);
|
int decide_logging_format(TABLE_LIST *tables);
|
||||||
void set_current_user_used() { current_user_used= TRUE; }
|
void binlog_invoker() { m_binlog_invoker= TRUE; }
|
||||||
bool is_current_user_used() { return current_user_used; }
|
bool need_binlog_invoker() { return m_binlog_invoker; }
|
||||||
void clean_current_user_used() { current_user_used= FALSE; }
|
|
||||||
void get_definer(LEX_USER *definer);
|
void get_definer(LEX_USER *definer);
|
||||||
void set_invoker(const LEX_STRING *user, const LEX_STRING *host)
|
void set_invoker(const LEX_STRING *user, const LEX_STRING *host)
|
||||||
{
|
{
|
||||||
@ -2739,7 +2738,7 @@ private:
|
|||||||
Current user will be binlogged into Query_log_event if current_user_used
|
Current user will be binlogged into Query_log_event if current_user_used
|
||||||
is TRUE; It will be stored into invoker_host and invoker_user by SQL thread.
|
is TRUE; It will be stored into invoker_host and invoker_user by SQL thread.
|
||||||
*/
|
*/
|
||||||
bool current_user_used;
|
bool m_binlog_invoker;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
It points to the invoker in the Query_log_event.
|
It points to the invoker in the Query_log_event.
|
||||||
|
@ -3414,6 +3414,10 @@ end_with_restore_list:
|
|||||||
if (check_access(thd, UPDATE_ACL, "mysql", NULL, NULL, 1, 1) &&
|
if (check_access(thd, UPDATE_ACL, "mysql", NULL, NULL, 1, 1) &&
|
||||||
check_global_access(thd,CREATE_USER_ACL))
|
check_global_access(thd,CREATE_USER_ACL))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* Replicate current user as grantor */
|
||||||
|
thd->binlog_invoker();
|
||||||
|
|
||||||
/* Conditionally writes to binlog */
|
/* Conditionally writes to binlog */
|
||||||
if (!(res = mysql_revoke_all(thd, lex->users_list)))
|
if (!(res = mysql_revoke_all(thd, lex->users_list)))
|
||||||
my_ok(thd);
|
my_ok(thd);
|
||||||
@ -3430,6 +3434,9 @@ end_with_restore_list:
|
|||||||
first_table ? 0 : 1, 0))
|
first_table ? 0 : 1, 0))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
|
/* Replicate current user as grantor */
|
||||||
|
thd->binlog_invoker();
|
||||||
|
|
||||||
if (thd->security_ctx->user) // If not replication
|
if (thd->security_ctx->user) // If not replication
|
||||||
{
|
{
|
||||||
LEX_USER *user, *tmp_user;
|
LEX_USER *user, *tmp_user;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user