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
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to