mysql-server/mysql-test/t/user_comment.test
2025-03-05 14:31:37 +07:00

146 lines
8 KiB
Text

SET @org_partial_revokes= @@partial_revokes;
SET @org_sql_mode= @@sql_mode;
CREATE USER u1;
SHOW CREATE USER u1;
ALTER USER u1 COMMENT 'free form text';
SELECT user,user_attributes FROM mysql.user WHERE user='u1';
ALTER USER u1 COMMENT 'changed the free form text';
SELECT user,user_attributes FROM mysql.user WHERE user='u1';
ALTER USER u1 ATTRIBUTE '{"uid" : "34234"}';
SELECT user,user_attributes FROM mysql.user WHERE user='u1';
ALTER USER u1 ATTRIBUTE '{"speed" : "9000"}';
SELECT user,user_attributes FROM mysql.user WHERE user='u1';
ALTER USER u1 ATTRIBUTE '{"speed" : null }';
--echo # should not contain the speed attribute!
SELECT user,user_attributes FROM mysql.user WHERE user='u1';
--echo # Should be NULL
SELECT user_attributes->>"$.metadata.speed" FROM mysql.user WHERE user= 'u1';
CREATE USER foo@localhost IDENTIFIED BY 'foo' FAILED_LOGIN_ATTEMPTS 4 PASSWORD_LOCK_TIME 6;
ALTER USER foo@localhost COMMENT 'password lock time';
SELECT user_attributes->>"$.metadata" FROM mysql.user WHERE user='foo';
ALTER USER foo@localhost ATTRIBUTE '{"flag":"red"}';
--replace_regex /AS '(.*)' REQUIRE/AS '<non-deterministic-password-hash>' REQUIRE/
SHOW CREATE USER foo@localhost;
SELECT user_attributes FROM mysql.user WHERE user='foo';
ALTER USER foo@localhost ATTRIBUTE '{"flag":null}';
SELECT user_attributes FROM mysql.user WHERE user='foo';
ALTER USER foo@localhost COMMENT 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz';
SELECT user_attributes FROM mysql.user WHERE user= 'foo';
ALTER USER foo@localhost COMMENT 'xxx';
--error ER_INVALID_USER_ATTRIBUTE_JSON
ALTER USER foo@localhost ATTRIBUTE 'not a valid object';
--error ER_PARSE_ERROR
ALTER USER foo@localhost ATTRIBUTE NULL;
--error ER_PARSE_ERROR
ALTER USER foo@localhost ATTRIBUTE;
--error ER_PARSE_ERROR
ALTER USER foo@localhost COMMENT;
--error ER_CANNOT_USER
ALTER USER u4@sdasd ATTRIBUTE '{}';
--error ER_CANNOT_USER
ALTER USER fff@asdasd COMMENT '';
--error ER_PARSE_ERROR
ALTER USER USER() COMMENT 'test';
CREATE USER foo2@localhost IDENTIFIED BY 'foo' COMMENT 'xxx';
--replace_regex /AS '(.*)' REQUIRE/AS '<non-deterministic-password-hash>' REQUIRE/
SHOW CREATE USER foo2@localhost;
SELECT user,user_attributes FROM mysql.user WHERE user='foo2';
CREATE USER foo3 PASSWORD EXPIRE DEFAULT COMMENT 'abc';
CREATE USER foo4 ACCOUNT LOCK ATTRIBUTE '{"stuff":"ffuts"}';
ALTER USER foo4 ACCOUNT UNLOCK ATTRIBUTE '{"stuff":"unlocked"}';
--replace_regex /AS '(.*)' REQUIRE/AS '<non-deterministic-password-hash>' REQUIRE/
SHOW CREATE USER foo4;
SELECT user,user_attributes FROM mysql.user WHERE user like 'foo%';
SELECT * FROM INFORMATION_SCHEMA.USER_ATTRIBUTES WHERE USER like 'foo%';
SELECT `attribute`->>"$.comment" FROM INFORMATION_SCHEMA.USER_ATTRIBUTES WHERE USER like 'foo%';
--echo # Verify that comments can be added along with other json-attributes
SET GLOBAL partial_revokes=ON;
GRANT SELECT ON *.* TO foo@localhost;
REVOKE SELECT ON mysql.* FROM foo@localhost;
SELECT user, user_attributes FROM mysql.user WHERE user='foo';
ALTER USER foo@localhost ATTRIBUTE '{"key":"value"}';
ALTER USER foo@localhost COMMENT 'Added key/value pair';
SELECT user,user_attributes FROM mysql.user WHERE user='foo';
GRANT SELECT ON mysql.* TO foo@localhost;
SELECT user,user_attributes FROM mysql.user WHERE user='foo';
CREATE USER redqueen@localhost IDENTIFIED BY 'shoo';
ALTER USER redqueen@localhost IDENTIFIED BY 'madness' RETAIN CURRENT PASSWORD;
SELECT user,char_length(user_attributes->>"$.additional_password") FROM mysql.user WHERE user='redqueen';
ALTER USER redqueen@localhost DISCARD OLD PASSWORD COMMENT 'Dropped old password';
SELECT user,char_length(user_attributes->>"$.additional_password") as length_password,user_attributes->>"$.metadata.comment" as comment FROM mysql.user WHERE user='redqueen';
SET GLOBAL partial_revokes=OFF;
DROP USER foo@localhost, u1, foo3, foo2@localhost, foo4, redqueen@localhost;
--echo **** NO_BACKSLASH_ESCAPES changes quoting of JSON
--echo +++++ NO_BACKSLASH_ESCAPES = OFF
CREATE USER u1 COMMENT 'Hello "Smith"';
let $result=`SHOW CREATE USER u1`;
DROP USER u1;
eval $result;
DROP USER u1;
--echo +++++ NO_BACKSLASH_ESCAPES = ON
CREATE USER u1 COMMENT 'Hello "Smith"';
SET @@sql_mode='NO_BACKSLASH_ESCAPES';
let $result=`SHOW CREATE USER u1`;
DROP USER u1;
eval $result;
DROP USER u1;
SET @@sql_mode = @org_sql_mode;
--echo *
--echo * Check privileges
--echo *
CREATE USER u1@localhost IDENTIFIED BY 'foo' COMMENT 'Not permitted to change this';
GRANT SELECT ON *.* to u1@localhost;
connect(con1,localhost,u1,foo);
--error ER_SPECIFIC_ACCESS_DENIED_ERROR
ALTER USER u1@localhost COMMENT 'I comment what I want';
--error ER_SPECIFIC_ACCESS_DENIED_ERROR
ALTER USER u1@localhost ATTRIBUTE '{"key": "value"}';
connection default;
DROP USER u1@localhost;
disconnect con1;
--echo *
--echo * Partial revokes and user comments
--echo *
CREATE USER u1@localhost IDENTIFIED BY 'foo',u2@localhost IDENTIFIED BY 'foo' COMMENT "Works with partial restrictions";
GRANT CREATE USER,SELECT ON *.* TO u2@localhost;
GRANT INSERT, CREATE ON *.* TO u1@localhost;
SET GLOBAL partial_revokes=ON;
REVOKE INSERT ON mysql.* FROM u1@localhost;
SELECT user_attributes FROM mysql.user WHERE user='u1';
connect (con1, localhost, u2,foo);
ALTER USER CURRENT_USER() COMMENT 'test';
SELECT user_attributes->>"$.metadata.comment" FROM mysql.user WHERE user='u2';
ALTER USER CURRENT_USER() ATTRIBUTE '{ "comment" : null }';
--error ER_DBACCESS_DENIED_ERROR
REVOKE CREATE ON mysql.* FROM u1@localhost;
SHOW GRANTS FOR u1@localhost;
--echo #
--echo # Add a fake Restrictions key as a metadata attribute. This should have no effect
--echo # on the existing restrictions.
--echo #
ALTER USER u1@localhost ATTRIBUTE '{"Restrictions": [{"Database":"mysql","Privileges": [ "CREATE" ]}]}';
SHOW GRANTS FOR u1@localhost;
--echo # Above privilege should be REVOKE INSERT
--echo #
--echo # Below we should see both the fake Restrictions-key under the metadata key and
--echo # the real Restrictions-key in the top of the hierarchy.
SELECT user_attributes FROM mysql.user WHERE user='u1';
DROP USER u1@localhost, u2@localhost;
connection default;
disconnect con1;
--error ER_INVALID_USER_ATTRIBUTE_JSON
CREATE USER u1@localhost ATTRIBUTE "this is a string";
SET GLOBAL partial_revokes=@org_partial_revokes;