Tarantool development patches archive
 help / color / mirror / Atom feed
From: "n.pettik" <korablev@tarantool.org>
To: tarantool-patches@freelists.org
Cc: Kirill Shcherbatov <kshcherbatov@tarantool.org>
Subject: [tarantool-patches] Re: [PATCH v2 2/9] box: fix _trigger and _ck_constraint access check
Date: Mon, 1 Apr 2019 17:06:19 +0300	[thread overview]
Message-ID: <A0452411-D75B-4415-92E7-3E95CB89098E@tarantool.org> (raw)
In-Reply-To: <21a029d4-90de-48a8-8999-8baed0a7a76d@tarantool.org>



> On 26 Mar 2019, at 13:59, Kirill Shcherbatov <kshcherbatov@tarantool.org> wrote:
> 
>> Why did you check only alter privilege? On drop we should check
>> drop privilege, on alter - alter privilege and on creation - creation
>> privilege.
> Hi! Here I check that we have alter privilege on corresponding "space" because replace
> in _trigger, _fk_constraint (and in further patches _ck_constaint)  cause space *
> object change. 
> This is very similar with access checks for _index space.

  1913	static void
  1914	on_replace_dd_index(struct trigger * /* trigger */, void *event)
  1915	{
		...
  1930		enum priv_type priv_type = new_tuple ? PRIV_C : PRIV_D;
  1931		if (old_tuple && new_tuple)
  1932			priv_type = PRIV_A;
  1933		access_check_ddl(old_space->def->name, old_space->def->id,
  1934				 old_space->def->uid, SC_SPACE, priv_type);

For indexes we check different privileges for drop, create and alter cases.

> As for _trigger, _fk_constraint regular access check everything is ok already.

I look at our docs: https://tarantool.io/en/doc/2.1/book/box/authentication/

It says:

‘’’
To create objects, users need the ‘create’ privilege and at least ‘read’ and
‘write’ privileges on the system space with a similar name
’''

Moreover, I see that we already have PRIV_TRIGGER in the list of object types.
AFAIK, ANSI states that user must have that privilege to create or drop triggers.
Please, consult other members of core team what check is expected here.
Personally I intuitively think that we need PRIV_C/PRIV_D/PRIV_A + PRIV_TRIGGER.
If PRIV_A is enough for all cases, add docbot request explaining that to create FK/TRIGGER
user should add alter privilege to space(s).

> Due to the fact that the insert in _fk_constraint and _trigger
> leads to a change in object space * need to check the right to
> change corresponding space before creating triggers or foreign
> key.
> 
> diff --git a/src/box/alter.cc b/src/box/alter.cc
> index 080a72b9f..fb668aa4c 100644
> --- a/src/box/alter.cc
> +++ b/src/box/alter.cc
> @@ -3514,6 +3514,11 @@ on_replace_dd_trigger(struct trigger * /* trigger */, void *event)
> 		uint32_t space_id =
> 			tuple_field_u32_xc(old_tuple,
> 					   BOX_TRIGGER_FIELD_SPACE_ID);
> +		struct space *space = space_by_id(space_id);
> +		assert(space != NULL);
> +		access_check_ddl(space->def->name, space->def->id,
> +				 space->def->uid, SC_SPACE, PRIV_A);
> +
> 		char *trigger_name =
> 			(char *)region_alloc_xc(&fiber()->gc,
> 						trigger_name_len + 1);
> @@ -3567,6 +3572,10 @@ on_replace_dd_trigger(struct trigger * /* trigger */, void *event)
> 				  "trigger space_id does not match the value "
> 				  "resolved on AST building from SQL");
> 		}
> +		struct space *space = space_by_id(space_id);
> +		assert(space != NULL);
> +		access_check_ddl(space->def->name, space->def->id,
> +				 space->def->uid, SC_SPACE, PRIV_A);

Could you move this check a bit higher, like in DROP trigger code?
We don’t need to compile trigger body to check access privilege.

> 
> 		struct sql_trigger *old_trigger;
> 		if (sql_trigger_replace(trigger_name,
> @@ -3897,6 +3906,8 @@ on_replace_dd_fk_constraint(struct trigger * /* trigger*/, void *event)
> 				  fk_def->name,
> 				  "referencing space can't be VIEW");
> 		}
> +		access_check_ddl(child_space->def->name, child_space->def->id,
> +				 child_space->def->uid, SC_SPACE, PRIV_A);
> 		struct space *parent_space =
> 			space_cache_find_xc(fk_def->parent_id);
> 		if (parent_space->def->opts.is_view) {
> @@ -3904,6 +3915,8 @@ on_replace_dd_fk_constraint(struct trigger * /* trigger*/, void *event)
> 				  fk_def->name,
> 				  "referenced space can't be VIEW");
> 		}
> +		access_check_ddl(parent_space->def->name, parent_space->def->id,
> +				 parent_space->def->uid, SC_SPACE, PRIV_A);
> 		/*
> 		 * FIXME: until SQL triggers are completely
> 		 * integrated into server (i.e. we are able to
> @@ -4031,6 +4044,10 @@ on_replace_dd_fk_constraint(struct trigger * /* trigger*/, void *event)
> 			space_cache_find_xc(fk_def->child_id);
> 		struct space *parent_space =
> 			space_cache_find_xc(fk_def->parent_id);
> +		access_check_ddl(child_space->def->name, child_space->def->id,
> +				 child_space->def->uid, SC_SPACE, PRIV_A);
> +		access_check_ddl(parent_space->def->name, parent_space->def->id,
> +				 parent_space->def->uid, SC_SPACE, PRIV_A);
> 		struct fk_constraint *old_fk=
> 			fk_constraint_remove(&child_space->child_fk_constraint,
> 					     fk_def->name);
> 
> diff --git a/test/box/net.box.test.lua b/test/box/net.box.test.lua
> index 04d6c1903..074c1a0fe 100644
> --- a/test/box/net.box.test.lua
> +++ b/test/box/net.box.test.lua
> @@ -1435,3 +1435,15 @@ test_run:wait_log('default', 'readahead limit is reached', 1024, 0.1)
> 
> s:drop()
> box.cfg{readahead = readahead}
> +
> +-- Test alter privilege for space that is modified by insertion in
> +-- _trigger, _ck_constraint space.

Nit: _fk_constraint

> +box.sql.execute("CREATE TABLE t5(x  INT primary key, y INT, CHECK( x + y < 2 ));")
> +box.sql.execute("CREATE TRIGGER tr1 AFTER DELETE ON t5 BEGIN DELETE FROM t5; END;")
> +box.schema.user.grant('guest','create,read,write','universe')
> +c = net.connect(box.cfg.listen)
> +c.space._trigger:replace({'TR1', box.space.T5.id, {sql='CREATE TRIGGER tr1 AFTER DELETE ON t5 BEGIN DELETE FROM t5; END;'}})

Please, add three separate cases: trigger creation, trigger drop and
trigger replace. The same for FK constraints.

  reply	other threads:[~2019-04-01 14:06 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-30  8:59 [tarantool-patches] [PATCH v2 0/9] sql: Checks on server side Kirill Shcherbatov
2019-01-30  8:59 ` [tarantool-patches] [PATCH v2 1/9] box: fix upgrade script for _fk_constraint space Kirill Shcherbatov
2019-03-11 18:44   ` [tarantool-patches] " n.pettik
2019-03-13 11:36   ` Kirill Yukhin
2019-01-30  8:59 ` [tarantool-patches] [PATCH v2 2/9] box: fix _trigger and _ck_constraint access check Kirill Shcherbatov
2019-03-11 19:29   ` [tarantool-patches] " n.pettik
2019-03-22  9:29     ` Vladislav Shpilevoy
2019-03-26 10:59     ` Kirill Shcherbatov
2019-04-01 14:06       ` n.pettik [this message]
2019-03-13 11:38   ` Kirill Yukhin
2019-03-13 11:44     ` Kirill Yukhin
2019-01-30  8:59 ` [tarantool-patches] [PATCH v2 3/9] box: fix Tarantool upgrade from 2.1.0 to 2.1.1 Kirill Shcherbatov
2019-03-12 11:45   ` [tarantool-patches] " n.pettik
2019-03-20 15:12     ` n.pettik
2019-03-20 15:38       ` Kirill Shcherbatov
2019-03-21 15:23         ` n.pettik
2019-03-21 15:36           ` Vladislav Shpilevoy
2019-03-22  9:28         ` Vladislav Shpilevoy
2019-03-22 10:18           ` Kirill Shcherbatov
2019-03-22 10:21             ` Vladislav Shpilevoy
2019-03-26  9:52   ` Kirill Yukhin
2019-01-30  8:59 ` [tarantool-patches] [PATCH v2 4/9] box: fix on_replace_trigger_rollback routine Kirill Shcherbatov
2019-03-11 20:00   ` [tarantool-patches] " n.pettik
2019-03-13 11:39   ` Kirill Yukhin
2019-01-30  8:59 ` [tarantool-patches] [PATCH v2 5/9] schema: add new system space for CHECK constraints Kirill Shcherbatov
2019-03-22  9:29   ` [tarantool-patches] " Vladislav Shpilevoy
2019-03-22  9:52     ` n.pettik
2019-03-26 10:59     ` Kirill Shcherbatov
2019-04-01 19:45       ` n.pettik
2019-04-16 13:51         ` Kirill Shcherbatov
2019-01-30  8:59 ` [tarantool-patches] [PATCH v2 6/9] sql: disallow use of TYPEOF in Check Kirill Shcherbatov
2019-03-26 10:59   ` [tarantool-patches] " Kirill Shcherbatov
2019-04-01 19:52     ` n.pettik
2019-01-30  8:59 ` [tarantool-patches] [PATCH v2 7/9] sql: refactor sqlite3_reset routine Kirill Shcherbatov
2019-03-26 10:59   ` [tarantool-patches] " Kirill Shcherbatov
2019-01-30  8:59 ` [tarantool-patches] [PATCH v2 8/9] box: exported sql_bind structure and API Kirill Shcherbatov
2019-03-26 10:59   ` [tarantool-patches] " Kirill Shcherbatov
2019-01-30  8:59 ` [tarantool-patches] [PATCH v2 9/9] sql: run check constraint tests on space alter Kirill Shcherbatov
2019-03-26 10:59   ` [tarantool-patches] " Kirill Shcherbatov
2019-04-02 14:14     ` n.pettik
2019-04-16 13:51       ` Kirill Shcherbatov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=A0452411-D75B-4415-92E7-3E95CB89098E@tarantool.org \
    --to=korablev@tarantool.org \
    --cc=kshcherbatov@tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --subject='[tarantool-patches] Re: [PATCH v2 2/9] box: fix _trigger and _ck_constraint access check' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox