From c0ae52e88d0fd66918cf6d7f21d03e922a3133b6 Mon Sep 17 00:00:00 2001 From: Kirill Shcherbatov <kshcherbatov@tarantool.org> Date: Wed, 24 Apr 2019 15:03:01 +0300 Subject: [PATCH] sql: check access rights of table in VIEW When access is performed using VIEW, access rights should be checked against table[s] which it is referencing, not against VIEW itself. Added a test case to verify this behaviour. Closes #4104 --- test/sql/gh-4104-view-access-check.result | 58 +++++++++++++++++++++ test/sql/gh-4104-view-access-check.test.lua | 18 +++++++ 2 files changed, 76 insertions(+) create mode 100644 test/sql/gh-4104-view-access-check.result create mode 100644 test/sql/gh-4104-view-access-check.test.lua diff --git a/test/sql/gh-4104-view-access-check.result b/test/sql/gh-4104-view-access-check.result new file mode 100644 index 0000000000..d38b633c36 --- /dev/null +++ b/test/sql/gh-4104-view-access-check.result @@ -0,0 +1,58 @@ +box.execute("CREATE TABLE supersecret(id INT PRIMARY KEY, data TEXT);") +--- +- row_count: 1 +... +box.execute("CREATE TABLE supersecret2(id INT PRIMARY KEY, data TEXT);") +--- +- row_count: 1 +... +box.execute("INSERT INTO supersecret VALUES(1, 'very very big secret');") +--- +- row_count: 1 +... +box.execute("INSERT INTO supersecret2 VALUES(1, 'very big secret 2');") +--- +- row_count: 1 +... +box.execute("CREATE VIEW supersecret_leak AS SELECT * FROM supersecret, supersecret2;") +--- +- row_count: 1 +... +remote = require 'net.box' +--- +... +cn = remote.connect(box.cfg.listen) +--- +... +box.schema.user.grant('guest','read', 'space', 'SUPERSECRET_LEAK') +--- +... +cn:execute('SELECT * FROM SUPERSECRET_LEAK') +--- +- error: Read access to space 'SUPERSECRET' is denied for user 'guest' +... +box.schema.user.grant('guest','read', 'space', 'SUPERSECRET') +--- +... +cn:execute('SELECT * FROM SUPERSECRET_LEAK') +--- +- error: Read access to space 'SUPERSECRET2' is denied for user 'guest' +... +box.schema.user.revoke('guest','read', 'space', 'SUPERSECRET') +--- +... +box.schema.user.revoke('guest','read', 'space', 'SUPERSECRET_LEAK') +--- +... +box.execute("DROP VIEW supersecret_leak") +--- +- row_count: 1 +... +box.execute("DROP TABLE supersecret") +--- +- row_count: 1 +... +box.execute("DROP TABLE supersecret2") +--- +- row_count: 1 +... diff --git a/test/sql/gh-4104-view-access-check.test.lua b/test/sql/gh-4104-view-access-check.test.lua new file mode 100644 index 0000000000..d1d19fc286 --- /dev/null +++ b/test/sql/gh-4104-view-access-check.test.lua @@ -0,0 +1,18 @@ +box.execute("CREATE TABLE supersecret(id INT PRIMARY KEY, data TEXT);") +box.execute("CREATE TABLE supersecret2(id INT PRIMARY KEY, data TEXT);") +box.execute("INSERT INTO supersecret VALUES(1, 'very very big secret');") +box.execute("INSERT INTO supersecret2 VALUES(1, 'very big secret 2');") +box.execute("CREATE VIEW supersecret_leak AS SELECT * FROM supersecret, supersecret2;") +remote = require 'net.box' +cn = remote.connect(box.cfg.listen) + +box.schema.user.grant('guest','read', 'space', 'SUPERSECRET_LEAK') +cn:execute('SELECT * FROM SUPERSECRET_LEAK') +box.schema.user.grant('guest','read', 'space', 'SUPERSECRET') +cn:execute('SELECT * FROM SUPERSECRET_LEAK') + +box.schema.user.revoke('guest','read', 'space', 'SUPERSECRET') +box.schema.user.revoke('guest','read', 'space', 'SUPERSECRET_LEAK') +box.execute("DROP VIEW supersecret_leak") +box.execute("DROP TABLE supersecret") +box.execute("DROP TABLE supersecret2") -- GitLab