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 '' 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 '' 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 '' 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;