Changeset: a11af30ab8bc for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a11af30ab8bc
Added Files:
sql/test/Users/Tests/view_privs.SQL.py
Modified Files:
sql/test/Users/Tests/All
Branch: indirect-privs
Log Message:
Added test for `GRANT SELECT on <view>`
diffs (73 lines):
diff --git a/sql/test/Users/Tests/All b/sql/test/Users/Tests/All
--- a/sql/test/Users/Tests/All
+++ b/sql/test/Users/Tests/All
@@ -2,6 +2,7 @@ function_privs
role
table
table_privs
+view_privs
unknown_user
createSetUp
withGrantOption
diff --git a/sql/test/Users/Tests/view_privs.SQL.py
b/sql/test/Users/Tests/view_privs.SQL.py
new file mode 100644
--- /dev/null
+++ b/sql/test/Users/Tests/view_privs.SQL.py
@@ -0,0 +1,57 @@
+###
+# Check indirect VIEW privilege:
+# A user with only(!) SELECT privilege on VIEWs of tables can use the VIEWs.
+# Check that if a user has CREATE VIEW privilege in one schema (i.e. is an
+# schema owner) but not in another schema, then the user can CREATE VIEWs
+# on tables in this schema but not in the other schema.
+###
+
+from MonetDBtesting.sqltest import SQLTestCase
+
+with SQLTestCase() as mdb:
+ mdb.connect(username="monetdb", password="monetdb")
+
+ # my_user is the owner of my_schema, hence has all privileges here
+ mdb.execute("CREATE ROLE my_role;").assertSucceeded()
+ mdb.execute("CREATE SCHEMA my_schema AUTHORIZATION
my_role;").assertSucceeded()
+ mdb.execute("CREATE USER my_user WITH PASSWORD 'p1' NAME 'my_user' SCHEMA
my_schema;").assertSucceeded()
+ mdb.execute("GRANT my_role to my_user;").assertSucceeded()
+
+ # someone else's schema, to parts of which my_user only has access when
+ # granted
+ mdb.execute("CREATE SCHEMA your_schema;").assertSucceeded()
+ mdb.execute("SET SCHEMA your_schema;").assertSucceeded()
+ mdb.execute("CREATE TABLE your_table (name VARCHAR(10), birthday DATE, ssn
CHAR(9));").assertSucceeded()
+ mdb.execute("INSERT INTO your_table VALUES ('alice', '1980-01-01',
'AAAAAAAAA'), ('bob', '1970-01-01', '000000000');").assertRowCount(2)
+ mdb.execute("CREATE VIEW your_view AS SELECT name, EXTRACT(YEAR FROM
birthday) as yr, '********'||substring(ssn,9,9) as ssn FROM
your_table;").assertSucceeded()
+ mdb.execute("SELECT * FROM
your_view;").assertSucceeded().assertDataResultMatch([('alice', 1980,
'********A'), ('bob', 1970, '********0')])
+ # grant indirect view right to my_user
+ mdb.execute("GRANT SELECT on your_view to my_user;").assertSucceeded()
+ mdb.execute("SET SCHEMA sys;").assertSucceeded()
+
+
+ with SQLTestCase() as tc:
+ tc.connect(username="my_user", password="p1")
+
+ # my_user can create tables, views in its own schema. Just a sanity
check
+ tc.execute("SET ROLE my_role;").assertSucceeded()
+ tc.execute("CREATE TABLE my_schema.my_table (name VARCHAR(10), i
INT);").assertSucceeded()
+ tc.execute("CREATE VIEW my_schema.my_view AS SELECT * FROM
my_schema.my_table;").assertSucceeded()
+ mdb.execute("DROP VIEW my_schema.my_view;").assertSucceeded()
+ mdb.execute("DROP TABLE my_schema.my_table;").assertSucceeded()
+
+ # my_user can only indirectly select from your_view
+ tc.execute("SELECT * FROM
your_schema.your_table;").assertFailed(err_code="42000", err_message="SELECT:
access denied for my_user to table 'your_schema.your_table'")
+ tc.execute("SELECT * FROM your_schema.your_view;").assertSucceeded()\
+ .assertDataResultMatch([('alice', 1980, '********A'), ('bob',
1970, '********0')])
+ # my_user cannot create VIEWs on your_table
+ tc.execute("CREATE VIEW your_view AS SELECT * FROM
your_schema.your_table;").assertFailed(err_code="42000", err_message="SELECT:
access denied for my_user to table 'your_schema.your_table'")
+
+ # clean up
+ mdb.execute("DROP VIEW your_schema.your_view;").assertSucceeded()
+ mdb.execute("DROP TABLE your_schema.your_table;").assertSucceeded()
+ mdb.execute("DROP USER my_user;").assertSucceeded()
+ mdb.execute("DROP ROLE my_role;").assertSucceeded()
+ mdb.execute("DROP SCHEMA my_schema;").assertSucceeded()
+ mdb.execute("DROP SCHEMA your_schema;").assertSucceeded()
+
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list