maria-developers team mailing list archive
-
maria-developers team
-
Mailing list archive
-
Message #10930
Re: 46b93fc: MDEV-13676: Field "create Procedure" is NULL, even if the the user has role which is the definer. (SHOW CREATE PROCEDURE)
On Mon, 9 Oct 2017 at 20:45 Sergei Golubchik <serg@xxxxxxxxxxx> wrote:
> Hi, Vicentiu!
>
> Looks good! A couple of comments, see below.
> Ok to push after fixing, the second review is not needed.
>
> On Oct 09, Vicentiu Ciorbaru wrote:
> > revision-id: 46b93fc2a2fa198d721813d9b93bbe09d2e36eb3
> (mariadb-10.0.32-50-g46b93fc)
> > parent(s): dbeffabc83ed01112e09d7e782d44f044cfcb691
> > author: Vicențiu Ciorbaru
> > committer: Vicențiu Ciorbaru
> > timestamp: 2017-10-09 13:32:40 +0300
> > message:
> >
> > MDEV-13676: Field "create Procedure" is NULL, even if the the user has
> role which is the definer. (SHOW CREATE PROCEDURE)
> >
> > During show create procedure we ommited to check the current role, if it
> > is the actual definer of the procedure. In addition, we should support
> > indirectly granted roles to the current role. Implemented a recursive
> > lookup to search the tree of grants if the rolename is present.
>
> We both had to check the SQL standard to see what the behavior should
> be. Please add here (in the commit comment) a reference to the exact
> part of the standard that specifies this behavior. Like
>
> SQL Standard 2016, Part ... Section ... View I_S.ROUTINES selects
> ROUTINE_BODY and its WHERE clause says that the GRANTEE must be either
> PUBLIC, or CURRENT_USER or in the ENABLED_ROLES.
>
> > diff --git a/sql/sp_head.cc b/sql/sp_head.cc
> > index ea9e1c1..3dd1a65 100644
> > --- a/sql/sp_head.cc
> > +++ b/sql/sp_head.cc
> > @@ -2588,10 +2588,18 @@ bool check_show_routine_access(THD *thd, sp_head
> *sp, bool *full_access)
> > *full_access= ((!check_table_access(thd, SELECT_ACL, &tables, FALSE,
> > 1, TRUE) &&
> > (tables.grant.privilege & SELECT_ACL) != 0) ||
> > + /* Check if user owns the routine. */
> > (!strcmp(sp->m_definer_user.str,
> > thd->security_ctx->priv_user) &&
> > !strcmp(sp->m_definer_host.str,
> > - thd->security_ctx->priv_host)));
> > + thd->security_ctx->priv_host)) ||
> > + /* Check if current role or any of the sub-granted
> roles
> > + own the routine. */
> > + (sp->m_definer_host.length == 0 &&
> > + (!strcmp(sp->m_definer_user.str,
> > + thd->security_ctx->priv_role) ||
> > + check_role_is_granted(thd->security_ctx->priv_role,
> NULL,
> > + sp->m_definer_user.str))));
>
> Perhaps you could simplify the condition above a little bit,
> by replacing it with
>
> /* Check if current role or any of the sub-granted roles
> own the routine. */
> (sp->m_definer_host.length == 0 &&
> check_role_is_granted(thd->security_ctx->priv_user,
> thd->security_ctx->priv_host,
> sp->m_definer_user.str)));
>
> I fixed the other change, but the logic you propose here is slightly
different. Your version will check all APPLICABLE_ROLES, not only
ENABLED_ROLES. We need to look at the subgraph of thd->priv_role only, not
those of priv_user@priv_host.
I've added an extra test case for this exact behaviour now too.
Regards,
> Sergei
> Chief Architect MariaDB
> and security@xxxxxxxxxxx
>
References