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