File: binlog_replication_applier_priv_checks.test

package info (click to toggle)
mysql-8.0 8.0.43-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 1,273,924 kB
  • sloc: cpp: 4,684,605; ansic: 412,450; pascal: 108,398; java: 83,641; perl: 30,221; cs: 27,067; sql: 26,594; sh: 24,181; python: 21,816; yacc: 17,169; php: 11,522; xml: 7,388; javascript: 7,076; makefile: 2,194; lex: 1,075; awk: 670; asm: 520; objc: 183; ruby: 97; lisp: 86
file content (204 lines) | stat: -rw-r--r-- 7,176 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
# ==== Purpose ====
#
# This script tests error handling regarding `BINLOG` statement execution while
# checking for proper privileges regarding `REPLICATION_APPLIER` privilege.
#
# ==== Requirements ====
#
# R1. `BINLOG` statement must fail if the user in session doesn't have `SUPER`,
#     `BINLOG_ADMIN` or `REPLICATION_APPLIER` privilege.
#
# R2. Necessary privileges for applying the underlying `BINLOG` statement are
#     enforced if the user in session has `REPLICATION_APPLIER`.
#
# ==== Implementation ====
#
# TC1. Apply a `Format_description_event` without any privileges
# --------------------------------------------------------------
# 1) Start a session with an unprivileged user.
# 2) Execute a `BINLOG` statement holding a `Format_description_event` and
#    expect an error.
#
# TC2. Apply a `Write_row_event` without any privileges needed by the event
# -------------------------------------------------------------------------
# 1) Start a session with a user with only `REPLICATION_APPLIER` privilege.
# 2) Execute a `BINLOG` statement holding a `Write_rows_event` and expect an
#    error.
#
# TC3. Apply a `Write_row_event` with `INSERT` privilege
# ------------------------------------------------------
# 1) Start a session with a user with only `REPLICATION_APPLIER` and `INSERT`
#    privileges.
# 2) Execute a `BINLOG` statement holding a `Write_rows_event` and expect
#    success.
# 3) Confirm the INSERT was executed
#
# TC4. Apply a `Write_row_event` with `BINLOG_ADMIN` privilege
# ------------------------------------------------------------
# 1) Start a session with a user with only `BINLOG_ADMIN` privilege.
# 2) Execute a `BINLOG` statement holding a `Write_rows_event` and expect
#    success.
# 3) Confirm the INSERT was executed
#
# TC5. Apply a `Write_row_event` with `SUPER` privilege
# -----------------------------------------------------
# 1) Start a session with a user with only `SUPER` privilege.
# 2) Execute a `BINLOG` statement holding a `Write_rows_event` and expect
#    success.
# 3) Confirm the INSERT was executed
#
# ==== References ====
#
# WL#12966 Replication with privilege checks
#

--source include/have_binlog_format_row.inc

CREATE USER 'u1'@'localhost' IDENTIFIED BY 'pass';
GRANT CREATE, SELECT ON *.* TO 'u1'@'localhost';

CREATE DATABASE rpl_priv;
USE rpl_priv;
CREATE TABLE t1 (a INT);

CALL mtr.add_suppression("INSERT command denied to user 'u1'@'localhost' for table 't1'");

--echo #
--echo # TC1. Apply a `Format_description_event` without any privileges
--echo # --------------------------------------------------------------
--echo #

# 1) Start a session with an unprivileged user.
--connect(other_conn, localhost, u1, pass, rpl_priv, $MYPORT, $MYSOCK)
--connection other_conn

# 2) Execute a `BINLOG` statement holding a `Format_description_event` and
#    expect an error.
--error ER_SPECIFIC_ACCESS_DENIED_ERROR
BINLOG '
jbMGXQ8BAAAAeAAAAHwAAAAAAAQAOC4wLjE4LXRyLWRlYnVnAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACNswZdEwANAAgAAAAABAAEAAAAYAAEGggAAAAICAgCAAAACgoKKioAEjQA
CgGQNwbk';
--disconnect other_conn

--connection default
GRANT REPLICATION_APPLIER ON *.* TO 'u1'@'localhost';

--echo #
--echo # TC2. Apply a `Write_row_event` without any privileges needed by the
--echo #      event
--echo # -------------------------------------------------------------------
--echo #

# 1) Start a session with a user with only `REPLICATION_APPLIER` privilege.
--connect(other_conn, localhost, u1, pass, rpl_priv, $MYPORT, $MYSOCK)
--connection other_conn
BINLOG '
jbMGXQ8BAAAAeAAAAHwAAAAAAAQAOC4wLjE4LXRyLWRlYnVnAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACNswZdEwANAAgAAAAABAAEAAAAYAAEGggAAAAICAgCAAAACgoKKioAEjQA
CgGQNwbk';

# 2) Execute a `BINLOG` statement holding a `Write_rows_event` and expect an
#    error.
--error ER_UNKNOWN_ERROR
BINLOG '
g2YSXRMBAAAANAAAAG0BAAAAAJoAAAAAAAEACHJwbF9wcml2AAJ0MQABAwABAQEAdXCMmg==
g2YSXR4BAAAAMgAAAJ8BAAAAAJoAAAAAAAEAAgAB/wAKAAAAAAsAAAAADAAAAGmCVP4=
';
--disconnect other_conn

--connection default
GRANT INSERT ON *.* TO 'u1'@'localhost';

--echo #
--echo # TC3. Apply a `Write_row_event` with `INSERT` privilege
--echo # ------------------------------------------------------
--echo #

# 1) Start a session with a user with only `REPLICATION_APPLIER` and `INSERT`
#    privileges.
--connect(other_conn, localhost, u1, pass, rpl_priv, $MYPORT, $MYSOCK)
--connection other_conn
BINLOG '
jbMGXQ8BAAAAeAAAAHwAAAAAAAQAOC4wLjE4LXRyLWRlYnVnAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACNswZdEwANAAgAAAAABAAEAAAAYAAEGggAAAAICAgCAAAACgoKKioAEjQA
CgGQNwbk';

# 2) Execute a `BINLOG` statement holding a `Write_rows_event` and expect
#    success.
BINLOG '
g2YSXRMBAAAANAAAAG0BAAAAAJoAAAAAAAEACHJwbF9wcml2AAJ0MQABAwABAQEAdXCMmg==
g2YSXR4BAAAAMgAAAJ8BAAAAAJoAAAAAAAEAAgAB/wAKAAAAAAsAAAAADAAAAGmCVP4=
';

# 3) Confirm the INSERT was executed
--let $assert_text= INSERT succeeded
--let $assert_cond= "[SELECT COUNT(*) FROM t1]" = "3"
--source include/assert.inc
--disconnect other_conn

--connection default
DELETE FROM t1;
REVOKE INSERT, REPLICATION_APPLIER ON *.* FROM 'u1'@'localhost';
GRANT BINLOG_ADMIN ON *.* TO 'u1'@'localhost';

--echo #
--echo # TC4. Apply a `Write_row_event` with `BINLOG_ADMIN` privilege
--echo # ------------------------------------------------------------
--echo #

# 1) Start a session with a user with only `BINLOG_ADMIN` privilege.
--connect(other_conn, localhost, u1, pass, rpl_priv, $MYPORT, $MYSOCK)
--connection other_conn
BINLOG '
jbMGXQ8BAAAAeAAAAHwAAAAAAAQAOC4wLjE4LXRyLWRlYnVnAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACNswZdEwANAAgAAAAABAAEAAAAYAAEGggAAAAICAgCAAAACgoKKioAEjQA
CgGQNwbk';

# 2) Execute a `BINLOG` statement holding a `Write_rows_event` and expect
#    success.
BINLOG '
g2YSXRMBAAAANAAAAG0BAAAAAJoAAAAAAAEACHJwbF9wcml2AAJ0MQABAwABAQEAdXCMmg==
g2YSXR4BAAAAMgAAAJ8BAAAAAJoAAAAAAAEAAgAB/wAKAAAAAAsAAAAADAAAAGmCVP4=
';

# 3) Confirm the INSERT was executed
--let $assert_text= INSERT succeeded
--let $assert_cond= "[SELECT COUNT(*) FROM t1]" = "3"
--source include/assert.inc
--disconnect other_conn

--connection default
DELETE FROM t1;
REVOKE BINLOG_ADMIN ON *.* FROM 'u1'@'localhost';
GRANT SUPER ON *.* TO 'u1'@'localhost';

--echo #
--echo # TC5. Apply a `Write_row_event` with `SUPER` privilege
--echo # -----------------------------------------------------
--echo #

# 1) Start a session with a user with only `SUPER` privilege.
--connect(other_conn, localhost, u1, pass, rpl_priv, $MYPORT, $MYSOCK)
--connection other_conn
BINLOG '
jbMGXQ8BAAAAeAAAAHwAAAAAAAQAOC4wLjE4LXRyLWRlYnVnAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACNswZdEwANAAgAAAAABAAEAAAAYAAEGggAAAAICAgCAAAACgoKKioAEjQA
CgGQNwbk';

# 2) Execute a `BINLOG` statement holding a `Write_rows_event` and expect
#    success.
BINLOG '
g2YSXRMBAAAANAAAAG0BAAAAAJoAAAAAAAEACHJwbF9wcml2AAJ0MQABAwABAQEAdXCMmg==
g2YSXR4BAAAAMgAAAJ8BAAAAAJoAAAAAAAEAAgAB/wAKAAAAAAsAAAAADAAAAGmCVP4=
';

# 3) Confirm the INSERT was executed
--let $assert_text= INSERT succeeded
--let $assert_cond= "[SELECT COUNT(*) FROM t1]" = "3"
--source include/assert.inc
--disconnect other_conn

--connection default
DROP DATABASE rpl_priv;
DROP USER 'u1'@'localhost';