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.
next prev parent 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