// Copyright 2016 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // See the License for the specific language governing permissions and // limitations under the License. package executor_test import ( "fmt" "strings" "github.com/hanchuanchuan/goInception/mysql" "github.com/hanchuanchuan/goInception/util/testkit" . "github.com/pingcap/check" ) func (s *testSuite) TestGrantGlobal(c *C) { tk := testkit.NewTestKit(c, s.store) // Create a new user. createUserSQL := `CREATE USER 'testGlobal'@'localhost' IDENTIFIED BY '123';` tk.MustExec(createUserSQL) // Make sure all the global privs for new user is "N". for _, v := range mysql.AllDBPrivs { sql := fmt.Sprintf("SELECT %s FROM mysql.User WHERE User=\"testGlobal\" and host=\"localhost\";", mysql.Priv2UserCol[v]) r := tk.MustQuery(sql) r.Check(testkit.Rows("N")) } // Grant each priv to the user. for _, v := range mysql.AllGlobalPrivs { sql := fmt.Sprintf("GRANT %s ON *.* TO 'testGlobal'@'localhost';", mysql.Priv2Str[v]) tk.MustExec(sql) sql = fmt.Sprintf("SELECT %s FROM mysql.User WHERE User=\"testGlobal\" and host=\"localhost\"", mysql.Priv2UserCol[v]) tk.MustQuery(sql).Check(testkit.Rows("Y")) } // Create a new user. createUserSQL = `CREATE USER 'testGlobal1'@'localhost' IDENTIFIED BY '123';` tk.MustExec(createUserSQL) tk.MustExec("GRANT ALL ON *.* TO 'testGlobal1'@'localhost';") // Make sure all the global privs for granted user is "Y". for _, v := range mysql.AllGlobalPrivs { sql := fmt.Sprintf("SELECT %s FROM mysql.User WHERE User=\"testGlobal1\" and host=\"localhost\"", mysql.Priv2UserCol[v]) tk.MustQuery(sql).Check(testkit.Rows("Y")) } } func (s *testSuite) TestGrantDBScope(c *C) { tk := testkit.NewTestKit(c, s.store) // Create a new user. createUserSQL := `CREATE USER 'testDB'@'localhost' IDENTIFIED BY '123';` tk.MustExec(createUserSQL) // Make sure all the db privs for new user is empty. sql := fmt.Sprintf("SELECT * FROM mysql.db WHERE User=\"testDB\" and host=\"localhost\"") tk.MustQuery(sql).Check(testkit.Rows()) // Grant each priv to the user. for _, v := range mysql.AllDBPrivs { sql := fmt.Sprintf("GRANT %s ON test.* TO 'testDB'@'localhost';", mysql.Priv2Str[v]) tk.MustExec(sql) sql = fmt.Sprintf("SELECT %s FROM mysql.DB WHERE User=\"testDB\" and host=\"localhost\" and db=\"test\"", mysql.Priv2UserCol[v]) tk.MustQuery(sql).Check(testkit.Rows("Y")) } // Create a new user. createUserSQL = `CREATE USER 'testDB1'@'localhost' IDENTIFIED BY '123';` tk.MustExec(createUserSQL) tk.MustExec("USE test;") tk.MustExec("GRANT ALL ON * TO 'testDB1'@'localhost';") // Make sure all the db privs for granted user is "Y". for _, v := range mysql.AllDBPrivs { sql := fmt.Sprintf("SELECT %s FROM mysql.DB WHERE User=\"testDB1\" and host=\"localhost\" and db=\"test\";", mysql.Priv2UserCol[v]) tk.MustQuery(sql).Check(testkit.Rows("Y")) } } func (s *testSuite) TestWithGrantOption(c *C) { tk := testkit.NewTestKit(c, s.store) // Create a new user. createUserSQL := `CREATE USER 'testWithGrant'@'localhost' IDENTIFIED BY '123';` tk.MustExec(createUserSQL) // Make sure all the db privs for new user is empty. sql := fmt.Sprintf("SELECT * FROM mysql.db WHERE User=\"testWithGrant\" and host=\"localhost\"") tk.MustQuery(sql).Check(testkit.Rows()) // Grant select priv to the user, with grant option. tk.MustExec("GRANT select ON test.* TO 'testWithGrant'@'localhost' WITH GRANT OPTION;") tk.MustQuery("SELECT grant_priv FROM mysql.DB WHERE User=\"testWithGrant\" and host=\"localhost\" and db=\"test\"").Check(testkit.Rows("Y")) } func (s *testSuite) TestTableScope(c *C) { tk := testkit.NewTestKit(c, s.store) // Create a new user. createUserSQL := `CREATE USER 'testTbl'@'localhost' IDENTIFIED BY '123';` tk.MustExec(createUserSQL) tk.MustExec(`CREATE TABLE test.test1(c1 int);`) // Make sure all the table privs for new user is empty. tk.MustQuery(`SELECT * FROM mysql.Tables_priv WHERE User="testTbl" and host="localhost" and db="test" and Table_name="test1"`).Check(testkit.Rows()) // Grant each priv to the user. for _, v := range mysql.AllTablePrivs { sql := fmt.Sprintf("GRANT %s ON test.test1 TO 'testTbl'@'localhost';", mysql.Priv2Str[v]) tk.MustExec(sql) rows := tk.MustQuery(`SELECT Table_priv FROM mysql.Tables_priv WHERE User="testTbl" and host="localhost" and db="test" and Table_name="test1";`).Rows() c.Assert(rows, HasLen, 1) row := rows[0] c.Assert(row, HasLen, 1) p := fmt.Sprintf("%v", row[0]) c.Assert(strings.Index(p, mysql.Priv2SetStr[v]), Greater, -1) } // Create a new user. createUserSQL = `CREATE USER 'testTbl1'@'localhost' IDENTIFIED BY '123';` tk.MustExec(createUserSQL) tk.MustExec("USE test;") tk.MustExec(`CREATE TABLE test2(c1 int);`) // Grant all table scope privs. tk.MustExec("GRANT ALL ON test2 TO 'testTbl1'@'localhost';") // Make sure all the table privs for granted user are in the Table_priv set. for _, v := range mysql.AllTablePrivs { rows := tk.MustQuery(`SELECT Table_priv FROM mysql.Tables_priv WHERE User="testTbl1" and host="localhost" and db="test" and Table_name="test2";`).Rows() c.Assert(rows, HasLen, 1) row := rows[0] c.Assert(row, HasLen, 1) p := fmt.Sprintf("%v", row[0]) c.Assert(strings.Index(p, mysql.Priv2SetStr[v]), Greater, -1) } } func (s *testSuite) TestColumnScope(c *C) { tk := testkit.NewTestKit(c, s.store) // Create a new user. createUserSQL := `CREATE USER 'testCol'@'localhost' IDENTIFIED BY '123';` tk.MustExec(createUserSQL) tk.MustExec(`CREATE TABLE test.test3(c1 int, c2 int);`) // Make sure all the column privs for new user is empty. tk.MustQuery(`SELECT * FROM mysql.Columns_priv WHERE User="testCol" and host="localhost" and db="test" and Table_name="test3" and Column_name="c1"`).Check(testkit.Rows()) tk.MustQuery(`SELECT * FROM mysql.Columns_priv WHERE User="testCol" and host="localhost" and db="test" and Table_name="test3" and Column_name="c2"`).Check(testkit.Rows()) // Grant each priv to the user. for _, v := range mysql.AllColumnPrivs { sql := fmt.Sprintf("GRANT %s(c1) ON test.test3 TO 'testCol'@'localhost';", mysql.Priv2Str[v]) tk.MustExec(sql) rows := tk.MustQuery(`SELECT Column_priv FROM mysql.Columns_priv WHERE User="testCol" and host="localhost" and db="test" and Table_name="test3" and Column_name="c1";`).Rows() c.Assert(rows, HasLen, 1) row := rows[0] c.Assert(row, HasLen, 1) p := fmt.Sprintf("%v", row[0]) c.Assert(strings.Index(p, mysql.Priv2SetStr[v]), Greater, -1) } // Create a new user. createUserSQL = `CREATE USER 'testCol1'@'localhost' IDENTIFIED BY '123';` tk.MustExec(createUserSQL) tk.MustExec("USE test;") // Grant all column scope privs. tk.MustExec("GRANT ALL(c2) ON test3 TO 'testCol1'@'localhost';") // Make sure all the column privs for granted user are in the Column_priv set. for _, v := range mysql.AllColumnPrivs { rows := tk.MustQuery(`SELECT Column_priv FROM mysql.Columns_priv WHERE User="testCol1" and host="localhost" and db="test" and Table_name="test3" and Column_name="c2";`).Rows() c.Assert(rows, HasLen, 1) row := rows[0] c.Assert(row, HasLen, 1) p := fmt.Sprintf("%v", row[0]) c.Assert(strings.Index(p, mysql.Priv2SetStr[v]), Greater, -1) } } func (s *testSuite) TestIssue2456(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("CREATE USER 'dduser'@'%' IDENTIFIED by '123456';") tk.MustExec("GRANT ALL PRIVILEGES ON `dddb_%`.* TO 'dduser'@'%';") tk.MustExec("GRANT ALL PRIVILEGES ON `dddb_%`.`te%` to 'dduser'@'%';") } func (s *testSuite) TestCreateUserWhenGrant(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec(`DROP USER IF EXISTS 'test'@'%'`) tk.MustExec(`GRANT ALL PRIVILEGES ON *.* to 'test'@'%' IDENTIFIED BY 'xxx'`) // Make sure user is created automatically when grant to a non-exists one. tk.MustQuery(`SELECT user FROM mysql.user WHERE user='test' and host='%'`).Check( testkit.Rows("test"), ) } func (s *testSuite) TestIssue2654(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec(`DROP USER IF EXISTS 'test'@'%'`) tk.MustExec(`CREATE USER 'test'@'%' IDENTIFIED BY 'test'`) tk.MustExec("GRANT SELECT ON test.* to 'test'") rows := tk.MustQuery(`SELECT user,host FROM mysql.user WHERE user='test' and host='%'`) rows.Check(testkit.Rows(`test %`)) }